Update to 1.16.1 and also make one jar work with 1.15 and 1.16.
This commit is contained in:
parent
034e35d473
commit
304762408f
|
@ -2,16 +2,28 @@
|
|||
<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/versions/version_1_15_R1/NMSInterface_1_15_R1.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" 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/versions/version_1_15_R1/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/Utils.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/Utils.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalFollowOwner.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalFollowOwner.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalMeleeAttack.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalMeleeAttack.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/io/LanguageConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/io/LanguageConfig.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/command/CommandSpawnTamableFox.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/CommandSpawnTamableFox.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalFollowOwner.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalFollowOwner.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalHurtByTarget.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalMeleeAttack.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalMeleeAttack.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalPanic.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalPanic.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15/pathfinding/FoxPathfinderGoalSit.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSit.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/resources/language.yml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/language.yml" 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-archiver/pom.properties" beforeDir="false" afterPath="$PROJECT_DIR$/target/maven-archiver/pom.properties" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst" beforeDir="false" afterPath="$PROJECT_DIR$/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst" 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" />
|
||||
|
@ -52,7 +64,7 @@
|
|||
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
|
||||
<property name="WebServerToolWindowFactoryState" value="true" />
|
||||
<property name="aspect.path.notification.shown" value="true" />
|
||||
<property name="last_opened_file_path" value="$USER_HOME$/Desktop/Servers/SMP/Paper.jar" />
|
||||
<property name="last_opened_file_path" value="$PROJECT_DIR$/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1" />
|
||||
<property name="node.js.detected.package.eslint" value="true" />
|
||||
<property name="node.js.detected.package.tslint" value="true" />
|
||||
<property name="node.js.path.for.package.eslint" value="project" />
|
||||
|
@ -64,15 +76,25 @@
|
|||
<property name="project.structure.side.proportion" value="0.2" />
|
||||
<property name="restartRequiresConfirmation" value="false" />
|
||||
<property name="run.code.analysis.last.selected.profile" value="pProject Default" />
|
||||
<property name="settings.editor.selected.configurable" value="editor.preferences.jsOptions" />
|
||||
<property name="settings.editor.selected.configurable" value="preferences.pluginManager" />
|
||||
</component>
|
||||
<component name="RecentsManager">
|
||||
<key name="MoveClassesOrPackagesDialog.RECENTS_KEY">
|
||||
<recent name="net.seanomik.tamablefoxes.versions" />
|
||||
</key>
|
||||
<key name="CopyClassDialog.RECENTS_KEY">
|
||||
<recent name="net.seanomik.tamablefoxes.versions.version_1_16_R1.command" />
|
||||
<recent name="net.seanomik.tamablefoxes.versions.version_1_15_R1.command" />
|
||||
<recent name="net.seanomik.tamablefoxes.versions.version_1_15" />
|
||||
<recent name="net.seanomik.tamablefoxes.versions.version_1_16" />
|
||||
</key>
|
||||
<key name="CopyFile.RECENT_KEYS">
|
||||
<recent name="D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_16_R1" />
|
||||
<recent name="D:\Code\java\spigotPlugins\myPlugins\GitTamableFoxes\src\main\java\net\seanomik\tamablefoxes\io" />
|
||||
<recent name="E:\TamableFoxesCustomEntity\src\main\resources" />
|
||||
</key>
|
||||
</component>
|
||||
<component name="RunManager" selected="JAR Application.Spigot-1.15.2">
|
||||
<component name="RunManager" selected="JAR Application.Spigot-1.16.1">
|
||||
<configuration name="Spigot-1.15.2" type="JarApplication">
|
||||
<option name="JAR_PATH" value="$PROJECT_DIR$/../../_TEST_SERVER_1.15.2_/spigot-1.15.2.jar" />
|
||||
<option name="PROGRAM_PARAMETERS" value="nogui" />
|
||||
|
@ -80,6 +102,13 @@
|
|||
<option name="ALTERNATIVE_JRE_PATH" />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="Spigot-1.16.1" type="JarApplication">
|
||||
<option name="JAR_PATH" value="$PROJECT_DIR$/../../_TEST_SERVER_1.16.1_/spigot-1.16.1.jar" />
|
||||
<option name="PROGRAM_PARAMETERS" value="nogui" />
|
||||
<option name="WORKING_DIRECTORY" value="D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.1_" />
|
||||
<option name="ALTERNATIVE_JRE_PATH" />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration default="true" type="JarApplication">
|
||||
<option name="JAR_PATH" value="$USER_HOME$/_TEST_SERVER_2_/spigot-1.15.1.jar" />
|
||||
<option name="WORKING_DIRECTORY" value="D:\Code\java\spigotPlugins\_TEST_SERVER_2_" />
|
||||
|
@ -114,6 +143,7 @@
|
|||
</configuration>
|
||||
<list>
|
||||
<item itemvalue="JAR Application.Spigot-1.15.2" />
|
||||
<item itemvalue="JAR Application.Spigot-1.16.1" />
|
||||
<item itemvalue="Maven.TamableFoxesCustomEntity build" />
|
||||
</list>
|
||||
</component>
|
||||
|
@ -176,168 +206,81 @@
|
|||
<option name="LAST_COMMIT_MESSAGE" value="New way of implementing foxes" />
|
||||
</component>
|
||||
<component name="WindowStateProjectService">
|
||||
<state x="414" y="174" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1588527496628">
|
||||
<state x="414" y="174" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1594704621064">
|
||||
<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="1588527496628" />
|
||||
<state x="414" y="174" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580229888801" />
|
||||
<state x="-1203" y="274" key="#com.intellij.ide.util.MemberChooser" timestamp="1585596287933">
|
||||
<state x="414" y="174" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594704621064" />
|
||||
<state x="765" y="229" key="#com.intellij.ide.util.MemberChooser" timestamp="1594703907165">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="765" y="229" key="#com.intellij.ide.util.MemberChooser/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594703907165" />
|
||||
<state x="728" y="405" width="511" height="237" key="#com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesDialog.classes" timestamp="1594684709262">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="728" y="405" width="511" height="237" key="#com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesDialog.classes/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594684709262" />
|
||||
<state x="690" y="267" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog" timestamp="1594707084828">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="690" y="267" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594707084828" />
|
||||
<state x="740" y="275" key="FileChooserDialogImpl" timestamp="1590119699228">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="740" y="275" key="FileChooserDialogImpl/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1590119699228" />
|
||||
<state width="1877" height="197" key="GridCell.Tab.0.bottom" timestamp="1594748168001">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="197" key="GridCell.Tab.0.bottom/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594748168001" />
|
||||
<state width="1877" height="197" key="GridCell.Tab.0.center" timestamp="1594748168001">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="197" key="GridCell.Tab.0.center/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594748168001" />
|
||||
<state width="1877" height="197" key="GridCell.Tab.0.left" timestamp="1594748168001">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="197" key="GridCell.Tab.0.left/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594748168001" />
|
||||
<state width="1877" height="197" key="GridCell.Tab.0.right" timestamp="1594748168001">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="197" key="GridCell.Tab.0.right/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594748168001" />
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.bottom" timestamp="1594748167920">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.bottom/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594748167920" />
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.center" timestamp="1594748167920">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.center/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594748167920" />
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.left" timestamp="1594748167919">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.left/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594748167919" />
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.right" timestamp="1594748167920">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.right/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594748167920" />
|
||||
<state x="461" y="162" key="SettingsEditor" timestamp="1588876397734">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="461" y="162" key="SettingsEditor/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1588876397734" />
|
||||
<state x="656" y="343" key="com.intellij.ide.util.TipDialog" timestamp="1590119557040">
|
||||
<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="1590119557040" />
|
||||
<state x="-876" y="0" width="883" height="1047" key="dock-window-1" timestamp="1594704170924">
|
||||
<screen x="-1920" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="-1203" y="274" key="#com.intellij.ide.util.MemberChooser/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1585596287933" />
|
||||
<state x="808" y="409" key="#com.intellij.ide.util.projectWizard.JdkChooserPanel.MyDialog" timestamp="1585594689529">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="808" y="409" key="#com.intellij.ide.util.projectWizard.JdkChooserPanel.MyDialog/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1585594689529" />
|
||||
<state x="2415" y="104" key="CommitChangelistDialog2" timestamp="1582326721037">
|
||||
<screen x="1920" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="495" y="104" key="CommitChangelistDialog2/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580233943125" />
|
||||
<state x="2415" y="104" key="CommitChangelistDialog2/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582326721037" />
|
||||
<state x="184" y="92" key="DiffContextDialog" timestamp="1580232320365">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="184" y="92" key="DiffContextDialog/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580232320365" />
|
||||
<state x="740" y="274" key="FileChooserDialogImpl" timestamp="1580229674681">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="740" y="274" key="FileChooserDialogImpl/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1580081289890" />
|
||||
<state x="740" y="274" key="FileChooserDialogImpl/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580229674681" />
|
||||
<state x="794" y="418" key="Github.CreateGistDialog" timestamp="1580081718270">
|
||||
<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="1580081718270" />
|
||||
<state width="1877" height="195" key="GridCell.Tab.0.bottom" timestamp="1588527514173">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="195" key="GridCell.Tab.0.bottom/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1588527514173" />
|
||||
<state width="939" height="355" key="GridCell.Tab.0.bottom/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234020859" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.0.bottom/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582226910732" />
|
||||
<state width="1877" height="199" key="GridCell.Tab.0.bottom/1920.0.1920.1040/0.0.1920.1040@0.0.1920.1040" timestamp="1580134668965" />
|
||||
<state width="1877" height="195" key="GridCell.Tab.0.center" timestamp="1588527514173">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="195" key="GridCell.Tab.0.center/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1588527514173" />
|
||||
<state width="939" height="355" key="GridCell.Tab.0.center/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234020858" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.0.center/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582226910732" />
|
||||
<state width="1877" height="199" key="GridCell.Tab.0.center/1920.0.1920.1040/0.0.1920.1040@0.0.1920.1040" timestamp="1580134668964" />
|
||||
<state width="1877" height="195" key="GridCell.Tab.0.left" timestamp="1588527514173">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="195" key="GridCell.Tab.0.left/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1588527514173" />
|
||||
<state width="939" height="355" key="GridCell.Tab.0.left/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234020858" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.0.left/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582226910732" />
|
||||
<state width="1877" height="199" key="GridCell.Tab.0.left/1920.0.1920.1040/0.0.1920.1040@0.0.1920.1040" timestamp="1580134668964" />
|
||||
<state width="1877" height="195" key="GridCell.Tab.0.right" timestamp="1588527514173">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="195" key="GridCell.Tab.0.right/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1588527514173" />
|
||||
<state width="939" height="355" key="GridCell.Tab.0.right/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234020858" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.0.right/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582226910732" />
|
||||
<state width="1877" height="199" key="GridCell.Tab.0.right/1920.0.1920.1040/0.0.1920.1040@0.0.1920.1040" timestamp="1580134668964" />
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.bottom" timestamp="1588527482192">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.bottom/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1588527482192" />
|
||||
<state width="939" height="355" key="GridCell.Tab.1.bottom/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234020859" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.1.bottom/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582226910717" />
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.center" timestamp="1588527482191">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.center/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1588527482191" />
|
||||
<state width="939" height="355" key="GridCell.Tab.1.center/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234020859" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.1.center/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582226910716" />
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.left" timestamp="1588527482191">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.left/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1588527482191" />
|
||||
<state width="939" height="355" key="GridCell.Tab.1.left/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234020859" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.1.left/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582226910716" />
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.right" timestamp="1588527482192">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="197" key="GridCell.Tab.1.right/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1588527482192" />
|
||||
<state width="939" height="355" key="GridCell.Tab.1.right/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234020859" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.1.right/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582226910716" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.2.bottom" timestamp="1582226910717">
|
||||
<screen x="1920" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="939" height="355" key="GridCell.Tab.2.bottom/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234020859" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.2.bottom/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582226910717" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.2.center" timestamp="1582226910717">
|
||||
<screen x="1920" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="939" height="355" key="GridCell.Tab.2.center/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234020859" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.2.center/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582226910717" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.2.left" timestamp="1582226910717">
|
||||
<screen x="1920" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="939" height="355" key="GridCell.Tab.2.left/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234020859" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.2.left/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582226910717" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.2.right" timestamp="1582226910717">
|
||||
<screen x="1920" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="939" height="355" key="GridCell.Tab.2.right/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234020859" />
|
||||
<state width="1879" height="282" key="GridCell.Tab.2.right/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582226910717" />
|
||||
<state x="649" y="243" key="RollbackChangesDialog" timestamp="1580234562831">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="649" y="243" key="RollbackChangesDialog/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234562831" />
|
||||
<state x="440" y="95" key="SettingsEditor" timestamp="1580234010294">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="440" y="95" key="SettingsEditor/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234010294" />
|
||||
<state x="552" y="254" key="Vcs.Push.Dialog.v2" timestamp="1580234030515">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="552" y="254" key="Vcs.Push.Dialog.v2/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234030515" />
|
||||
<state x="656" y="343" key="com.intellij.ide.util.TipDialog" timestamp="1585806909949">
|
||||
<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="1585806909949" />
|
||||
<state x="2576" y="343" key="com.intellij.ide.util.TipDialog/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1582324367326" />
|
||||
<state x="656" y="343" key="com.intellij.ide.util.TipDialog/1920.0.1920.1040/0.0.1920.1040@0.0.1920.1040" timestamp="1580132930429" />
|
||||
<state x="458" y="257" width="1003" height="602" key="com.intellij.xdebugger.impl.breakpoints.ui.BreakpointsDialogFactory$2" timestamp="1580233159142">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="458" y="257" width="1003" height="602" key="com.intellij.xdebugger.impl.breakpoints.ui.BreakpointsDialogFactory$2/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580233159142" />
|
||||
<state x="213" y="285" width="1356" height="802" maximized="true" key="dock-window-1" timestamp="1585598224552">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="213" y="285" width="1356" height="802" maximized="true" key="dock-window-1/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1585598224552" />
|
||||
<state x="-809" y="141" width="1359" height="1028" key="dock-window-2" timestamp="1580018302720">
|
||||
<state x="-876" y="0" width="883" height="1047" key="dock-window-1/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594704170924" />
|
||||
<state x="-941" y="0" width="948" height="1047" key="dock-window-2" timestamp="1594707356239">
|
||||
<screen x="-1920" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="-809" y="141" width="1359" height="1028" key="dock-window-2/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1580018302720" />
|
||||
<state x="656" y="125" width="834" height="789" key="find.popup" timestamp="1580233407819">
|
||||
<state x="-941" y="0" width="948" height="1047" key="dock-window-2/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594707356239" />
|
||||
<state x="656" y="252" width="607" height="536" key="find.popup" timestamp="1594704998390">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="656" y="125" width="607" height="789" key="find.popup/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1580018609474" />
|
||||
<state x="656" y="125" width="834" height="789" key="find.popup/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580233407819" />
|
||||
<state x="656" y="125" width="624" height="789" key="find.popup/1920.0.1920.1040/0.0.1920.1040@0.0.1920.1040" timestamp="1580133295803" />
|
||||
<state x="698" y="312" key="git4idea.merge.GitMergeDialog" timestamp="1580234410981">
|
||||
<state x="656" y="252" width="607" height="536" key="find.popup/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594704998390" />
|
||||
<state x="623" y="225" width="672" height="678" key="search.everywhere.popup" timestamp="1594697967242">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="698" y="312" key="git4idea.merge.GitMergeDialog/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234410981" />
|
||||
<state x="633" y="312" key="git4idea.merge.GitPullDialog" timestamp="1580234511781">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="633" y="312" key="git4idea.merge.GitPullDialog/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234511781" />
|
||||
<state x="730" y="385" key="git4idea.rebase.GitRebaseDialog" timestamp="1580234534356">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="730" y="385" key="git4idea.rebase.GitRebaseDialog/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234534356" />
|
||||
<state x="709" y="415" key="git4idea.ui.GitResetDialog" timestamp="1580234483885">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="709" y="415" key="git4idea.ui.GitResetDialog/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1580234483885" />
|
||||
<state x="-1304" y="240" key="run.anything.popup" timestamp="1585596304658">
|
||||
<screen x="-1920" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="-1304" y="240" key="run.anything.popup/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1585596304658" />
|
||||
<state x="623" y="225" width="672" height="678" key="search.everywhere.popup" timestamp="1580063483764">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="623" y="225" width="672" height="678" key="search.everywhere.popup/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1580063483764" />
|
||||
<state x="623" y="225" width="672" height="678" key="search.everywhere.popup/0.0.1920.1040/-1920.0.1920.1040@0.0.1920.1040" timestamp="1594697967242" />
|
||||
</component>
|
||||
</project>
|
26
pom.xml
26
pom.xml
|
@ -6,7 +6,7 @@
|
|||
|
||||
<groupId>net.seanomik</groupId>
|
||||
<artifactId>tamablefoxes</artifactId>
|
||||
<version>1.6.1-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>Tamablefoxes</name>
|
||||
|
@ -39,8 +39,8 @@
|
|||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.15.2_\plugins\TamableFoxes-MC-v1.15.X-v${project.version}.jar</outputFile>
|
||||
<!--<outputFile>C:\Users\Checkium\Desktop\vps\smp\SMP\plugins\TamableFoxes-MC-v1.15.X-v${project.version}.jar</outputFile>-->
|
||||
<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.1_\plugins\TamableFoxes-MC-v1.15.X-v1.16.X-v${project.version}.jar</outputFile>
|
||||
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.15.2_\plugins\TamableFoxes-MC-v1.15.X-v${project.version}.jar</outputFile>-->
|
||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||
</configuration>
|
||||
</execution>
|
||||
|
@ -72,22 +72,22 @@
|
|||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>local.spigot.nms</groupId>
|
||||
<artifactId>AllSpigotNMS</artifactId>
|
||||
<version>LATEST</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/spigot-14-15-16-nms.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency> <!-- We need to do this so we get the spigot api without nms. -->
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot</artifactId>
|
||||
<version>1.15.2-R0.1-SNAPSHOT</version>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.14.4-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.WesJD.AnvilGUI</groupId>
|
||||
<artifactId>anvilgui</artifactId>
|
||||
<version>478e0c1</version>
|
||||
<version>master-ef71db62ec-1</version>
|
||||
</dependency>
|
||||
<!--<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot</artifactId>
|
||||
<scope>system</scope>
|
||||
<version>1.15.2</version>
|
||||
<systemPath>C:/Users/Checkium/Desktop/Servers/SMP/cache/patched_1.15.2.jar</systemPath>
|
||||
</dependency>-->
|
||||
</dependencies>
|
||||
</project>
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_15.command;
|
||||
package net.seanomik.tamablefoxes;
|
||||
|
||||
import net.seanomik.tamablefoxes.EntityTamableFox;
|
||||
import net.seanomik.tamablefoxes.TamableFoxes;
|
||||
import net.minecraft.server.v1_15_R1.EntityFox;
|
||||
import net.seanomik.tamablefoxes.Utils;
|
||||
import net.seanomik.tamablefoxes.versions.NMSInterface;
|
||||
import net.seanomik.tamablefoxes.io.LanguageConfig;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
|
@ -40,8 +37,8 @@ public class CommandSpawnTamableFox implements TabExecutor {
|
|||
switch (args[0]) {
|
||||
case "red":
|
||||
try {
|
||||
EntityTamableFox fox = plugin.spawnTamableFox(player.getLocation(), EntityFox.Type.RED);
|
||||
player.sendMessage(Utils.getPrefix() + ChatColor.RESET + LanguageConfig.getSpawnedFoxMessage(EntityFox.Type.RED));
|
||||
plugin.nmsInterface.spawnTamableFox(player.getLocation(), NMSInterface.FoxType.RED);
|
||||
player.sendMessage(Utils.getPrefix() + ChatColor.RESET + LanguageConfig.getSpawnedFoxMessage(NMSInterface.FoxType.RED));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
player.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureSpawn());
|
||||
|
@ -49,8 +46,8 @@ public class CommandSpawnTamableFox implements TabExecutor {
|
|||
break;
|
||||
case "snow":
|
||||
try {
|
||||
EntityTamableFox spawnedFox = plugin.spawnTamableFox(player.getLocation(), EntityFox.Type.SNOW);
|
||||
player.sendMessage(Utils.getPrefix() + ChatColor.RESET + LanguageConfig.getSpawnedFoxMessage(EntityFox.Type.SNOW));
|
||||
plugin.nmsInterface.spawnTamableFox(player.getLocation(), NMSInterface.FoxType.SNOW);
|
||||
player.sendMessage(Utils.getPrefix() + ChatColor.RESET + LanguageConfig.getSpawnedFoxMessage(NMSInterface.FoxType.SNOW));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
player.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureSpawn());
|
|
@ -1,62 +1,47 @@
|
|||
package net.seanomik.tamablefoxes;
|
||||
|
||||
import net.minecraft.server.v1_15_R1.*;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_15.command.CommandSpawnTamableFox;
|
||||
import net.seanomik.tamablefoxes.versions.NMSInterface;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_15_R1.NMSInterface_1_15_R1;
|
||||
import net.seanomik.tamablefoxes.io.LanguageConfig;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_16_R1.NMSInterface_1_16_R1;
|
||||
import org.bukkit.*;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
// @TODO:
|
||||
|
||||
/* @CHANGELOG (1.6.1-SNAPSHOT):
|
||||
* Fix a bug of duplicating water/lava buckets.
|
||||
/* @CHANGELOG (1.7-SNAPSHOT):
|
||||
* Update to Minecraft 1.16.1.
|
||||
* This jar file will also work with Minecraft 1.15.2, and 1.16.1.
|
||||
*/
|
||||
public final class TamableFoxes extends JavaPlugin implements Listener {
|
||||
private static TamableFoxes plugin;
|
||||
|
||||
private boolean versionSupported = true;
|
||||
|
||||
public NMSInterface nmsInterface;
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
plugin = this;
|
||||
|
||||
LanguageConfig.getConfig().saveDefault();
|
||||
|
||||
String version = Bukkit.getServer().getClass().getPackage().getName();
|
||||
if (!version.equals("org.bukkit.craftbukkit.v1_15_R1")) {
|
||||
String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
|
||||
if (version.equals("v1_15_R1")) {
|
||||
nmsInterface = new NMSInterface_1_15_R1();
|
||||
} else if (version.equals("v1_16_R1")) {
|
||||
nmsInterface = new NMSInterface_1_16_R1();
|
||||
} else {
|
||||
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getUnsupportedMCVersionRegister());
|
||||
versionSupported = false;
|
||||
return;
|
||||
}
|
||||
|
||||
try { // Replace the fox entity
|
||||
Field field = EntityTypes.FOX.getClass().getDeclaredField("ba");
|
||||
field.setAccessible(true);
|
||||
|
||||
// If the field is final, then make it non final
|
||||
if ((field.getModifiers() & Modifier.FINAL) == Modifier.FINAL) {
|
||||
Field fieldMutable = field.getClass().getDeclaredField("modifiers");
|
||||
fieldMutable.setAccessible(true);
|
||||
fieldMutable.set(field, fieldMutable.getInt(field) & ~Modifier.FINAL);
|
||||
fieldMutable.setAccessible(false);
|
||||
}
|
||||
|
||||
field.set(EntityTypes.FOX, (EntityTypes.b<EntityFox>) (type, world) -> new EntityTamableFox(type, world));
|
||||
|
||||
field.setAccessible(false);
|
||||
|
||||
getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced());
|
||||
} catch (Exception e) {
|
||||
//e.printStackTrace();
|
||||
getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace());
|
||||
}
|
||||
|
||||
// Display starting message
|
||||
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.YELLOW + LanguageConfig.getMCVersionLoading(version));
|
||||
nmsInterface.registerCustomFoxEntity();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -80,15 +65,6 @@ public final class TamableFoxes extends JavaPlugin implements Listener {
|
|||
getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.YELLOW + LanguageConfig.getSavingFoxMessage());
|
||||
}
|
||||
|
||||
|
||||
public EntityTamableFox spawnTamableFox(Location loc, EntityFox.Type type) {
|
||||
EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle();
|
||||
tamableFox.setFoxType(type);
|
||||
|
||||
return tamableFox;
|
||||
}
|
||||
|
||||
|
||||
public static TamableFoxes getPlugin() {
|
||||
return plugin;
|
||||
}
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
package net.seanomik.tamablefoxes.io;
|
||||
|
||||
import net.minecraft.server.v1_15_R1.EntityFox;
|
||||
import net.minecraft.server.v1_15_R1.IChatBaseComponent;
|
||||
import net.seanomik.tamablefoxes.TamableFoxes;
|
||||
import net.seanomik.tamablefoxes.versions.NMSInterface;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
|
||||
|
@ -83,6 +82,11 @@ public class LanguageConfig extends YamlConfiguration {
|
|||
return (super.getString(path).isEmpty()) ? super.getString(path) : ChatColor.translateAlternateColorCodes('&', super.getString(path));
|
||||
}
|
||||
|
||||
// This is the text that shows when registering the custom entity
|
||||
public static String getMCVersionLoading(String mcVersionStr) {
|
||||
return getConfig().getString("mc-version-loading").replaceAll("%MC_VERSION%", mcVersionStr);
|
||||
}
|
||||
|
||||
// Get the error that shows during register when they try to run the plugin on an unsupported mc version.
|
||||
public static String getUnsupportedMCVersionRegister() {
|
||||
return getConfig().getString("unsupported-mc-version-not-registering");
|
||||
|
@ -136,7 +140,7 @@ public class LanguageConfig extends YamlConfiguration {
|
|||
return getConfig().getString("only-run-by-player");
|
||||
}
|
||||
|
||||
public static String getSpawnedFoxMessage(EntityFox.Type type) {
|
||||
public static String getSpawnedFoxMessage(NMSInterface.FoxType type) {
|
||||
String typeStr = ((type == type.SNOW) ? ChatColor.AQUA + "Snow" : ChatColor.RED + "Red") + ChatColor.RESET;
|
||||
return getConfig().getString("spawned-fox-message").replaceAll("%TYPE%", typeStr);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
package net.seanomik.tamablefoxes.versions;
|
||||
|
||||
//import net.minecraft.server.v1_15_R1.EntityFox;
|
||||
import net.seanomik.tamablefoxes.TamableFoxes;
|
||||
import org.bukkit.Location;
|
||||
|
||||
public interface NMSInterface {
|
||||
enum FoxType {
|
||||
RED,
|
||||
SNOW
|
||||
}
|
||||
|
||||
public void registerCustomFoxEntity();
|
||||
public void spawnTamableFox(Location loc, FoxType type);
|
||||
}
|
|
@ -1,18 +1,20 @@
|
|||
package net.seanomik.tamablefoxes;
|
||||
package net.seanomik.tamablefoxes.versions.version_1_15_R1;
|
||||
|
||||
import net.minecraft.server.v1_15_R1.*;
|
||||
import net.seanomik.tamablefoxes.TamableFoxes;
|
||||
import net.seanomik.tamablefoxes.Utils;
|
||||
import net.seanomik.tamablefoxes.io.Config;
|
||||
import net.seanomik.tamablefoxes.io.LanguageConfig;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_15.pathfinding.*;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding.*;
|
||||
import net.wesjd.anvilgui.AnvilGUI;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.craftbukkit.libs.jline.internal.Nullable;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.event.CraftEventFactory;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.entity.EntityRegainHealthEvent;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.*;
|
|
@ -0,0 +1,48 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_15_R1;
|
||||
|
||||
import net.minecraft.server.v1_15_R1.EntityFox;
|
||||
import net.minecraft.server.v1_15_R1.EntityTypes;
|
||||
import net.seanomik.tamablefoxes.TamableFoxes;
|
||||
import net.seanomik.tamablefoxes.Utils;
|
||||
import net.seanomik.tamablefoxes.io.LanguageConfig;
|
||||
import net.seanomik.tamablefoxes.versions.NMSInterface;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
public class NMSInterface_1_15_R1 implements NMSInterface {
|
||||
@Override
|
||||
public void registerCustomFoxEntity() {
|
||||
try { // Replace the fox entity
|
||||
Field field = EntityTypes.FOX.getClass().getDeclaredField("ba");
|
||||
field.setAccessible(true);
|
||||
|
||||
// If the field is final, then make it non final
|
||||
if ((field.getModifiers() & Modifier.FINAL) == Modifier.FINAL) {
|
||||
Field fieldMutable = field.getClass().getDeclaredField("modifiers");
|
||||
fieldMutable.setAccessible(true);
|
||||
fieldMutable.set(field, fieldMutable.getInt(field) & ~Modifier.FINAL);
|
||||
fieldMutable.setAccessible(false);
|
||||
}
|
||||
|
||||
field.set(EntityTypes.FOX, (EntityTypes.b<EntityFox>) (type, world) -> new EntityTamableFox(type, world));
|
||||
|
||||
field.setAccessible(false);
|
||||
|
||||
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced());
|
||||
} catch (Exception e) {
|
||||
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void spawnTamableFox(Location loc, FoxType type) {
|
||||
EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle();
|
||||
tamableFox.setFoxType( (type == FoxType.RED) ? EntityFox.Type.RED : EntityFox.Type.SNOW );
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_15.pathfinding;
|
||||
package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding;
|
||||
|
||||
import net.seanomik.tamablefoxes.EntityTamableFox;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox;
|
||||
import net.minecraft.server.v1_15_R1.*;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity;
|
|
@ -1,6 +1,6 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_15.pathfinding;
|
||||
package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding;
|
||||
|
||||
import net.seanomik.tamablefoxes.EntityTamableFox;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox;
|
||||
import net.minecraft.server.v1_15_R1.*;
|
||||
import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
|
||||
|
|
@ -1,9 +1,9 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_15.pathfinding;
|
||||
package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding;
|
||||
|
||||
import net.minecraft.server.v1_15_R1.EntityLiving;
|
||||
import net.minecraft.server.v1_15_R1.PathfinderGoalMeleeAttack;
|
||||
import net.minecraft.server.v1_15_R1.SoundEffects;
|
||||
import net.seanomik.tamablefoxes.EntityTamableFox;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox;
|
||||
|
||||
public class FoxPathfinderGoalMeleeAttack extends PathfinderGoalMeleeAttack {
|
||||
EntityTamableFox tamableFox;
|
|
@ -1,6 +1,6 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_15.pathfinding;
|
||||
package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding;
|
||||
|
||||
import net.seanomik.tamablefoxes.EntityTamableFox;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox;
|
||||
import net.minecraft.server.v1_15_R1.EntityLiving;
|
||||
import net.minecraft.server.v1_15_R1.PathfinderGoalTarget;
|
||||
import net.minecraft.server.v1_15_R1.PathfinderTargetCondition;
|
|
@ -1,9 +1,9 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_15.pathfinding;
|
||||
package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding;
|
||||
|
||||
import net.minecraft.server.v1_15_R1.EntityLiving;
|
||||
import net.minecraft.server.v1_15_R1.PathfinderGoalTarget;
|
||||
import net.minecraft.server.v1_15_R1.PathfinderTargetCondition;
|
||||
import net.seanomik.tamablefoxes.EntityTamableFox;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox;
|
||||
import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
|
||||
|
||||
import java.util.EnumSet;
|
|
@ -1,8 +1,8 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_15.pathfinding;
|
||||
package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding;
|
||||
|
||||
import net.minecraft.server.v1_15_R1.EntityFox;
|
||||
import net.minecraft.server.v1_15_R1.PathfinderGoalPanic;
|
||||
import net.seanomik.tamablefoxes.EntityTamableFox;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_15.pathfinding;
|
||||
package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding;
|
||||
|
||||
import net.seanomik.tamablefoxes.EntityTamableFox;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox;
|
||||
import net.minecraft.server.v1_15_R1.EntityLiving;
|
||||
import net.minecraft.server.v1_15_R1.PathfinderGoal;
|
||||
|
|
@ -0,0 +1,550 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_16_R1;
|
||||
|
||||
import net.minecraft.server.v1_16_R1.*;
|
||||
import net.seanomik.tamablefoxes.TamableFoxes;
|
||||
import net.seanomik.tamablefoxes.Utils;
|
||||
import net.seanomik.tamablefoxes.io.Config;
|
||||
import net.seanomik.tamablefoxes.io.LanguageConfig;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding.*;
|
||||
import net.wesjd.anvilgui.AnvilGUI;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.craftbukkit.libs.jline.internal.Nullable;
|
||||
import org.bukkit.craftbukkit.v1_16_R1.event.CraftEventFactory;
|
||||
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.entity.EntityRegainHealthEvent;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.*;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
public class EntityTamableFox extends EntityFox {
|
||||
|
||||
protected static final DataWatcherObject<Byte> tamed;
|
||||
protected static final DataWatcherObject<Optional<UUID>> ownerUUID;
|
||||
|
||||
private static final DataWatcherObject<Byte> bw; // DATA_FLAGS_ID
|
||||
private static final Predicate<Entity> bC; // AVOID_PLAYERS
|
||||
|
||||
static {
|
||||
tamed = DataWatcher.a(EntityTamableFox.class, DataWatcherRegistry.a);
|
||||
ownerUUID = DataWatcher.a(EntityTamableFox.class, DataWatcherRegistry.o);
|
||||
|
||||
bw = DataWatcher.a(EntityFox.class, DataWatcherRegistry.a);
|
||||
bC = (entity) -> !entity.bt() && IEntitySelector.e.test(entity);
|
||||
}
|
||||
|
||||
List<PathfinderGoal> untamedGoals;
|
||||
private FoxPathfinderGoalSit goalSit;
|
||||
|
||||
public EntityTamableFox(EntityTypes<? extends EntityFox> entitytypes, World world) {
|
||||
super(entitytypes, world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initPathfinder() {
|
||||
try {
|
||||
this.goalSit = new FoxPathfinderGoalSit(this);
|
||||
this.goalSelector.a(1, goalSit);
|
||||
|
||||
// Wild animal attacking
|
||||
Field landTargetGoal = this.getClass().getSuperclass().getDeclaredField("bD"); // landTargetGoal
|
||||
landTargetGoal.setAccessible(true);
|
||||
landTargetGoal.set(this, new PathfinderGoalNearestAttackableTarget(this, EntityAnimal.class, 10, false, false, (entityliving) -> {
|
||||
return (!isTamed() || (Config.doesTamedAttackWildAnimals() && isTamed())) && (entityliving instanceof EntityChicken || entityliving instanceof EntityRabbit);
|
||||
}));
|
||||
|
||||
Field turtleEggTargetGoal = this.getClass().getSuperclass().getDeclaredField("bE"); // turtleEggTargetGoal
|
||||
turtleEggTargetGoal.setAccessible(true);
|
||||
turtleEggTargetGoal.set(this, new PathfinderGoalNearestAttackableTarget(this, EntityTurtle.class, 10, false, false, (entityLiving) -> {
|
||||
return (!isTamed() || (Config.doesTamedAttackWildAnimals() && isTamed())) && EntityTurtle.bv.test((EntityLiving) entityLiving);
|
||||
}));
|
||||
|
||||
Field fishTargetGoal = this.getClass().getSuperclass().getDeclaredField("bF"); // fishTargetGoal
|
||||
fishTargetGoal.setAccessible(true);
|
||||
fishTargetGoal.set(this, new PathfinderGoalNearestAttackableTarget(this, EntityFish.class, 20, false, false, (entityliving) -> {
|
||||
return (!isTamed() || (Config.doesTamedAttackWildAnimals() && isTamed())) && entityliving instanceof EntityFishSchool;
|
||||
}));
|
||||
|
||||
this.goalSelector.a(0, getFoxInnerPathfinderGoal("g")); // FoxFloatGoal
|
||||
this.goalSelector.a(1, getFoxInnerPathfinderGoal("b")); // FaceplantGoal
|
||||
this.goalSelector.a(2, new FoxPathfinderGoalPanic(this, 2.2D)); // FoxPanicGoal
|
||||
this.goalSelector.a(3, getFoxInnerPathfinderGoal("e", Arrays.asList(1.0D), Arrays.asList(double.class))); // FoxBreedGoal
|
||||
|
||||
this.goalSelector.a(4, new PathfinderGoalAvoidTarget(this, EntityHuman.class, 16.0F, 1.6D, 1.4D, (entityliving) -> {
|
||||
return !isTamed() && bC.test((EntityLiving) entityliving);
|
||||
}));
|
||||
this.goalSelector.a(4, new PathfinderGoalAvoidTarget(this, EntityWolf.class, 8.0F, 1.6D, 1.4D, (entityliving) -> {
|
||||
return !((EntityWolf)entityliving).isTamed() && !this.isDefending();
|
||||
}));
|
||||
this.goalSelector.a(4, new PathfinderGoalAvoidTarget(this, EntityPolarBear.class, 8.0F, 1.6D, 1.4D, (entityliving) -> {
|
||||
return !this.isDefending();
|
||||
}));
|
||||
|
||||
this.goalSelector.a(5, getFoxInnerPathfinderGoal("u")); // StalkPreyGoal
|
||||
this.goalSelector.a(6, new EntityFox.o()); // FoxPounceGoal
|
||||
this.goalSelector.a(7, getFoxInnerPathfinderGoal("l", Arrays.asList(1.2000000476837158D, true), Arrays.asList(double.class, boolean.class))); // FoxMeleeAttackGoal
|
||||
this.goalSelector.a(8, getFoxInnerPathfinderGoal("h", Arrays.asList(this, 1.25D), Arrays.asList(EntityFox.class, double.class))); // FoxFollowParentGoal
|
||||
this.goalSelector.a(8, new FoxPathfinderGoalSleepWithOwner(this));
|
||||
this.goalSelector.a(9, new FoxPathfinderGoalFollowOwner(this, 1.3D, 10.0F, 2.0F, false));
|
||||
this.goalSelector.a(10, new PathfinderGoalLeapAtTarget(this, 0.4F));
|
||||
this.goalSelector.a(11, new PathfinderGoalRandomStrollLand(this, 1.0D));
|
||||
this.goalSelector.a(11, getFoxInnerPathfinderGoal("p")); // FoxSearchForItemsGoal
|
||||
this.goalSelector.a(12, getFoxInnerPathfinderGoal("j", Arrays.asList(this, EntityHuman.class, 24.0f),
|
||||
Arrays.asList(EntityInsentient.class, Class.class, float.class))); // LookAtPlayer
|
||||
|
||||
//this.goalSelector.a(10, new EntityFox.f(1.2000000476837158D, 12, 2));
|
||||
|
||||
this.targetSelector.a(1, new FoxPathfinderGoalOwnerHurtByTarget(this));
|
||||
this.targetSelector.a(2, new FoxPathfinderGoalOwnerHurtTarget(this));
|
||||
this.targetSelector.a(3, (new FoxPathfinderGoalHurtByTarget(this)).a(new Class[0]));
|
||||
|
||||
// Assign all the untamed goals that will later be removed.
|
||||
untamedGoals = new ArrayList<>();
|
||||
|
||||
// SleepGoal
|
||||
PathfinderGoal sleep = getFoxInnerPathfinderGoal("t");
|
||||
this.goalSelector.a(7, sleep);
|
||||
untamedGoals.add(sleep);
|
||||
|
||||
// PerchAndSearch (Random sitting?)
|
||||
PathfinderGoal perchAndSearch = getFoxInnerPathfinderGoal("r");
|
||||
this.goalSelector.a(13, perchAndSearch);
|
||||
untamedGoals.add(perchAndSearch);
|
||||
|
||||
// FoxEatBerriesGoal (Pick berry bushes)
|
||||
PathfinderGoal eatBerries = new f(1.2000000476837158D, 12, 2);
|
||||
this.goalSelector.a(11, eatBerries);
|
||||
untamedGoals.add(eatBerries); // Maybe this should be configurable too?
|
||||
|
||||
// SeekShelterGoal
|
||||
PathfinderGoal seekShelter = getFoxInnerPathfinderGoal("s", Arrays.asList(1.25D), Arrays.asList(double.class));
|
||||
this.goalSelector.a(6, seekShelter);
|
||||
untamedGoals.add(seekShelter);
|
||||
|
||||
PathfinderGoal strollThroughVillage = getFoxInnerPathfinderGoal("q", Arrays.asList(32, 200), Arrays.asList(int.class, int.class));
|
||||
this.goalSelector.a(9, strollThroughVillage); // StrollThroughVillage
|
||||
untamedGoals.add(strollThroughVillage);
|
||||
|
||||
// This is DefendTrustedTargetGoal so I don't think its needed
|
||||
/*this.targetSelector.a(3, new EntityFox.a(EntityLiving.class, false, false, (entityliving) -> {
|
||||
return bA.test(entityliving) && !this.c(entityliving.getUniqueID());
|
||||
}));*/
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/* I need to find out a new way to do this.
|
||||
* 1.16.1 introduced a new way that attributes are created. These methods are static methods
|
||||
* which makes it so I can't override them. Each entity also has a unique method name.
|
||||
*/
|
||||
/*protected void initAttributes() {
|
||||
this.getAttributeMap().b(GenericAttributes.MAX_HEALTH);
|
||||
this.getAttributeMap().b(GenericAttributes.KNOCKBACK_RESISTANCE);
|
||||
this.getAttributeMap().b(GenericAttributes.MOVEMENT_SPEED);
|
||||
this.getAttributeMap().b(GenericAttributes.ARMOR);
|
||||
this.getAttributeMap().b(GenericAttributes.ARMOR_TOUGHNESS);
|
||||
|
||||
// Default value is 32, might want to make this configurable in the future
|
||||
this.getAttributeMap().b(GenericAttributes.FOLLOW_RANGE);//.setValue(32.0D);
|
||||
EntityLiving.cK().a(GenericAttributes.FOLLOW_RANGE, 16.0D).
|
||||
//this.ck(GenericAttributes.FOLLOW_RANGE, 32.0D);
|
||||
|
||||
this.getAttributeMap().b(GenericAttributes.ATTACK_KNOCKBACK);
|
||||
|
||||
this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(0.30000001192092896D);
|
||||
|
||||
if (!isTamed()) {
|
||||
this.getAttributeInstance(GenericAttributes.MAX_HEALTH).setValue(10.0D);
|
||||
this.getAttributeMap().b(GenericAttributes.ATTACK_DAMAGE).setValue(2.0D);
|
||||
} else {
|
||||
this.getAttributeInstance(GenericAttributes.MAX_HEALTH).setValue(24.0D);
|
||||
this.getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).setValue(3.0D);
|
||||
}
|
||||
}*/
|
||||
|
||||
// deobf: getFlag
|
||||
private boolean t(int i) {
|
||||
return ((Byte)this.datawatcher.get(bw) & i) != 0;
|
||||
}
|
||||
|
||||
// deobf: 'isDefending' from 'fc'
|
||||
public boolean isDefending() {
|
||||
return this.t(128);
|
||||
}
|
||||
|
||||
// deobf: setFlag
|
||||
/*public void d(int i, boolean flag) {
|
||||
if (flag) {
|
||||
this.datawatcher.set(bw, (byte)((Byte)this.datawatcher.get(bw) | i));
|
||||
} else {
|
||||
this.datawatcher.set(bw, (byte)((Byte)this.datawatcher.get(bw) & ~i));
|
||||
}
|
||||
}*/
|
||||
|
||||
/*public void x(boolean flag) {
|
||||
this.datawatcher.set(bA, flag);
|
||||
}*/
|
||||
|
||||
public static Object getPrivateField(String fieldName, Class clazz, Object object) {
|
||||
Field field;
|
||||
Object o = null;
|
||||
|
||||
try {
|
||||
field = clazz.getDeclaredField(fieldName);
|
||||
field.setAccessible(true);
|
||||
o = field.get(object);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
protected void initDatawatcher() {
|
||||
super.initDatawatcher();
|
||||
this.datawatcher.register(tamed, (byte) 0);
|
||||
this.datawatcher.register(ownerUUID, Optional.empty());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveData(NBTTagCompound compound) {
|
||||
super.saveData(compound);
|
||||
if (this.getOwnerUUID() == null) {
|
||||
compound.setString("OwnerUUID", "");
|
||||
} else {
|
||||
compound.setString("OwnerUUID", this.getOwnerUUID().toString());
|
||||
}
|
||||
|
||||
compound.setBoolean("Sitting", this.isSitting());
|
||||
}
|
||||
|
||||
public void loadData(NBTTagCompound compound) {
|
||||
super.loadData(compound);
|
||||
String ownerUuid;
|
||||
|
||||
if (compound.hasKeyOfType("OwnerUUID", 8)) {
|
||||
ownerUuid = compound.getString("OwnerUUID");
|
||||
} else {
|
||||
String var2 = compound.getString("Owner");
|
||||
ownerUuid = NameReferencingFileConverter.a(this.getMinecraftServer(), var2).toString();
|
||||
}
|
||||
|
||||
if (!ownerUuid.isEmpty()) {
|
||||
try {
|
||||
this.setOwnerUUID(UUID.fromString(ownerUuid));
|
||||
this.setTamed(true);
|
||||
} catch (Throwable throwable) {
|
||||
this.setTamed(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (this.goalSit != null) {
|
||||
this.goalSit.setSitting(compound.getBoolean("Sitting"));
|
||||
}
|
||||
|
||||
this.setSitting(compound.getBoolean("Sitting"));
|
||||
}
|
||||
|
||||
public boolean isTamed() {
|
||||
return ((Byte) this.datawatcher.get(tamed) & 4) != 0;
|
||||
}
|
||||
|
||||
public void setTamed(boolean tamed_) {
|
||||
byte isTamed = this.datawatcher.get(tamed);
|
||||
if (tamed_) {
|
||||
this.datawatcher.set(tamed, (byte) (isTamed | 4));
|
||||
} else {
|
||||
this.datawatcher.set(tamed, (byte) (isTamed & -5));
|
||||
}
|
||||
this.reassessTameGoals();
|
||||
|
||||
if (tamed_) {
|
||||
this.getAttributeInstance(GenericAttributes.MAX_HEALTH).setValue(24.0D);
|
||||
this.getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).setValue(3.0D);
|
||||
this.setHealth(this.getMaxHealth());
|
||||
} else {
|
||||
this.getAttributeInstance(GenericAttributes.MAX_HEALTH).setValue(10.0D);
|
||||
this.getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).setValue(2.0D);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove untamed goals if its tamed.
|
||||
private void reassessTameGoals() {
|
||||
if (!isTamed()) return;
|
||||
|
||||
for (PathfinderGoal untamedGoal : untamedGoals) {
|
||||
this.goalSelector.a(untamedGoal);
|
||||
}
|
||||
}
|
||||
|
||||
// deobf: mobInteract
|
||||
public EnumInteractionResult b(EntityHuman entityhuman, EnumHand enumhand) {
|
||||
ItemStack itemstack = entityhuman.b(enumhand);
|
||||
Item item = itemstack.getItem();
|
||||
|
||||
if (itemstack.getItem() instanceof ItemMonsterEgg) {
|
||||
return super.a(entityhuman, enumhand);
|
||||
} else {
|
||||
if (this.isTamed()) {
|
||||
|
||||
// Heal the fox if its health is below the max.
|
||||
if (item.isFood() && item.getFoodInfo().c() && this.getHealth() < this.getMaxHealth()) {
|
||||
// Only remove the item from the player if they're in survival mode.
|
||||
if (!entityhuman.abilities.canInstantlyBuild) {
|
||||
itemstack.subtract(1);
|
||||
}
|
||||
|
||||
this.heal((float)item.getFoodInfo().getNutrition(), EntityRegainHealthEvent.RegainReason.EATING);
|
||||
return EnumInteractionResult.CONSUME;
|
||||
}
|
||||
|
||||
if (isOwnedBy(entityhuman)) {
|
||||
// This super method checks if the fox can breed or not.
|
||||
EnumInteractionResult flag = super.b(entityhuman, enumhand);
|
||||
|
||||
// If the player is not sneaking and the fox cannot breed, then make the fox sit.
|
||||
// @TODO: Do I need to use this.eQ() instead of flag != EnumInteractionResult.SUCCESS?
|
||||
if (!entityhuman.isSneaking() && (flag != EnumInteractionResult.SUCCESS || this.isBaby())) {
|
||||
this.goalSit.setSitting(!this.isSitting());
|
||||
return flag;
|
||||
} else if (entityhuman.isSneaking()) { // Swap/Put/Take item from fox.
|
||||
// Ignore buckets since they can be easily duplicated.
|
||||
if (itemstack.getItem() == Items.BUCKET || itemstack.getItem() == Items.LAVA_BUCKET || itemstack.getItem() == Items.WATER_BUCKET) {
|
||||
return EnumInteractionResult.PASS;
|
||||
}
|
||||
|
||||
if (!this.getEquipment(EnumItemSlot.MAINHAND).isEmpty()) {
|
||||
getBukkitEntity().getWorld().dropItem(getBukkitEntity().getLocation(), CraftItemStack.asBukkitCopy(this.getEquipment(EnumItemSlot.MAINHAND)));
|
||||
this.setSlot(EnumItemSlot.MAINHAND, new ItemStack(Items.AIR));
|
||||
}
|
||||
|
||||
// Run this task async to make sure to not slow the server down.
|
||||
// This is needed due to the item being remove as soon as its put in the foxes mouth.
|
||||
Bukkit.getScheduler().runTaskLaterAsynchronously(TamableFoxes.getPlugin(), ()-> {
|
||||
// Put item in mouth
|
||||
if (item != Items.AIR) {
|
||||
ItemStack c = itemstack.cloneItemStack();
|
||||
c.setCount(1);
|
||||
|
||||
// Only remove the item from the player if they're in survival mode.
|
||||
if (!entityhuman.abilities.canInstantlyBuild) {
|
||||
itemstack.subtract(1);
|
||||
}
|
||||
|
||||
this.setSlot(EnumItemSlot.MAINHAND, c);
|
||||
}
|
||||
}, (long) 0.1);
|
||||
|
||||
return EnumInteractionResult.SUCCESS;
|
||||
//return true;
|
||||
}
|
||||
}
|
||||
} else if (item == Items.CHICKEN) {
|
||||
// Check if the player has permissions to tame the fox
|
||||
if (Config.canPlayerTameFox((Player) entityhuman.getBukkitEntity())) {
|
||||
// Only remove the item from the player if they're in survival mode.
|
||||
if (!entityhuman.abilities.canInstantlyBuild) {
|
||||
itemstack.subtract(1);
|
||||
}
|
||||
|
||||
// 0.33% chance to tame the fox, also check if the called tame entity event is cancelled or not.
|
||||
if (this.random.nextInt(3) == 0 && !CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) {
|
||||
this.tame(entityhuman);
|
||||
|
||||
// Remove all navigation when tamed.
|
||||
this.navigation.o();
|
||||
this.setGoalTarget(null);
|
||||
this.goalSit.setSitting(true);
|
||||
|
||||
getBukkitEntity().getWorld().spawnParticle(org.bukkit.Particle.HEART, getBukkitEntity().getLocation(), 6, 0.5D, 0.5D, 0.5D);
|
||||
|
||||
// Give player tamed message.
|
||||
((Player) entityhuman.getBukkitEntity()).sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getTamedMessage());
|
||||
|
||||
// Let the player choose the new fox's name if its enabled in config.
|
||||
if (Config.askForNameAfterTaming()) {
|
||||
Player player = (Player) entityhuman.getBukkitEntity();
|
||||
|
||||
player.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getTamingAskingName());
|
||||
new AnvilGUI.Builder()
|
||||
.onComplete((plr, input) -> { // Called when the inventory output slot is clicked
|
||||
if (!input.equals("")) {
|
||||
org.bukkit.entity.Entity tamableFox = this.getBukkitEntity();
|
||||
|
||||
// This will auto format the name for config settings.
|
||||
String foxName = LanguageConfig.getFoxNameFormat(input, player.getDisplayName());
|
||||
|
||||
tamableFox.setCustomName(foxName);
|
||||
tamableFox.setCustomNameVisible(true);
|
||||
plr.sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getTamingChosenPerfect(input));
|
||||
}
|
||||
|
||||
return AnvilGUI.Response.close();
|
||||
})
|
||||
.text("Fox name") // Sets the text the GUI should start with
|
||||
.plugin(TamableFoxes.getPlugin()) // Set the plugin instance
|
||||
.open(player); // Opens the GUI for the player provided
|
||||
}
|
||||
} else {
|
||||
getBukkitEntity().getWorld().spawnParticle(org.bukkit.Particle.SMOKE_NORMAL, getBukkitEntity().getLocation(), 10, 0.2D, 0.2D, 0.2D, 0.15D);
|
||||
}
|
||||
}
|
||||
|
||||
return EnumInteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
return super.b(entityhuman, enumhand);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityTamableFox createChild(EntityAgeable entityageable) {
|
||||
EntityTamableFox entityFox = (EntityTamableFox) EntityTypes.FOX.a(this.world);
|
||||
entityFox.setFoxType(this.getFoxType());
|
||||
|
||||
UUID uuid = this.getOwnerUUID();
|
||||
if (uuid != null) {
|
||||
entityFox.setOwnerUUID(uuid);
|
||||
entityFox.setTamed(true);
|
||||
}
|
||||
|
||||
return entityFox;
|
||||
}
|
||||
|
||||
public boolean mate(EntityAnimal entityanimal) {
|
||||
if (entityanimal == this) {
|
||||
return false;
|
||||
} else if (!(entityanimal instanceof EntityTamableFox)) {
|
||||
return false;
|
||||
} else {
|
||||
EntityTamableFox entityFox = (EntityTamableFox) entityanimal;
|
||||
return (!entityFox.isSitting() && (this.isInLove() && entityFox.isInLove()));
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public UUID getOwnerUUID() {
|
||||
return (UUID) ((Optional) this.datawatcher.get(ownerUUID)).orElse(null);
|
||||
}
|
||||
|
||||
public void setOwnerUUID(@Nullable UUID ownerUuid) {
|
||||
this.datawatcher.set(ownerUUID, Optional.ofNullable(ownerUuid));
|
||||
}
|
||||
|
||||
public void tame(EntityHuman owner) {
|
||||
this.setTamed(true);
|
||||
this.setOwnerUUID(owner.getUniqueID());
|
||||
|
||||
// Give the player the taming advancement.
|
||||
if (owner instanceof EntityPlayer) {
|
||||
CriterionTriggers.x.a((EntityPlayer)owner, this);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public EntityLiving getOwner() {
|
||||
try {
|
||||
UUID ownerUuid = this.getOwnerUUID();
|
||||
return ownerUuid == null ? null : this.world.b(ownerUuid);
|
||||
} catch (IllegalArgumentException var2) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Only attack entity if its not attacking owner.
|
||||
@Override
|
||||
public boolean d(EntityLiving entity) {
|
||||
return !this.isOwnedBy(entity) && super.d(entity);
|
||||
}
|
||||
|
||||
public boolean isOwnedBy(EntityLiving entity) {
|
||||
return entity == this.getOwner();
|
||||
}
|
||||
|
||||
/*
|
||||
deobf: wantsToAttack (Copied from EntityWolf)
|
||||
This code being from EntityWolf also means that wolves will want to attack foxes
|
||||
Our life would be so much easier if we could extend both EntityFox and EntityTameableAnimal
|
||||
*/
|
||||
public boolean a(EntityLiving entityliving, EntityLiving entityliving1) {
|
||||
if (!(entityliving instanceof EntityCreeper) && !(entityliving instanceof EntityGhast)) {
|
||||
if (entityliving instanceof EntityTamableFox) {
|
||||
EntityTamableFox entityFox = (EntityTamableFox) entityliving;
|
||||
return !entityFox.isTamed() || entityFox.getOwner() != entityliving1;
|
||||
} else {
|
||||
return (!(entityliving instanceof EntityHuman)
|
||||
|| !(entityliving1 instanceof EntityHuman) ||
|
||||
((EntityHuman) entityliving1).a((EntityHuman) entityliving)) && ((!(entityliving instanceof EntityHorseAbstract)
|
||||
|| !((EntityHorseAbstract) entityliving).isTamed()) && (!(entityliving instanceof EntityTameableAnimal)
|
||||
|| !((EntityTameableAnimal) entityliving).isTamed()));
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Set the scoreboard team to the same as the owner if its tamed.
|
||||
public ScoreboardTeamBase getScoreboardTeam() {
|
||||
if (this.isTamed()) {
|
||||
EntityLiving var0 = this.getOwner();
|
||||
if (var0 != null) {
|
||||
return var0.getScoreboardTeam();
|
||||
}
|
||||
}
|
||||
|
||||
return super.getScoreboardTeam();
|
||||
}
|
||||
|
||||
// Override isAlliedTo (Entity::r(Entity))
|
||||
public boolean r(Entity entity) {
|
||||
if (this.isTamed()) {
|
||||
EntityLiving entityOwner = this.getOwner();
|
||||
if (entity == entityOwner) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (entityOwner != null) {
|
||||
return entityOwner.r(entity);
|
||||
}
|
||||
}
|
||||
return super.r(entity);
|
||||
}
|
||||
|
||||
// When the fox dies, show a chat message.
|
||||
public void die(DamageSource damageSource) {
|
||||
if (!this.world.isClientSide && this.world.getGameRules().getBoolean(GameRules.SHOW_DEATH_MESSAGES) && this.getOwner() instanceof EntityPlayer) {
|
||||
this.getOwner().sendMessage(this.getCombatTracker().getDeathMessage(), getOwnerUUID());
|
||||
}
|
||||
|
||||
super.die(damageSource);
|
||||
}
|
||||
|
||||
|
||||
private PathfinderGoal getFoxInnerPathfinderGoal(String innerName, List<Object> args, List<Class<?>> argTypes) {
|
||||
return (PathfinderGoal) Utils.instantiatePrivateInnerClass(EntityFox.class, innerName, this, args, argTypes);
|
||||
}
|
||||
|
||||
private PathfinderGoal getFoxInnerPathfinderGoal(String innerName) {
|
||||
return (PathfinderGoal) Utils.instantiatePrivateInnerClass(EntityFox.class, innerName, this, Arrays.asList(), Arrays.asList());
|
||||
}
|
||||
|
||||
private void clearPathFinderGoals() {
|
||||
Set<?> goalSet = (Set<?>) getPrivateField("d", PathfinderGoalSelector.class, goalSelector);
|
||||
Set<?> targetSet = (Set<?>) getPrivateField("d", PathfinderGoalSelector.class, targetSelector);
|
||||
goalSet.clear();
|
||||
targetSet.clear();
|
||||
|
||||
Map<?, ?> goalMap = (Map<?, ?>) getPrivateField("c", PathfinderGoalSelector.class, goalSelector);
|
||||
Map<?, ?> targetMap = (Map<?, ?>) getPrivateField("c", PathfinderGoalSelector.class, targetSelector);
|
||||
goalMap.clear();
|
||||
targetMap.clear();
|
||||
|
||||
EnumSet<?> goalEnumSet = (EnumSet<?>) getPrivateField("f", PathfinderGoalSelector.class, goalSelector);
|
||||
EnumSet<?> targetEnumSet = (EnumSet<?>) getPrivateField("f", PathfinderGoalSelector.class, targetSelector);
|
||||
goalEnumSet.clear();
|
||||
targetEnumSet.clear();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_16_R1;
|
||||
|
||||
import net.minecraft.server.v1_16_R1.EntityTypes;
|
||||
import net.minecraft.server.v1_16_R1.EntityFox;
|
||||
import net.seanomik.tamablefoxes.TamableFoxes;
|
||||
import net.seanomik.tamablefoxes.Utils;
|
||||
import net.seanomik.tamablefoxes.io.LanguageConfig;
|
||||
import net.seanomik.tamablefoxes.versions.NMSInterface;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.craftbukkit.v1_16_R1.entity.CraftEntity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
public class NMSInterface_1_16_R1 implements NMSInterface {
|
||||
|
||||
@Override
|
||||
public void registerCustomFoxEntity() {
|
||||
try { // Replace the fox entity
|
||||
Field field = EntityTypes.FOX.getClass().getDeclaredField("be");
|
||||
field.setAccessible(true);
|
||||
|
||||
// If the field is final, then make it non final
|
||||
if ((field.getModifiers() & Modifier.FINAL) == Modifier.FINAL) {
|
||||
Field fieldMutable = field.getClass().getDeclaredField("modifiers");
|
||||
fieldMutable.setAccessible(true);
|
||||
fieldMutable.set(field, fieldMutable.getInt(field) & ~Modifier.FINAL);
|
||||
fieldMutable.setAccessible(false);
|
||||
}
|
||||
|
||||
field.set(EntityTypes.FOX, (EntityTypes.b<EntityFox>) (type, world) -> new EntityTamableFox(type, world));
|
||||
|
||||
field.setAccessible(false);
|
||||
|
||||
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced());
|
||||
} catch (Exception e) {
|
||||
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void spawnTamableFox(Location loc, FoxType type) {
|
||||
EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle();
|
||||
tamableFox.setFoxType( (type == FoxType.RED) ? EntityFox.Type.RED : EntityFox.Type.SNOW );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,139 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding;
|
||||
|
||||
import net.minecraft.server.v1_16_R1.*;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.craftbukkit.v1_16_R1.entity.CraftEntity;
|
||||
import org.bukkit.event.entity.EntityTeleportEvent;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
public class FoxPathfinderGoalFollowOwner extends PathfinderGoal {
|
||||
private final EntityTamableFox a;
|
||||
private EntityLiving b;
|
||||
private final IWorldReader c;
|
||||
private final double d;
|
||||
private final NavigationAbstract e;
|
||||
private int f;
|
||||
private final float g;
|
||||
private final float h;
|
||||
private float i;
|
||||
private final boolean j;
|
||||
|
||||
public FoxPathfinderGoalFollowOwner(EntityTamableFox tamableFox, double d0, float f, float f1, boolean flag) {
|
||||
this.a = tamableFox;
|
||||
this.c = tamableFox.world;
|
||||
this.d = d0;
|
||||
this.e = tamableFox.getNavigation();
|
||||
this.h = f;
|
||||
this.g = f1;
|
||||
this.j = flag;
|
||||
this.a(EnumSet.of(PathfinderGoal.Type.MOVE, PathfinderGoal.Type.LOOK));
|
||||
if (!(tamableFox.getNavigation() instanceof Navigation) && !(tamableFox.getNavigation() instanceof NavigationFlying)) {
|
||||
throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal");
|
||||
}
|
||||
}
|
||||
|
||||
public boolean a() {
|
||||
EntityLiving entityliving = this.a.getOwner();
|
||||
if (entityliving == null) {
|
||||
return false;
|
||||
} else if (entityliving.isSpectator()) {
|
||||
return false;
|
||||
} else if (this.a.isSitting()) { // this.a.isWillSit()
|
||||
return false;
|
||||
} else if (this.a.h(entityliving) < (double)(this.h * this.h)) {
|
||||
return false;
|
||||
} else {
|
||||
this.b = entityliving;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean b() {
|
||||
// !this.a.isWillSit()
|
||||
return !this.e.m() && (!this.a.isSitting() && this.a.h(this.b) > (double) (this.g * this.g));
|
||||
}
|
||||
|
||||
public void c() {
|
||||
this.f = 0;
|
||||
this.i = this.a.a(PathType.WATER);
|
||||
this.a.a(PathType.WATER, 0.0F);
|
||||
}
|
||||
|
||||
public void d() {
|
||||
this.b = null;
|
||||
this.e.o();
|
||||
this.a.a(PathType.WATER, this.i);
|
||||
}
|
||||
|
||||
public void e() {
|
||||
this.a.getControllerLook().a(this.b, 10.0F, (float)this.a.eo());
|
||||
if (--this.f <= 0) {
|
||||
this.f = 10;
|
||||
if (!this.a.isLeashed() && !this.a.isPassenger()) {
|
||||
if (this.a.h(this.b) >= 144.0D) {
|
||||
this.g();
|
||||
} else {
|
||||
this.e.a(this.b, this.d);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void g() {
|
||||
BlockPosition blockposition = this.b.getChunkCoordinates();
|
||||
|
||||
for(int i = 0; i < 10; ++i) {
|
||||
int j = this.a(-3, 3);
|
||||
int k = this.a(-1, 1);
|
||||
int l = this.a(-3, 3);
|
||||
boolean flag = this.a(blockposition.getX() + j, blockposition.getY() + k, blockposition.getZ() + l);
|
||||
if (flag) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private boolean a(int i, int j, int k) {
|
||||
if (Math.abs((double)i - this.b.locX()) < 2.0D && Math.abs((double)k - this.b.locZ()) < 2.0D) {
|
||||
return false;
|
||||
} else if (!this.a(new BlockPosition(i, j, k))) {
|
||||
return false;
|
||||
} else {
|
||||
CraftEntity entity = this.a.getBukkitEntity();
|
||||
Location to = new Location(entity.getWorld(), (double)i + 0.5D, (double)j, (double)k + 0.5D, this.a.yaw, this.a.pitch);
|
||||
EntityTeleportEvent event = new EntityTeleportEvent(entity, entity.getLocation(), to);
|
||||
this.a.world.getServer().getPluginManager().callEvent(event);
|
||||
if (event.isCancelled()) {
|
||||
return false;
|
||||
} else {
|
||||
to = event.getTo();
|
||||
this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch());
|
||||
this.e.o();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean a(BlockPosition blockposition) {
|
||||
PathType pathtype = PathfinderNormal.a(this.c, blockposition.i());
|
||||
if (pathtype != PathType.WALKABLE) {
|
||||
return false;
|
||||
} else {
|
||||
IBlockData iblockdata = this.c.getType(blockposition.down());
|
||||
if (!this.j && iblockdata.getBlock() instanceof BlockLeaves) {
|
||||
return false;
|
||||
} else {
|
||||
BlockPosition blockposition1 = blockposition.b(this.a.getChunkCoordinates());
|
||||
return this.c.getCubes(this.a, this.a.getBoundingBox().a(blockposition1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int a(int i, int j) {
|
||||
return this.a.getRandom().nextInt(j - i + 1) + i;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,114 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding;
|
||||
|
||||
import net.minecraft.server.v1_16_R1.*;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox;
|
||||
import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
|
||||
|
||||
import java.util.EnumSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
public class FoxPathfinderGoalHurtByTarget extends PathfinderGoalTarget {
|
||||
private static final PathfinderTargetCondition a = (new PathfinderTargetCondition()).c().e();
|
||||
private boolean b;
|
||||
private int c;
|
||||
private final Class<?>[] d;
|
||||
private Class<?>[] i;
|
||||
|
||||
public FoxPathfinderGoalHurtByTarget(EntityTamableFox tamableFox, Class<?>... aclass) {
|
||||
super(tamableFox, true);
|
||||
this.d = aclass;
|
||||
this.a(EnumSet.of(PathfinderGoal.Type.TARGET));
|
||||
}
|
||||
|
||||
public boolean a() {
|
||||
int i = this.e.cZ();
|
||||
EntityLiving entityliving = this.e.getLastDamager();
|
||||
if (i != this.c && entityliving != null) {
|
||||
if (entityliving.getEntityType() == EntityTypes.PLAYER && this.e.world.getGameRules().getBoolean(GameRules.UNIVERSAL_ANGER)) {
|
||||
return false;
|
||||
} else {
|
||||
Class[] aclass = this.d;
|
||||
int j = aclass.length;
|
||||
|
||||
for(int k = 0; k < j; ++k) {
|
||||
Class<?> oclass = aclass[k];
|
||||
if (oclass.isAssignableFrom(entityliving.getClass())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return this.a(entityliving, a);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public FoxPathfinderGoalHurtByTarget a(Class<?>... aclass) {
|
||||
this.b = true;
|
||||
this.i = aclass;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void c() {
|
||||
this.e.setGoalTarget(this.e.getLastDamager(), TargetReason.TARGET_ATTACKED_ENTITY, true);
|
||||
this.g = this.e.getGoalTarget();
|
||||
this.c = this.e.cZ();
|
||||
this.h = 300;
|
||||
if (this.b) {
|
||||
this.g();
|
||||
}
|
||||
|
||||
super.c();
|
||||
}
|
||||
|
||||
protected void g() {
|
||||
double d0 = this.k();
|
||||
AxisAlignedBB axisalignedbb = AxisAlignedBB.a(this.e.getPositionVector()).grow(d0, 10.0D, d0);
|
||||
List<EntityInsentient> list = this.e.world.b(this.e.getClass(), axisalignedbb);
|
||||
Iterator iterator = list.iterator();
|
||||
|
||||
while(true) {
|
||||
EntityInsentient entityinsentient;
|
||||
boolean flag;
|
||||
do {
|
||||
do {
|
||||
do {
|
||||
do {
|
||||
do {
|
||||
if (!iterator.hasNext()) {
|
||||
return;
|
||||
}
|
||||
|
||||
entityinsentient = (EntityInsentient)iterator.next();
|
||||
} while(this.e == entityinsentient);
|
||||
} while(entityinsentient.getGoalTarget() != null);
|
||||
} while(this.e instanceof EntityTameableAnimal && ((EntityTameableAnimal)this.e).getOwner() != ((EntityTameableAnimal)entityinsentient).getOwner());
|
||||
} while(entityinsentient.r(this.e.getLastDamager()));
|
||||
|
||||
if (this.i == null) {
|
||||
break;
|
||||
}
|
||||
|
||||
flag = false;
|
||||
Class[] aclass = this.i;
|
||||
int i = aclass.length;
|
||||
|
||||
for(int j = 0; j < i; ++j) {
|
||||
Class<?> oclass = aclass[j];
|
||||
if (entityinsentient.getClass() == oclass) {
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while(flag);
|
||||
|
||||
this.a(entityinsentient, this.e.getLastDamager());
|
||||
}
|
||||
}
|
||||
|
||||
protected void a(EntityInsentient entityinsentient, EntityLiving entityliving) {
|
||||
entityinsentient.setGoalTarget(entityliving, TargetReason.TARGET_ATTACKED_NEARBY_ENTITY, true);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding;
|
||||
|
||||
import net.minecraft.server.v1_16_R1.PathfinderGoalTarget;
|
||||
import net.minecraft.server.v1_16_R1.EntityLiving;
|
||||
import net.minecraft.server.v1_16_R1.PathfinderGoal;
|
||||
import net.minecraft.server.v1_16_R1.PathfinderTargetCondition;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox;
|
||||
import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget {
|
||||
private final EntityTamableFox a;
|
||||
private net.minecraft.server.v1_16_R1.EntityLiving b;
|
||||
private int c;
|
||||
|
||||
public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) {
|
||||
super(tamableFox, false);
|
||||
this.a = tamableFox;
|
||||
this.a(EnumSet.of(PathfinderGoal.Type.TARGET));
|
||||
}
|
||||
|
||||
public boolean a() {
|
||||
if (this.a.isTamed() && !this.a.isSitting()) { //!this.a.isWillSit
|
||||
EntityLiving entityliving = this.a.getOwner();
|
||||
if (entityliving == null) {
|
||||
return false;
|
||||
} else {
|
||||
this.b = entityliving.getLastDamager();
|
||||
int i = entityliving.cZ();
|
||||
return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void c() {
|
||||
this.e.setGoalTarget(this.b, TargetReason.TARGET_ATTACKED_OWNER, true);
|
||||
EntityLiving entityliving = this.a.getOwner();
|
||||
if (entityliving != null) {
|
||||
this.c = entityliving.cZ();
|
||||
}
|
||||
|
||||
super.c();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding;
|
||||
|
||||
import net.minecraft.server.v1_16_R1.PathfinderGoalTarget;
|
||||
import net.minecraft.server.v1_16_R1.EntityLiving;
|
||||
import net.minecraft.server.v1_16_R1.EntityTameableAnimal;
|
||||
import net.minecraft.server.v1_16_R1.PathfinderGoal;
|
||||
import net.minecraft.server.v1_16_R1.PathfinderTargetCondition;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox;
|
||||
import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget {
|
||||
private final EntityTamableFox a;
|
||||
private net.minecraft.server.v1_16_R1.EntityLiving b;
|
||||
private int c;
|
||||
|
||||
public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) {
|
||||
super(tamableFox, false);
|
||||
this.a = tamableFox;
|
||||
this.a(EnumSet.of(PathfinderGoal.Type.TARGET));
|
||||
}
|
||||
|
||||
public boolean a() {
|
||||
if (this.a.isTamed() && !this.a.isSitting()) { // !this.a.isWillSit()
|
||||
net.minecraft.server.v1_16_R1.EntityLiving entityliving = this.a.getOwner();
|
||||
if (entityliving == null) {
|
||||
return false;
|
||||
} else {
|
||||
this.b = entityliving.da();
|
||||
int i = entityliving.db();
|
||||
return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void c() {
|
||||
this.e.setGoalTarget(this.b, TargetReason.OWNER_ATTACKED_TARGET, true);
|
||||
EntityLiving entityliving = this.a.getOwner();
|
||||
if (entityliving != null) {
|
||||
this.c = entityliving.db();
|
||||
}
|
||||
|
||||
super.c();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding;
|
||||
|
||||
import net.minecraft.server.v1_16_R1.PathfinderGoalPanic;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox;
|
||||
|
||||
public class FoxPathfinderGoalPanic extends PathfinderGoalPanic {
|
||||
EntityTamableFox tamableFox;
|
||||
|
||||
public FoxPathfinderGoalPanic(EntityTamableFox tamableFox, double d0) {
|
||||
super(tamableFox, d0);
|
||||
this.tamableFox = tamableFox;
|
||||
}
|
||||
|
||||
public boolean a() {
|
||||
return !tamableFox.isTamed() && tamableFox.isDefending() && super.a();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding;
|
||||
|
||||
import net.minecraft.server.v1_16_R1.PathfinderGoal;
|
||||
import net.minecraft.server.v1_16_R1.EntityLiving;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
public class FoxPathfinderGoalSit extends PathfinderGoal {
|
||||
private final EntityTamableFox entity;
|
||||
private boolean willSit;
|
||||
|
||||
public FoxPathfinderGoalSit(EntityTamableFox tamableFox) {
|
||||
this.entity = tamableFox;
|
||||
this.a(EnumSet.of(net.minecraft.server.v1_16_R1.PathfinderGoal.Type.JUMP, net.minecraft.server.v1_16_R1.PathfinderGoal.Type.MOVE));
|
||||
}
|
||||
|
||||
public boolean b() {
|
||||
return this.willSit;
|
||||
} // return this.entity.isWillSit();
|
||||
|
||||
public boolean a() {
|
||||
if (!this.entity.isTamed()) {
|
||||
return this.willSit && this.entity.getGoalTarget() == null; // this.entity.isWillSit()
|
||||
} else if (this.entity.aD()) {
|
||||
return false;
|
||||
} else if (!this.entity.isOnGround()) {
|
||||
return false;
|
||||
} else {
|
||||
EntityLiving entityliving = this.entity.getOwner();
|
||||
return entityliving == null ? true : (this.entity.h(entityliving) < 144.0D && entityliving.getLastDamager() != null ? false : this.willSit); // this.entity.isWillSit()
|
||||
}
|
||||
}
|
||||
|
||||
public void c() {
|
||||
this.entity.getNavigation().o();
|
||||
this.entity.setSitting(true);
|
||||
}
|
||||
|
||||
public void d() {
|
||||
this.entity.setSitting(false);
|
||||
}
|
||||
|
||||
public void setSitting(boolean flag) {
|
||||
this.willSit = flag;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,134 @@
|
|||
package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding;
|
||||
|
||||
import net.minecraft.server.v1_16_R1.*;
|
||||
import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
public class FoxPathfinderGoalSleepWithOwner extends PathfinderGoal {
|
||||
private final EntityTamableFox a;
|
||||
private EntityHuman b;
|
||||
private BlockPosition c;
|
||||
private int d;
|
||||
|
||||
public FoxPathfinderGoalSleepWithOwner(EntityTamableFox tamableFox) {
|
||||
this.a = tamableFox;
|
||||
}
|
||||
|
||||
public boolean a() {
|
||||
if (!this.a.isTamed()) {
|
||||
return false;
|
||||
} else if (this.a.isSitting()) { // this.a.isWillSit()
|
||||
return false;
|
||||
} else {
|
||||
EntityLiving entityliving = this.a.getOwner();
|
||||
if (entityliving instanceof EntityHuman) {
|
||||
this.b = (EntityHuman)entityliving;
|
||||
if (!entityliving.isSleeping()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.a.h(this.b) > 100.0D) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockPosition blockposition = this.b.getChunkCoordinates();
|
||||
IBlockData iblockdata = this.a.world.getType(blockposition);
|
||||
if (iblockdata.getBlock().a(TagsBlock.BEDS)) {
|
||||
this.c = (BlockPosition)iblockdata.d(BlockBed.FACING).map((enumdirection) -> {
|
||||
return blockposition.shift(enumdirection.opposite());
|
||||
}).orElseGet(() -> {
|
||||
return new BlockPosition(blockposition);
|
||||
});
|
||||
return !this.g();
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean g() {
|
||||
List<EntityTamableFox> list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D));
|
||||
Iterator iterator = list.iterator();
|
||||
|
||||
EntityTamableFox entityTamableFox;
|
||||
do {
|
||||
do {
|
||||
if (!iterator.hasNext()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
entityTamableFox = (EntityTamableFox) iterator.next();
|
||||
} while(entityTamableFox == this.a);
|
||||
} while(!entityTamableFox.eX() && true); // !entityTamableFox.eY()
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean b() {
|
||||
//!this.a.isWillSit()
|
||||
return this.a.isTamed() && !this.a.isSitting() && this.b != null && this.b.isSleeping() && this.c != null && !this.g();
|
||||
}
|
||||
|
||||
public void c() {
|
||||
if (this.c != null) {
|
||||
this.a.setSitting(false);
|
||||
this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void d() {
|
||||
this.a.setSleeping(false);
|
||||
float f = this.a.world.f(1.0F);
|
||||
if (this.b.eB() >= 100 && (double)f > 0.77D && (double)f < 0.8D && (double)this.a.world.getRandom().nextFloat() < 0.7D) {
|
||||
this.h();
|
||||
}
|
||||
|
||||
this.d = 0;
|
||||
//this.a.y(false); // setRelaxStateOne
|
||||
this.a.getNavigation().o();
|
||||
}
|
||||
|
||||
private void h() {
|
||||
Random random = this.a.getRandom();
|
||||
BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
|
||||
blockposition_mutableblockposition.g(this.a.getChunkCoordinates());
|
||||
this.a.a((double)(blockposition_mutableblockposition.getX() + random.nextInt(11) - 5), (double)(blockposition_mutableblockposition.getY() + random.nextInt(5) - 2), (double)(blockposition_mutableblockposition.getZ() + random.nextInt(11) - 5), false);
|
||||
blockposition_mutableblockposition.g(this.a.getChunkCoordinates());
|
||||
LootTable loottable = this.a.world.getMinecraftServer().getLootTableRegistry().getLootTable(LootTables.ak);
|
||||
net.minecraft.server.v1_16_R1.LootTableInfo.Builder loottableinfo_builder = (new net.minecraft.server.v1_16_R1.LootTableInfo.Builder((WorldServer)this.a.world)).set(LootContextParameters.POSITION, blockposition_mutableblockposition).set(LootContextParameters.THIS_ENTITY, this.a).a(random);
|
||||
List<ItemStack> list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.GIFT));
|
||||
Iterator iterator = list.iterator();
|
||||
|
||||
while(iterator.hasNext()) {
|
||||
ItemStack itemstack = (ItemStack)iterator.next();
|
||||
this.a.world.addEntity(new EntityItem(this.a.world, (double)blockposition_mutableblockposition.getX() - (double)MathHelper.sin(this.a.aH * 0.017453292F), (double)blockposition_mutableblockposition.getY(), (double)blockposition_mutableblockposition.getZ() + (double)MathHelper.cos(this.a.aH * 0.017453292F), itemstack));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void e() {
|
||||
if (this.b != null && this.c != null) {
|
||||
this.a.setSitting(false);
|
||||
this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D);
|
||||
if (this.a.h(this.b) < 2.5D) {
|
||||
++this.d;
|
||||
if (this.d > 16) {
|
||||
this.a.setSleeping(true);
|
||||
//this.a.y(false); // setRelaxStateOne
|
||||
} else {
|
||||
this.a.a(this.b, 45.0F, 45.0F);
|
||||
//this.a.y(true); // setRelaxStateOne
|
||||
}
|
||||
} else {
|
||||
this.a.setSleeping(false);
|
||||
//this.a.x(false);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,3 +1,4 @@
|
|||
mc-version-loading: "Registering entity for MC Version %MC_VERSION%..."
|
||||
unsupported-mc-version-not-registering: "ERROR: This plugin version only supports Spigot 1.15.X! Not registering entity! Make sure your Java version is no newer than Java 11!"
|
||||
unsupported-mc-version-disabling: "This plugin version only supports Spigot 1.15.X! Disabling plugin! Make sure your Java version is no newer than Java 11!"
|
||||
success-replaced-entity: "Replaced tamable fox entity!"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name: Tamablefoxes
|
||||
version: 1.6.1-SNAPSHOT
|
||||
version: 1.7-SNAPSHOT
|
||||
main: net.seanomik.tamablefoxes.TamableFoxes
|
||||
api-version: 1.15
|
||||
load: STARTUP
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#Generated by Maven
|
||||
#Sun May 03 12:38:36 CDT 2020
|
||||
#Tue Jul 14 00:33:46 CDT 2020
|
||||
groupId=net.seanomik
|
||||
artifactId=tamablefoxes
|
||||
version=1.6.1-SNAPSHOT
|
||||
version=1.7-SNAPSHOT
|
||||
|
|
|
@ -1,13 +1,25 @@
|
|||
net\seanomik\tamablefoxes\EntityTamableFox.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalMeleeAttack.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalPanic.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalHurtByTarget.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalFollowOwner.class
|
||||
net\seanomik\tamablefoxes\TamableFoxes.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalSit.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15\command\CommandSpawnTamableFox.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalOwnerHurtByTarget.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalOwnerHurtTarget.class
|
||||
net\seanomik\tamablefoxes\versions\NMSInterface.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalHurtByTarget.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_16_R1\EntityTamableFox.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalFollowOwner.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15_R1\EntityTamableFox.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalOwnerHurtByTarget.class
|
||||
net\seanomik\tamablefoxes\CommandSpawnTamableFox.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalHurtByTarget.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalOwnerHurtTarget.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalPanic.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalMeleeAttack.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalFollowOwner.class
|
||||
net\seanomik\tamablefoxes\io\LanguageConfig.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalOwnerHurtTarget.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalOwnerHurtByTarget.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_16_R1\NMSInterface_1_16_R1.class
|
||||
net\seanomik\tamablefoxes\versions\NMSInterface$FoxType.class
|
||||
net\seanomik\tamablefoxes\TamableFoxes.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalSit.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalSit.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalPanic.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_15_R1\NMSInterface_1_15_R1.class
|
||||
net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalSleepWithOwner.class
|
||||
net\seanomik\tamablefoxes\Utils.class
|
||||
net\seanomik\tamablefoxes\io\Config.class
|
||||
|
|
|
@ -1,13 +1,23 @@
|
|||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalHurtByTarget.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalPanic.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalOwnerHurtByTarget.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15\command\CommandSpawnTamableFox.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalSit.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalHurtByTarget.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalPanic.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalMeleeAttack.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalOwnerHurtByTarget.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15_R1\EntityTamableFox.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\Utils.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalFollowOwner.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalOwnerHurtTarget.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\TamableFoxes.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalFollowOwner.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_16_R1\NMSInterface_1_16_R1.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\NMSInterface.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_16_R1\EntityTamableFox.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\io\Config.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalOwnerHurtTarget.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15\pathfinding\FoxPathfinderGoalMeleeAttack.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\EntityTamableFox.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalOwnerHurtByTarget.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalPanic.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalHurtByTarget.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_16_R1\pathfinding\FoxPathfinderGoalSit.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalFollowOwner.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalSit.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\io\LanguageConfig.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15_R1\NMSInterface_1_15_R1.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\CommandSpawnTamableFox.java
|
||||
D:\Code\java\spigotPlugins\myPlugins\TamableFoxes\src\main\java\net\seanomik\tamablefoxes\versions\version_1_15_R1\pathfinding\FoxPathfinderGoalOwnerHurtTarget.java
|
||||
|
|
Loading…
Reference in New Issue