From 1dbdfb004985ddb23747b28a642fd3f964f9e42f Mon Sep 17 00:00:00 2001 From: SeanOMik Date: Wed, 23 Jun 2021 15:54:58 -0400 Subject: [PATCH] Update for 1.17 I had to separate the 1.17 implementation in a separate maven module. I will do similar things to all other older MC versions since we will no longer need to have the jar file with a bunch of nms versions packaged inside of it. --- .gitignore | 3 + 1.14 TRANS.xlsx | Bin 10108 -> 0 bytes 1_17_R1/pom.xml | 45 ++ .../version_1_17_R1/EntityTamableFox.java | 598 ++++++++++++++++++ .../version_1_17_R1/NMSInterface_1_17_R1.java | 42 ++ .../FoxPathfinderGoalFollowOwner.java | 149 +++++ .../FoxPathfinderGoalHurtByTarget.java | 121 ++++ .../FoxPathfinderGoalOwnerHurtByTarget.java | 46 ++ .../FoxPathfinderGoalOwnerHurtTarget.java | 46 ++ .../pathfinding/FoxPathfinderGoalPanic.java | 17 + .../pathfinding/FoxPathfinderGoalSit.java | 59 ++ .../FoxPathfinderGoalSleepWithOwner.java | 153 +++++ .../Spigot_v14_v15_v16-v165.jar | Bin Plugin/output.jar | Bin 0 -> 274464 bytes Plugin/pom.xml | 119 ++++ .../tamablefoxes/CommandSpawnTamableFox.java | 159 ++--- .../seanomik/tamablefoxes/TamableFoxes.java | 25 +- .../version_1_14_R1/EntityTamableFox.java | 13 +- .../version_1_14_R1/NMSInterface_1_14_R1.java | 71 +-- .../FoxPathfinderGoalFollowOwner.java | 206 +++--- .../FoxPathfinderGoalHurtByTarget.java | 0 .../FoxPathfinderGoalOwnerHurtByTarget.java | 92 +-- .../FoxPathfinderGoalOwnerHurtTarget.java | 92 +-- .../pathfinding/FoxPathfinderGoalPanic.java | 0 .../pathfinding/FoxPathfinderGoalSit.java | 0 .../FoxPathfinderGoalSleepWithOwner.java | 260 ++++---- .../version_1_15_R1/EntityTamableFox.java | 12 +- .../version_1_15_R1/NMSInterface_1_15_R1.java | 71 +-- .../FoxPathfinderGoalFollowOwner.java | 278 ++++---- .../FoxPathfinderGoalHurtByTarget.java | 0 .../FoxPathfinderGoalOwnerHurtByTarget.java | 96 +-- .../FoxPathfinderGoalOwnerHurtTarget.java | 92 +-- .../pathfinding/FoxPathfinderGoalPanic.java | 0 .../pathfinding/FoxPathfinderGoalSit.java | 0 .../FoxPathfinderGoalSleepWithOwner.java | 260 ++++---- .../version_1_16_R1/EntityTamableFox.java | 12 +- .../version_1_16_R1/NMSInterface_1_16_R1.java | 73 ++- .../FoxPathfinderGoalFollowOwner.java | 278 ++++---- .../FoxPathfinderGoalHurtByTarget.java | 0 .../FoxPathfinderGoalOwnerHurtByTarget.java | 94 +-- .../FoxPathfinderGoalOwnerHurtTarget.java | 94 +-- .../pathfinding/FoxPathfinderGoalPanic.java | 0 .../pathfinding/FoxPathfinderGoalSit.java | 0 .../FoxPathfinderGoalSleepWithOwner.java | 268 ++++---- .../version_1_16_R2/EntityTamableFox.java | 12 +- .../version_1_16_R2/NMSInterface_1_16_R2.java | 72 +-- .../FoxPathfinderGoalFollowOwner.java | 278 ++++---- .../FoxPathfinderGoalHurtByTarget.java | 0 .../FoxPathfinderGoalOwnerHurtByTarget.java | 92 +-- .../FoxPathfinderGoalOwnerHurtTarget.java | 90 +-- .../pathfinding/FoxPathfinderGoalPanic.java | 0 .../pathfinding/FoxPathfinderGoalSit.java | 0 .../FoxPathfinderGoalSleepWithOwner.java | 266 ++++---- .../version_1_16_R3/EntityTamableFox.java | 12 +- .../version_1_16_R3/NMSInterface_1_16_R3.java | 72 +-- .../FoxPathfinderGoalFollowOwner.java | 278 ++++---- .../FoxPathfinderGoalHurtByTarget.java | 0 .../FoxPathfinderGoalOwnerHurtByTarget.java | 92 +-- .../FoxPathfinderGoalOwnerHurtTarget.java | 90 +-- .../pathfinding/FoxPathfinderGoalPanic.java | 0 .../pathfinding/FoxPathfinderGoalSit.java | 0 .../FoxPathfinderGoalSleepWithOwner.java | 264 ++++---- {src => Plugin/src}/main/resources/config.yml | 12 +- .../src}/main/resources/language.yml | 36 +- {src => Plugin/src}/main/resources/plugin.yml | 44 +- Utility/pom.xml | 30 + .../tamablefoxes/util}/FieldHelper.java | 6 +- .../tamablefoxes/util}/NMSInterface.java | 26 +- .../seanomik/tamablefoxes/util}/Utils.java | 104 +-- .../tamablefoxes/util}/io/Config.java | 9 +- .../tamablefoxes/util}/io/LanguageConfig.java | 320 +++++----- .../util}/io/sqlite/SQLiteHandler.java | 119 ++-- .../util}/io/sqlite/SQLiteHelper.java | 260 ++++---- pom.xml | 125 ++-- 74 files changed, 4018 insertions(+), 2635 deletions(-) delete mode 100644 1.14 TRANS.xlsx create mode 100644 1_17_R1/pom.xml create mode 100644 1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/EntityTamableFox.java create mode 100644 1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/NMSInterface_1_17_R1.java create mode 100644 1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalFollowOwner.java create mode 100644 1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java create mode 100644 1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java create mode 100644 1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java create mode 100644 1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalPanic.java create mode 100644 1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalSit.java create mode 100644 1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java rename Spigot_v14_v15_v16-v165.jar => Plugin/Spigot_v14_v15_v16-v165.jar (100%) create mode 100644 Plugin/output.jar create mode 100644 Plugin/pom.xml rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/CommandSpawnTamableFox.java (92%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/TamableFoxes.java (82%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/EntityTamableFox.java (98%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/NMSInterface_1_14_R1.java (83%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalFollowOwner.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalPanic.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalSit.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/EntityTamableFox.java (98%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/NMSInterface_1_15_R1.java (83%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalFollowOwner.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalPanic.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSit.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/EntityTamableFox.java (98%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/NMSInterface_1_16_R1.java (83%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalFollowOwner.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalPanic.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalSit.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/EntityTamableFox.java (98%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/NMSInterface_1_16_R2.java (85%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalFollowOwner.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalHurtByTarget.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalPanic.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalSit.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalSleepWithOwner.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/EntityTamableFox.java (98%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/NMSInterface_1_16_R3.java (85%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalFollowOwner.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalHurtByTarget.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java (97%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalPanic.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalSit.java (100%) rename {src => Plugin/src}/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalSleepWithOwner.java (97%) rename {src => Plugin/src}/main/resources/config.yml (78%) rename {src => Plugin/src}/main/resources/language.yml (96%) rename {src => Plugin/src}/main/resources/plugin.yml (97%) create mode 100644 Utility/pom.xml rename {src/main/java/net/seanomik/tamablefoxes/versions => Utility/src/main/java/net/seanomik/tamablefoxes/util}/FieldHelper.java (92%) rename {src/main/java/net/seanomik/tamablefoxes/versions => Utility/src/main/java/net/seanomik/tamablefoxes/util}/NMSInterface.java (58%) rename {src/main/java/net/seanomik/tamablefoxes => Utility/src/main/java/net/seanomik/tamablefoxes/util}/Utils.java (93%) rename {src/main/java/net/seanomik/tamablefoxes => Utility/src/main/java/net/seanomik/tamablefoxes/util}/io/Config.java (82%) rename {src/main/java/net/seanomik/tamablefoxes => Utility/src/main/java/net/seanomik/tamablefoxes/util}/io/LanguageConfig.java (66%) rename {src/main/java/net/seanomik/tamablefoxes => Utility/src/main/java/net/seanomik/tamablefoxes/util}/io/sqlite/SQLiteHandler.java (72%) rename {src/main/java/net/seanomik/tamablefoxes => Utility/src/main/java/net/seanomik/tamablefoxes/util}/io/sqlite/SQLiteHelper.java (90%) diff --git a/.gitignore b/.gitignore index 72578b3..7afb5fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # Don't track content of these folders .idea/* target/* +1_17_R1/target/* +Plugin/target/* +Utility/target/* # Compiled source # ################### diff --git a/1.14 TRANS.xlsx b/1.14 TRANS.xlsx deleted file mode 100644 index 13163dddf832d64820a877086ab1d8685f05d102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10108 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 T`XB&+2K_NW-B^O|x2yjL>fd6Y diff --git a/1_17_R1/pom.xml b/1_17_R1/pom.xml new file mode 100644 index 0000000..6b7c740 --- /dev/null +++ b/1_17_R1/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + + net.seanomik + tamablefoxes-parent + 2.0.0-SNAPSHOT + + + tamablefoxes_v1_17_R1 + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + codemc-snapshots + https://repo.codemc.io/repository/maven-snapshots/ + + + + + + net.seanomik + tamablefoxes-util + ${project.parent.version} + provided + + + org.spigotmc + spigot + 1.17-R0.1-SNAPSHOT + provided + + + net.wesjd + anvilgui + 1.5.1-SNAPSHOT + + + \ No newline at end of file diff --git a/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/EntityTamableFox.java b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/EntityTamableFox.java new file mode 100644 index 0000000..3ad8f4c --- /dev/null +++ b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/EntityTamableFox.java @@ -0,0 +1,598 @@ +package net.seanomik.tamablefoxes.versions.version_1_17_R1; + +import net.minecraft.advancements.CriterionTriggers; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.syncher.DataWatcher; +import net.minecraft.network.syncher.DataWatcherObject; +import net.minecraft.network.syncher.DataWatcherRegistry; +import net.minecraft.server.level.EntityPlayer; +import net.minecraft.server.level.WorldServer; +import net.minecraft.world.EnumHand; +import net.minecraft.world.EnumInteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.PathfinderGoalNearestAttackableTarget; +import net.minecraft.world.entity.animal.*; +import net.minecraft.world.entity.animal.horse.EntityHorseAbstract; +import net.minecraft.world.entity.monster.EntityCreeper; +import net.minecraft.world.entity.monster.EntityGhast; +import net.minecraft.world.entity.player.EntityHuman; +import net.minecraft.world.entity.player.PlayerAbilities; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemMonsterEgg; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.World; +import net.minecraft.world.scores.ScoreboardTeamBase; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.IEntitySelector; +import net.minecraft.world.entity.ai.goal.PathfinderGoal; +import net.minecraft.world.entity.animal.EntityFox; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.Config; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +import net.seanomik.tamablefoxes.util.io.sqlite.SQLiteHelper; +import net.seanomik.tamablefoxes.versions.version_1_17_R1.pathfinding.*; +import net.wesjd.anvilgui.AnvilGUI; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Server; +import org.bukkit.craftbukkit.libs.jline.internal.Nullable; +import org.bukkit.craftbukkit.v1_17_R1.CraftServer; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftHumanEntity; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory; +import org.bukkit.craftbukkit.v1_17_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 tamed; + protected static final DataWatcherObject> ownerUUID; + + private static final DataWatcherObject bw; // DATA_FLAGS_ID + private static final Predicate 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.isSneaking() && IEntitySelector.e.test(entity); + } + + List untamedGoals; + private FoxPathfinderGoalSit goalSit; + + public EntityTamableFox(EntityTypes entitytypes, World world) { + super(entitytypes, world); + + System.out.println("Set default attributes"); + /*this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(0.33000001192092896D); + if (isTamed()) { + 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); + }*/ + } + + @Override + public void initPathfinder() { + try { + this.goalSit = new FoxPathfinderGoalSit(this); + this.bO.a(1, goalSit); + + // Wild animal attacking + Field landTargetGoal = this.getClass().getSuperclass().getDeclaredField("cj"); // 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("ck"); // turtleEggTargetGoal + turtleEggTargetGoal.setAccessible(true); + turtleEggTargetGoal.set(this, new PathfinderGoalNearestAttackableTarget(this, EntityTurtle.class, 10, false, false, EntityTurtle.bT)); + + Field fishTargetGoal = this.getClass().getSuperclass().getDeclaredField("cl"); // 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)); + this.goalSelector().a(2, new FoxPathfinderGoalSleepWithOwner(this)); + 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.isDefending(); + })); + 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 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.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); + + // StrollThroughVillage + PathfinderGoal strollThroughVillage = getFoxInnerPathfinderGoal("q", Arrays.asList(32, 200), Arrays.asList(int.class, int.class)); + this.goalSelector().a(9, strollThroughVillage); + untamedGoals.add(strollThroughVillage); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private DataWatcher datawatcher() { + return this.Y; + } + + private PathfinderGoalSelector goalSelector() { + return this.bO; + } + + private PathfinderGoalSelector targetSelector() { + return this.bP; + } + + private Random random() { + return this.Q; + } + + // deobf: 'getFlag' + private boolean u(int i) { + return ((Byte)datawatcher().get(bw) & i) != 0; + } + + // deobf: 'isDefending' from 'fI' + public boolean isDefending() { + return this.u(128); + } + + 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()); + } + + @Override + 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); + }*/ + + 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(); + + System.out.println("setTamed set attributes"); + /*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); + } + } + + // mobInteract + @Override + public EnumInteractionResult b(EntityHuman entityhuman, EnumHand enumhand) { + ItemStack itemstack = entityhuman.b(enumhand); + Item item = itemstack.getItem(); + + if (itemstack.getItem() instanceof ItemMonsterEgg) { + return super.b(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. + Player player = (Player) entityhuman.getBukkitEntity(); + if (player.getGameMode() != GameMode.CREATIVE ) { + itemstack.subtract(1); + } + + this.heal((float)item.getFoodInfo().getNutrition(), EntityRegainHealthEvent.RegainReason.EATING); + return EnumInteractionResult.b; // 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? + // EnumInteractionResult.a = EnumInteractionResult.SUCCESS + if (!entityhuman.isSneaking() && (flag != EnumInteractionResult.a || this.isBaby())) { + this.setSleeping(false); + this.goalSit.setSitting(!this.isSitting()); + return flag; + } else if (entityhuman.isSneaking() && enumhand == EnumHand.a) { // EnumHand.a = EnumHand.MAIN_HAND; Swap/Put/Take item from fox. + // Ignore buckets since they can be easily duplicated. + // nW = BUCKET; nX = WATER_BUCKET; nY = LAVA_BUCKET + if (itemstack.getItem() == Items.nW || itemstack.getItem() == Items.nX || itemstack.getItem() == Items.nY) { + return EnumInteractionResult.c; // EnumInteractionResult.c = EnumInteractionResult.PASS + } + + // Check if the player has something in their main hand. + // EnumItemSlot.MAINHAND = EnumItemSlot.a + if (!this.getEquipment(EnumItemSlot.a).isEmpty()) { + getBukkitEntity().getWorld().dropItem(getBukkitEntity().getLocation(), CraftItemStack.asBukkitCopy(this.getEquipment(EnumItemSlot.a))); + this.setSlot(EnumItemSlot.a, new ItemStack(Items.a)); // Items.a = 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(Utils.tamableFoxesPlugin, ()-> { + // Put item in mouth + if (item != Items.a) { // Items.a = AIR + ItemStack c = itemstack.cloneItemStack(); + c.setCount(1); + + // Only remove the item from the player if they're in survival mode. + Player player = (Player) entityhuman.getBukkitEntity(); + if (player.getGameMode() != GameMode.CREATIVE ) { + itemstack.subtract(1); + } + + this.setSlot(EnumItemSlot.a, c); + } + // If the player doesn't have anything in their hand, make the fox sleep or wakeup. + else { + this.goalSit.setSitting(false); + this.setSleeping(!this.isSleeping()); + } + }, (long) 0.1); + + return EnumInteractionResult.a; + //return true; + } + } + } else if (item == Items.px) { // px = 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. + Player player = (Player) entityhuman.getBukkitEntity(); + if (player.getGameMode() != GameMode.CREATIVE ) { + itemstack.subtract(1); + } + + SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(Utils.tamableFoxesPlugin); + int maxTameCount = Config.getMaxPlayerFoxTames(); + if ( !((Player) entityhuman.getBukkitEntity()).hasPermission("tamablefoxes.tame.unlimited") && maxTameCount > 0 && sqLiteHelper.getPlayerFoxAmount(entityhuman.getUniqueID()) >= maxTameCount) { + ((Player) entityhuman.getBukkitEntity()).sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFoxDoesntTrust()); + + return EnumInteractionResult.a; + } + + // 0.33% chance to tame the fox, also check if the called tame entity event is cancelled or not. + if (this.getRandom().nextInt(3) == 0 && !CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { + this.tame(entityhuman); + + // Remove all navigation when tamed. + this.bN.o(); // bN = navigation + this.setGoalTarget(null); + this.goalSit.setSitting(true); + + if (maxTameCount > 0) { + sqLiteHelper.addPlayerFoxAmount(entityhuman.getUniqueID(), 1); + } + + 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.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(Utils.tamableFoxesPlugin) // 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.a; + } + + return super.b(entityhuman, enumhand); + } + } + + @Override + public EntityTamableFox createChild(WorldServer worldserver, EntityAgeable entityageable) { + EntityTamableFox entityfox = (EntityTamableFox) EntityTypes.E.a(worldserver); // EntityTypes.E = EntityTypes.FOX + entityfox.setFoxType(this.getRandom().nextBoolean() ? this.getFoxType() : ((EntityFox)entityageable).getFoxType()); + + UUID uuid = this.getOwnerUUID(); + if (uuid != null) { + entityfox.setOwnerUUID(uuid); + entityfox.setTamed(true); + } + + return entityfox; + } + + @Override + 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.getWorld().b(ownerUuid); + } catch (IllegalArgumentException var2) { + return null; + } + } + + // Only attack entity if its not attacking owner. + // canAttack + @Override + public boolean c(EntityLiving entity) { + return !this.isOwnedBy(entity) && super.c(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 wantsToAttack(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) { + // getWorld().y = getWorld().isClientSide; GameRules.m = GameRules.SHOW_DEATH_MESSAGES + if (!this.getWorld().y && this.getWorld().getGameRules().getBoolean(GameRules.m) && this.getOwner() instanceof EntityPlayer) { + this.getOwner().sendMessage(this.getCombatTracker().getDeathMessage(), getOwnerUUID()); + + // Remove the amount of foxes the player has tamed if the limit is enabled. + if (Config.getMaxPlayerFoxTames() > 0) { + SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(Utils.tamableFoxesPlugin); + sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1); + } + } + + super.die(damageSource); + } + + + private PathfinderGoal getFoxInnerPathfinderGoal(String innerName, List args, List> 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(); + } +} diff --git a/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/NMSInterface_1_17_R1.java b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/NMSInterface_1_17_R1.java new file mode 100644 index 0000000..d6d43fe --- /dev/null +++ b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/NMSInterface_1_17_R1.java @@ -0,0 +1,42 @@ +package net.seanomik.tamablefoxes.versions.version_1_17_R1; + +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.animal.EntityFox; +import net.seanomik.tamablefoxes.util.FieldHelper; +import net.seanomik.tamablefoxes.util.NMSInterface; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity; +import org.bukkit.entity.EntityType; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public class NMSInterface_1_17_R1 implements NMSInterface { + @Override + public void registerCustomFoxEntity() { + try { // Replace the fox entity + Field field = EntityTypes.E.getClass().getDeclaredField("bm"); + + //FOX = a("fox", EntityTypes.Builder.a(EntityFox::new, EnumCreatureType.CREATURE).a(0.6F, 0.7F).trackingRange(8).a(Blocks.SWEET_BERRY_BUSH)); + /*Method method = EntityTypes.class.getDeclaredMethod("a", String.class, EntityTypes.Builder.class); + method.setAccessible(true); + EntityTypes type = method.invoke(null, "fox", EntityTypes.Builder.a(EntityTamableFox::new, EnumCreatureType.C))*/ + + FieldHelper.setField(field, EntityTypes.E, (EntityTypes.b) EntityTamableFox::new); + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); + } catch (Exception e) { + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); + e.printStackTrace(); + } + } + + @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.a : EntityFox.Type.b); + } +} diff --git a/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalFollowOwner.java b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalFollowOwner.java new file mode 100644 index 0000000..f766190 --- /dev/null +++ b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalFollowOwner.java @@ -0,0 +1,149 @@ +package net.seanomik.tamablefoxes.versions.version_1_17_R1.pathfinding; + +import net.minecraft.core.BlockPosition; +import net.minecraft.world.entity.EntityLiving; +import net.minecraft.world.entity.ai.goal.PathfinderGoal; +import net.minecraft.world.entity.ai.navigation.Navigation; +import net.minecraft.world.entity.ai.navigation.NavigationAbstract; +import net.minecraft.world.entity.ai.navigation.NavigationFlying; +import net.minecraft.world.level.IWorldReader; +import net.minecraft.world.level.block.BlockLeaves; +import net.minecraft.world.level.block.state.IBlockData; +import net.minecraft.world.level.pathfinder.PathType; +import net.minecraft.world.level.pathfinder.PathfinderNormal; +import net.seanomik.tamablefoxes.versions.version_1_17_R1.EntityTamableFox; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_17_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.getWorld(); + this.d = d0; + this.e = tamableFox.getNavigation(); + this.h = f; + this.g = f1; + this.j = flag; + this.a(EnumSet.of(Type.a, Type.b)); // a = MOVE; b = 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.f(entityliving) < (double)(this.h * this.h)) { + return false; + } else { + this.b = entityliving; + return true; + } + } + + public boolean b() { + // Simplified with IntelliJ hints + return !this.e.m() && (!this.a.isSitting() && this.a.f(this.f) > (double) (this.g * this.g)); + } + + public void c() { + this.f = 0; + this.i = this.a.a(PathType.i); + this.a.a(PathType.i, 0.0F); + } + + public void d() { + this.b = null; + this.e.o(); + this.a.a(PathType.i, this.i); + } + + public void e() { + this.a.getControllerLook().a(this.b, 10.0F, (float)this.a.eY()); + if (--this.f <= 0) { + this.f = 10; + if (!this.a.isLeashed() && !this.a.isPassenger()) { + if (this.a.f(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.getYRot(), this.a.getXRot()); + EntityTeleportEvent event = new EntityTeleportEvent(entity, entity.getLocation(), to); + this.a.getWorld().getCraftServer().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.c) { + return false; + } else { + IBlockData iblockdata = this.c.getType(blockposition.down()); + if (!this.j && iblockdata.getBlock() instanceof BlockLeaves) { + return false; + } else { + BlockPosition blockposition1 = blockposition.e(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; + } +} diff --git a/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java new file mode 100644 index 0000000..6f95041 --- /dev/null +++ b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java @@ -0,0 +1,121 @@ +package net.seanomik.tamablefoxes.versions.version_1_17_R1.pathfinding; + +import net.minecraft.world.entity.EntityInsentient; +import net.minecraft.world.entity.EntityLiving; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.IEntitySelector; +import net.minecraft.world.entity.ai.goal.target.PathfinderGoalTarget; +import net.minecraft.world.entity.ai.targeting.PathfinderTargetCondition; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.phys.AxisAlignedBB; +import net.seanomik.tamablefoxes.versions.version_1_17_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 = PathfinderTargetCondition.a().d().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(Type.d)); + } + + public boolean a() { + int i = this.e.dH(); + EntityLiving entityliving = this.e.getLastDamager(); + if (i != this.c && entityliving != null) { + if (entityliving.getEntityType() == EntityTypes.bi && this.e.getWorld().getGameRules().getBoolean(GameRules.I)) { + 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.dH(); + 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 list = this.e.getWorld().a(this.e.getClass(), axisalignedbb, IEntitySelector.f); + 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 EntityTamableFox && ((EntityTamableFox)this.e).getOwner() != ((EntityTamableFox)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); + } +} \ No newline at end of file diff --git a/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java new file mode 100644 index 0000000..7a4628a --- /dev/null +++ b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java @@ -0,0 +1,46 @@ +package net.seanomik.tamablefoxes.versions.version_1_17_R1.pathfinding; + +import net.minecraft.world.entity.EntityLiving; +import net.minecraft.world.entity.ai.goal.target.PathfinderGoalTarget; +import net.minecraft.world.entity.ai.targeting.PathfinderTargetCondition; +import net.seanomik.tamablefoxes.versions.version_1_17_R1.EntityTamableFox; +import org.bukkit.event.entity.EntityTargetEvent.TargetReason; + +import java.util.EnumSet; + +public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { + private final EntityTamableFox a; + private EntityLiving b; + private int c; + + public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { + super(tamableFox, false); + this.a = tamableFox; + this.a(EnumSet.of(Type.d)); + } + + 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.dH(); + return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.wantsToAttack(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.dH(); + } + + super.c(); + } +} diff --git a/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java new file mode 100644 index 0000000..71d5bcc --- /dev/null +++ b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java @@ -0,0 +1,46 @@ +package net.seanomik.tamablefoxes.versions.version_1_17_R1.pathfinding; + +import net.minecraft.world.entity.EntityLiving; +import net.minecraft.world.entity.ai.goal.target.PathfinderGoalTarget; +import net.minecraft.world.entity.ai.targeting.PathfinderTargetCondition; +import net.seanomik.tamablefoxes.versions.version_1_17_R1.EntityTamableFox; +import org.bukkit.event.entity.EntityTargetEvent.TargetReason; + +import java.util.EnumSet; + +public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { + private final EntityTamableFox a; + private EntityLiving b; + private int c; + + public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) { + super(tamableFox, false); + this.a = tamableFox; + this.a(EnumSet.of(Type.d)); + } + + 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.dI(); + int i = entityliving.dJ(); + return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.wantsToAttack(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.dJ(); + } + + super.c(); + } +} \ No newline at end of file diff --git a/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalPanic.java b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalPanic.java new file mode 100644 index 0000000..4d811c9 --- /dev/null +++ b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalPanic.java @@ -0,0 +1,17 @@ +package net.seanomik.tamablefoxes.versions.version_1_17_R1.pathfinding; + +import net.minecraft.world.entity.ai.goal.PathfinderGoalPanic; +import net.seanomik.tamablefoxes.versions.version_1_17_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.isDefending() && super.a(); + } +} diff --git a/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalSit.java b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalSit.java new file mode 100644 index 0000000..539af6f --- /dev/null +++ b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalSit.java @@ -0,0 +1,59 @@ +package net.seanomik.tamablefoxes.versions.version_1_17_R1.pathfinding; + +import net.minecraft.world.entity.EntityLiving; +import net.minecraft.world.entity.ai.goal.PathfinderGoal; +import net.minecraft.world.level.block.Blocks; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.versions.version_1_17_R1.EntityTamableFox; +import org.bukkit.Bukkit; + +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(Type.c, Type.a)); // c = JUMP; a = MOVE + } + + public boolean b() { + return this.willSit; + } + + private boolean isInBubbleColumn() { + return this.entity.getWorld().getType(this.entity.getChunkCoordinates()).a(Blocks.lq); + } + + public boolean a() { + if (!this.entity.isTamed()) { + return this.willSit && this.entity.getGoalTarget() == null; + } else if (this.entity.aO()) { + return false; + } else if (!this.entity.isOnGround()) { + return false; + } else { + EntityLiving entityliving = this.entity.getOwner(); + return entityliving == null || ((!(this.entity.f(entityliving) < 144.0D) || entityliving.getLastDamager() == null) && this.willSit); + } + } + + public void c() { + this.entity.getNavigation().o(); + this.entity.setGoalTarget(null); + + // For some reason it needs to be ran later to not have the fox slide across the floor. + Bukkit.getScheduler().runTaskLater(Utils.tamableFoxesPlugin, () -> { + this.entity.setSitting(true); + }, 1L); + } + + public void d() { + this.entity.setSitting(false); + } + + public void setSitting(boolean flag) { + this.willSit = flag; + } +} diff --git a/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java new file mode 100644 index 0000000..9505da7 --- /dev/null +++ b/1_17_R1/src/main/java/net/seanomik/tamablefoxes/versions/version_1_17_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java @@ -0,0 +1,153 @@ +package net.seanomik.tamablefoxes.versions.version_1_17_R1.pathfinding; + +import net.minecraft.core.BlockPosition; +import net.minecraft.server.level.WorldServer; +import net.minecraft.tags.TagsBlock; +import net.minecraft.util.MathHelper; +import net.minecraft.world.entity.EntityLiving; +import net.minecraft.world.entity.ai.goal.PathfinderGoal; +import net.minecraft.world.entity.item.EntityItem; +import net.minecraft.world.entity.player.EntityHuman; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.BlockBed; +import net.minecraft.world.level.block.state.IBlockData; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.LootTables; +import net.minecraft.world.level.storage.loot.parameters.LootContextParameterSets; +import net.minecraft.world.level.storage.loot.parameters.LootContextParameters; +import net.minecraft.world.phys.AxisAlignedBB; +import net.seanomik.tamablefoxes.versions.version_1_17_R1.EntityTamableFox; +import org.bukkit.event.entity.EntityDropItemEvent; + +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +// From class EntityCat#b +public class FoxPathfinderGoalSleepWithOwner extends PathfinderGoal { + private final EntityTamableFox a; + private EntityHuman b; + private BlockPosition c; + private int d; + + public FoxPathfinderGoalSleepWithOwner(EntityTamableFox entitycat) { + this.a = entitycat; + } + + public boolean a() { + if (!this.a.isTamed()) { + return false; + } else if (this.a.isSitting()) { + return false; + } else { + EntityLiving entityliving = this.a.getOwner(); + if (entityliving instanceof EntityHuman) { + this.b = (EntityHuman) entityliving; + if (!entityliving.isSleeping()) { + return false; + } + + if (this.a.f(this.b) > 100.0D) { + return false; + } + + BlockPosition blockposition = this.b.getChunkCoordinates(); + IBlockData iblockdata = this.a.getWorld().getType(blockposition); + if (iblockdata.a(TagsBlock.L)) { + this.c = (BlockPosition) iblockdata.d(BlockBed.aE).map((enumdirection) -> { + return blockposition.shift(enumdirection.opposite()); + }).orElseGet(() -> { + return new BlockPosition(blockposition); + }); + return !this.g(); + } + } + + } + return false; + } + + private boolean g() { + List list = this.a.getWorld().a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D)); + Iterator iterator = list.iterator(); + + EntityTamableFox entitycat; + do { + do { + if (!iterator.hasNext()) { + return false; + } + + entitycat = (EntityTamableFox)iterator.next(); + } while(entitycat == this.a); + } while(!entitycat.isSleeping()); + + return true; + } + + public boolean b() { + return this.a.isTamed() && 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.getWorld().f(1.0F); + if (this.b.fm() >= 100 && (double)f > 0.77D && (double)f < 0.8D && (double)this.a.getWorld().getRandom().nextFloat() < 0.7D) { + this.h(); + } + + this.d = 0; + //this.a.y(false); + 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.t.getMinecraftServer().getLootTableRegistry().getLootTable(LootTables.ak); + net.minecraft.world.level.storage.loot.LootTableInfo.Builder loottableinfo_builder = (new net.minecraft.world.level.storage.loot.LootTableInfo.Builder((WorldServer)this.a.t)).set(LootContextParameters.f, this.a.getPositionVector()).set(LootContextParameters.a, this.a).a(random); + List list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.g)); + Iterator iterator = list.iterator(); + + while(iterator.hasNext()) { + ItemStack itemstack = (ItemStack)iterator.next(); + EntityItem entityitem = new EntityItem(this.a.t, (double)blockposition_mutableblockposition.getX() - (double) MathHelper.sin(this.a.aX * 0.017453292F), (double)blockposition_mutableblockposition.getY(), (double)blockposition_mutableblockposition.getZ() + (double)MathHelper.cos(this.a.aX * 0.017453292F), itemstack); + EntityDropItemEvent event = new EntityDropItemEvent(this.a.getBukkitEntity(), (org.bukkit.entity.Item)entityitem.getBukkitEntity()); + entityitem.t.getCraftServer().getPluginManager().callEvent(event); + if (!event.isCancelled()) { + this.a.t.addEntity(entityitem); + } + } + } + + 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.f(this.b) < 2.5D) { + ++this.d; + if (this.d > 16) { + this.a.setSleeping(true); + //this.a.y(false); + } else { + this.a.a(this.b, 45.0F, 45.0F); + //this.a.y(true); + } + } else { + this.a.setSleeping(false); + } + } + + } +} diff --git a/Spigot_v14_v15_v16-v165.jar b/Plugin/Spigot_v14_v15_v16-v165.jar similarity index 100% rename from Spigot_v14_v15_v16-v165.jar rename to Plugin/Spigot_v14_v15_v16-v165.jar diff --git a/Plugin/output.jar b/Plugin/output.jar new file mode 100644 index 0000000000000000000000000000000000000000..791f72f62652fc2071dda0a23d211e4e87140b97 GIT binary patch literal 274464 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 z⁢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

ckNw{O} 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 literal 0 HcmV?d00001 diff --git a/Plugin/pom.xml b/Plugin/pom.xml new file mode 100644 index 0000000..c6fdad3 --- /dev/null +++ b/Plugin/pom.xml @@ -0,0 +1,119 @@ + + + + 4.0.0 + + net.seanomik + tamablefoxes-parent + 2.0.0-SNAPSHOT + + + net.seanomik + tamablefoxes + 2.0.0-SNAPSHOT + jar + + Tamablefoxes + + + 1.8 + UTF-8 + 1.17 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.3.0-SNAPSHOT + + + package + + shade + + + D:\Code\java\spigotPlugins\servers\${server.version}\plugins\TamableFoxes_v${project.version}.jar + false + + + + + + + + src/main/resources + true + + + + + + + + apache.snapshots + https://repository.apache.org/snapshots/ + + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + codemc-snapshots + https://repo.codemc.io/repository/maven-snapshots/ + + + + + + net.seanomik + tamablefoxes-util + ${project.parent.version} + compile + + + net.seanomik + tamablefoxes_v1_17_R1 + ${project.parent.version} + compile + + + local.spigot.nms + AllSpigotNMS + LATEST + system + ${project.basedir}/Spigot_v14_v15_v16-v165.jar + + + + org.spigotmc + spigot-api + 1.14-R0.1-SNAPSHOT + provided + + + net.wesjd + anvilgui + 1.5.1-SNAPSHOT + + + diff --git a/src/main/java/net/seanomik/tamablefoxes/CommandSpawnTamableFox.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/CommandSpawnTamableFox.java similarity index 92% rename from src/main/java/net/seanomik/tamablefoxes/CommandSpawnTamableFox.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/CommandSpawnTamableFox.java index 715e9d9..8db8eb0 100644 --- a/src/main/java/net/seanomik/tamablefoxes/CommandSpawnTamableFox.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/CommandSpawnTamableFox.java @@ -1,79 +1,80 @@ -package net.seanomik.tamablefoxes; - -import net.seanomik.tamablefoxes.versions.NMSInterface; -import net.seanomik.tamablefoxes.io.LanguageConfig; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; - -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; - -public class CommandSpawnTamableFox implements TabExecutor { - - private final TamableFoxes plugin; - - public CommandSpawnTamableFox(TamableFoxes plugin) { - this.plugin = plugin; - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (!(sender instanceof Player)) { - sender.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getOnlyRunPlayer()); - return true; - } - - if (!sender.hasPermission("tamablefoxes.spawntamablefox")) { - sender.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getNoPermMessage()); - return true; - } - - Player player = (Player) sender; - if (args.length != 0) { - switch (args[0]) { - case "red": - try { - 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()); - } - break; - case "snow": - try { - 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()); - } - break; - case "reload": - plugin.reloadConfig(); - LanguageConfig.getConfig().reloadConfig(); - player.sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getReloadMessage()); - break; - default: - player.sendMessage(ChatColor.RED + "/spawntamablefox " + ChatColor.GRAY + "[red | snow | reload]"); - } - } else { - player.sendMessage(ChatColor.RED + "/spawntamablefox " + ChatColor.GRAY + "[red | snow | reload]"); - } - - return true; - } - - @Override - public List onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) { - return new LinkedList<>(Arrays.asList( - "red", - "snow", - "reload" - )); - } -} +package net.seanomik.tamablefoxes; + +import net.seanomik.tamablefoxes.util.NMSInterface; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +public class CommandSpawnTamableFox implements TabExecutor { + + private final TamableFoxes plugin; + + public CommandSpawnTamableFox(TamableFoxes plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (!(sender instanceof Player)) { + sender.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getOnlyRunPlayer()); + return true; + } + + if (!sender.hasPermission("tamablefoxes.spawntamablefox")) { + sender.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getNoPermMessage()); + return true; + } + + Player player = (Player) sender; + if (args.length != 0) { + switch (args[0]) { + case "red": + try { + 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()); + } + break; + case "snow": + try { + 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()); + } + break; + case "reload": + plugin.reloadConfig(); + LanguageConfig.getConfig(plugin).reloadConfig(); + player.sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getReloadMessage()); + break; + default: + player.sendMessage(ChatColor.RED + "/spawntamablefox " + ChatColor.GRAY + "[red | snow | reload]"); + } + } else { + player.sendMessage(ChatColor.RED + "/spawntamablefox " + ChatColor.GRAY + "[red | snow | reload]"); + } + + return true; + } + + @Override + public List onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) { + return new LinkedList<>(Arrays.asList( + "red", + "snow", + "reload" + )); + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/TamableFoxes.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/TamableFoxes.java similarity index 82% rename from src/main/java/net/seanomik/tamablefoxes/TamableFoxes.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/TamableFoxes.java index 446f1bc..f302290 100644 --- a/src/main/java/net/seanomik/tamablefoxes/TamableFoxes.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/TamableFoxes.java @@ -1,24 +1,20 @@ package net.seanomik.tamablefoxes; -import net.minecraft.server.v1_15_R1.EntityWolf; -import net.seanomik.tamablefoxes.io.Config; -import net.seanomik.tamablefoxes.io.sqlite.SQLiteHelper; -import net.seanomik.tamablefoxes.versions.NMSInterface; +import net.seanomik.tamablefoxes.versions.version_1_17_R1.NMSInterface_1_17_R1; +import net.seanomik.tamablefoxes.util.NMSInterface; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.Config; +import net.seanomik.tamablefoxes.util.io.sqlite.SQLiteHelper; import net.seanomik.tamablefoxes.versions.version_1_14_R1.NMSInterface_1_14_R1; import net.seanomik.tamablefoxes.versions.version_1_15_R1.NMSInterface_1_15_R1; import net.seanomik.tamablefoxes.versions.version_1_16_R1.NMSInterface_1_16_R1; import net.seanomik.tamablefoxes.versions.version_1_16_R2.NMSInterface_1_16_R2; import net.seanomik.tamablefoxes.versions.version_1_16_R3.NMSInterface_1_16_R3; -import net.seanomik.tamablefoxes.io.LanguageConfig; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; import org.bukkit.*; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; -// @TODO: - -/* @CHANGELOG (1.8.1-SNAPSHOT): - * Fixes #32. Kinda hacky but will work for now - */ public final class TamableFoxes extends JavaPlugin implements Listener { private static TamableFoxes plugin; @@ -29,8 +25,10 @@ public final class TamableFoxes extends JavaPlugin implements Listener { @Override public void onLoad() { plugin = this; + Utils.tamableFoxesPlugin = this; - LanguageConfig.getConfig().saveDefault(); + Config.setConfig(this.getConfig()); + LanguageConfig.getConfig(this).saveDefault(); // Verify server version String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; @@ -50,6 +48,9 @@ public final class TamableFoxes extends JavaPlugin implements Listener { case "v1_16_R3": nmsInterface = new NMSInterface_1_16_R3(); break; + case "v1_17_R1": + nmsInterface = new NMSInterface_1_17_R1(); + break; default: Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getUnsupportedMCVersionRegister()); Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + "You're trying to run MC version " + version + " which is not supported!"); @@ -62,7 +63,7 @@ public final class TamableFoxes extends JavaPlugin implements Listener { nmsInterface.registerCustomFoxEntity(); if (Config.getMaxPlayerFoxTames() != 0) { - SQLiteHelper.getInstance().createTablesIfNotExist(); + SQLiteHelper.getInstance(this).createTablesIfNotExist(); } } diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/EntityTamableFox.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/EntityTamableFox.java similarity index 98% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/EntityTamableFox.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/EntityTamableFox.java index 1a11507..bb0ce8c 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/EntityTamableFox.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/EntityTamableFox.java @@ -2,10 +2,10 @@ package net.seanomik.tamablefoxes.versions.version_1_14_R1; import net.minecraft.server.v1_14_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.io.sqlite.SQLiteHelper; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.Config; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +import net.seanomik.tamablefoxes.util.io.sqlite.SQLiteHelper; import net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding.*; import net.wesjd.anvilgui.AnvilGUI; import org.bukkit.Bukkit; @@ -17,7 +17,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityRegainHealthEvent; import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.util.*; import java.util.function.Predicate; @@ -319,7 +318,7 @@ public class EntityTamableFox extends EntityFox { itemstack.subtract(1); } - SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(); + SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin()); int maxTameCount = Config.getMaxPlayerFoxTames(); if ( !((Player) entityhuman.getBukkitEntity()).hasPermission("tamablefoxes.tame.unlimited") && maxTameCount > 0 && sqLiteHelper.getPlayerFoxAmount(entityhuman.getUniqueID()) >= maxTameCount) { ((Player) entityhuman.getBukkitEntity()).sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFoxDoesntTrust()); @@ -500,7 +499,7 @@ public class EntityTamableFox extends EntityFox { // Remove the amount of foxes the player has tamed if the limit is enabled. if (Config.getMaxPlayerFoxTames() > 0) { - SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(); + SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin()); sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1); } } diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/NMSInterface_1_14_R1.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/NMSInterface_1_14_R1.java similarity index 83% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/NMSInterface_1_14_R1.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/NMSInterface_1_14_R1.java index 28d5d84..f917d76 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/NMSInterface_1_14_R1.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/NMSInterface_1_14_R1.java @@ -1,36 +1,35 @@ -package net.seanomik.tamablefoxes.versions.version_1_14_R1; - -import net.minecraft.server.v1_14_R1.EntityFox; -import net.minecraft.server.v1_14_R1.EntityTypes; -import net.seanomik.tamablefoxes.Utils; -import net.seanomik.tamablefoxes.io.LanguageConfig; -import net.seanomik.tamablefoxes.versions.FieldHelper; -import net.seanomik.tamablefoxes.versions.NMSInterface; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity; -import org.bukkit.entity.EntityType; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; - -public class NMSInterface_1_14_R1 implements NMSInterface { - @Override - public void registerCustomFoxEntity() { - try { // Replace the fox entity - Field field = EntityTypes.FOX.getClass().getDeclaredField("aZ"); - FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b) EntityTamableFox::new); - Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); - } catch (Exception e) { - Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); - e.printStackTrace(); - } - } - - @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 ); - } -} +package net.seanomik.tamablefoxes.versions.version_1_14_R1; + +import net.minecraft.server.v1_14_R1.EntityFox; +import net.minecraft.server.v1_14_R1.EntityTypes; +import net.seanomik.tamablefoxes.util.FieldHelper; +import net.seanomik.tamablefoxes.util.NMSInterface; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity; +import org.bukkit.entity.EntityType; + +import java.lang.reflect.Field; + +public class NMSInterface_1_14_R1 implements NMSInterface { + @Override + public void registerCustomFoxEntity() { + try { // Replace the fox entity + Field field = EntityTypes.FOX.getClass().getDeclaredField("aZ"); + FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b) EntityTamableFox::new); + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); + } catch (Exception e) { + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); + e.printStackTrace(); + } + } + + @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 ); + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalFollowOwner.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalFollowOwner.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalFollowOwner.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalFollowOwner.java index c88ee8f..9f71ce7 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalFollowOwner.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalFollowOwner.java @@ -1,103 +1,103 @@ -package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding; - -import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox; -import net.minecraft.server.v1_14_R1.*; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity; -import org.bukkit.event.entity.EntityTeleportEvent; - -import java.util.EnumSet; - -public class FoxPathfinderGoalFollowOwner extends PathfinderGoal { - protected final EntityTamableFox a; - private EntityLiving c; - protected final IWorldReader b; - private final double d; - private final NavigationAbstract e; - private int f; - private final float g; - private final float h; - private float i; - - public FoxPathfinderGoalFollowOwner(EntityTamableFox tamableFox, double d0, float f, float f1) { - this.a = tamableFox; - this.b = tamableFox.world; - this.d = d0; - this.e = tamableFox.getNavigation(); - this.h = f; - this.g = f1; - this.a(EnumSet.of(Type.MOVE, 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 instanceof EntityHuman && ((EntityHuman)entityliving).isSpectator()) { - return false; - } else if (this.a.isSitting()) { - return false; - } else if (this.a.h(entityliving) < (double)(this.h * this.h)) { - return false; - } else { - this.c = entityliving; - return true; - } - } - - public boolean b() { - return !this.e.n() && this.a.h(this.c) > (double)(this.g * this.g) && !this.a.isSitting(); - } - - public void c() { - this.f = 0; - this.i = this.a.a(PathType.WATER); - this.a.a(PathType.WATER, 0.0F); - } - - public void d() { - this.c = null; - this.e.o(); - this.a.a(PathType.WATER, this.i); - } - - public void e() { - this.a.getControllerLook().a(this.c, 10.0F, (float)this.a.M()); - if (!this.a.isSitting() && --this.f <= 0) { - this.f = 10; - if (!this.e.a(this.c, this.d) && !this.a.isLeashed() && !this.a.isPassenger() && this.a.h(this.c) >= 144.0D) { - int i = MathHelper.floor(this.c.locX) - 2; - int j = MathHelper.floor(this.c.locZ) - 2; - int k = MathHelper.floor(this.c.getBoundingBox().minY); - - for(int l = 0; l <= 4; ++l) { - for(int i1 = 0; i1 <= 4; ++i1) { - if ((l < 1 || i1 < 1 || l > 3 || i1 > 3) && this.a(new BlockPosition(i + l, k - 1, j + i1))) { - CraftEntity entity = this.a.getBukkitEntity(); - Location to = new Location(entity.getWorld(), (double)((float)(i + l) + 0.5F), (double)k, (double)((float)(j + i1) + 0.5F), 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; - } - - to = event.getTo(); - this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch()); - this.e.o(); - return; - } - } - } - } - } - - } - - protected boolean a(BlockPosition blockposition) { - IBlockData iblockdata = this.b.getType(blockposition); - return iblockdata.a(this.b, blockposition, this.a.getEntityType()) && this.b.isEmpty(blockposition.up()) && this.b.isEmpty(blockposition.up(2)); - } -} +package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding; + +import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox; +import net.minecraft.server.v1_14_R1.*; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity; +import org.bukkit.event.entity.EntityTeleportEvent; + +import java.util.EnumSet; + +public class FoxPathfinderGoalFollowOwner extends PathfinderGoal { + protected final EntityTamableFox a; + private EntityLiving c; + protected final IWorldReader b; + private final double d; + private final NavigationAbstract e; + private int f; + private final float g; + private final float h; + private float i; + + public FoxPathfinderGoalFollowOwner(EntityTamableFox tamableFox, double d0, float f, float f1) { + this.a = tamableFox; + this.b = tamableFox.world; + this.d = d0; + this.e = tamableFox.getNavigation(); + this.h = f; + this.g = f1; + this.a(EnumSet.of(Type.MOVE, 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 instanceof EntityHuman && ((EntityHuman)entityliving).isSpectator()) { + return false; + } else if (this.a.isSitting()) { + return false; + } else if (this.a.h(entityliving) < (double)(this.h * this.h)) { + return false; + } else { + this.c = entityliving; + return true; + } + } + + public boolean b() { + return !this.e.n() && this.a.h(this.c) > (double)(this.g * this.g) && !this.a.isSitting(); + } + + public void c() { + this.f = 0; + this.i = this.a.a(PathType.WATER); + this.a.a(PathType.WATER, 0.0F); + } + + public void d() { + this.c = null; + this.e.o(); + this.a.a(PathType.WATER, this.i); + } + + public void e() { + this.a.getControllerLook().a(this.c, 10.0F, (float)this.a.M()); + if (!this.a.isSitting() && --this.f <= 0) { + this.f = 10; + if (!this.e.a(this.c, this.d) && !this.a.isLeashed() && !this.a.isPassenger() && this.a.h(this.c) >= 144.0D) { + int i = MathHelper.floor(this.c.locX) - 2; + int j = MathHelper.floor(this.c.locZ) - 2; + int k = MathHelper.floor(this.c.getBoundingBox().minY); + + for(int l = 0; l <= 4; ++l) { + for(int i1 = 0; i1 <= 4; ++i1) { + if ((l < 1 || i1 < 1 || l > 3 || i1 > 3) && this.a(new BlockPosition(i + l, k - 1, j + i1))) { + CraftEntity entity = this.a.getBukkitEntity(); + Location to = new Location(entity.getWorld(), (double)((float)(i + l) + 0.5F), (double)k, (double)((float)(j + i1) + 0.5F), 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; + } + + to = event.getTo(); + this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch()); + this.e.o(); + return; + } + } + } + } + } + + } + + protected boolean a(BlockPosition blockposition) { + IBlockData iblockdata = this.b.getType(blockposition); + return iblockdata.a(this.b, blockposition, this.a.getEntityType()) && this.b.isEmpty(blockposition.up()) && this.b.isEmpty(blockposition.up(2)); + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java index ac085f7..ad6f828 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java @@ -1,46 +1,46 @@ -package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding; - -import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox; -import net.minecraft.server.v1_14_R1.EntityLiving; -import net.minecraft.server.v1_14_R1.PathfinderGoalTarget; -import net.minecraft.server.v1_14_R1.PathfinderTargetCondition; -import org.bukkit.event.entity.EntityTargetEvent.TargetReason; - -import java.util.EnumSet; - -public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { - private final EntityTamableFox a; - private EntityLiving b; - private int c; - - public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { - super(tamableFox, false); - this.a = tamableFox; - this.a(EnumSet.of(Type.TARGET)); - } - - public boolean a() { - if (this.a.isTamed() && !this.a.isSitting()) { - EntityLiving entityliving = this.a.getOwner(); - if (entityliving == null) { - return false; - } else { - this.b = entityliving.getLastDamager(); - int i = entityliving.ct(); - 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.ct(); - } - - super.c(); - } -} +package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding; + +import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox; +import net.minecraft.server.v1_14_R1.EntityLiving; +import net.minecraft.server.v1_14_R1.PathfinderGoalTarget; +import net.minecraft.server.v1_14_R1.PathfinderTargetCondition; +import org.bukkit.event.entity.EntityTargetEvent.TargetReason; + +import java.util.EnumSet; + +public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { + private final EntityTamableFox a; + private EntityLiving b; + private int c; + + public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { + super(tamableFox, false); + this.a = tamableFox; + this.a(EnumSet.of(Type.TARGET)); + } + + public boolean a() { + if (this.a.isTamed() && !this.a.isSitting()) { + EntityLiving entityliving = this.a.getOwner(); + if (entityliving == null) { + return false; + } else { + this.b = entityliving.getLastDamager(); + int i = entityliving.ct(); + 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.ct(); + } + + super.c(); + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java index d88a032..68516fd 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java @@ -1,47 +1,47 @@ -package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding; - -import net.minecraft.server.v1_14_R1.EntityLiving; -import net.minecraft.server.v1_14_R1.EntityTameableAnimal; -import net.minecraft.server.v1_14_R1.PathfinderGoalTarget; -import net.minecraft.server.v1_14_R1.PathfinderTargetCondition; -import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox; -import org.bukkit.event.entity.EntityTargetEvent.TargetReason; - -import java.util.EnumSet; - -public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { - private final EntityTamableFox a; - private EntityLiving b; - private int c; - - public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) { - super(tamableFox, false); - this.a = tamableFox; - this.a(EnumSet.of(Type.TARGET)); - } - - public boolean a() { - if (this.a.isTamed() && !this.a.isSitting()) { - EntityLiving entityliving = this.a.getOwner(); - if (entityliving == null) { - return false; - } else { - this.b = entityliving.cu(); - int i = entityliving.cv(); - 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.cv(); - } - - super.c(); - } +package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding; + +import net.minecraft.server.v1_14_R1.EntityLiving; +import net.minecraft.server.v1_14_R1.EntityTameableAnimal; +import net.minecraft.server.v1_14_R1.PathfinderGoalTarget; +import net.minecraft.server.v1_14_R1.PathfinderTargetCondition; +import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox; +import org.bukkit.event.entity.EntityTargetEvent.TargetReason; + +import java.util.EnumSet; + +public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { + private final EntityTamableFox a; + private EntityLiving b; + private int c; + + public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) { + super(tamableFox, false); + this.a = tamableFox; + this.a(EnumSet.of(Type.TARGET)); + } + + public boolean a() { + if (this.a.isTamed() && !this.a.isSitting()) { + EntityLiving entityliving = this.a.getOwner(); + if (entityliving == null) { + return false; + } else { + this.b = entityliving.cu(); + int i = entityliving.cv(); + 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.cv(); + } + + super.c(); + } } \ No newline at end of file diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalPanic.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalPanic.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalPanic.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalPanic.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalSit.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalSit.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalSit.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalSit.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java index 02c3150..f2f967a 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_14_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java @@ -1,130 +1,130 @@ -package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding; - -import net.minecraft.server.v1_14_R1.*; -import net.seanomik.tamablefoxes.TamableFoxes; -import net.seanomik.tamablefoxes.versions.version_1_14_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()) { - 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 = new BlockPosition(this.b); - IBlockData iblockdata = this.a.world.getType(blockposition); - if (iblockdata.getBlock().a(TagsBlock.BEDS)) { - EnumDirection enumdirection = (EnumDirection)iblockdata.get(BlockBed.FACING); - this.c = new BlockPosition(blockposition.getX() - enumdirection.getAdjacentX(), blockposition.getY(), blockposition.getZ() - enumdirection.getAdjacentZ()); - return !this.g(); - } - } - - return false; - } - } - - private boolean g() { - List 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.eg()); // && !entityTamableFox.eh() <- isRelaxStateOne() - - return true; - } - - public boolean b() { - 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.getGoalSit().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.j(1.0F); - if (this.b.dJ() >= 100 && (double)f > 0.77D && (double)f < 0.8D && (double)this.a.world.getRandom().nextFloat() < 0.7D) { - this.h(); - } - - this.d = 0; - //this.a.v(false); < setRelaxStateOne - this.a.getNavigation().o(); - } - - private void h() { - Random random = this.a.getRandom(); - BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); - blockposition_mutableblockposition.a(this.a); - 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.a(this.a); - LootTable loottable = this.a.world.getMinecraftServer().getLootTableRegistry().getLootTable(LootTables.af); - LootTableInfo.Builder loottableinfo_builder = (new LootTableInfo.Builder((WorldServer)this.a.world)).set(LootContextParameters.POSITION, blockposition_mutableblockposition).set(LootContextParameters.THIS_ENTITY, this.a).a(random); - List 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)((float)blockposition_mutableblockposition.getX() - MathHelper.sin(this.a.aK * 0.017453292F)), (double)blockposition_mutableblockposition.getY(), (double)((float)blockposition_mutableblockposition.getZ() + MathHelper.cos(this.a.aK * 0.017453292F)), itemstack)); - } - - } - - public void e() { - if (this.b != null && this.c != null) { - this.a.getGoalSit().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.v(false); < setRelaxStateOne - } else { - this.a.a(this.b, 45.0F, 45.0F); - //this.a.v(true); < setRelaxStateOne - } - } else { - this.a.setSleeping(false); - } - } - - } -} +package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding; + +import net.minecraft.server.v1_14_R1.*; +import net.seanomik.tamablefoxes.TamableFoxes; +import net.seanomik.tamablefoxes.versions.version_1_14_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()) { + 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 = new BlockPosition(this.b); + IBlockData iblockdata = this.a.world.getType(blockposition); + if (iblockdata.getBlock().a(TagsBlock.BEDS)) { + EnumDirection enumdirection = (EnumDirection)iblockdata.get(BlockBed.FACING); + this.c = new BlockPosition(blockposition.getX() - enumdirection.getAdjacentX(), blockposition.getY(), blockposition.getZ() - enumdirection.getAdjacentZ()); + return !this.g(); + } + } + + return false; + } + } + + private boolean g() { + List 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.eg()); // && !entityTamableFox.eh() <- isRelaxStateOne() + + return true; + } + + public boolean b() { + 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.getGoalSit().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.j(1.0F); + if (this.b.dJ() >= 100 && (double)f > 0.77D && (double)f < 0.8D && (double)this.a.world.getRandom().nextFloat() < 0.7D) { + this.h(); + } + + this.d = 0; + //this.a.v(false); < setRelaxStateOne + this.a.getNavigation().o(); + } + + private void h() { + Random random = this.a.getRandom(); + BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); + blockposition_mutableblockposition.a(this.a); + 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.a(this.a); + LootTable loottable = this.a.world.getMinecraftServer().getLootTableRegistry().getLootTable(LootTables.af); + LootTableInfo.Builder loottableinfo_builder = (new LootTableInfo.Builder((WorldServer)this.a.world)).set(LootContextParameters.POSITION, blockposition_mutableblockposition).set(LootContextParameters.THIS_ENTITY, this.a).a(random); + List 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)((float)blockposition_mutableblockposition.getX() - MathHelper.sin(this.a.aK * 0.017453292F)), (double)blockposition_mutableblockposition.getY(), (double)((float)blockposition_mutableblockposition.getZ() + MathHelper.cos(this.a.aK * 0.017453292F)), itemstack)); + } + + } + + public void e() { + if (this.b != null && this.c != null) { + this.a.getGoalSit().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.v(false); < setRelaxStateOne + } else { + this.a.a(this.b, 45.0F, 45.0F); + //this.a.v(true); < setRelaxStateOne + } + } else { + this.a.setSleeping(false); + } + } + + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/EntityTamableFox.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/EntityTamableFox.java similarity index 98% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/EntityTamableFox.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/EntityTamableFox.java index da33406..72daa98 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/EntityTamableFox.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/EntityTamableFox.java @@ -2,10 +2,10 @@ 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.io.sqlite.SQLiteHelper; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.Config; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +import net.seanomik.tamablefoxes.util.io.sqlite.SQLiteHelper; import net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding.*; import net.wesjd.anvilgui.AnvilGUI; import org.bukkit.Bukkit; @@ -318,7 +318,7 @@ public class EntityTamableFox extends EntityFox { itemstack.subtract(1); } - SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(); + SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin()); int maxTameCount = Config.getMaxPlayerFoxTames(); if ( !((Player) entityhuman.getBukkitEntity()).hasPermission("tamablefoxes.tame.unlimited") && maxTameCount > 0 && sqLiteHelper.getPlayerFoxAmount(entityhuman.getUniqueID()) >= maxTameCount) { ((Player) entityhuman.getBukkitEntity()).sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFoxDoesntTrust()); @@ -499,7 +499,7 @@ public class EntityTamableFox extends EntityFox { // Remove the amount of foxes the player has tamed if the limit is enabled. if (Config.getMaxPlayerFoxTames() > 0) { - SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(); + SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin()); sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1); } } diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/NMSInterface_1_15_R1.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/NMSInterface_1_15_R1.java similarity index 83% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/NMSInterface_1_15_R1.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/NMSInterface_1_15_R1.java index d1767fc..f3402f9 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/NMSInterface_1_15_R1.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/NMSInterface_1_15_R1.java @@ -1,36 +1,35 @@ -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.Utils; -import net.seanomik.tamablefoxes.io.LanguageConfig; -import net.seanomik.tamablefoxes.versions.FieldHelper; -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"); - FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b) EntityTamableFox::new); - Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); - } catch (Exception e) { - Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); - e.printStackTrace(); - } - } - - @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 ); - } -} +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.util.FieldHelper; +import net.seanomik.tamablefoxes.util.NMSInterface; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +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; + +public class NMSInterface_1_15_R1 implements NMSInterface { + @Override + public void registerCustomFoxEntity() { + try { // Replace the fox entity + Field field = EntityTypes.FOX.getClass().getDeclaredField("ba"); + FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b) EntityTamableFox::new); + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); + } catch (Exception e) { + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); + e.printStackTrace(); + } + } + + @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 ); + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalFollowOwner.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalFollowOwner.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalFollowOwner.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalFollowOwner.java index 2530c8b..4442de5 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalFollowOwner.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalFollowOwner.java @@ -1,139 +1,139 @@ -package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding; - -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; -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 entityTamableFox, double d0, float f, float f1, boolean flag) { - this.a = entityTamableFox; - this.c = entityTamableFox.world; - this.d = d0; - this.e = entityTamableFox.getNavigation(); - this.h = f; - this.g = f1; - this.j = flag; - this.a(EnumSet.of(Type.MOVE, Type.LOOK)); - if (!(entityTamableFox.getNavigation() instanceof Navigation) && !(entityTamableFox.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()) { - return false; - } else if (this.a.h(entityliving) < (double)(this.h * this.h)) { - return false; - } else { - this.b = entityliving; - return true; - } - } - - public boolean b() { - 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.dU()); - 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 = new BlockPosition(this.b); - - 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)((float)i + 0.5F), (double)j, (double)((float)k + 0.5F), 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.b(this.c, blockposition.getX(), blockposition.getY(), blockposition.getZ()); - 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(new BlockPosition(this.a)); - 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; - } - -} +package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding; + +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; +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 entityTamableFox, double d0, float f, float f1, boolean flag) { + this.a = entityTamableFox; + this.c = entityTamableFox.world; + this.d = d0; + this.e = entityTamableFox.getNavigation(); + this.h = f; + this.g = f1; + this.j = flag; + this.a(EnumSet.of(Type.MOVE, Type.LOOK)); + if (!(entityTamableFox.getNavigation() instanceof Navigation) && !(entityTamableFox.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()) { + return false; + } else if (this.a.h(entityliving) < (double)(this.h * this.h)) { + return false; + } else { + this.b = entityliving; + return true; + } + } + + public boolean b() { + 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.dU()); + 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 = new BlockPosition(this.b); + + 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)((float)i + 0.5F), (double)j, (double)((float)k + 0.5F), 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.b(this.c, blockposition.getX(), blockposition.getY(), blockposition.getZ()); + 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(new BlockPosition(this.a)); + 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; + } + +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java index 880a7e1..f2ed07b 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java @@ -1,48 +1,48 @@ -package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding; - -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; -import org.bukkit.event.entity.EntityTargetEvent.TargetReason; - -import java.util.EnumSet; - -public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { - - private final EntityTamableFox a; - private EntityLiving b; - private int c; - - public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { - super(tamableFox, false); - this.a = tamableFox; - this.a(EnumSet.of(Type.TARGET)); - } - - public boolean a() { - if (this.a.isTamed() && !this.a.isSitting()) { - EntityLiving entityliving = this.a.getOwner(); - if (entityliving == null) { - return false; - } else { - this.b = entityliving.getLastDamager(); - int i = entityliving.cI(); - 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.cI(); - } - - super.c(); - } - -} +package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding; + +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; +import org.bukkit.event.entity.EntityTargetEvent.TargetReason; + +import java.util.EnumSet; + +public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { + + private final EntityTamableFox a; + private EntityLiving b; + private int c; + + public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { + super(tamableFox, false); + this.a = tamableFox; + this.a(EnumSet.of(Type.TARGET)); + } + + public boolean a() { + if (this.a.isTamed() && !this.a.isSitting()) { + EntityLiving entityliving = this.a.getOwner(); + if (entityliving == null) { + return false; + } else { + this.b = entityliving.getLastDamager(); + int i = entityliving.cI(); + 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.cI(); + } + + super.c(); + } + +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java index b5e3350..5d6dd12 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java @@ -1,47 +1,47 @@ -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.versions.version_1_15_R1.EntityTamableFox; -import org.bukkit.event.entity.EntityTargetEvent.TargetReason; - -import java.util.EnumSet; - -public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { - private final EntityTamableFox fox; - private EntityLiving hitEntity; - private int c; - - public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox entityTamableFox) { - super(entityTamableFox, false); - this.fox = entityTamableFox; - this.a(EnumSet.of(Type.TARGET)); - } - - public boolean a() { - if (fox.isTamed() && !fox.isSitting()) { - EntityLiving entityliving = fox.getOwner(); - if (entityliving == null) { - e.setGoalTarget(null); - return false; - } else { - hitEntity = entityliving.cJ(); - int i = entityliving.cK(); - return i != this.c && this.a(hitEntity, PathfinderTargetCondition.a) && fox.a(hitEntity, entityliving); - } - } else { - return false; - } - } - - public void c() { - this.e.setGoalTarget(hitEntity, TargetReason.OWNER_ATTACKED_TARGET, true); - EntityLiving entityliving = fox.getOwner(); - if (entityliving != null) { - this.c = entityliving.cK(); - } - - super.c(); - } +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.versions.version_1_15_R1.EntityTamableFox; +import org.bukkit.event.entity.EntityTargetEvent.TargetReason; + +import java.util.EnumSet; + +public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { + private final EntityTamableFox fox; + private EntityLiving hitEntity; + private int c; + + public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox entityTamableFox) { + super(entityTamableFox, false); + this.fox = entityTamableFox; + this.a(EnumSet.of(Type.TARGET)); + } + + public boolean a() { + if (fox.isTamed() && !fox.isSitting()) { + EntityLiving entityliving = fox.getOwner(); + if (entityliving == null) { + e.setGoalTarget(null); + return false; + } else { + hitEntity = entityliving.cJ(); + int i = entityliving.cK(); + return i != this.c && this.a(hitEntity, PathfinderTargetCondition.a) && fox.a(hitEntity, entityliving); + } + } else { + return false; + } + } + + public void c() { + this.e.setGoalTarget(hitEntity, TargetReason.OWNER_ATTACKED_TARGET, true); + EntityLiving entityliving = fox.getOwner(); + if (entityliving != null) { + this.c = entityliving.cK(); + } + + super.c(); + } } \ No newline at end of file diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalPanic.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalPanic.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalPanic.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalPanic.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSit.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSit.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSit.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSit.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java index 7573f3f..8bdd4a5 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_15_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java @@ -1,130 +1,130 @@ -package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding; - -import net.minecraft.server.v1_15_R1.*; -import net.seanomik.tamablefoxes.versions.version_1_15_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 = new BlockPosition(this.b); - IBlockData iblockdata = this.a.world.getType(blockposition); - if (iblockdata.getBlock().a(TagsBlock.BEDS)) { - EnumDirection enumdirection = (EnumDirection)iblockdata.get(BlockBed.FACING); - this.c = new BlockPosition(blockposition.getX() - enumdirection.getAdjacentX(), blockposition.getY(), blockposition.getZ() - enumdirection.getAdjacentZ()); - return !this.g(); - } - } - - return false; - } - } - - private boolean g() { - List 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.isSleeping()); // !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.ef() >= 100 && (double)f > 0.77D && (double)f < 0.8D && (double)this.a.world.getRandom().nextFloat() < 0.7D) { - this.h(); - } - - this.d = 0; - //this.a.v(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); - LootTableInfo.Builder loottableinfo_builder = (new LootTableInfo.Builder((WorldServer)this.a.world)).set(LootContextParameters.POSITION, blockposition_mutableblockposition).set(LootContextParameters.THIS_ENTITY, this.a).a(random); - List 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); - } - } - } -} +package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding; + +import net.minecraft.server.v1_15_R1.*; +import net.seanomik.tamablefoxes.versions.version_1_15_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 = new BlockPosition(this.b); + IBlockData iblockdata = this.a.world.getType(blockposition); + if (iblockdata.getBlock().a(TagsBlock.BEDS)) { + EnumDirection enumdirection = (EnumDirection)iblockdata.get(BlockBed.FACING); + this.c = new BlockPosition(blockposition.getX() - enumdirection.getAdjacentX(), blockposition.getY(), blockposition.getZ() - enumdirection.getAdjacentZ()); + return !this.g(); + } + } + + return false; + } + } + + private boolean g() { + List 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.isSleeping()); // !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.ef() >= 100 && (double)f > 0.77D && (double)f < 0.8D && (double)this.a.world.getRandom().nextFloat() < 0.7D) { + this.h(); + } + + this.d = 0; + //this.a.v(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); + LootTableInfo.Builder loottableinfo_builder = (new LootTableInfo.Builder((WorldServer)this.a.world)).set(LootContextParameters.POSITION, blockposition_mutableblockposition).set(LootContextParameters.THIS_ENTITY, this.a).a(random); + List 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); + } + } + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/EntityTamableFox.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/EntityTamableFox.java similarity index 98% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/EntityTamableFox.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/EntityTamableFox.java index 08c17b8..f896d62 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/EntityTamableFox.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/EntityTamableFox.java @@ -2,10 +2,10 @@ 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.io.sqlite.SQLiteHelper; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.Config; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +import net.seanomik.tamablefoxes.util.io.sqlite.SQLiteHelper; import net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding.*; import net.wesjd.anvilgui.AnvilGUI; import org.bukkit.Bukkit; @@ -321,7 +321,7 @@ public class EntityTamableFox extends EntityFox { itemstack.subtract(1); } - SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(); + SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin()); int maxTameCount = Config.getMaxPlayerFoxTames(); if ( !((Player) entityhuman.getBukkitEntity()).hasPermission("tamablefoxes.tame.unlimited") && maxTameCount > 0 && sqLiteHelper.getPlayerFoxAmount(entityhuman.getUniqueID()) >= maxTameCount) { ((Player) entityhuman.getBukkitEntity()).sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFoxDoesntTrust()); @@ -503,7 +503,7 @@ public class EntityTamableFox extends EntityFox { // Remove the amount of foxes the player has tamed if the limit is enabled. if (Config.getMaxPlayerFoxTames() > 0) { - SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(); + SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin()); sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1); } } diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/NMSInterface_1_16_R1.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/NMSInterface_1_16_R1.java similarity index 83% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/NMSInterface_1_16_R1.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/NMSInterface_1_16_R1.java index 35e877e..a98e311 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/NMSInterface_1_16_R1.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/NMSInterface_1_16_R1.java @@ -1,37 +1,36 @@ -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.Utils; -import net.seanomik.tamablefoxes.io.LanguageConfig; -import net.seanomik.tamablefoxes.versions.FieldHelper; -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"); - FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b) EntityTamableFox::new); - Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); - } catch (Exception e) { - Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); - e.printStackTrace(); - } - } - - @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); - } -} +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.util.FieldHelper; +import net.seanomik.tamablefoxes.util.NMSInterface; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +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; + +public class NMSInterface_1_16_R1 implements NMSInterface { + + @Override + public void registerCustomFoxEntity() { + try { // Replace the fox entity + Field field = EntityTypes.FOX.getClass().getDeclaredField("be"); + FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b) EntityTamableFox::new); + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); + } catch (Exception e) { + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); + e.printStackTrace(); + } + } + + @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); + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalFollowOwner.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalFollowOwner.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalFollowOwner.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalFollowOwner.java index f391d13..c7ebd64 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalFollowOwner.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalFollowOwner.java @@ -1,139 +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; - } -} +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; + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalHurtByTarget.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java index 5964014..b3f2e5b 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java @@ -1,47 +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(); - } -} +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(); + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java index 7ef963d..a04f264 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java @@ -1,48 +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(); - } +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(); + } } \ No newline at end of file diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalPanic.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalPanic.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalPanic.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalPanic.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalSit.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalSit.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalSit.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalSit.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java index 6d81401..b9941c9 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R1/pathfinding/FoxPathfinderGoalSleepWithOwner.java @@ -1,134 +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()) { - 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 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.isSleeping()); // !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 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); - } - } - - } -} +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()) { + 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 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.isSleeping()); // !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 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); + } + } + + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/EntityTamableFox.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/EntityTamableFox.java similarity index 98% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/EntityTamableFox.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/EntityTamableFox.java index 474e1f9..83678fc 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/EntityTamableFox.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/EntityTamableFox.java @@ -2,10 +2,10 @@ package net.seanomik.tamablefoxes.versions.version_1_16_R2; import net.minecraft.server.v1_16_R2.*; 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.io.sqlite.SQLiteHelper; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.Config; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +import net.seanomik.tamablefoxes.util.io.sqlite.SQLiteHelper; import net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding.*; import net.wesjd.anvilgui.AnvilGUI; import org.bukkit.Bukkit; @@ -318,7 +318,7 @@ public class EntityTamableFox extends EntityFox { itemstack.subtract(1); } - SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(); + SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin()); int maxTameCount = Config.getMaxPlayerFoxTames(); if ( !((Player) entityhuman.getBukkitEntity()).hasPermission("tamablefoxes.tame.unlimited") && maxTameCount > 0 && sqLiteHelper.getPlayerFoxAmount(entityhuman.getUniqueID()) >= maxTameCount) { ((Player) entityhuman.getBukkitEntity()).sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFoxDoesntTrust()); @@ -500,7 +500,7 @@ public class EntityTamableFox extends EntityFox { // Remove the amount of foxes the player has tamed if the limit is enabled. if (Config.getMaxPlayerFoxTames() > 0) { - SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(); + SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin()); sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1); } } diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/NMSInterface_1_16_R2.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/NMSInterface_1_16_R2.java similarity index 85% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/NMSInterface_1_16_R2.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/NMSInterface_1_16_R2.java index b3bea78..5c5b086 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/NMSInterface_1_16_R2.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/NMSInterface_1_16_R2.java @@ -1,36 +1,36 @@ -package net.seanomik.tamablefoxes.versions.version_1_16_R2; - -import net.minecraft.server.v1_16_R2.EntityFox; -import net.minecraft.server.v1_16_R2.EntityTypes; -import net.seanomik.tamablefoxes.Utils; -import net.seanomik.tamablefoxes.io.LanguageConfig; -import net.seanomik.tamablefoxes.versions.FieldHelper; -import net.seanomik.tamablefoxes.versions.NMSInterface; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_16_R2.entity.CraftEntity; -import org.bukkit.entity.EntityType; - -import java.lang.reflect.Field; - -public class NMSInterface_1_16_R2 implements NMSInterface { - - @Override - public void registerCustomFoxEntity() { - try { // Replace the fox entity - Field field = EntityTypes.FOX.getClass().getDeclaredField("bf"); - FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b) EntityTamableFox::new); - Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); - } catch (Exception e) { - Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); - e.printStackTrace(); - } - } - - @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); - } -} +package net.seanomik.tamablefoxes.versions.version_1_16_R2; + +import net.minecraft.server.v1_16_R2.EntityFox; +import net.minecraft.server.v1_16_R2.EntityTypes; +import net.seanomik.tamablefoxes.util.FieldHelper; +import net.seanomik.tamablefoxes.util.NMSInterface; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_16_R2.entity.CraftEntity; +import org.bukkit.entity.EntityType; + +import java.lang.reflect.Field; + +public class NMSInterface_1_16_R2 implements NMSInterface { + + @Override + public void registerCustomFoxEntity() { + try { // Replace the fox entity + Field field = EntityTypes.FOX.getClass().getDeclaredField("bf"); + FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b) EntityTamableFox::new); + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); + } catch (Exception e) { + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); + e.printStackTrace(); + } + } + + @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); + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalFollowOwner.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalFollowOwner.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalFollowOwner.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalFollowOwner.java index 9fb7253..d80f3a0 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalFollowOwner.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalFollowOwner.java @@ -1,139 +1,139 @@ -package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding; - -import net.minecraft.server.v1_16_R2.*; -import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_16_R2.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(Type.MOVE, 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; - } -} +package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding; + +import net.minecraft.server.v1_16_R2.*; +import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_16_R2.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(Type.MOVE, 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; + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalHurtByTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalHurtByTarget.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalHurtByTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalHurtByTarget.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java index 4b36131..9f12d23 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java @@ -1,46 +1,46 @@ -package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding; - -import net.minecraft.server.v1_16_R2.EntityLiving; -import net.minecraft.server.v1_16_R2.PathfinderGoalTarget; -import net.minecraft.server.v1_16_R2.PathfinderTargetCondition; -import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox; -import org.bukkit.event.entity.EntityTargetEvent.TargetReason; - -import java.util.EnumSet; - -public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { - private final EntityTamableFox a; - private EntityLiving b; - private int c; - - public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { - super(tamableFox, false); - this.a = tamableFox; - this.a(EnumSet.of(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(); - } -} +package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding; + +import net.minecraft.server.v1_16_R2.EntityLiving; +import net.minecraft.server.v1_16_R2.PathfinderGoalTarget; +import net.minecraft.server.v1_16_R2.PathfinderTargetCondition; +import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox; +import org.bukkit.event.entity.EntityTargetEvent.TargetReason; + +import java.util.EnumSet; + +public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { + private final EntityTamableFox a; + private EntityLiving b; + private int c; + + public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { + super(tamableFox, false); + this.a = tamableFox; + this.a(EnumSet.of(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(); + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java index 3e5261f..1ce00c0 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java @@ -1,46 +1,46 @@ -package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding; - -import net.minecraft.server.v1_16_R2.EntityLiving; -import net.minecraft.server.v1_16_R2.PathfinderGoalTarget; -import net.minecraft.server.v1_16_R2.PathfinderTargetCondition; -import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox; -import org.bukkit.event.entity.EntityTargetEvent.TargetReason; - -import java.util.EnumSet; - -public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { - private final EntityTamableFox a; - private EntityLiving b; - private int c; - - public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) { - super(tamableFox, false); - this.a = tamableFox; - this.a(EnumSet.of(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.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(); - } +package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding; + +import net.minecraft.server.v1_16_R2.EntityLiving; +import net.minecraft.server.v1_16_R2.PathfinderGoalTarget; +import net.minecraft.server.v1_16_R2.PathfinderTargetCondition; +import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox; +import org.bukkit.event.entity.EntityTargetEvent.TargetReason; + +import java.util.EnumSet; + +public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { + private final EntityTamableFox a; + private EntityLiving b; + private int c; + + public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) { + super(tamableFox, false); + this.a = tamableFox; + this.a(EnumSet.of(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.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(); + } } \ No newline at end of file diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalPanic.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalPanic.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalPanic.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalPanic.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalSit.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalSit.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalSit.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalSit.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalSleepWithOwner.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalSleepWithOwner.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalSleepWithOwner.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalSleepWithOwner.java index b7e7477..579e5ba 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalSleepWithOwner.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R2/pathfinding/FoxPathfinderGoalSleepWithOwner.java @@ -1,133 +1,133 @@ -package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding; - -import net.minecraft.server.v1_16_R2.*; -import net.seanomik.tamablefoxes.versions.version_1_16_R2.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()) { - 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 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.isSleeping()); // !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_R2.LootTableInfo.Builder loottableinfo_builder = (new net.minecraft.server.v1_16_R2.LootTableInfo.Builder((WorldServer)this.a.world)).set(LootContextParameters.ORIGIN, this.a.getPositionVector()).set(LootContextParameters.THIS_ENTITY, this.a).a(random); - List 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.aA * 0.017453292F), (double)blockposition_mutableblockposition.getY(), (double)blockposition_mutableblockposition.getZ() + (double)MathHelper.cos(this.a.aA * 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); - } - } - - } -} +package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding; + +import net.minecraft.server.v1_16_R2.*; +import net.seanomik.tamablefoxes.versions.version_1_16_R2.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()) { + 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 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.isSleeping()); // !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_R2.LootTableInfo.Builder loottableinfo_builder = (new net.minecraft.server.v1_16_R2.LootTableInfo.Builder((WorldServer)this.a.world)).set(LootContextParameters.ORIGIN, this.a.getPositionVector()).set(LootContextParameters.THIS_ENTITY, this.a).a(random); + List 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.aA * 0.017453292F), (double)blockposition_mutableblockposition.getY(), (double)blockposition_mutableblockposition.getZ() + (double)MathHelper.cos(this.a.aA * 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); + } + } + + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/EntityTamableFox.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/EntityTamableFox.java similarity index 98% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/EntityTamableFox.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/EntityTamableFox.java index ac82927..d398654 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/EntityTamableFox.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/EntityTamableFox.java @@ -2,10 +2,10 @@ package net.seanomik.tamablefoxes.versions.version_1_16_R3; import net.minecraft.server.v1_16_R3.*; 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.io.sqlite.SQLiteHelper; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.Config; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +import net.seanomik.tamablefoxes.util.io.sqlite.SQLiteHelper; import net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding.*; import net.wesjd.anvilgui.AnvilGUI; import org.bukkit.Bukkit; @@ -319,7 +319,7 @@ public class EntityTamableFox extends EntityFox { itemstack.subtract(1); } - SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(); + SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin()); int maxTameCount = Config.getMaxPlayerFoxTames(); if ( !((Player) entityhuman.getBukkitEntity()).hasPermission("tamablefoxes.tame.unlimited") && maxTameCount > 0 && sqLiteHelper.getPlayerFoxAmount(entityhuman.getUniqueID()) >= maxTameCount) { ((Player) entityhuman.getBukkitEntity()).sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFoxDoesntTrust()); @@ -501,7 +501,7 @@ public class EntityTamableFox extends EntityFox { // Remove the amount of foxes the player has tamed if the limit is enabled. if (Config.getMaxPlayerFoxTames() > 0) { - SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(); + SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin()); sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1); } } diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/NMSInterface_1_16_R3.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/NMSInterface_1_16_R3.java similarity index 85% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/NMSInterface_1_16_R3.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/NMSInterface_1_16_R3.java index db9d307..d76e8b7 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/NMSInterface_1_16_R3.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/NMSInterface_1_16_R3.java @@ -1,36 +1,36 @@ -package net.seanomik.tamablefoxes.versions.version_1_16_R3; - -import net.minecraft.server.v1_16_R3.EntityFox; -import net.minecraft.server.v1_16_R3.EntityTypes; -import net.seanomik.tamablefoxes.Utils; -import net.seanomik.tamablefoxes.io.LanguageConfig; -import net.seanomik.tamablefoxes.versions.FieldHelper; -import net.seanomik.tamablefoxes.versions.NMSInterface; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity; -import org.bukkit.entity.EntityType; - -import java.lang.reflect.Field; - -public class NMSInterface_1_16_R3 implements NMSInterface { - - @Override - public void registerCustomFoxEntity() { - try { // Replace the fox entity - Field field = EntityTypes.FOX.getClass().getDeclaredField("bf"); - FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b) EntityTamableFox::new); - Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); - } catch (Exception e) { - Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); - e.printStackTrace(); - } - } - - @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); - } -} +package net.seanomik.tamablefoxes.versions.version_1_16_R3; + +import net.minecraft.server.v1_16_R3.EntityFox; +import net.minecraft.server.v1_16_R3.EntityTypes; +import net.seanomik.tamablefoxes.util.FieldHelper; +import net.seanomik.tamablefoxes.util.NMSInterface; +import net.seanomik.tamablefoxes.util.Utils; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity; +import org.bukkit.entity.EntityType; + +import java.lang.reflect.Field; + +public class NMSInterface_1_16_R3 implements NMSInterface { + + @Override + public void registerCustomFoxEntity() { + try { // Replace the fox entity + Field field = EntityTypes.FOX.getClass().getDeclaredField("bf"); + FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b) EntityTamableFox::new); + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); + } catch (Exception e) { + Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); + e.printStackTrace(); + } + } + + @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); + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalFollowOwner.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalFollowOwner.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalFollowOwner.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalFollowOwner.java index 75adde4..1f11ea6 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalFollowOwner.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalFollowOwner.java @@ -1,139 +1,139 @@ -package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding; - -import net.minecraft.server.v1_16_R3.*; -import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_16_R3.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(Type.MOVE, 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.O()); - 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; - } -} +package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding; + +import net.minecraft.server.v1_16_R3.*; +import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_16_R3.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(Type.MOVE, 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.O()); + 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; + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalHurtByTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalHurtByTarget.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalHurtByTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalHurtByTarget.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java index b9199bd..7dd1afc 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtByTarget.java @@ -1,46 +1,46 @@ -package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding; - -import net.minecraft.server.v1_16_R3.EntityLiving; -import net.minecraft.server.v1_16_R3.PathfinderGoalTarget; -import net.minecraft.server.v1_16_R3.PathfinderTargetCondition; -import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox; -import org.bukkit.event.entity.EntityTargetEvent.TargetReason; - -import java.util.EnumSet; - -public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { - private final EntityTamableFox a; - private EntityLiving b; - private int c; - - public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { - super(tamableFox, false); - this.a = tamableFox; - this.a(EnumSet.of(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.da(); - 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.da(); - } - - super.c(); - } -} +package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding; + +import net.minecraft.server.v1_16_R3.EntityLiving; +import net.minecraft.server.v1_16_R3.PathfinderGoalTarget; +import net.minecraft.server.v1_16_R3.PathfinderTargetCondition; +import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox; +import org.bukkit.event.entity.EntityTargetEvent.TargetReason; + +import java.util.EnumSet; + +public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { + private final EntityTamableFox a; + private EntityLiving b; + private int c; + + public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { + super(tamableFox, false); + this.a = tamableFox; + this.a(EnumSet.of(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.da(); + 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.da(); + } + + super.c(); + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java index 4f09755..a826665 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalOwnerHurtTarget.java @@ -1,46 +1,46 @@ -package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding; - -import net.minecraft.server.v1_16_R3.EntityLiving; -import net.minecraft.server.v1_16_R3.PathfinderGoalTarget; -import net.minecraft.server.v1_16_R3.PathfinderTargetCondition; -import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox; -import org.bukkit.event.entity.EntityTargetEvent.TargetReason; - -import java.util.EnumSet; - -public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { - private final EntityTamableFox a; - private EntityLiving b; - private int c; - - public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) { - super(tamableFox, false); - this.a = tamableFox; - this.a(EnumSet.of(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.db(); - int i = entityliving.dc(); - 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.dc(); - } - - super.c(); - } +package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding; + +import net.minecraft.server.v1_16_R3.EntityLiving; +import net.minecraft.server.v1_16_R3.PathfinderGoalTarget; +import net.minecraft.server.v1_16_R3.PathfinderTargetCondition; +import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox; +import org.bukkit.event.entity.EntityTargetEvent.TargetReason; + +import java.util.EnumSet; + +public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { + private final EntityTamableFox a; + private EntityLiving b; + private int c; + + public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) { + super(tamableFox, false); + this.a = tamableFox; + this.a(EnumSet.of(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.db(); + int i = entityliving.dc(); + 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.dc(); + } + + super.c(); + } } \ No newline at end of file diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalPanic.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalPanic.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalPanic.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalPanic.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalSit.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalSit.java similarity index 100% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalSit.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalSit.java diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalSleepWithOwner.java b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalSleepWithOwner.java similarity index 97% rename from src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalSleepWithOwner.java rename to Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalSleepWithOwner.java index 7b90623..3c7134e 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalSleepWithOwner.java +++ b/Plugin/src/main/java/net/seanomik/tamablefoxes/versions/version_1_16_R3/pathfinding/FoxPathfinderGoalSleepWithOwner.java @@ -1,132 +1,132 @@ -package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding; - -import net.minecraft.server.v1_16_R3.*; -import net.seanomik.tamablefoxes.versions.version_1_16_R3.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 entitycat) { - this.a = entitycat; - } - - public boolean a() { - if (!this.a.isTamed()) { - return false; - } else if (this.a.isSitting()) { - 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 list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D)); - Iterator iterator = list.iterator(); - - EntityTamableFox entitycat; - do { - do { - if (!iterator.hasNext()) { - return false; - } - - entitycat = (EntityTamableFox)iterator.next(); - } while(entitycat == this.a); - } while(!entitycat.eW()); - - return true; - } - - public boolean b() { - return this.a.isTamed() && 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.eC() >= 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); - 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_R3.LootTableInfo.Builder loottableinfo_builder = (new net.minecraft.server.v1_16_R3.LootTableInfo.Builder((WorldServer)this.a.world)).set(LootContextParameters.ORIGIN, this.a.getPositionVector()).set(LootContextParameters.THIS_ENTITY, this.a).a(random); - List 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.aA * 0.017453292F), (double)blockposition_mutableblockposition.getY(), (double)blockposition_mutableblockposition.getZ() + (double)MathHelper.cos(this.a.aA * 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); - } else { - this.a.a(this.b, 45.0F, 45.0F); - //this.a.y(true); - } - } else { - this.a.setSleeping(false); - } - } - - } -} +package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding; + +import net.minecraft.server.v1_16_R3.*; +import net.seanomik.tamablefoxes.versions.version_1_16_R3.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 entitycat) { + this.a = entitycat; + } + + public boolean a() { + if (!this.a.isTamed()) { + return false; + } else if (this.a.isSitting()) { + 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 list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D)); + Iterator iterator = list.iterator(); + + EntityTamableFox entitycat; + do { + do { + if (!iterator.hasNext()) { + return false; + } + + entitycat = (EntityTamableFox)iterator.next(); + } while(entitycat == this.a); + } while(!entitycat.eW()); + + return true; + } + + public boolean b() { + return this.a.isTamed() && 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.eC() >= 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); + 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_R3.LootTableInfo.Builder loottableinfo_builder = (new net.minecraft.server.v1_16_R3.LootTableInfo.Builder((WorldServer)this.a.world)).set(LootContextParameters.ORIGIN, this.a.getPositionVector()).set(LootContextParameters.THIS_ENTITY, this.a).a(random); + List 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.aA * 0.017453292F), (double)blockposition_mutableblockposition.getY(), (double)blockposition_mutableblockposition.getZ() + (double)MathHelper.cos(this.a.aA * 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); + } else { + this.a.a(this.b, 45.0F, 45.0F); + //this.a.y(true); + } + } else { + this.a.setSleeping(false); + } + } + + } +} diff --git a/src/main/resources/config.yml b/Plugin/src/main/resources/config.yml similarity index 78% rename from src/main/resources/config.yml rename to Plugin/src/main/resources/config.yml index 5c59195..2c2faf2 100644 --- a/src/main/resources/config.yml +++ b/Plugin/src/main/resources/config.yml @@ -1,7 +1,7 @@ -# Config for Tamable Foxes -show-owner-in-fox-name: true -ask-for-name-after-taming: true -max-fox-tames: 0 - -tamed-behavior: +# Config for Tamable Foxes +show-owner-in-fox-name: true +ask-for-name-after-taming: true +max-fox-tames: 0 + +tamed-behavior: attack-wild-animals: true \ No newline at end of file diff --git a/src/main/resources/language.yml b/Plugin/src/main/resources/language.yml similarity index 96% rename from src/main/resources/language.yml rename to Plugin/src/main/resources/language.yml index 2f90b1e..b99a656 100644 --- a/src/main/resources/language.yml +++ b/Plugin/src/main/resources/language.yml @@ -1,19 +1,19 @@ -mc-version-loading: "Registering entity for MC Version %MC_VERSION%..." -unsupported-mc-version-not-registering: "ERROR: This plugin version only supports Spigot 1.14-1.16.4! 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.14-1.16.4! Disabling plugin! Make sure your Java version is no newer than Java 11!" -success-replaced-entity: "Replaced tamable fox entity!" -error-to-replaced-entity: "Failed to replace tamable fox entity!" -saving-foxes-message: "Saving foxes." - -taming-tamed-message: "You just tamed a wild fox!" -taming-asking-for-name-message: "What do you want to call it?" -taming-chosen-name-perfect: "%NEW_FOX_NAME% is perfect!" -fox-name-format: "%FOX_NAME% (%OWNER%'s Fox)" -fox-name-no-owner-name-format: "%FOX_NAME%" -fox-doesnt-trust: "The fox doesn't trust you! You have too many foxes!" - -no-permission: "You do not have the permission for this command." -only-run-by-player: "Command can only be run from player state!" -spawned-fox-message: "Spawned a %TYPE% fox." -failed-to-spawn-message: "Failed to spawn fox!" +mc-version-loading: "Registering entity for MC Version %MC_VERSION%..." +unsupported-mc-version-not-registering: "ERROR: This plugin version only supports Spigot 1.14-1.16.4! 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.14-1.16.4! Disabling plugin! Make sure your Java version is no newer than Java 11!" +success-replaced-entity: "Replaced tamable fox entity!" +error-to-replaced-entity: "Failed to replace tamable fox entity!" +saving-foxes-message: "Saving foxes." + +taming-tamed-message: "You just tamed a wild fox!" +taming-asking-for-name-message: "What do you want to call it?" +taming-chosen-name-perfect: "%NEW_FOX_NAME% is perfect!" +fox-name-format: "%FOX_NAME% (%OWNER%'s Fox)" +fox-name-no-owner-name-format: "%FOX_NAME%" +fox-doesnt-trust: "The fox doesn't trust you! You have too many foxes!" + +no-permission: "You do not have the permission for this command." +only-run-by-player: "Command can only be run from player state!" +spawned-fox-message: "Spawned a %TYPE% fox." +failed-to-spawn-message: "Failed to spawn fox!" reloaded-message: "Reloaded." \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/Plugin/src/main/resources/plugin.yml similarity index 97% rename from src/main/resources/plugin.yml rename to Plugin/src/main/resources/plugin.yml index e17b52b..29526f6 100644 --- a/src/main/resources/plugin.yml +++ b/Plugin/src/main/resources/plugin.yml @@ -1,22 +1,22 @@ -name: Tamablefoxes -version: ${project.version} -main: net.seanomik.tamablefoxes.TamableFoxes -api-version: 1.14 -load: STARTUP -description: Adds tamable foxes to Minecraft! - -commands: - spawntamablefox: - aliases: [tamablefox, stf, spawntf] - usage: /spawntamablefox [type] - description: Spawn a tamable fox at the standing location. Type can be snow or red, or left empty for a red. -permissions: - tamablefoxes.spawn: - description: "Gives the player the ability to spawn tamable foxes." - default: op - tamablefoxes.tame: - description: "Gives the player the ability to tame a fox." - default: true - tamablefoxes.tame.unlimited: - description: "Lets players bypass the tame limit." - default: op +name: Tamablefoxes +version: ${project.version} +main: net.seanomik.tamablefoxes.TamableFoxes +api-version: 1.14 +load: STARTUP +description: Adds tamable foxes to Minecraft! + +commands: + spawntamablefox: + aliases: [tamablefox, stf, spawntf] + usage: /spawntamablefox [type] + description: Spawn a tamable fox at the standing location. Type can be snow or red, or left empty for a red. +permissions: + tamablefoxes.spawn: + description: "Gives the player the ability to spawn tamable foxes." + default: op + tamablefoxes.tame: + description: "Gives the player the ability to tame a fox." + default: true + tamablefoxes.tame.unlimited: + description: "Lets players bypass the tame limit." + default: op diff --git a/Utility/pom.xml b/Utility/pom.xml new file mode 100644 index 0000000..b7bc63f --- /dev/null +++ b/Utility/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + + net.seanomik + tamablefoxes-parent + 2.0.0-SNAPSHOT + + + tamablefoxes-util + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + + + org.spigotmc + spigot-api + 1.14-R0.1-SNAPSHOT + provided + + + \ No newline at end of file diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/FieldHelper.java b/Utility/src/main/java/net/seanomik/tamablefoxes/util/FieldHelper.java similarity index 92% rename from src/main/java/net/seanomik/tamablefoxes/versions/FieldHelper.java rename to Utility/src/main/java/net/seanomik/tamablefoxes/util/FieldHelper.java index 2529016..288cd16 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/FieldHelper.java +++ b/Utility/src/main/java/net/seanomik/tamablefoxes/util/FieldHelper.java @@ -1,12 +1,10 @@ -package net.seanomik.tamablefoxes.versions; +package net.seanomik.tamablefoxes.util; -import net.seanomik.tamablefoxes.Utils; -import net.seanomik.tamablefoxes.io.LanguageConfig; +import net.seanomik.tamablefoxes.util.io.LanguageConfig; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; import java.lang.invoke.VarHandle; import java.lang.reflect.Field; import java.lang.reflect.Modifier; diff --git a/src/main/java/net/seanomik/tamablefoxes/versions/NMSInterface.java b/Utility/src/main/java/net/seanomik/tamablefoxes/util/NMSInterface.java similarity index 58% rename from src/main/java/net/seanomik/tamablefoxes/versions/NMSInterface.java rename to Utility/src/main/java/net/seanomik/tamablefoxes/util/NMSInterface.java index c895e06..9ed6191 100644 --- a/src/main/java/net/seanomik/tamablefoxes/versions/NMSInterface.java +++ b/Utility/src/main/java/net/seanomik/tamablefoxes/util/NMSInterface.java @@ -1,15 +1,13 @@ -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); +package net.seanomik.tamablefoxes.util; + +import org.bukkit.Location; + +public interface NMSInterface { + enum FoxType { + RED, + SNOW + } + + public void registerCustomFoxEntity(); + public void spawnTamableFox(Location loc, FoxType type); } \ No newline at end of file diff --git a/src/main/java/net/seanomik/tamablefoxes/Utils.java b/Utility/src/main/java/net/seanomik/tamablefoxes/util/Utils.java similarity index 93% rename from src/main/java/net/seanomik/tamablefoxes/Utils.java rename to Utility/src/main/java/net/seanomik/tamablefoxes/util/Utils.java index 9938e9c..d91f69c 100644 --- a/src/main/java/net/seanomik/tamablefoxes/Utils.java +++ b/Utility/src/main/java/net/seanomik/tamablefoxes/util/Utils.java @@ -1,51 +1,53 @@ -package net.seanomik.tamablefoxes; - -import org.bukkit.ChatColor; - -import java.lang.reflect.Constructor; -import java.util.List; - -public class Utils { - public static String getPrefix() { - return ChatColor.RED + "[Tamable Foxes] "; - } - - public static Class getPrivateInnerClass(Class outer, String innerName) { - for (Class declaredClass : outer.getDeclaredClasses()) { - if (declaredClass.getSimpleName().equals(innerName)) return declaredClass; - } - - return null; - } - - public static Object instantiatePrivateInnerClass(Class outer, String innerName, Object outerObject, List args, List> argTypes) { - try { - Class innerClass = getPrivateInnerClass(outer, innerName); - - Object[] argObjects = new Object[args.size() + 1]; - Class[] argClasses = new Class[argTypes.size() + 1]; - - // Needed due to how List#toArray() converts the classes to objects - for (int i = 0; i < argClasses.length; i++) { - if (i == argClasses.length - 1) continue; - argObjects[i + 1] = args.get(i); - argClasses[i + 1] = argTypes.get(i); - } - argObjects[0] = outerObject; - argClasses[0] = outer; - - Constructor innerConstructor = innerClass.getDeclaredConstructor(argClasses); - innerConstructor.setAccessible(true); - - Object instantiatedClass = innerConstructor.newInstance(argObjects); - - innerConstructor.setAccessible(false); - - return instantiatedClass; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - -} +package net.seanomik.tamablefoxes.util; + +import org.bukkit.ChatColor; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.Constructor; +import java.util.List; + +public class Utils { + public static String getPrefix() { + return ChatColor.RED + "[Tamable Foxes] "; + } + public static Plugin tamableFoxesPlugin; + + public static Class getPrivateInnerClass(Class outer, String innerName) { + for (Class declaredClass : outer.getDeclaredClasses()) { + if (declaredClass.getSimpleName().equals(innerName)) return declaredClass; + } + + return null; + } + + public static Object instantiatePrivateInnerClass(Class outer, String innerName, Object outerObject, List args, List> argTypes) { + try { + Class innerClass = getPrivateInnerClass(outer, innerName); + + Object[] argObjects = new Object[args.size() + 1]; + Class[] argClasses = new Class[argTypes.size() + 1]; + + // Needed due to how List#toArray() converts the classes to objects + for (int i = 0; i < argClasses.length; i++) { + if (i == argClasses.length - 1) continue; + argObjects[i + 1] = args.get(i); + argClasses[i + 1] = argTypes.get(i); + } + argObjects[0] = outerObject; + argClasses[0] = outer; + + Constructor innerConstructor = innerClass.getDeclaredConstructor(argClasses); + innerConstructor.setAccessible(true); + + Object instantiatedClass = innerConstructor.newInstance(argObjects); + + innerConstructor.setAccessible(false); + + return instantiatedClass; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + +} diff --git a/src/main/java/net/seanomik/tamablefoxes/io/Config.java b/Utility/src/main/java/net/seanomik/tamablefoxes/util/io/Config.java similarity index 82% rename from src/main/java/net/seanomik/tamablefoxes/io/Config.java rename to Utility/src/main/java/net/seanomik/tamablefoxes/util/io/Config.java index 9d6e764..275d9df 100644 --- a/src/main/java/net/seanomik/tamablefoxes/io/Config.java +++ b/Utility/src/main/java/net/seanomik/tamablefoxes/util/io/Config.java @@ -1,11 +1,14 @@ -package net.seanomik.tamablefoxes.io; +package net.seanomik.tamablefoxes.util.io; -import net.seanomik.tamablefoxes.TamableFoxes; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; public class Config { - private static FileConfiguration config = TamableFoxes.getPlugin().getConfig(); + private static FileConfiguration config = null; + + public static void setConfig(FileConfiguration config) { + Config.config = config; + } // Does the owner's name show if the foxes name? public static boolean doesShowOwnerInFoxName() { return config.getBoolean("show-owner-in-fox-name"); } diff --git a/src/main/java/net/seanomik/tamablefoxes/io/LanguageConfig.java b/Utility/src/main/java/net/seanomik/tamablefoxes/util/io/LanguageConfig.java similarity index 66% rename from src/main/java/net/seanomik/tamablefoxes/io/LanguageConfig.java rename to Utility/src/main/java/net/seanomik/tamablefoxes/util/io/LanguageConfig.java index 415b84b..e5e8c97 100644 --- a/src/main/java/net/seanomik/tamablefoxes/io/LanguageConfig.java +++ b/Utility/src/main/java/net/seanomik/tamablefoxes/util/io/LanguageConfig.java @@ -1,161 +1,161 @@ -package net.seanomik.tamablefoxes.io; - -import net.seanomik.tamablefoxes.TamableFoxes; -import net.seanomik.tamablefoxes.versions.NMSInterface; -import org.bukkit.ChatColor; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; - -public class LanguageConfig extends YamlConfiguration { - private static LanguageConfig config; - private TamableFoxes plugin; - private File configFile; - - public static LanguageConfig getConfig() { - if (LanguageConfig.config == null) { - LanguageConfig.config = new LanguageConfig(); - } - return LanguageConfig.config; - } - - public LanguageConfig() { - this.plugin = TamableFoxes.getPlugin(); - this.configFile = new File(this.plugin.getDataFolder(), "language.yml"); - this.saveDefault(); - this.reload(); - } - - public void reload() { - try { - super.load(this.configFile); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - public void save() { - try { - super.save(this.configFile); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - public void saveDefault() { - this.plugin.saveResource("language.yml", false); - } - - public void saveConfig() { - try { - super.save(this.configFile); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - public void reloadConfig() { - try { - super.load(this.configFile); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - public void saveDefaultConfig() { - try { - this.plugin.saveDefaultConfig(); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - // Auto replace alternate color codes. - @Override - public String getString(String path) { - // Only attempt to translate if the text is not empty. - 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"); - } - - // Get the error that shows during disable when they try to run the plugin on an unsupported mc version. - public static String getUnsupportedMCVersionDisable() { - return getConfig().getString("unsupported-mc-version-disabling"); - } - - // Get the message that shows when we successfully replaced the entity. - public static String getSuccessReplaced() { - return getConfig().getString("success-replaced-entity"); - } - - // Get the error when it failed to replace the entity. - public static String getFailureReplace() { - return getConfig().getString("error-to-replaced-entity"); - } - - // Get the message when saving foxes. - public static String getSavingFoxMessage() { - return getConfig().getString("saving-foxes-message"); - } - - // Get the message that shows when you tame a fox. - public static String getTamedMessage() { - return getConfig().getString("taming-tamed-message"); - } - - // Get the message when you ask for the foxes name. - public static String getTamingAskingName() { - return getConfig().getString("taming-asking-for-name-message"); - } - - // Get the message when you give feed back on the new fox name. - public static String getTamingChosenPerfect(String chosen) { - return getConfig().getString("taming-chosen-name-perfect").replaceAll("%NEW_FOX_NAME%", chosen); - } - - // Get the fox name format. - public static String getFoxNameFormat(String foxName, String ownerName) { - return getConfig().getString((Config.doesShowOwnerInFoxName()) ? "fox-name-format" : "fox-name-no-owner-name-format").replaceAll("%FOX_NAME%", foxName).replaceAll("%OWNER%", ownerName); - } - - public static String getFoxDoesntTrust() { - return getConfig().getString("fox-doesnt-trust"); - } - - public static String getNoPermMessage() { - return getConfig().getString("no-permission"); - } - - public static String getOnlyRunPlayer() { - return getConfig().getString("only-run-by-player"); - } - - 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); - } - - public static String getFailureSpawn() { - return getConfig().getString("failed-to-spawn-message"); - } - - public static String getReloadMessage() { - return getConfig().getString("reloaded-message"); - } -} - +package net.seanomik.tamablefoxes.util.io; + +import net.seanomik.tamablefoxes.util.NMSInterface; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; + +public class LanguageConfig extends YamlConfiguration { + private static LanguageConfig config; + private JavaPlugin plugin; + private File configFile; + + public static LanguageConfig getConfig(JavaPlugin plugin) { + if (LanguageConfig.config == null) { + LanguageConfig.config = new LanguageConfig(plugin); + } + return LanguageConfig.config; + } + + public LanguageConfig(JavaPlugin plugin) { + this.plugin = plugin; + this.configFile = new File(this.plugin.getDataFolder(), "language.yml"); + this.saveDefault(); + this.reload(); + } + + public void reload() { + try { + super.load(this.configFile); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public void save() { + try { + super.save(this.configFile); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public void saveDefault() { + this.plugin.saveResource("language.yml", false); + } + + public void saveConfig() { + try { + super.save(this.configFile); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public void reloadConfig() { + try { + super.load(this.configFile); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public void saveDefaultConfig() { + try { + this.plugin.saveDefaultConfig(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + // Auto replace alternate color codes. + @Override + public String getString(String path) { + // Only attempt to translate if the text is not empty. + 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 config.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 config.getString("unsupported-mc-version-not-registering"); + } + + // Get the error that shows during disable when they try to run the plugin on an unsupported mc version. + public static String getUnsupportedMCVersionDisable() { + return config.getString("unsupported-mc-version-disabling"); + } + + // Get the message that shows when we successfully replaced the entity. + public static String getSuccessReplaced() { + return config.getString("success-replaced-entity"); + } + + // Get the error when it failed to replace the entity. + public static String getFailureReplace() { + return config.getString("error-to-replaced-entity"); + } + + // Get the message when saving foxes. + public static String getSavingFoxMessage() { + return config.getString("saving-foxes-message"); + } + + // Get the message that shows when you tame a fox. + public static String getTamedMessage() { + return config.getString("taming-tamed-message"); + } + + // Get the message when you ask for the foxes name. + public static String getTamingAskingName() { + return config.getString("taming-asking-for-name-message"); + } + + // Get the message when you give feed back on the new fox name. + public static String getTamingChosenPerfect(String chosen) { + return config.getString("taming-chosen-name-perfect").replaceAll("%NEW_FOX_NAME%", chosen); + } + + // Get the fox name format. + public static String getFoxNameFormat(String foxName, String ownerName) { + return config.getString((Config.doesShowOwnerInFoxName()) ? "fox-name-format" : "fox-name-no-owner-name-format").replaceAll("%FOX_NAME%", foxName).replaceAll("%OWNER%", ownerName); + } + + public static String getFoxDoesntTrust() { + return config.getString("fox-doesnt-trust"); + } + + public static String getNoPermMessage() { + return config.getString("no-permission"); + } + + public static String getOnlyRunPlayer() { + return config.getString("only-run-by-player"); + } + + public static String getSpawnedFoxMessage(NMSInterface.FoxType type) { + String typeStr = ((type == type.SNOW) ? ChatColor.AQUA + "Snow" : ChatColor.RED + "Red") + ChatColor.RESET; + return config.getString("spawned-fox-message").replaceAll("%TYPE%", typeStr); + } + + public static String getFailureSpawn() { + return config.getString("failed-to-spawn-message"); + } + + public static String getReloadMessage() { + return config.getString("reloaded-message"); + } +} + \ No newline at end of file diff --git a/src/main/java/net/seanomik/tamablefoxes/io/sqlite/SQLiteHandler.java b/Utility/src/main/java/net/seanomik/tamablefoxes/util/io/sqlite/SQLiteHandler.java similarity index 72% rename from src/main/java/net/seanomik/tamablefoxes/io/sqlite/SQLiteHandler.java rename to Utility/src/main/java/net/seanomik/tamablefoxes/util/io/sqlite/SQLiteHandler.java index 5449e25..56ba9e7 100644 --- a/src/main/java/net/seanomik/tamablefoxes/io/sqlite/SQLiteHandler.java +++ b/Utility/src/main/java/net/seanomik/tamablefoxes/util/io/sqlite/SQLiteHandler.java @@ -1,58 +1,61 @@ -package net.seanomik.tamablefoxes.io.sqlite; - -import net.seanomik.tamablefoxes.TamableFoxes; -import org.bukkit.Bukkit; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -public class SQLiteHandler { - private Connection connection; - - private static SQLiteHandler instance; - - public static SQLiteHandler getInstance() { - if (instance == null) { - instance = new SQLiteHandler(); - } - - return instance; - } - - public void connect() { - try { - String pluginFolder = TamableFoxes.getPlugin().getDataFolder().getAbsolutePath(); - String url = "jdbc:sqlite:" + pluginFolder + "/userFoxAmount.db"; - connection = DriverManager.getConnection(url); - - } catch (SQLException e) { - e.printStackTrace(); - } - } - - public Connection getConnection() { - return connection; - } - - public void closeConnection() { - try { - connection.close(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - - public void newConnection() { - try { - connection.close(); - connect(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - - public void setConnection(Connection connection) { - this.connection = connection; - } -} +package net.seanomik.tamablefoxes.util.io.sqlite; + +import org.bukkit.plugin.Plugin; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class SQLiteHandler { + private Connection connection; + + private static SQLiteHandler instance; + + public static SQLiteHandler getInstance() { + if (instance == null) { + instance = new SQLiteHandler(); + } + + return instance; + } + + public void connect(Plugin plugin) { + String pluginFolder = plugin.getDataFolder().getAbsolutePath(); + connect(pluginFolder); + } + + public void connect(String pluginFolder) { + try { + String url = "jdbc:sqlite:" + pluginFolder + "/userFoxAmount.db"; + connection = DriverManager.getConnection(url); + + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public Connection getConnection() { + return connection; + } + + public void closeConnection() { + try { + connection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void newConnection(String pluginFolder) { + try { + connection.close(); + connect(pluginFolder); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void setConnection(Connection connection) { + this.connection = connection; + } +} diff --git a/src/main/java/net/seanomik/tamablefoxes/io/sqlite/SQLiteHelper.java b/Utility/src/main/java/net/seanomik/tamablefoxes/util/io/sqlite/SQLiteHelper.java similarity index 90% rename from src/main/java/net/seanomik/tamablefoxes/io/sqlite/SQLiteHelper.java rename to Utility/src/main/java/net/seanomik/tamablefoxes/util/io/sqlite/SQLiteHelper.java index 95c1e1b..816ee51 100644 --- a/src/main/java/net/seanomik/tamablefoxes/io/sqlite/SQLiteHelper.java +++ b/Utility/src/main/java/net/seanomik/tamablefoxes/util/io/sqlite/SQLiteHelper.java @@ -1,130 +1,130 @@ -package net.seanomik.tamablefoxes.io.sqlite; - -import net.seanomik.tamablefoxes.TamableFoxes; -import net.seanomik.tamablefoxes.Utils; -import org.bukkit.plugin.Plugin; - -import java.sql.DatabaseMetaData; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.*; - -public class SQLiteHelper { - public static Plugin plugin; - public static SQLiteHandler sqLiteHandler; - - private static SQLiteHelper instance; - private static String userAmountTableName = "USER_FOX_AMT"; - - public static SQLiteHelper getInstance() { - if (instance == null) { - instance = new SQLiteHelper(); - } - - return instance; - } - - public void createTablesIfNotExist() { - sqLiteHandler = SQLiteHandler.getInstance(); - - String userFoxAmountQuery = - "CREATE TABLE IF NOT EXISTS `" + userAmountTableName + "` ( " + - "`UUID` TEXT PRIMARY KEY , " + - "`AMOUNT` INT NOT NULL);"; - - try { - sqLiteHandler.connect(); - // Create previous bans table - DatabaseMetaData dbm = sqLiteHandler.getConnection().getMetaData(); - ResultSet tables = dbm.getTables(null, null, userAmountTableName, null); - if (!tables.next()) { - PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement(userFoxAmountQuery); - statement.executeUpdate(); - - plugin.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + "Created previous player bans table!"); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (sqLiteHandler.getConnection() != null) { - try { - sqLiteHandler.getConnection().close(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - } - - public int getPlayerFoxAmount(UUID uuid) { - try { - sqLiteHandler.connect(); - PreparedStatement statement = sqLiteHandler.getConnection() - .prepareStatement("SELECT * FROM " + userAmountTableName + " WHERE UUID=?"); - statement.setString(1, uuid.toString()); - ResultSet results = statement.executeQuery(); - - if (results.next()) { - return results.getInt("AMOUNT"); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (sqLiteHandler.getConnection() != null) { - try { - sqLiteHandler.getConnection().close(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - - return -1; - } - - public void addPlayerFoxAmount(UUID uuid, int amt) { - try { - String query = "UPDATE " + userAmountTableName + " SET AMOUNT = AMOUNT + " + amt + " WHERE UUID = '" + uuid.toString() + "'"; - if (getPlayerFoxAmount(uuid) == -1) { - query = "INSERT INTO " + userAmountTableName + " (UUID, AMOUNT) VALUES('" + uuid.toString() + "'," + amt + ")"; - } - - sqLiteHandler.connect(); - PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement(query); - - statement.executeUpdate(); - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (sqLiteHandler.getConnection() != null) { - try { - sqLiteHandler.getConnection().close(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - } - - public void removePlayerFoxAmount(UUID uuid, int amt) { - try { - String query = "UPDATE " + userAmountTableName + " SET AMOUNT = AMOUNT - " + amt + " WHERE UUID = '" + uuid.toString() + "'"; - - sqLiteHandler.connect(); - PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement(query); - - statement.executeUpdate(); - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (sqLiteHandler.getConnection() != null) { - try { - sqLiteHandler.getConnection().close(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - } -} +package net.seanomik.tamablefoxes.util.io.sqlite; + +import net.seanomik.tamablefoxes.util.Utils; +import org.bukkit.plugin.Plugin; + +import java.sql.DatabaseMetaData; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; + +public class SQLiteHelper { + public static Plugin plugin; + public static SQLiteHandler sqLiteHandler; + + private static SQLiteHelper instance; + private static String userAmountTableName = "USER_FOX_AMT"; + + public static SQLiteHelper getInstance(Plugin plugin) { + if (instance == null) { + instance = new SQLiteHelper(); + instance.plugin = plugin; + } + + return instance; + } + + public void createTablesIfNotExist() { + sqLiteHandler = SQLiteHandler.getInstance(); + + String userFoxAmountQuery = + "CREATE TABLE IF NOT EXISTS `" + userAmountTableName + "` ( " + + "`UUID` TEXT PRIMARY KEY , " + + "`AMOUNT` INT NOT NULL);"; + + try { + sqLiteHandler.connect(plugin); + // Create previous bans table + DatabaseMetaData dbm = sqLiteHandler.getConnection().getMetaData(); + ResultSet tables = dbm.getTables(null, null, userAmountTableName, null); + if (!tables.next()) { + PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement(userFoxAmountQuery); + statement.executeUpdate(); + + plugin.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + "Created previous player bans table!"); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (sqLiteHandler.getConnection() != null) { + try { + sqLiteHandler.getConnection().close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + } + + public int getPlayerFoxAmount(UUID uuid) { + try { + sqLiteHandler.connect(plugin); + PreparedStatement statement = sqLiteHandler.getConnection() + .prepareStatement("SELECT * FROM " + userAmountTableName + " WHERE UUID=?"); + statement.setString(1, uuid.toString()); + ResultSet results = statement.executeQuery(); + + if (results.next()) { + return results.getInt("AMOUNT"); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (sqLiteHandler.getConnection() != null) { + try { + sqLiteHandler.getConnection().close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + return -1; + } + + public void addPlayerFoxAmount(UUID uuid, int amt) { + try { + String query = "UPDATE " + userAmountTableName + " SET AMOUNT = AMOUNT + " + amt + " WHERE UUID = '" + uuid.toString() + "'"; + if (getPlayerFoxAmount(uuid) == -1) { + query = "INSERT INTO " + userAmountTableName + " (UUID, AMOUNT) VALUES('" + uuid.toString() + "'," + amt + ")"; + } + + sqLiteHandler.connect(plugin); + PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement(query); + + statement.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (sqLiteHandler.getConnection() != null) { + try { + sqLiteHandler.getConnection().close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + } + + public void removePlayerFoxAmount(UUID uuid, int amt) { + try { + String query = "UPDATE " + userAmountTableName + " SET AMOUNT = AMOUNT - " + amt + " WHERE UUID = '" + uuid.toString() + "'"; + + sqLiteHandler.connect(plugin); + PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement(query); + + statement.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (sqLiteHandler.getConnection() != null) { + try { + sqLiteHandler.getConnection().close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + } +} diff --git a/pom.xml b/pom.xml index 2fd0769..d97571d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,98 +5,51 @@ 4.0.0 net.seanomik - tamablefoxes - 1.9.2.1-SNAPSHOT - jar + tamablefoxes-parent + 2.0.0-SNAPSHOT + pom - Tamablefoxes + + Plugin + Utility + 1_17_R1 + - 8 + 16 + 16 + UTF-8 - clean package - - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - ${java.version} - ${java.version} - - - - org.apache.maven.plugins - maven-shade-plugin - 3.1.0 - - - package - - shade - - - - - - - - - - - - - D:\Code\java\spigotPlugins\_TEST_SERVER_PAPER_1.16.5_\plugins\TamableFoxes_v${project.version}.jar - false - - - - - - - - src/main/resources - true - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + + - - - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - - - sonatype - https://oss.sonatype.org/content/groups/public/ - - - codemc-snapshots - https://repo.codemc.io/repository/maven-snapshots/ - - - - - - local.spigot.nms - AllSpigotNMS - LATEST - system - ${project.basedir}/Spigot_v14_v15_v16-v165.jar - - - org.spigotmc - spigot-api - 1.14.4-R0.1-SNAPSHOT - provided - - - net.wesjd - anvilgui - 1.5.0-SNAPSHOT - - - + \ No newline at end of file