Attempt to find a way to spawn the foxes from the saves.
Saving the data works great, I just need to find a way to spawn the fox in the world.
This commit is contained in:
parent
4fa1bef8fb
commit
a9620bf1c9
|
@ -2,30 +2,15 @@
|
|||
<project version="4">
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="dcab9632-7b1a-44d7-9283-be9b37640afc" name="Default Changelist" comment="">
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/sqlite/SQLiteHandler.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/sqlite/SQLiteSetterGetter.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/EntityTamableFox.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/EntityTamableFox.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/TamableFoxes.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/TamableFoxes.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/command/CommandSpawnTamableFox.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/command/CommandSpawnTamableFox.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/io/FileManager.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/io/FileManager.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalBeg.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalBeg.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalBreed.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalBreed.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalFleeSun.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalFleeSun.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalFloat.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalFloat.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalFollowOwner.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalFollowOwner.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalHurtByTarget.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalHurtByTarget.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalLunge.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalLunge.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalLungeUNKNOWN_USE.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalLungeUNKNOWN_USE.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalMeleeAttack.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalMeleeAttack.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalOwnerHurtByTarget.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalOwnerHurtByTarget.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalOwnerHurtTarget.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalOwnerHurtTarget.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalPickBushes.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalPickBushes.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalRandomStrollLand.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalRandomStrollLand.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalRandomTargetNonTamed.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalRandomTargetNonTamed.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomilk/tamablefoxes/pathfinding/FoxPathfindGoalSit.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/pathfinding/FoxPathfindGoalSit.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/EntityTamableFox.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/EntityTamableFox.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/TamableFoxes.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/TamableFoxes.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/command/CommandSpawnTamableFox.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/command/CommandSpawnTamableFox.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/sqlite/SQLiteSetterGetter.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/sqlite/SQLiteSetterGetter.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/resources/plugin.yml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/plugin.yml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/target/classes/plugin.yml" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/plugin.yml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst" beforeDir="false" afterPath="$PROJECT_DIR$/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
|
@ -85,8 +70,8 @@
|
|||
</component>
|
||||
<component name="RunManager">
|
||||
<configuration name="Spigot-1.15.1" type="JarApplication">
|
||||
<option name="JAR_PATH" value="$PROJECT_DIR$/../../TEST_SERVER/spigot-1.15.1.jar" />
|
||||
<option name="WORKING_DIRECTORY" value="D:\Code\java\spigotPlugins\TEST_SERVER" />
|
||||
<option name="JAR_PATH" value="$PROJECT_DIR$/../../_TEST_SERVER_/spigot-1.15.1.jar" />
|
||||
<option name="WORKING_DIRECTORY" value="D:\Code\java\spigotPlugins\_TEST_SERVER_" />
|
||||
<option name="ALTERNATIVE_JRE_PATH" />
|
||||
<module name="GitTamableFoxes" />
|
||||
<method v="2" />
|
||||
|
@ -147,10 +132,10 @@
|
|||
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
|
||||
</component>
|
||||
<component name="WindowStateProjectService">
|
||||
<state x="414" y="174" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1579378826331">
|
||||
<state x="414" y="174" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1579664182600">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="414" y="174" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579378826331" />
|
||||
<state x="414" y="174" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579664182600" />
|
||||
<state x="765" y="229" key="#com.intellij.ide.util.MemberChooser" timestamp="1579568884135">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
|
@ -163,38 +148,38 @@
|
|||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="794" y="418" width="356" height="203" key="Github.CreateGistDialog/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579471488647" />
|
||||
<state width="1877" height="256" key="GridCell.Tab.0.bottom" timestamp="1579581388624">
|
||||
<state width="1877" height="218" key="GridCell.Tab.0.bottom" timestamp="1579666091685">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="256" key="GridCell.Tab.0.bottom/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579581388624" />
|
||||
<state width="1877" height="256" key="GridCell.Tab.0.center" timestamp="1579581388624">
|
||||
<state width="1877" height="218" key="GridCell.Tab.0.bottom/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579666091685" />
|
||||
<state width="1877" height="218" key="GridCell.Tab.0.center" timestamp="1579666091685">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="256" key="GridCell.Tab.0.center/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579581388624" />
|
||||
<state width="1877" height="256" key="GridCell.Tab.0.left" timestamp="1579581388624">
|
||||
<state width="1877" height="218" key="GridCell.Tab.0.center/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579666091685" />
|
||||
<state width="1877" height="218" key="GridCell.Tab.0.left" timestamp="1579666091685">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="256" key="GridCell.Tab.0.left/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579581388624" />
|
||||
<state width="1877" height="256" key="GridCell.Tab.0.right" timestamp="1579581388624">
|
||||
<state width="1877" height="218" key="GridCell.Tab.0.left/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579666091685" />
|
||||
<state width="1877" height="218" key="GridCell.Tab.0.right" timestamp="1579666091685">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="256" key="GridCell.Tab.0.right/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579581388624" />
|
||||
<state width="1877" height="256" key="GridCell.Tab.1.bottom" timestamp="1579581388624">
|
||||
<state width="1877" height="218" key="GridCell.Tab.0.right/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579666091685" />
|
||||
<state width="1877" height="216" key="GridCell.Tab.1.bottom" timestamp="1579666076544">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="256" key="GridCell.Tab.1.bottom/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579581388624" />
|
||||
<state width="1877" height="256" key="GridCell.Tab.1.center" timestamp="1579581388624">
|
||||
<state width="1877" height="216" key="GridCell.Tab.1.bottom/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579666076544" />
|
||||
<state width="1877" height="216" key="GridCell.Tab.1.center" timestamp="1579666076544">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="256" key="GridCell.Tab.1.center/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579581388624" />
|
||||
<state width="1877" height="256" key="GridCell.Tab.1.left" timestamp="1579581388624">
|
||||
<state width="1877" height="216" key="GridCell.Tab.1.center/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579666076544" />
|
||||
<state width="1877" height="216" key="GridCell.Tab.1.left" timestamp="1579666076544">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="256" key="GridCell.Tab.1.left/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579581388624" />
|
||||
<state width="1877" height="256" key="GridCell.Tab.1.right" timestamp="1579581388624">
|
||||
<state width="1877" height="216" key="GridCell.Tab.1.left/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579666076544" />
|
||||
<state width="1877" height="216" key="GridCell.Tab.1.right" timestamp="1579666076544">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="256" key="GridCell.Tab.1.right/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579581388624" />
|
||||
<state width="1877" height="216" key="GridCell.Tab.1.right/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579666076544" />
|
||||
<state x="490" y="174" key="Maven.ArtifactSearchDialog" timestamp="1579373377880">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
|
@ -203,20 +188,13 @@
|
|||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="498" height="446" key="SwitcherDM/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579469022098" />
|
||||
<state x="656" y="343" key="com.intellij.ide.util.TipDialog" timestamp="1579535914963">
|
||||
<state x="656" y="343" key="com.intellij.ide.util.TipDialog" timestamp="1579647313147">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="656" y="343" key="com.intellij.ide.util.TipDialog/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579535914963" />
|
||||
</component>
|
||||
<component name="XDebuggerManager">
|
||||
<breakpoint-manager>
|
||||
<breakpoints>
|
||||
<line-breakpoint enabled="true" type="java-line">
|
||||
<url>file://$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/TamableFoxes.java</url>
|
||||
<line>440</line>
|
||||
<option name="timeStamp" value="6" />
|
||||
</line-breakpoint>
|
||||
</breakpoints>
|
||||
</breakpoint-manager>
|
||||
<state x="656" y="343" key="com.intellij.ide.util.TipDialog/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579647313147" />
|
||||
<state x="342" y="189" key="new project wizard" timestamp="1579657428699">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="342" y="189" key="new project wizard/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1579657428699" />
|
||||
</component>
|
||||
</project>
|
2
pom.xml
2
pom.xml
|
@ -39,7 +39,7 @@
|
|||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<outputFile>D:\Code\java\spigotPlugins\TEST_SERVER\plugins\${project.artifactId}-${project.version}.jar</outputFile>
|
||||
<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_\plugins\${project.artifactId}-${project.version}.jar</outputFile>
|
||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||
</configuration>
|
||||
</execution>
|
||||
|
|
|
@ -41,7 +41,7 @@ public class EntityTamableFox extends EntityFox {
|
|||
plugin.getFoxUUIDs().put(this.getBukkitEntity().getUniqueId(), null);
|
||||
}
|
||||
|
||||
this.setPersistent();
|
||||
this.persistent = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -9,15 +9,11 @@ import net.minecraft.server.v1_15_R1.*;
|
|||
import net.seanomik.tamablefoxes.sqlite.SQLiteHandler;
|
||||
import net.seanomik.tamablefoxes.sqlite.SQLiteSetterGetter;
|
||||
import net.wesjd.anvilgui.AnvilGUI;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Particle;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.*;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftFox;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Entity;
|
||||
|
@ -27,20 +23,16 @@ import org.bukkit.event.EventHandler;
|
|||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||
import org.bukkit.event.entity.EntityDeathEvent;
|
||||
import org.bukkit.event.entity.EntityTargetEvent;
|
||||
import org.bukkit.event.player.*;
|
||||
import org.bukkit.event.world.ChunkLoadEvent;
|
||||
import org.bukkit.event.world.ChunkUnloadEvent;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
// @TODO: Add language.yml
|
||||
|
@ -48,15 +40,14 @@ import java.util.stream.Collectors;
|
|||
public class TamableFoxes extends JavaPlugin implements Listener {
|
||||
|
||||
public static final String ITEM_INSPECTOR_LORE = ChatColor.BLUE + "Tamable Fox Inspector";
|
||||
public static final String TAG_TAME_FOX = "tameablefox";
|
||||
public static final String FOX_REGISTER_NAME = "tameablefox";
|
||||
|
||||
private FileManager fileManager = new FileManager(this);
|
||||
|
||||
private Map<UUID, UUID> foxUUIDs = Maps.newHashMap(); // FoxUUID, OwnerUUID
|
||||
private EntityTypes customType;
|
||||
private boolean isOnLoad = true;
|
||||
private Map<UUID, Entity> lookupCache = Maps.newHashMap();
|
||||
private List<EntityTamableFox> spawnedFoxes;
|
||||
private List<EntityTamableFox> spawnedFoxes = new ArrayList<>();
|
||||
private FileManager.Config config;//, configFoxes;
|
||||
public static SQLiteHandler sqLiteHandler = new SQLiteHandler();
|
||||
public static SQLiteSetterGetter sqLiteSetterGetter = new SQLiteSetterGetter();
|
||||
|
@ -82,11 +73,11 @@ public class TamableFoxes extends JavaPlugin implements Listener {
|
|||
final Map<String, Type<?>> types = (Map<String, Type<?>>) DataConverterRegistry.a()
|
||||
.getSchema(DataFixUtils.makeKey(SharedConstants.getGameVersion().getWorldVersion()))
|
||||
.findChoiceType(DataConverterTypes.ENTITY).types();
|
||||
types.put("minecraft:" + TAG_TAME_FOX, types.get("minecraft:fox"));
|
||||
types.put("minecraft:" + FOX_REGISTER_NAME, types.get("minecraft:fox"));
|
||||
|
||||
EntityTypes.a<net.minecraft.server.v1_15_R1.Entity> a = EntityTypes.a.a((entityTypes, world) ->
|
||||
new EntityTamableFox(this, entityTypes, world), EnumCreatureType.AMBIENT);
|
||||
customType = IRegistry.a(IRegistry.ENTITY_TYPE, "tameablefox", a.a("tameablefox"));
|
||||
customType = IRegistry.a(IRegistry.ENTITY_TYPE, FOX_REGISTER_NAME, a.a(FOX_REGISTER_NAME));
|
||||
|
||||
this.replaceFoxesOnLoad();
|
||||
}
|
||||
|
@ -97,7 +88,9 @@ public class TamableFoxes extends JavaPlugin implements Listener {
|
|||
for (EntityTamableFox fox : spawnedFoxes) {
|
||||
sqLiteSetterGetter.saveFox(fox);
|
||||
|
||||
fox.getBukkitEntity().remove();
|
||||
Location loc = new Location(fox.getWorld().getWorld(), fox.locX(), fox.locY(), fox.locZ());
|
||||
loc.getChunk().load();
|
||||
fox.die();
|
||||
}
|
||||
|
||||
getServer().getConsoleSender().sendMessage(getPrefix() + ChatColor.GREEN + "Saved all foxes successfully!");
|
||||
|
@ -106,99 +99,6 @@ public class TamableFoxes extends JavaPlugin implements Listener {
|
|||
}
|
||||
}
|
||||
|
||||
private void replaceFoxesOnLoad() {
|
||||
/*int amountReplaced = 0;
|
||||
|
||||
for (World world : Bukkit.getWorlds()) {
|
||||
Chunk[] loadedChunks = world.getLoadedChunks();
|
||||
for (Chunk chunk : loadedChunks) {
|
||||
Entity[] entities = chunk.getEntities();
|
||||
for (Entity entity : entities) {
|
||||
if (!(entity instanceof Fox))
|
||||
continue;
|
||||
if (this.isTamableFox(entity))
|
||||
continue;
|
||||
EntityTamableFox tamableFox = (EntityTamableFox) spawnTamableFox(entity.getLocation(), ((CraftFox) entity).getHandle().getFoxType());
|
||||
|
||||
//final YamlConfiguration configuration = configFoxes.get();
|
||||
// get living entity data
|
||||
if (configuration.isConfigurationSection("Foxes." + entity.getUniqueId())) {
|
||||
String owner = configuration.getString("Foxes." + entity.getUniqueId() + ".owner");
|
||||
|
||||
// make new data
|
||||
if (owner.equals("none")) {
|
||||
foxUUIDs.replace(tamableFox.getUniqueID(), null);
|
||||
configuration.set("Foxes." + tamableFox.getUniqueID() + ".owner", "none");
|
||||
} else {
|
||||
foxUUIDs.replace(tamableFox.getUniqueID(), UUID.fromString(owner));
|
||||
tamableFox.setTamed(true);
|
||||
configuration.set("Foxes." + tamableFox.getUniqueID() + ".owner", owner);
|
||||
}
|
||||
|
||||
// set name
|
||||
if (configuration.isSet("Foxes." + entity.getUniqueId() + ".name")) {
|
||||
final String name = configuration.getString("Foxes." + entity.getUniqueId() + ".name");
|
||||
configuration.set("Foxes." + tamableFox.getUniqueID() + ".name", name);
|
||||
tamableFox.setChosenName(name);
|
||||
}
|
||||
|
||||
// delete old data
|
||||
configuration.set("Foxes." + entity.getUniqueId(), null);
|
||||
|
||||
tamableFox.setSitting(((EntityFox) ((CraftEntity) entity).getHandle()).isSitting());
|
||||
tamableFox.updateFox();
|
||||
tamableFox.setAge(((CraftFox) entity).getAge());
|
||||
ItemStack entityMouthItem = ((CraftFox) entity).getEquipment().getItemInMainHand();
|
||||
entityMouthItem.setAmount(1);
|
||||
|
||||
if (entityMouthItem.getType() != Material.AIR) {
|
||||
tamableFox.setSlot(EnumItemSlot.MAINHAND, CraftItemStack.asNMSCopy(entityMouthItem));
|
||||
} else {
|
||||
tamableFox.setSlot(EnumItemSlot.MAINHAND, new net.minecraft.server.v1_15_R1.ItemStack(Items.AIR));
|
||||
}
|
||||
|
||||
} else {
|
||||
configuration.set("Foxes." + tamableFox.getUniqueID() + ".owner", "none");
|
||||
|
||||
tamableFox.setAge(((CraftFox) entity).getAge());
|
||||
ItemStack entityMouthItem = ((CraftFox) entity).getEquipment().getItemInMainHand();
|
||||
entityMouthItem.setAmount(1);
|
||||
|
||||
if (entityMouthItem.getType() != Material.AIR) {
|
||||
tamableFox.setSlot(EnumItemSlot.MAINHAND, CraftItemStack.asNMSCopy(entityMouthItem));
|
||||
} else {
|
||||
tamableFox.setSlot(EnumItemSlot.MAINHAND, new net.minecraft.server.v1_15_R1.ItemStack(Items.AIR));
|
||||
}
|
||||
}
|
||||
|
||||
entity.remove();
|
||||
++amountReplaced;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
configFoxes.save();*/
|
||||
|
||||
spawnedFoxes = sqLiteSetterGetter.spawnFoxes();
|
||||
this.isOnLoad = false;
|
||||
}
|
||||
|
||||
public net.minecraft.server.v1_15_R1.Entity spawnTamableFox(Location location, net.minecraft.server.v1_15_R1.EntityFox.Type type) {
|
||||
WorldServer world = ((CraftWorld) location.getWorld()).getHandle();
|
||||
EntityTamableFox spawnedFox = (EntityTamableFox) customType.b(world, null, null, null,
|
||||
new BlockPosition(location.getX(), location.getY(), location.getZ()), null, false, false);
|
||||
|
||||
if (!world.addEntity(spawnedFox)) { // Throw a error if the fox failed to spawn
|
||||
throw new RuntimeException("Failed to spawn fox!");
|
||||
}
|
||||
|
||||
spawnedFox.setFoxType(type);
|
||||
|
||||
sqLiteSetterGetter.saveFox((EntityTamableFox) spawnedFox);
|
||||
|
||||
return spawnedFox;
|
||||
}
|
||||
|
||||
private class SaveFoxRunnable extends BukkitRunnable {
|
||||
private final TamableFoxes plugin;
|
||||
|
||||
|
@ -217,6 +117,58 @@ public class TamableFoxes extends JavaPlugin implements Listener {
|
|||
}
|
||||
}
|
||||
|
||||
private void replaceFoxesOnLoad() {
|
||||
//spawnedFoxes = sqLiteSetterGetter.spawnFoxes();
|
||||
}
|
||||
|
||||
public net.minecraft.server.v1_15_R1.Entity spawnTamableFox(Location location, net.minecraft.server.v1_15_R1.EntityFox.Type type) {
|
||||
if (location.getChunk() != null) {
|
||||
location.getChunk().load();
|
||||
}
|
||||
|
||||
WorldServer world = ((CraftWorld) location.getWorld()).getHandle();
|
||||
EntityTamableFox spawnedFox = (EntityTamableFox) customType.b(world, null, null, null,
|
||||
new BlockPosition(location.getX(), location.getY(), location.getZ()), null, false, false);
|
||||
|
||||
if (!world.addEntity(spawnedFox)) { // Show an error if the fox failed to spawn
|
||||
getServer().getConsoleSender().sendMessage(getPrefix() + ChatColor.RED + "Failed to spawn fox!");
|
||||
}
|
||||
|
||||
spawnedFox.setFoxType(type);
|
||||
|
||||
return spawnedFox;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onChunkLoad(ChunkLoadEvent event) {
|
||||
if (event.isNewChunk()) return;
|
||||
|
||||
// Remove vanilla foxes
|
||||
for (Entity entity : event.getChunk().getEntities()) {
|
||||
if (entity instanceof Fox && !this.isTamableFox(entity)) {
|
||||
entity.remove();
|
||||
}
|
||||
}
|
||||
|
||||
// Spawn saved foxes
|
||||
List<EntityTamableFox> newFoxes = sqLiteSetterGetter.spawnFoxesInChunk(event.getChunk());
|
||||
if (newFoxes != null && newFoxes.size() != 0) {
|
||||
spawnedFoxes.addAll(newFoxes);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onChunkUnload(ChunkUnloadEvent event) {
|
||||
for (Entity entity : event.getChunk().getEntities()) {
|
||||
if (isTamableFox(entity)) {
|
||||
EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) entity).getHandle();
|
||||
|
||||
sqLiteSetterGetter.saveFox(tamableFox);
|
||||
tamableFox.die();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
@ -234,8 +186,7 @@ public class TamableFoxes extends JavaPlugin implements Listener {
|
|||
Entity entity = event.getRightClicked();
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (event.getHand() != EquipmentSlot.HAND)
|
||||
return;
|
||||
if (event.getHand() != EquipmentSlot.HAND) return;
|
||||
|
||||
final ItemStack playerHand = player.getInventory().getItemInMainHand();
|
||||
ItemMeta itemMeta = playerHand.getItemMeta();
|
||||
|
|
|
@ -42,7 +42,7 @@ public class CommandSpawnTamableFox implements TabExecutor {
|
|||
switch (args[0]) {
|
||||
case "red":
|
||||
try {
|
||||
EntityTamableFox fox = (EntityTamableFox) plugin.spawnTamableFox(player.getLocation(), EntityFox.Type.RED);
|
||||
EntityTamableFox fox = (EntityTamableFox) plugin.spawnTamableFox(player.getLocation().add(0, 1, 0), EntityFox.Type.RED);
|
||||
plugin.getSpawnedFoxes().add(fox);
|
||||
plugin.sqLiteSetterGetter.saveFox(fox);
|
||||
|
||||
|
@ -53,7 +53,7 @@ public class CommandSpawnTamableFox implements TabExecutor {
|
|||
break;
|
||||
case "snow":
|
||||
try {
|
||||
EntityTamableFox spawnedFox = (EntityTamableFox) plugin.spawnTamableFox(player.getLocation(), EntityFox.Type.SNOW);
|
||||
EntityTamableFox spawnedFox = (EntityTamableFox) plugin.spawnTamableFox(player.getLocation().add(0, 1, 0), EntityFox.Type.SNOW);
|
||||
plugin.getSpawnedFoxes().add(spawnedFox);
|
||||
plugin.sqLiteSetterGetter.saveFox(spawnedFox);
|
||||
|
||||
|
|
|
@ -5,10 +5,7 @@ import net.minecraft.server.v1_15_R1.EnumItemSlot;
|
|||
import net.seanomik.tamablefoxes.EntityTamableFox;
|
||||
import net.seanomik.tamablefoxes.TamableFoxes;
|
||||
import org.apache.commons.lang.ObjectUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.*;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
@ -37,7 +34,7 @@ public class SQLiteSetterGetter {
|
|||
"`TYPE` TEXT NOT NULL , " +
|
||||
"`SITTING` INTEGER NOT NULL , " +
|
||||
"`SLEEPING` INTEGER NOT NULL , " +
|
||||
"`MOUTH_ITEM` TEXT NOT NULL);";
|
||||
"`MOUTH_ITEM` TEXT NOT NULL);"; // @TODO: Add a age field
|
||||
|
||||
try {
|
||||
sqLiteHandler.connect();
|
||||
|
@ -99,7 +96,7 @@ public class SQLiteSetterGetter {
|
|||
}
|
||||
}
|
||||
|
||||
public void saveFoxes(List<EntityTamableFox> foxes) { // @TODO: Optimize
|
||||
public void saveFoxes(List<EntityTamableFox> foxes) { // @TODO: Optimize?
|
||||
for (EntityTamableFox fox : foxes) {
|
||||
saveFox(fox);
|
||||
}
|
||||
|
@ -155,6 +152,63 @@ public class SQLiteSetterGetter {
|
|||
return null;
|
||||
}
|
||||
|
||||
public List<EntityTamableFox> spawnFoxesInChunk(Chunk chunk) {
|
||||
plugin = TamableFoxes.getPlugin(TamableFoxes.class);
|
||||
try {
|
||||
sqLiteHandler.connect();
|
||||
PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement("SELECT * FROM foxes");
|
||||
ResultSet results = statement.executeQuery();
|
||||
|
||||
List<EntityTamableFox> foxList = new ArrayList<>();
|
||||
while (results.next()) { // Loop through each row
|
||||
List<String> locationList = Arrays.asList(results.getString("LOCATION").split("\\s*,\\s*"));
|
||||
Location loc = new Location(Bukkit.getWorld(locationList.get(0)), Double.parseDouble(locationList.get(1)), Double.parseDouble(locationList.get(2)), Double.parseDouble(locationList.get(3)));
|
||||
|
||||
// Checks if the location is in a chunk.
|
||||
if (chunk.getX() == ((double) loc.getBlockX() / 16 && chunk.getZ() == loc.getBlockZ() / 16) {
|
||||
plugin.getServer().getConsoleSender().sendMessage("SPAWN IN CHUNK");
|
||||
|
||||
EntityTamableFox spawnedFox = (EntityTamableFox) plugin.spawnTamableFox(loc, EntityFox.Type.valueOf(results.getString("TYPE")));
|
||||
spawnedFox.databaseID = results.getInt("ID");
|
||||
spawnedFox.setSlot(EnumItemSlot.MAINHAND, CraftItemStack.asNMSCopy(new ItemStack(Material.valueOf(results.getString("MOUTH_ITEM")), 1)));
|
||||
|
||||
spawnedFox.setSitting(results.getInt("SITTING") == 1);
|
||||
spawnedFox.setSleeping(results.getInt("SLEEPING") == 1);
|
||||
|
||||
if (!results.getString("OWNER_UUID").equals("none")) {
|
||||
UUID ownerUUID = UUID.fromString(results.getString("OWNER_UUID"));
|
||||
|
||||
OfflinePlayer owner = plugin.getServer().getOfflinePlayer(ownerUUID);
|
||||
if (owner.isOnline()) {
|
||||
spawnedFox.setOwner(((CraftPlayer) owner.getPlayer()).getHandle());
|
||||
}
|
||||
|
||||
plugin.getFoxUUIDs().put(spawnedFox.getUniqueID(), ownerUUID);
|
||||
spawnedFox.setChosenName(results.getString("NAME"));
|
||||
spawnedFox.setTamed(true);
|
||||
}
|
||||
|
||||
foxList.add(spawnedFox);
|
||||
} else {
|
||||
plugin.getServer().getConsoleSender().sendMessage("ChunkX: " + (chunk.getX()) + ", LocX: " + (loc.getBlockX() / 16) + ", ChunkZ: " + (chunk.getZ()) + ", LocZ: " + (loc.getBlockZ() / 16));
|
||||
}
|
||||
}
|
||||
|
||||
return foxList;
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (sqLiteHandler.getConnection() != null) {
|
||||
try {
|
||||
sqLiteHandler.getConnection().close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void removeFox(int databaseID) {
|
||||
plugin = TamableFoxes.getPlugin(TamableFoxes.class);
|
||||
try {
|
||||
|
|
|
@ -3,6 +3,7 @@ version: 1.4.1-SNAPSHOT
|
|||
main: net.seanomik.tamablefoxes.TamableFoxes
|
||||
api-version: 1.15
|
||||
load: POSTWORLD
|
||||
#load: STARTUP
|
||||
description: Modified version of TamableFoxes for 1.15.1.
|
||||
|
||||
commands:
|
||||
|
|
|
@ -3,6 +3,7 @@ version: 1.4.1-SNAPSHOT
|
|||
main: net.seanomik.tamablefoxes.TamableFoxes
|
||||
api-version: 1.15
|
||||
load: POSTWORLD
|
||||
#load: STARTUP
|
||||
description: Modified version of TamableFoxes for 1.15.1.
|
||||
|
||||
commands:
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalFloat.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalRandomTargetNonTamed.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\command\CommandSpawnTamableFox.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalOwnerHurtByTarget.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\sqlite\SQLiteHandler.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\EntityTamableFox.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalMeleeAttack.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalHurtByTarget.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalSit.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalOwnerHurtTarget.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalPickBushes.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalBreed.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\io\FileManager.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalBeg.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalLungeUNKNOWN_USE.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\sqlite\SQLiteSetterGetter.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\TamableFoxes.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalLunge.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalRandomStrollLand.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalFollowOwner.java
|
||||
C:\code\java\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalFleeSun.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalRandomStrollLand.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalRandomTargetNonTamed.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalLunge.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\command\CommandSpawnTamableFox.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\TamableFoxes.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalBeg.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalPickBushes.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalBreed.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalMeleeAttack.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\EntityTamableFox.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalFleeSun.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\sqlite\SQLiteHandler.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalLungeUNKNOWN_USE.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalOwnerHurtByTarget.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalOwnerHurtTarget.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalSit.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\sqlite\SQLiteSetterGetter.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalFloat.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\io\FileManager.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalHurtByTarget.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\pathfinding\FoxPathfindGoalFollowOwner.java
|
||||
|
|
Loading…
Reference in New Issue