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.
This commit is contained in:
SeanOMik 2021-06-23 15:54:58 -04:00
parent e842dee1b0
commit 1dbdfb0049
No known key found for this signature in database
GPG Key ID: CA09E5BE1F32728A
74 changed files with 4018 additions and 2635 deletions

3
.gitignore vendored
View File

@ -1,6 +1,9 @@
# Don't track content of these folders # Don't track content of these folders
.idea/* .idea/*
target/* target/*
1_17_R1/target/*
Plugin/target/*
Utility/target/*
# Compiled source # # Compiled source #
################### ###################

Binary file not shown.

45
1_17_R1/pom.xml Normal file
View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.seanomik</groupId>
<artifactId>tamablefoxes-parent</artifactId>
<version>2.0.0-SNAPSHOT</version>
</parent>
<artifactId>tamablefoxes_v1_17_R1</artifactId>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>codemc-snapshots</id>
<url>https://repo.codemc.io/repository/maven-snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>net.seanomik</groupId>
<artifactId>tamablefoxes-util</artifactId>
<version>${project.parent.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.17-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.wesjd</groupId>
<artifactId>anvilgui</artifactId>
<version>1.5.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

View File

@ -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<Byte> tamed;
protected static final DataWatcherObject<Optional<UUID>> ownerUUID;
private static final DataWatcherObject<Byte> bw; // DATA_FLAGS_ID
private static final Predicate<Entity> bC; // AVOID_PLAYERS
static {
tamed = DataWatcher.a(EntityTamableFox.class, DataWatcherRegistry.a);
ownerUUID = DataWatcher.a(EntityTamableFox.class, DataWatcherRegistry.o);
bw = DataWatcher.a(EntityFox.class, DataWatcherRegistry.a);
bC = (entity) -> !entity.isSneaking() && IEntitySelector.e.test(entity);
}
List<PathfinderGoal> untamedGoals;
private FoxPathfinderGoalSit goalSit;
public EntityTamableFox(EntityTypes<? extends EntityFox> 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<Object> args, List<Class<?>> argTypes) {
return (PathfinderGoal) Utils.instantiatePrivateInnerClass(EntityFox.class, innerName, this, args, argTypes);
}
private PathfinderGoal getFoxInnerPathfinderGoal(String innerName) {
return (PathfinderGoal) Utils.instantiatePrivateInnerClass(EntityFox.class, innerName, this, Arrays.asList(), Arrays.asList());
}
private void clearPathFinderGoals() {
Set<?> goalSet = (Set<?>) getPrivateField("d", PathfinderGoalSelector.class, goalSelector());
Set<?> targetSet = (Set<?>) getPrivateField("d", PathfinderGoalSelector.class, targetSelector());
goalSet.clear();
targetSet.clear();
Map<?, ?> goalMap = (Map<?, ?>) getPrivateField("c", PathfinderGoalSelector.class, goalSelector());
Map<?, ?> targetMap = (Map<?, ?>) getPrivateField("c", PathfinderGoalSelector.class, targetSelector());
goalMap.clear();
targetMap.clear();
EnumSet<?> goalEnumSet = (EnumSet<?>) getPrivateField("f", PathfinderGoalSelector.class, goalSelector());
EnumSet<?> targetEnumSet = (EnumSet<?>) getPrivateField("f", PathfinderGoalSelector.class, targetSelector());
goalEnumSet.clear();
targetEnumSet.clear();
}
}

View File

@ -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<EntityFox> type = method.invoke(null, "fox", EntityTypes.Builder.a(EntityTamableFox::new, EnumCreatureType.C))*/
FieldHelper.setField(field, EntityTypes.E, (EntityTypes.b<EntityFox>) 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);
}
}

View File

@ -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;
}
}

View File

@ -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<? extends EntityInsentient> 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);
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -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<EntityTamableFox> 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<ItemStack> 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);
}
}
}
}

BIN
Plugin/output.jar Normal file

Binary file not shown.

119
Plugin/pom.xml Normal file
View File

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.seanomik</groupId>
<artifactId>tamablefoxes-parent</artifactId>
<version>2.0.0-SNAPSHOT</version>
</parent>
<groupId>net.seanomik</groupId>
<artifactId>tamablefoxes</artifactId>
<version>2.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Tamablefoxes</name>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<server.version>1.17</server.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.3.0-SNAPSHOT</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<outputFile>D:\Code\java\spigotPlugins\servers\${server.version}\plugins\TamableFoxes_v${project.version}.jar</outputFile>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<!-- For maven-shade-plugin 3.3.0-SNAPSHOT -->
<pluginRepositories>
<pluginRepository>
<id>apache.snapshots</id>
<url>https://repository.apache.org/snapshots/</url>
</pluginRepository>
</pluginRepositories>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>sonatype</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
<repository>
<id>codemc-snapshots</id>
<url>https://repo.codemc.io/repository/maven-snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>net.seanomik</groupId>
<artifactId>tamablefoxes-util</artifactId>
<version>${project.parent.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.seanomik</groupId>
<artifactId>tamablefoxes_v1_17_R1</artifactId>
<version>${project.parent.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>local.spigot.nms</groupId>
<artifactId>AllSpigotNMS</artifactId>
<version>LATEST</version>
<scope>system</scope>
<systemPath>${project.basedir}/Spigot_v14_v15_v16-v165.jar</systemPath>
</dependency>
<!-- We need to do this so we get the spigot api without nms. -->
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.14-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.wesjd</groupId>
<artifactId>anvilgui</artifactId>
<version>1.5.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

View File

@ -1,79 +1,80 @@
package net.seanomik.tamablefoxes; package net.seanomik.tamablefoxes;
import net.seanomik.tamablefoxes.versions.NMSInterface; import net.seanomik.tamablefoxes.util.NMSInterface;
import net.seanomik.tamablefoxes.io.LanguageConfig; import net.seanomik.tamablefoxes.util.Utils;
import org.bukkit.ChatColor; import net.seanomik.tamablefoxes.util.io.LanguageConfig;
import org.bukkit.command.Command; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.Command;
import org.bukkit.command.TabExecutor; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import java.util.Arrays;
import java.util.LinkedList; import java.util.Arrays;
import java.util.List; import java.util.LinkedList;
import java.util.List;
public class CommandSpawnTamableFox implements TabExecutor {
public class CommandSpawnTamableFox implements TabExecutor {
private final TamableFoxes plugin;
private final TamableFoxes plugin;
public CommandSpawnTamableFox(TamableFoxes plugin) {
this.plugin = plugin; public CommandSpawnTamableFox(TamableFoxes plugin) {
} this.plugin = plugin;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { @Override
if (!(sender instanceof Player)) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
sender.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getOnlyRunPlayer()); if (!(sender instanceof Player)) {
return true; sender.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getOnlyRunPlayer());
} return true;
}
if (!sender.hasPermission("tamablefoxes.spawntamablefox")) {
sender.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getNoPermMessage()); if (!sender.hasPermission("tamablefoxes.spawntamablefox")) {
return true; sender.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getNoPermMessage());
} return true;
}
Player player = (Player) sender;
if (args.length != 0) { Player player = (Player) sender;
switch (args[0]) { if (args.length != 0) {
case "red": switch (args[0]) {
try { case "red":
plugin.nmsInterface.spawnTamableFox(player.getLocation(), NMSInterface.FoxType.RED); try {
player.sendMessage(Utils.getPrefix() + ChatColor.RESET + LanguageConfig.getSpawnedFoxMessage(NMSInterface.FoxType.RED)); plugin.nmsInterface.spawnTamableFox(player.getLocation(), NMSInterface.FoxType.RED);
} catch (Exception e) { player.sendMessage(Utils.getPrefix() + ChatColor.RESET + LanguageConfig.getSpawnedFoxMessage(NMSInterface.FoxType.RED));
e.printStackTrace(); } catch (Exception e) {
player.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureSpawn()); e.printStackTrace();
} player.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureSpawn());
break; }
case "snow": break;
try { case "snow":
plugin.nmsInterface.spawnTamableFox(player.getLocation(), NMSInterface.FoxType.SNOW); try {
player.sendMessage(Utils.getPrefix() + ChatColor.RESET + LanguageConfig.getSpawnedFoxMessage(NMSInterface.FoxType.SNOW)); plugin.nmsInterface.spawnTamableFox(player.getLocation(), NMSInterface.FoxType.SNOW);
} catch (Exception e) { player.sendMessage(Utils.getPrefix() + ChatColor.RESET + LanguageConfig.getSpawnedFoxMessage(NMSInterface.FoxType.SNOW));
e.printStackTrace(); } catch (Exception e) {
player.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureSpawn()); e.printStackTrace();
} player.sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureSpawn());
break; }
case "reload": break;
plugin.reloadConfig(); case "reload":
LanguageConfig.getConfig().reloadConfig(); plugin.reloadConfig();
player.sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getReloadMessage()); LanguageConfig.getConfig(plugin).reloadConfig();
break; player.sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getReloadMessage());
default: break;
player.sendMessage(ChatColor.RED + "/spawntamablefox " + ChatColor.GRAY + "[red | snow | reload]"); default:
} player.sendMessage(ChatColor.RED + "/spawntamablefox " + ChatColor.GRAY + "[red | snow | reload]");
} else { }
player.sendMessage(ChatColor.RED + "/spawntamablefox " + ChatColor.GRAY + "[red | snow | reload]"); } else {
} player.sendMessage(ChatColor.RED + "/spawntamablefox " + ChatColor.GRAY + "[red | snow | reload]");
}
return true;
} return true;
}
@Override
public List<String> onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) { @Override
return new LinkedList<>(Arrays.asList( public List<String> onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) {
"red", return new LinkedList<>(Arrays.asList(
"snow", "red",
"reload" "snow",
)); "reload"
} ));
} }
}

View File

@ -1,24 +1,20 @@
package net.seanomik.tamablefoxes; package net.seanomik.tamablefoxes;
import net.minecraft.server.v1_15_R1.EntityWolf; import net.seanomik.tamablefoxes.versions.version_1_17_R1.NMSInterface_1_17_R1;
import net.seanomik.tamablefoxes.io.Config; import net.seanomik.tamablefoxes.util.NMSInterface;
import net.seanomik.tamablefoxes.io.sqlite.SQLiteHelper; import net.seanomik.tamablefoxes.util.Utils;
import net.seanomik.tamablefoxes.versions.NMSInterface; 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_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_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_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_R2.NMSInterface_1_16_R2;
import net.seanomik.tamablefoxes.versions.version_1_16_R3.NMSInterface_1_16_R3; 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.*;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin; 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 { public final class TamableFoxes extends JavaPlugin implements Listener {
private static TamableFoxes plugin; private static TamableFoxes plugin;
@ -29,8 +25,10 @@ public final class TamableFoxes extends JavaPlugin implements Listener {
@Override @Override
public void onLoad() { public void onLoad() {
plugin = this; plugin = this;
Utils.tamableFoxesPlugin = this;
LanguageConfig.getConfig().saveDefault(); Config.setConfig(this.getConfig());
LanguageConfig.getConfig(this).saveDefault();
// Verify server version // Verify server version
String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; 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": case "v1_16_R3":
nmsInterface = new NMSInterface_1_16_R3(); nmsInterface = new NMSInterface_1_16_R3();
break; break;
case "v1_17_R1":
nmsInterface = new NMSInterface_1_17_R1();
break;
default: default:
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getUnsupportedMCVersionRegister()); 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!"); 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(); nmsInterface.registerCustomFoxEntity();
if (Config.getMaxPlayerFoxTames() != 0) { if (Config.getMaxPlayerFoxTames() != 0) {
SQLiteHelper.getInstance().createTablesIfNotExist(); SQLiteHelper.getInstance(this).createTablesIfNotExist();
} }
} }

View File

@ -2,10 +2,10 @@ package net.seanomik.tamablefoxes.versions.version_1_14_R1;
import net.minecraft.server.v1_14_R1.*; import net.minecraft.server.v1_14_R1.*;
import net.seanomik.tamablefoxes.TamableFoxes; import net.seanomik.tamablefoxes.TamableFoxes;
import net.seanomik.tamablefoxes.Utils; import net.seanomik.tamablefoxes.util.Utils;
import net.seanomik.tamablefoxes.io.Config; import net.seanomik.tamablefoxes.util.io.Config;
import net.seanomik.tamablefoxes.io.LanguageConfig; import net.seanomik.tamablefoxes.util.io.LanguageConfig;
import net.seanomik.tamablefoxes.io.sqlite.SQLiteHelper; import net.seanomik.tamablefoxes.util.io.sqlite.SQLiteHelper;
import net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding.*; import net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding.*;
import net.wesjd.anvilgui.AnvilGUI; import net.wesjd.anvilgui.AnvilGUI;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -17,7 +17,6 @@ import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.EntityRegainHealthEvent;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.*; import java.util.*;
import java.util.function.Predicate; import java.util.function.Predicate;
@ -319,7 +318,7 @@ public class EntityTamableFox extends EntityFox {
itemstack.subtract(1); itemstack.subtract(1);
} }
SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(); SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin());
int maxTameCount = Config.getMaxPlayerFoxTames(); int maxTameCount = Config.getMaxPlayerFoxTames();
if ( !((Player) entityhuman.getBukkitEntity()).hasPermission("tamablefoxes.tame.unlimited") && maxTameCount > 0 && sqLiteHelper.getPlayerFoxAmount(entityhuman.getUniqueID()) >= maxTameCount) { 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()); ((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. // Remove the amount of foxes the player has tamed if the limit is enabled.
if (Config.getMaxPlayerFoxTames() > 0) { if (Config.getMaxPlayerFoxTames() > 0) {
SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(); SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin());
sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1); sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1);
} }
} }

View File

@ -1,36 +1,35 @@
package net.seanomik.tamablefoxes.versions.version_1_14_R1; package net.seanomik.tamablefoxes.versions.version_1_14_R1;
import net.minecraft.server.v1_14_R1.EntityFox; import net.minecraft.server.v1_14_R1.EntityFox;
import net.minecraft.server.v1_14_R1.EntityTypes; import net.minecraft.server.v1_14_R1.EntityTypes;
import net.seanomik.tamablefoxes.Utils; import net.seanomik.tamablefoxes.util.FieldHelper;
import net.seanomik.tamablefoxes.io.LanguageConfig; import net.seanomik.tamablefoxes.util.NMSInterface;
import net.seanomik.tamablefoxes.versions.FieldHelper; import net.seanomik.tamablefoxes.util.Utils;
import net.seanomik.tamablefoxes.versions.NMSInterface; import net.seanomik.tamablefoxes.util.io.LanguageConfig;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class NMSInterface_1_14_R1 implements NMSInterface {
public class NMSInterface_1_14_R1 implements NMSInterface { @Override
@Override public void registerCustomFoxEntity() {
public void registerCustomFoxEntity() { try { // Replace the fox entity
try { // Replace the fox entity Field field = EntityTypes.FOX.getClass().getDeclaredField("aZ");
Field field = EntityTypes.FOX.getClass().getDeclaredField("aZ"); FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b<EntityFox>) EntityTamableFox::new);
FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b<EntityFox>) EntityTamableFox::new); Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced());
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); } catch (Exception e) {
} catch (Exception e) { Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace());
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); e.printStackTrace();
e.printStackTrace(); }
} }
}
@Override
@Override public void spawnTamableFox(Location loc, FoxType type) {
public void spawnTamableFox(Location loc, FoxType type) { EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle();
EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle(); tamableFox.setFoxType( (type == FoxType.RED) ? EntityFox.Type.RED : EntityFox.Type.SNOW );
tamableFox.setFoxType( (type == FoxType.RED) ? EntityFox.Type.RED : EntityFox.Type.SNOW ); }
} }
}

View File

@ -1,103 +1,103 @@
package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding;
import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox;
import net.minecraft.server.v1_14_R1.*; import net.minecraft.server.v1_14_R1.*;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity;
import org.bukkit.event.entity.EntityTeleportEvent; import org.bukkit.event.entity.EntityTeleportEvent;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalFollowOwner extends PathfinderGoal { public class FoxPathfinderGoalFollowOwner extends PathfinderGoal {
protected final EntityTamableFox a; protected final EntityTamableFox a;
private EntityLiving c; private EntityLiving c;
protected final IWorldReader b; protected final IWorldReader b;
private final double d; private final double d;
private final NavigationAbstract e; private final NavigationAbstract e;
private int f; private int f;
private final float g; private final float g;
private final float h; private final float h;
private float i; private float i;
public FoxPathfinderGoalFollowOwner(EntityTamableFox tamableFox, double d0, float f, float f1) { public FoxPathfinderGoalFollowOwner(EntityTamableFox tamableFox, double d0, float f, float f1) {
this.a = tamableFox; this.a = tamableFox;
this.b = tamableFox.world; this.b = tamableFox.world;
this.d = d0; this.d = d0;
this.e = tamableFox.getNavigation(); this.e = tamableFox.getNavigation();
this.h = f; this.h = f;
this.g = f1; this.g = f1;
this.a(EnumSet.of(Type.MOVE, Type.LOOK)); this.a(EnumSet.of(Type.MOVE, Type.LOOK));
if (!(tamableFox.getNavigation() instanceof Navigation) && !(tamableFox.getNavigation() instanceof NavigationFlying)) { if (!(tamableFox.getNavigation() instanceof Navigation) && !(tamableFox.getNavigation() instanceof NavigationFlying)) {
throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal"); throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal");
} }
} }
public boolean a() { public boolean a() {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else if (entityliving instanceof EntityHuman && ((EntityHuman)entityliving).isSpectator()) { } else if (entityliving instanceof EntityHuman && ((EntityHuman)entityliving).isSpectator()) {
return false; return false;
} else if (this.a.isSitting()) { } else if (this.a.isSitting()) {
return false; return false;
} else if (this.a.h(entityliving) < (double)(this.h * this.h)) { } else if (this.a.h(entityliving) < (double)(this.h * this.h)) {
return false; return false;
} else { } else {
this.c = entityliving; this.c = entityliving;
return true; return true;
} }
} }
public boolean b() { public boolean b() {
return !this.e.n() && this.a.h(this.c) > (double)(this.g * this.g) && !this.a.isSitting(); return !this.e.n() && this.a.h(this.c) > (double)(this.g * this.g) && !this.a.isSitting();
} }
public void c() { public void c() {
this.f = 0; this.f = 0;
this.i = this.a.a(PathType.WATER); this.i = this.a.a(PathType.WATER);
this.a.a(PathType.WATER, 0.0F); this.a.a(PathType.WATER, 0.0F);
} }
public void d() { public void d() {
this.c = null; this.c = null;
this.e.o(); this.e.o();
this.a.a(PathType.WATER, this.i); this.a.a(PathType.WATER, this.i);
} }
public void e() { public void e() {
this.a.getControllerLook().a(this.c, 10.0F, (float)this.a.M()); this.a.getControllerLook().a(this.c, 10.0F, (float)this.a.M());
if (!this.a.isSitting() && --this.f <= 0) { if (!this.a.isSitting() && --this.f <= 0) {
this.f = 10; this.f = 10;
if (!this.e.a(this.c, this.d) && !this.a.isLeashed() && !this.a.isPassenger() && this.a.h(this.c) >= 144.0D) { 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 i = MathHelper.floor(this.c.locX) - 2;
int j = MathHelper.floor(this.c.locZ) - 2; int j = MathHelper.floor(this.c.locZ) - 2;
int k = MathHelper.floor(this.c.getBoundingBox().minY); int k = MathHelper.floor(this.c.getBoundingBox().minY);
for(int l = 0; l <= 4; ++l) { for(int l = 0; l <= 4; ++l) {
for(int i1 = 0; i1 <= 4; ++i1) { 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))) { if ((l < 1 || i1 < 1 || l > 3 || i1 > 3) && this.a(new BlockPosition(i + l, k - 1, j + i1))) {
CraftEntity entity = this.a.getBukkitEntity(); 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); 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); EntityTeleportEvent event = new EntityTeleportEvent(entity, entity.getLocation(), to);
this.a.world.getServer().getPluginManager().callEvent(event); this.a.world.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) { if (event.isCancelled()) {
return; return;
} }
to = event.getTo(); to = event.getTo();
this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch()); this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch());
this.e.o(); this.e.o();
return; return;
} }
} }
} }
} }
} }
} }
protected boolean a(BlockPosition blockposition) { protected boolean a(BlockPosition blockposition) {
IBlockData iblockdata = this.b.getType(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)); return iblockdata.a(this.b, blockposition, this.a.getEntityType()) && this.b.isEmpty(blockposition.up()) && this.b.isEmpty(blockposition.up(2));
} }
} }

View File

@ -1,46 +1,46 @@
package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding;
import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox; 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.EntityLiving;
import net.minecraft.server.v1_14_R1.PathfinderGoalTarget; import net.minecraft.server.v1_14_R1.PathfinderGoalTarget;
import net.minecraft.server.v1_14_R1.PathfinderTargetCondition; import net.minecraft.server.v1_14_R1.PathfinderTargetCondition;
import org.bukkit.event.entity.EntityTargetEvent.TargetReason; import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityLiving b; private EntityLiving b;
private int c; private int c;
public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) {
super(tamableFox, false); super(tamableFox, false);
this.a = tamableFox; this.a = tamableFox;
this.a(EnumSet.of(Type.TARGET)); this.a(EnumSet.of(Type.TARGET));
} }
public boolean a() { public boolean a() {
if (this.a.isTamed() && !this.a.isSitting()) { if (this.a.isTamed() && !this.a.isSitting()) {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else { } else {
this.b = entityliving.getLastDamager(); this.b = entityliving.getLastDamager();
int i = entityliving.ct(); int i = entityliving.ct();
return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving); return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving);
} }
} else { } else {
return false; return false;
} }
} }
public void c() { public void c() {
this.e.setGoalTarget(this.b, TargetReason.TARGET_ATTACKED_OWNER, true); this.e.setGoalTarget(this.b, TargetReason.TARGET_ATTACKED_OWNER, true);
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving != null) { if (entityliving != null) {
this.c = entityliving.ct(); this.c = entityliving.ct();
} }
super.c(); super.c();
} }
} }

View File

@ -1,47 +1,47 @@
package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding; 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.EntityLiving;
import net.minecraft.server.v1_14_R1.EntityTameableAnimal; import net.minecraft.server.v1_14_R1.EntityTameableAnimal;
import net.minecraft.server.v1_14_R1.PathfinderGoalTarget; import net.minecraft.server.v1_14_R1.PathfinderGoalTarget;
import net.minecraft.server.v1_14_R1.PathfinderTargetCondition; import net.minecraft.server.v1_14_R1.PathfinderTargetCondition;
import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox;
import org.bukkit.event.entity.EntityTargetEvent.TargetReason; import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityLiving b; private EntityLiving b;
private int c; private int c;
public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) { public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) {
super(tamableFox, false); super(tamableFox, false);
this.a = tamableFox; this.a = tamableFox;
this.a(EnumSet.of(Type.TARGET)); this.a(EnumSet.of(Type.TARGET));
} }
public boolean a() { public boolean a() {
if (this.a.isTamed() && !this.a.isSitting()) { if (this.a.isTamed() && !this.a.isSitting()) {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else { } else {
this.b = entityliving.cu(); this.b = entityliving.cu();
int i = entityliving.cv(); int i = entityliving.cv();
return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving); return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving);
} }
} else { } else {
return false; return false;
} }
} }
public void c() { public void c() {
this.e.setGoalTarget(this.b, TargetReason.OWNER_ATTACKED_TARGET, true); this.e.setGoalTarget(this.b, TargetReason.OWNER_ATTACKED_TARGET, true);
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving != null) { if (entityliving != null) {
this.c = entityliving.cv(); this.c = entityliving.cv();
} }
super.c(); super.c();
} }
} }

View File

@ -1,130 +1,130 @@
package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_14_R1.pathfinding;
import net.minecraft.server.v1_14_R1.*; import net.minecraft.server.v1_14_R1.*;
import net.seanomik.tamablefoxes.TamableFoxes; import net.seanomik.tamablefoxes.TamableFoxes;
import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_14_R1.EntityTamableFox;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
public class FoxPathfinderGoalSleepWithOwner extends PathfinderGoal { public class FoxPathfinderGoalSleepWithOwner extends PathfinderGoal {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityHuman b; private EntityHuman b;
private BlockPosition c; private BlockPosition c;
private int d; private int d;
public FoxPathfinderGoalSleepWithOwner(EntityTamableFox tamableFox) { public FoxPathfinderGoalSleepWithOwner(EntityTamableFox tamableFox) {
this.a = tamableFox; this.a = tamableFox;
} }
public boolean a() { public boolean a() {
if (!this.a.isTamed()) { if (!this.a.isTamed()) {
return false; return false;
} else if (this.a.isSitting()) { } else if (this.a.isSitting()) {
return false; return false;
} else { } else {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving instanceof EntityHuman) { if (entityliving instanceof EntityHuman) {
this.b = (EntityHuman)entityliving; this.b = (EntityHuman)entityliving;
if (!entityliving.isSleeping()) { if (!entityliving.isSleeping()) {
return false; return false;
} }
if (this.a.h(this.b) > 100.0D) { if (this.a.h(this.b) > 100.0D) {
return false; return false;
} }
BlockPosition blockposition = new BlockPosition(this.b); BlockPosition blockposition = new BlockPosition(this.b);
IBlockData iblockdata = this.a.world.getType(blockposition); IBlockData iblockdata = this.a.world.getType(blockposition);
if (iblockdata.getBlock().a(TagsBlock.BEDS)) { if (iblockdata.getBlock().a(TagsBlock.BEDS)) {
EnumDirection enumdirection = (EnumDirection)iblockdata.get(BlockBed.FACING); EnumDirection enumdirection = (EnumDirection)iblockdata.get(BlockBed.FACING);
this.c = new BlockPosition(blockposition.getX() - enumdirection.getAdjacentX(), blockposition.getY(), blockposition.getZ() - enumdirection.getAdjacentZ()); this.c = new BlockPosition(blockposition.getX() - enumdirection.getAdjacentX(), blockposition.getY(), blockposition.getZ() - enumdirection.getAdjacentZ());
return !this.g(); return !this.g();
} }
} }
return false; return false;
} }
} }
private boolean g() { private boolean g() {
List<EntityTamableFox> list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D)); List<EntityTamableFox> list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D));
Iterator iterator = list.iterator(); Iterator iterator = list.iterator();
EntityTamableFox entityTamableFox; EntityTamableFox entityTamableFox;
do { do {
do { do {
if (!iterator.hasNext()) { if (!iterator.hasNext()) {
return false; return false;
} }
entityTamableFox = (EntityTamableFox) iterator.next(); entityTamableFox = (EntityTamableFox) iterator.next();
} while(entityTamableFox == this.a); } while(entityTamableFox == this.a);
} while(!entityTamableFox.eg()); // && !entityTamableFox.eh() <- isRelaxStateOne() } while(!entityTamableFox.eg()); // && !entityTamableFox.eh() <- isRelaxStateOne()
return true; return true;
} }
public boolean b() { public boolean b() {
return this.a.isTamed() && !this.a.isSitting() && this.b != null && this.b.isSleeping() && this.c != null && !this.g(); return this.a.isTamed() && !this.a.isSitting() && this.b != null && this.b.isSleeping() && this.c != null && !this.g();
} }
public void c() { public void c() {
if (this.c != null) { if (this.c != null) {
this.a.getGoalSit().setSitting(false); this.a.getGoalSit().setSitting(false);
this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D); this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D);
} }
} }
public void d() { public void d() {
this.a.setSleeping(false); this.a.setSleeping(false);
float f = this.a.world.j(1.0F); 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) { if (this.b.dJ() >= 100 && (double)f > 0.77D && (double)f < 0.8D && (double)this.a.world.getRandom().nextFloat() < 0.7D) {
this.h(); this.h();
} }
this.d = 0; this.d = 0;
//this.a.v(false); < setRelaxStateOne //this.a.v(false); < setRelaxStateOne
this.a.getNavigation().o(); this.a.getNavigation().o();
} }
private void h() { private void h() {
Random random = this.a.getRandom(); Random random = this.a.getRandom();
BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
blockposition_mutableblockposition.a(this.a); 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); 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); blockposition_mutableblockposition.a(this.a);
LootTable loottable = this.a.world.getMinecraftServer().getLootTableRegistry().getLootTable(LootTables.af); 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); 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<ItemStack> list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.GIFT)); List<ItemStack> list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.GIFT));
Iterator iterator = list.iterator(); Iterator iterator = list.iterator();
while(iterator.hasNext()) { while(iterator.hasNext()) {
ItemStack itemstack = (ItemStack)iterator.next(); 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)); 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() { public void e() {
if (this.b != null && this.c != null) { if (this.b != null && this.c != null) {
this.a.getGoalSit().setSitting(false); this.a.getGoalSit().setSitting(false);
this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D); 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) { if (this.a.h(this.b) < 2.5D) {
++this.d; ++this.d;
if (this.d > 16) { if (this.d > 16) {
this.a.setSleeping(true); this.a.setSleeping(true);
//this.a.v(false); < setRelaxStateOne //this.a.v(false); < setRelaxStateOne
} else { } else {
this.a.a(this.b, 45.0F, 45.0F); this.a.a(this.b, 45.0F, 45.0F);
//this.a.v(true); < setRelaxStateOne //this.a.v(true); < setRelaxStateOne
} }
} else { } else {
this.a.setSleeping(false); this.a.setSleeping(false);
} }
} }
} }
} }

View File

@ -2,10 +2,10 @@ package net.seanomik.tamablefoxes.versions.version_1_15_R1;
import net.minecraft.server.v1_15_R1.*; import net.minecraft.server.v1_15_R1.*;
import net.seanomik.tamablefoxes.TamableFoxes; import net.seanomik.tamablefoxes.TamableFoxes;
import net.seanomik.tamablefoxes.Utils; import net.seanomik.tamablefoxes.util.Utils;
import net.seanomik.tamablefoxes.io.Config; import net.seanomik.tamablefoxes.util.io.Config;
import net.seanomik.tamablefoxes.io.LanguageConfig; import net.seanomik.tamablefoxes.util.io.LanguageConfig;
import net.seanomik.tamablefoxes.io.sqlite.SQLiteHelper; import net.seanomik.tamablefoxes.util.io.sqlite.SQLiteHelper;
import net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding.*; import net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding.*;
import net.wesjd.anvilgui.AnvilGUI; import net.wesjd.anvilgui.AnvilGUI;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -318,7 +318,7 @@ public class EntityTamableFox extends EntityFox {
itemstack.subtract(1); itemstack.subtract(1);
} }
SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(); SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin());
int maxTameCount = Config.getMaxPlayerFoxTames(); int maxTameCount = Config.getMaxPlayerFoxTames();
if ( !((Player) entityhuman.getBukkitEntity()).hasPermission("tamablefoxes.tame.unlimited") && maxTameCount > 0 && sqLiteHelper.getPlayerFoxAmount(entityhuman.getUniqueID()) >= maxTameCount) { 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()); ((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. // Remove the amount of foxes the player has tamed if the limit is enabled.
if (Config.getMaxPlayerFoxTames() > 0) { if (Config.getMaxPlayerFoxTames() > 0) {
SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(); SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin());
sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1); sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1);
} }
} }

View File

@ -1,36 +1,35 @@
package net.seanomik.tamablefoxes.versions.version_1_15_R1; package net.seanomik.tamablefoxes.versions.version_1_15_R1;
import net.minecraft.server.v1_15_R1.EntityFox; import net.minecraft.server.v1_15_R1.EntityFox;
import net.minecraft.server.v1_15_R1.EntityTypes; import net.minecraft.server.v1_15_R1.EntityTypes;
import net.seanomik.tamablefoxes.Utils; import net.seanomik.tamablefoxes.util.FieldHelper;
import net.seanomik.tamablefoxes.io.LanguageConfig; import net.seanomik.tamablefoxes.util.NMSInterface;
import net.seanomik.tamablefoxes.versions.FieldHelper; import net.seanomik.tamablefoxes.util.Utils;
import net.seanomik.tamablefoxes.versions.NMSInterface; import net.seanomik.tamablefoxes.util.io.LanguageConfig;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class NMSInterface_1_15_R1 implements NMSInterface {
public class NMSInterface_1_15_R1 implements NMSInterface { @Override
@Override public void registerCustomFoxEntity() {
public void registerCustomFoxEntity() { try { // Replace the fox entity
try { // Replace the fox entity Field field = EntityTypes.FOX.getClass().getDeclaredField("ba");
Field field = EntityTypes.FOX.getClass().getDeclaredField("ba"); FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b<EntityFox>) EntityTamableFox::new);
FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b<EntityFox>) EntityTamableFox::new); Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced());
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); } catch (Exception e) {
} catch (Exception e) { Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace());
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); e.printStackTrace();
e.printStackTrace(); }
} }
}
@Override
@Override public void spawnTamableFox(Location loc, FoxType type) {
public void spawnTamableFox(Location loc, FoxType type) { EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle();
EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle(); tamableFox.setFoxType( (type == FoxType.RED) ? EntityFox.Type.RED : EntityFox.Type.SNOW );
tamableFox.setFoxType( (type == FoxType.RED) ? EntityFox.Type.RED : EntityFox.Type.SNOW ); }
} }
}

View File

@ -1,139 +1,139 @@
package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding;
import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox;
import net.minecraft.server.v1_15_R1.*; import net.minecraft.server.v1_15_R1.*;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity;
import org.bukkit.event.entity.EntityTeleportEvent; import org.bukkit.event.entity.EntityTeleportEvent;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalFollowOwner extends PathfinderGoal { public class FoxPathfinderGoalFollowOwner extends PathfinderGoal {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityLiving b; private EntityLiving b;
private final IWorldReader c; private final IWorldReader c;
private final double d; private final double d;
private final NavigationAbstract e; private final NavigationAbstract e;
private int f; private int f;
private final float g; private final float g;
private final float h; private final float h;
private float i; private float i;
private final boolean j; private final boolean j;
public FoxPathfinderGoalFollowOwner(EntityTamableFox entityTamableFox, double d0, float f, float f1, boolean flag) { public FoxPathfinderGoalFollowOwner(EntityTamableFox entityTamableFox, double d0, float f, float f1, boolean flag) {
this.a = entityTamableFox; this.a = entityTamableFox;
this.c = entityTamableFox.world; this.c = entityTamableFox.world;
this.d = d0; this.d = d0;
this.e = entityTamableFox.getNavigation(); this.e = entityTamableFox.getNavigation();
this.h = f; this.h = f;
this.g = f1; this.g = f1;
this.j = flag; this.j = flag;
this.a(EnumSet.of(Type.MOVE, Type.LOOK)); this.a(EnumSet.of(Type.MOVE, Type.LOOK));
if (!(entityTamableFox.getNavigation() instanceof Navigation) && !(entityTamableFox.getNavigation() instanceof NavigationFlying)) { if (!(entityTamableFox.getNavigation() instanceof Navigation) && !(entityTamableFox.getNavigation() instanceof NavigationFlying)) {
throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal"); throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal");
} }
} }
public boolean a() { public boolean a() {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else if (entityliving.isSpectator()) { } else if (entityliving.isSpectator()) {
return false; return false;
} else if (this.a.isSitting()) { } else if (this.a.isSitting()) {
return false; return false;
} else if (this.a.h(entityliving) < (double)(this.h * this.h)) { } else if (this.a.h(entityliving) < (double)(this.h * this.h)) {
return false; return false;
} else { } else {
this.b = entityliving; this.b = entityliving;
return true; return true;
} }
} }
public boolean b() { public boolean b() {
return !this.e.m() && (!this.a.isSitting() && this.a.h(this.b) > (double) (this.g * this.g)); return !this.e.m() && (!this.a.isSitting() && this.a.h(this.b) > (double) (this.g * this.g));
} }
public void c() { public void c() {
this.f = 0; this.f = 0;
this.i = this.a.a(PathType.WATER); this.i = this.a.a(PathType.WATER);
this.a.a(PathType.WATER, 0.0F); this.a.a(PathType.WATER, 0.0F);
} }
public void d() { public void d() {
this.b = null; this.b = null;
this.e.o(); this.e.o();
this.a.a(PathType.WATER, this.i); this.a.a(PathType.WATER, this.i);
} }
public void e() { public void e() {
this.a.getControllerLook().a(this.b, 10.0F, (float)this.a.dU()); this.a.getControllerLook().a(this.b, 10.0F, (float)this.a.dU());
if (--this.f <= 0) { if (--this.f <= 0) {
this.f = 10; this.f = 10;
if (!this.a.isLeashed() && !this.a.isPassenger()) { if (!this.a.isLeashed() && !this.a.isPassenger()) {
if (this.a.h(this.b) >= 144.0D) { if (this.a.h(this.b) >= 144.0D) {
this.g(); this.g();
} else { } else {
this.e.a(this.b, this.d); this.e.a(this.b, this.d);
} }
} }
} }
} }
private void g() { private void g() {
BlockPosition blockposition = new BlockPosition(this.b); BlockPosition blockposition = new BlockPosition(this.b);
for(int i = 0; i < 10; ++i) { for(int i = 0; i < 10; ++i) {
int j = this.a(-3, 3); int j = this.a(-3, 3);
int k = this.a(-1, 1); int k = this.a(-1, 1);
int l = this.a(-3, 3); int l = this.a(-3, 3);
boolean flag = this.a(blockposition.getX() + j, blockposition.getY() + k, blockposition.getZ() + l); boolean flag = this.a(blockposition.getX() + j, blockposition.getY() + k, blockposition.getZ() + l);
if (flag) { if (flag) {
return; return;
} }
} }
} }
private boolean a(int i, int j, int k) { 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) { if (Math.abs((double)i - this.b.locX()) < 2.0D && Math.abs((double)k - this.b.locZ()) < 2.0D) {
return false; return false;
} else if (!this.a(new BlockPosition(i, j, k))) { } else if (!this.a(new BlockPosition(i, j, k))) {
return false; return false;
} else { } else {
CraftEntity entity = this.a.getBukkitEntity(); 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); 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); EntityTeleportEvent event = new EntityTeleportEvent(entity, entity.getLocation(), to);
this.a.world.getServer().getPluginManager().callEvent(event); this.a.world.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) { if (event.isCancelled()) {
return false; return false;
} else { } else {
to = event.getTo(); to = event.getTo();
this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch()); this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch());
this.e.o(); this.e.o();
return true; return true;
} }
} }
} }
private boolean a(BlockPosition blockposition) { private boolean a(BlockPosition blockposition) {
PathType pathtype = PathfinderNormal.b(this.c, blockposition.getX(), blockposition.getY(), blockposition.getZ()); PathType pathtype = PathfinderNormal.b(this.c, blockposition.getX(), blockposition.getY(), blockposition.getZ());
if (pathtype != PathType.WALKABLE) { if (pathtype != PathType.WALKABLE) {
return false; return false;
} else { } else {
IBlockData iblockdata = this.c.getType(blockposition.down()); IBlockData iblockdata = this.c.getType(blockposition.down());
if (!this.j && iblockdata.getBlock() instanceof BlockLeaves) { if (!this.j && iblockdata.getBlock() instanceof BlockLeaves) {
return false; return false;
} else { } else {
BlockPosition blockposition1 = blockposition.b(new BlockPosition(this.a)); BlockPosition blockposition1 = blockposition.b(new BlockPosition(this.a));
return this.c.getCubes(this.a, this.a.getBoundingBox().a(blockposition1)); return this.c.getCubes(this.a, this.a.getBoundingBox().a(blockposition1));
} }
} }
} }
private int a(int i, int j) { private int a(int i, int j) {
return this.a.getRandom().nextInt(j - i + 1) + i; return this.a.getRandom().nextInt(j - i + 1) + i;
} }
} }

View File

@ -1,48 +1,48 @@
package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding;
import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox;
import net.minecraft.server.v1_15_R1.EntityLiving; import net.minecraft.server.v1_15_R1.EntityLiving;
import net.minecraft.server.v1_15_R1.PathfinderGoalTarget; import net.minecraft.server.v1_15_R1.PathfinderGoalTarget;
import net.minecraft.server.v1_15_R1.PathfinderTargetCondition; import net.minecraft.server.v1_15_R1.PathfinderTargetCondition;
import org.bukkit.event.entity.EntityTargetEvent.TargetReason; import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityLiving b; private EntityLiving b;
private int c; private int c;
public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) {
super(tamableFox, false); super(tamableFox, false);
this.a = tamableFox; this.a = tamableFox;
this.a(EnumSet.of(Type.TARGET)); this.a(EnumSet.of(Type.TARGET));
} }
public boolean a() { public boolean a() {
if (this.a.isTamed() && !this.a.isSitting()) { if (this.a.isTamed() && !this.a.isSitting()) {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else { } else {
this.b = entityliving.getLastDamager(); this.b = entityliving.getLastDamager();
int i = entityliving.cI(); int i = entityliving.cI();
return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving); return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving);
} }
} else { } else {
return false; return false;
} }
} }
public void c() { public void c() {
this.e.setGoalTarget(this.b, TargetReason.TARGET_ATTACKED_OWNER, true); this.e.setGoalTarget(this.b, TargetReason.TARGET_ATTACKED_OWNER, true);
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving != null) { if (entityliving != null) {
this.c = entityliving.cI(); this.c = entityliving.cI();
} }
super.c(); super.c();
} }
} }

View File

@ -1,47 +1,47 @@
package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding;
import net.minecraft.server.v1_15_R1.EntityLiving; import net.minecraft.server.v1_15_R1.EntityLiving;
import net.minecraft.server.v1_15_R1.PathfinderGoalTarget; import net.minecraft.server.v1_15_R1.PathfinderGoalTarget;
import net.minecraft.server.v1_15_R1.PathfinderTargetCondition; import net.minecraft.server.v1_15_R1.PathfinderTargetCondition;
import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox;
import org.bukkit.event.entity.EntityTargetEvent.TargetReason; import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget {
private final EntityTamableFox fox; private final EntityTamableFox fox;
private EntityLiving hitEntity; private EntityLiving hitEntity;
private int c; private int c;
public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox entityTamableFox) { public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox entityTamableFox) {
super(entityTamableFox, false); super(entityTamableFox, false);
this.fox = entityTamableFox; this.fox = entityTamableFox;
this.a(EnumSet.of(Type.TARGET)); this.a(EnumSet.of(Type.TARGET));
} }
public boolean a() { public boolean a() {
if (fox.isTamed() && !fox.isSitting()) { if (fox.isTamed() && !fox.isSitting()) {
EntityLiving entityliving = fox.getOwner(); EntityLiving entityliving = fox.getOwner();
if (entityliving == null) { if (entityliving == null) {
e.setGoalTarget(null); e.setGoalTarget(null);
return false; return false;
} else { } else {
hitEntity = entityliving.cJ(); hitEntity = entityliving.cJ();
int i = entityliving.cK(); int i = entityliving.cK();
return i != this.c && this.a(hitEntity, PathfinderTargetCondition.a) && fox.a(hitEntity, entityliving); return i != this.c && this.a(hitEntity, PathfinderTargetCondition.a) && fox.a(hitEntity, entityliving);
} }
} else { } else {
return false; return false;
} }
} }
public void c() { public void c() {
this.e.setGoalTarget(hitEntity, TargetReason.OWNER_ATTACKED_TARGET, true); this.e.setGoalTarget(hitEntity, TargetReason.OWNER_ATTACKED_TARGET, true);
EntityLiving entityliving = fox.getOwner(); EntityLiving entityliving = fox.getOwner();
if (entityliving != null) { if (entityliving != null) {
this.c = entityliving.cK(); this.c = entityliving.cK();
} }
super.c(); super.c();
} }
} }

View File

@ -1,130 +1,130 @@
package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_15_R1.pathfinding;
import net.minecraft.server.v1_15_R1.*; import net.minecraft.server.v1_15_R1.*;
import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_15_R1.EntityTamableFox;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
public class FoxPathfinderGoalSleepWithOwner extends PathfinderGoal { public class FoxPathfinderGoalSleepWithOwner extends PathfinderGoal {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityHuman b; private EntityHuman b;
private BlockPosition c; private BlockPosition c;
private int d; private int d;
public FoxPathfinderGoalSleepWithOwner(EntityTamableFox tamableFox) { public FoxPathfinderGoalSleepWithOwner(EntityTamableFox tamableFox) {
this.a = tamableFox; this.a = tamableFox;
} }
public boolean a() { public boolean a() {
if (!this.a.isTamed()) { if (!this.a.isTamed()) {
return false; return false;
} else if (this.a.isSitting()) { // this.a.isWillSit() } else if (this.a.isSitting()) { // this.a.isWillSit()
return false; return false;
} else { } else {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving instanceof EntityHuman) { if (entityliving instanceof EntityHuman) {
this.b = (EntityHuman)entityliving; this.b = (EntityHuman)entityliving;
if (!entityliving.isSleeping()) { if (!entityliving.isSleeping()) {
return false; return false;
} }
if (this.a.h(this.b) > 100.0D) { if (this.a.h(this.b) > 100.0D) {
return false; return false;
} }
BlockPosition blockposition = new BlockPosition(this.b); BlockPosition blockposition = new BlockPosition(this.b);
IBlockData iblockdata = this.a.world.getType(blockposition); IBlockData iblockdata = this.a.world.getType(blockposition);
if (iblockdata.getBlock().a(TagsBlock.BEDS)) { if (iblockdata.getBlock().a(TagsBlock.BEDS)) {
EnumDirection enumdirection = (EnumDirection)iblockdata.get(BlockBed.FACING); EnumDirection enumdirection = (EnumDirection)iblockdata.get(BlockBed.FACING);
this.c = new BlockPosition(blockposition.getX() - enumdirection.getAdjacentX(), blockposition.getY(), blockposition.getZ() - enumdirection.getAdjacentZ()); this.c = new BlockPosition(blockposition.getX() - enumdirection.getAdjacentX(), blockposition.getY(), blockposition.getZ() - enumdirection.getAdjacentZ());
return !this.g(); return !this.g();
} }
} }
return false; return false;
} }
} }
private boolean g() { private boolean g() {
List<EntityTamableFox> list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D)); List<EntityTamableFox> list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D));
Iterator iterator = list.iterator(); Iterator iterator = list.iterator();
EntityTamableFox entityTamableFox; EntityTamableFox entityTamableFox;
do { do {
do { do {
if (!iterator.hasNext()) { if (!iterator.hasNext()) {
return false; return false;
} }
entityTamableFox = (EntityTamableFox) iterator.next(); entityTamableFox = (EntityTamableFox) iterator.next();
} while(entityTamableFox == this.a); } while(entityTamableFox == this.a);
} while(!entityTamableFox.isSleeping()); // !entityTamableFox.eY() } while(!entityTamableFox.isSleeping()); // !entityTamableFox.eY()
return true; return true;
} }
public boolean b() { public boolean b() {
//!this.a.isWillSit() //!this.a.isWillSit()
return this.a.isTamed() && !this.a.isSitting() && this.b != null && this.b.isSleeping() && this.c != null && !this.g(); return this.a.isTamed() && !this.a.isSitting() && this.b != null && this.b.isSleeping() && this.c != null && !this.g();
} }
public void c() { public void c() {
if (this.c != null) { if (this.c != null) {
this.a.setSitting(false); this.a.setSitting(false);
this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D); this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D);
} }
} }
public void d() { public void d() {
this.a.setSleeping(false); this.a.setSleeping(false);
float f = this.a.world.f(1.0F); 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) { if (this.b.ef() >= 100 && (double)f > 0.77D && (double)f < 0.8D && (double)this.a.world.getRandom().nextFloat() < 0.7D) {
this.h(); this.h();
} }
this.d = 0; this.d = 0;
//this.a.v(false); // setRelaxStateOne //this.a.v(false); // setRelaxStateOne
this.a.getNavigation().o(); this.a.getNavigation().o();
} }
private void h() { private void h() {
Random random = this.a.getRandom(); Random random = this.a.getRandom();
BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
blockposition_mutableblockposition.g(this.a.getChunkCoordinates()); 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); 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()); blockposition_mutableblockposition.g(this.a.getChunkCoordinates());
LootTable loottable = this.a.world.getMinecraftServer().getLootTableRegistry().getLootTable(LootTables.ak); 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); 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<ItemStack> list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.GIFT)); List<ItemStack> list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.GIFT));
Iterator iterator = list.iterator(); Iterator iterator = list.iterator();
while(iterator.hasNext()) { while(iterator.hasNext()) {
ItemStack itemstack = (ItemStack)iterator.next(); 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)); 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() { public void e() {
if (this.b != null && this.c != null) { if (this.b != null && this.c != null) {
this.a.setSitting(false); this.a.setSitting(false);
this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D); 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) { if (this.a.h(this.b) < 2.5D) {
++this.d; ++this.d;
if (this.d > 16) { if (this.d > 16) {
this.a.setSleeping(true); this.a.setSleeping(true);
//this.a.y(false); // setRelaxStateOne //this.a.y(false); // setRelaxStateOne
} else { } else {
this.a.a(this.b, 45.0F, 45.0F); this.a.a(this.b, 45.0F, 45.0F);
//this.a.y(true); // setRelaxStateOne //this.a.y(true); // setRelaxStateOne
} }
} else { } else {
this.a.setSleeping(false); this.a.setSleeping(false);
//this.a.x(false); //this.a.x(false);
} }
} }
} }
} }

View File

@ -2,10 +2,10 @@ package net.seanomik.tamablefoxes.versions.version_1_16_R1;
import net.minecraft.server.v1_16_R1.*; import net.minecraft.server.v1_16_R1.*;
import net.seanomik.tamablefoxes.TamableFoxes; import net.seanomik.tamablefoxes.TamableFoxes;
import net.seanomik.tamablefoxes.Utils; import net.seanomik.tamablefoxes.util.Utils;
import net.seanomik.tamablefoxes.io.Config; import net.seanomik.tamablefoxes.util.io.Config;
import net.seanomik.tamablefoxes.io.LanguageConfig; import net.seanomik.tamablefoxes.util.io.LanguageConfig;
import net.seanomik.tamablefoxes.io.sqlite.SQLiteHelper; import net.seanomik.tamablefoxes.util.io.sqlite.SQLiteHelper;
import net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding.*; import net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding.*;
import net.wesjd.anvilgui.AnvilGUI; import net.wesjd.anvilgui.AnvilGUI;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -321,7 +321,7 @@ public class EntityTamableFox extends EntityFox {
itemstack.subtract(1); itemstack.subtract(1);
} }
SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(); SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin());
int maxTameCount = Config.getMaxPlayerFoxTames(); int maxTameCount = Config.getMaxPlayerFoxTames();
if ( !((Player) entityhuman.getBukkitEntity()).hasPermission("tamablefoxes.tame.unlimited") && maxTameCount > 0 && sqLiteHelper.getPlayerFoxAmount(entityhuman.getUniqueID()) >= maxTameCount) { 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()); ((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. // Remove the amount of foxes the player has tamed if the limit is enabled.
if (Config.getMaxPlayerFoxTames() > 0) { if (Config.getMaxPlayerFoxTames() > 0) {
SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(); SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin());
sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1); sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1);
} }
} }

View File

@ -1,37 +1,36 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R1; package net.seanomik.tamablefoxes.versions.version_1_16_R1;
import net.minecraft.server.v1_16_R1.EntityTypes; import net.minecraft.server.v1_16_R1.EntityTypes;
import net.minecraft.server.v1_16_R1.EntityFox; import net.minecraft.server.v1_16_R1.EntityFox;
import net.seanomik.tamablefoxes.Utils; import net.seanomik.tamablefoxes.util.FieldHelper;
import net.seanomik.tamablefoxes.io.LanguageConfig; import net.seanomik.tamablefoxes.util.NMSInterface;
import net.seanomik.tamablefoxes.versions.FieldHelper; import net.seanomik.tamablefoxes.util.Utils;
import net.seanomik.tamablefoxes.versions.NMSInterface; import net.seanomik.tamablefoxes.util.io.LanguageConfig;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_16_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_16_R1.entity.CraftEntity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class NMSInterface_1_16_R1 implements NMSInterface {
public class NMSInterface_1_16_R1 implements NMSInterface {
@Override
@Override public void registerCustomFoxEntity() {
public void registerCustomFoxEntity() { try { // Replace the fox entity
try { // Replace the fox entity Field field = EntityTypes.FOX.getClass().getDeclaredField("be");
Field field = EntityTypes.FOX.getClass().getDeclaredField("be"); FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b<EntityFox>) EntityTamableFox::new);
FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b<EntityFox>) EntityTamableFox::new); Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced());
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); } catch (Exception e) {
} catch (Exception e) { Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace());
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); e.printStackTrace();
e.printStackTrace(); }
} }
}
@Override
@Override public void spawnTamableFox(Location loc, FoxType type) {
public void spawnTamableFox(Location loc, FoxType type) { EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle();
EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle(); tamableFox.setFoxType((type == FoxType.RED) ? EntityFox.Type.RED : EntityFox.Type.SNOW);
tamableFox.setFoxType((type == FoxType.RED) ? EntityFox.Type.RED : EntityFox.Type.SNOW); }
} }
}

View File

@ -1,139 +1,139 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding;
import net.minecraft.server.v1_16_R1.*; import net.minecraft.server.v1_16_R1.*;
import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_16_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_16_R1.entity.CraftEntity;
import org.bukkit.event.entity.EntityTeleportEvent; import org.bukkit.event.entity.EntityTeleportEvent;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalFollowOwner extends PathfinderGoal { public class FoxPathfinderGoalFollowOwner extends PathfinderGoal {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityLiving b; private EntityLiving b;
private final IWorldReader c; private final IWorldReader c;
private final double d; private final double d;
private final NavigationAbstract e; private final NavigationAbstract e;
private int f; private int f;
private final float g; private final float g;
private final float h; private final float h;
private float i; private float i;
private final boolean j; private final boolean j;
public FoxPathfinderGoalFollowOwner(EntityTamableFox tamableFox, double d0, float f, float f1, boolean flag) { public FoxPathfinderGoalFollowOwner(EntityTamableFox tamableFox, double d0, float f, float f1, boolean flag) {
this.a = tamableFox; this.a = tamableFox;
this.c = tamableFox.world; this.c = tamableFox.world;
this.d = d0; this.d = d0;
this.e = tamableFox.getNavigation(); this.e = tamableFox.getNavigation();
this.h = f; this.h = f;
this.g = f1; this.g = f1;
this.j = flag; this.j = flag;
this.a(EnumSet.of(PathfinderGoal.Type.MOVE, PathfinderGoal.Type.LOOK)); this.a(EnumSet.of(PathfinderGoal.Type.MOVE, PathfinderGoal.Type.LOOK));
if (!(tamableFox.getNavigation() instanceof Navigation) && !(tamableFox.getNavigation() instanceof NavigationFlying)) { if (!(tamableFox.getNavigation() instanceof Navigation) && !(tamableFox.getNavigation() instanceof NavigationFlying)) {
throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal"); throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal");
} }
} }
public boolean a() { public boolean a() {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else if (entityliving.isSpectator()) { } else if (entityliving.isSpectator()) {
return false; return false;
} else if (this.a.isSitting()) { // this.a.isWillSit() } else if (this.a.isSitting()) { // this.a.isWillSit()
return false; return false;
} else if (this.a.h(entityliving) < (double)(this.h * this.h)) { } else if (this.a.h(entityliving) < (double)(this.h * this.h)) {
return false; return false;
} else { } else {
this.b = entityliving; this.b = entityliving;
return true; return true;
} }
} }
public boolean b() { public boolean b() {
// !this.a.isWillSit() // !this.a.isWillSit()
return !this.e.m() && (!this.a.isSitting() && this.a.h(this.b) > (double) (this.g * this.g)); return !this.e.m() && (!this.a.isSitting() && this.a.h(this.b) > (double) (this.g * this.g));
} }
public void c() { public void c() {
this.f = 0; this.f = 0;
this.i = this.a.a(PathType.WATER); this.i = this.a.a(PathType.WATER);
this.a.a(PathType.WATER, 0.0F); this.a.a(PathType.WATER, 0.0F);
} }
public void d() { public void d() {
this.b = null; this.b = null;
this.e.o(); this.e.o();
this.a.a(PathType.WATER, this.i); this.a.a(PathType.WATER, this.i);
} }
public void e() { public void e() {
this.a.getControllerLook().a(this.b, 10.0F, (float)this.a.eo()); this.a.getControllerLook().a(this.b, 10.0F, (float)this.a.eo());
if (--this.f <= 0) { if (--this.f <= 0) {
this.f = 10; this.f = 10;
if (!this.a.isLeashed() && !this.a.isPassenger()) { if (!this.a.isLeashed() && !this.a.isPassenger()) {
if (this.a.h(this.b) >= 144.0D) { if (this.a.h(this.b) >= 144.0D) {
this.g(); this.g();
} else { } else {
this.e.a(this.b, this.d); this.e.a(this.b, this.d);
} }
} }
} }
} }
private void g() { private void g() {
BlockPosition blockposition = this.b.getChunkCoordinates(); BlockPosition blockposition = this.b.getChunkCoordinates();
for(int i = 0; i < 10; ++i) { for(int i = 0; i < 10; ++i) {
int j = this.a(-3, 3); int j = this.a(-3, 3);
int k = this.a(-1, 1); int k = this.a(-1, 1);
int l = this.a(-3, 3); int l = this.a(-3, 3);
boolean flag = this.a(blockposition.getX() + j, blockposition.getY() + k, blockposition.getZ() + l); boolean flag = this.a(blockposition.getX() + j, blockposition.getY() + k, blockposition.getZ() + l);
if (flag) { if (flag) {
return; return;
} }
} }
} }
private boolean a(int i, int j, int k) { 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) { if (Math.abs((double)i - this.b.locX()) < 2.0D && Math.abs((double)k - this.b.locZ()) < 2.0D) {
return false; return false;
} else if (!this.a(new BlockPosition(i, j, k))) { } else if (!this.a(new BlockPosition(i, j, k))) {
return false; return false;
} else { } else {
CraftEntity entity = this.a.getBukkitEntity(); 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); 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); EntityTeleportEvent event = new EntityTeleportEvent(entity, entity.getLocation(), to);
this.a.world.getServer().getPluginManager().callEvent(event); this.a.world.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) { if (event.isCancelled()) {
return false; return false;
} else { } else {
to = event.getTo(); to = event.getTo();
this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch()); this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch());
this.e.o(); this.e.o();
return true; return true;
} }
} }
} }
private boolean a(BlockPosition blockposition) { private boolean a(BlockPosition blockposition) {
PathType pathtype = PathfinderNormal.a(this.c, blockposition.i()); PathType pathtype = PathfinderNormal.a(this.c, blockposition.i());
if (pathtype != PathType.WALKABLE) { if (pathtype != PathType.WALKABLE) {
return false; return false;
} else { } else {
IBlockData iblockdata = this.c.getType(blockposition.down()); IBlockData iblockdata = this.c.getType(blockposition.down());
if (!this.j && iblockdata.getBlock() instanceof BlockLeaves) { if (!this.j && iblockdata.getBlock() instanceof BlockLeaves) {
return false; return false;
} else { } else {
BlockPosition blockposition1 = blockposition.b(this.a.getChunkCoordinates()); BlockPosition blockposition1 = blockposition.b(this.a.getChunkCoordinates());
return this.c.getCubes(this.a, this.a.getBoundingBox().a(blockposition1)); return this.c.getCubes(this.a, this.a.getBoundingBox().a(blockposition1));
} }
} }
} }
private int a(int i, int j) { private int a(int i, int j) {
return this.a.getRandom().nextInt(j - i + 1) + i; return this.a.getRandom().nextInt(j - i + 1) + i;
} }
} }

View File

@ -1,47 +1,47 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding; 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.PathfinderGoalTarget;
import net.minecraft.server.v1_16_R1.EntityLiving; import net.minecraft.server.v1_16_R1.EntityLiving;
import net.minecraft.server.v1_16_R1.PathfinderGoal; import net.minecraft.server.v1_16_R1.PathfinderGoal;
import net.minecraft.server.v1_16_R1.PathfinderTargetCondition; import net.minecraft.server.v1_16_R1.PathfinderTargetCondition;
import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox;
import org.bukkit.event.entity.EntityTargetEvent.TargetReason; import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget {
private final EntityTamableFox a; private final EntityTamableFox a;
private net.minecraft.server.v1_16_R1.EntityLiving b; private net.minecraft.server.v1_16_R1.EntityLiving b;
private int c; private int c;
public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) {
super(tamableFox, false); super(tamableFox, false);
this.a = tamableFox; this.a = tamableFox;
this.a(EnumSet.of(PathfinderGoal.Type.TARGET)); this.a(EnumSet.of(PathfinderGoal.Type.TARGET));
} }
public boolean a() { public boolean a() {
if (this.a.isTamed() && !this.a.isSitting()) { //!this.a.isWillSit if (this.a.isTamed() && !this.a.isSitting()) { //!this.a.isWillSit
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else { } else {
this.b = entityliving.getLastDamager(); this.b = entityliving.getLastDamager();
int i = entityliving.cZ(); int i = entityliving.cZ();
return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving); return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving);
} }
} else { } else {
return false; return false;
} }
} }
public void c() { public void c() {
this.e.setGoalTarget(this.b, TargetReason.TARGET_ATTACKED_OWNER, true); this.e.setGoalTarget(this.b, TargetReason.TARGET_ATTACKED_OWNER, true);
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving != null) { if (entityliving != null) {
this.c = entityliving.cZ(); this.c = entityliving.cZ();
} }
super.c(); super.c();
} }
} }

View File

@ -1,48 +1,48 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding; 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.PathfinderGoalTarget;
import net.minecraft.server.v1_16_R1.EntityLiving; import net.minecraft.server.v1_16_R1.EntityLiving;
import net.minecraft.server.v1_16_R1.EntityTameableAnimal; import net.minecraft.server.v1_16_R1.EntityTameableAnimal;
import net.minecraft.server.v1_16_R1.PathfinderGoal; import net.minecraft.server.v1_16_R1.PathfinderGoal;
import net.minecraft.server.v1_16_R1.PathfinderTargetCondition; import net.minecraft.server.v1_16_R1.PathfinderTargetCondition;
import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox;
import org.bukkit.event.entity.EntityTargetEvent.TargetReason; import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget {
private final EntityTamableFox a; private final EntityTamableFox a;
private net.minecraft.server.v1_16_R1.EntityLiving b; private net.minecraft.server.v1_16_R1.EntityLiving b;
private int c; private int c;
public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) { public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) {
super(tamableFox, false); super(tamableFox, false);
this.a = tamableFox; this.a = tamableFox;
this.a(EnumSet.of(PathfinderGoal.Type.TARGET)); this.a(EnumSet.of(PathfinderGoal.Type.TARGET));
} }
public boolean a() { public boolean a() {
if (this.a.isTamed() && !this.a.isSitting()) { // !this.a.isWillSit() if (this.a.isTamed() && !this.a.isSitting()) { // !this.a.isWillSit()
net.minecraft.server.v1_16_R1.EntityLiving entityliving = this.a.getOwner(); net.minecraft.server.v1_16_R1.EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else { } else {
this.b = entityliving.da(); this.b = entityliving.da();
int i = entityliving.db(); int i = entityliving.db();
return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving); return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving);
} }
} else { } else {
return false; return false;
} }
} }
public void c() { public void c() {
this.e.setGoalTarget(this.b, TargetReason.OWNER_ATTACKED_TARGET, true); this.e.setGoalTarget(this.b, TargetReason.OWNER_ATTACKED_TARGET, true);
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving != null) { if (entityliving != null) {
this.c = entityliving.db(); this.c = entityliving.db();
} }
super.c(); super.c();
} }
} }

View File

@ -1,134 +1,134 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_16_R1.pathfinding;
import net.minecraft.server.v1_16_R1.*; import net.minecraft.server.v1_16_R1.*;
import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_16_R1.EntityTamableFox;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
public class FoxPathfinderGoalSleepWithOwner extends PathfinderGoal { public class FoxPathfinderGoalSleepWithOwner extends PathfinderGoal {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityHuman b; private EntityHuman b;
private BlockPosition c; private BlockPosition c;
private int d; private int d;
public FoxPathfinderGoalSleepWithOwner(EntityTamableFox tamableFox) { public FoxPathfinderGoalSleepWithOwner(EntityTamableFox tamableFox) {
this.a = tamableFox; this.a = tamableFox;
} }
public boolean a() { public boolean a() {
if (!this.a.isTamed()) { if (!this.a.isTamed()) {
return false; return false;
} else if (this.a.isSitting()) { } else if (this.a.isSitting()) {
return false; return false;
} else { } else {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving instanceof EntityHuman) { if (entityliving instanceof EntityHuman) {
this.b = (EntityHuman)entityliving; this.b = (EntityHuman)entityliving;
if (!entityliving.isSleeping()) { if (!entityliving.isSleeping()) {
return false; return false;
} }
if (this.a.h(this.b) > 100.0D) { if (this.a.h(this.b) > 100.0D) {
return false; return false;
} }
BlockPosition blockposition = this.b.getChunkCoordinates(); BlockPosition blockposition = this.b.getChunkCoordinates();
IBlockData iblockdata = this.a.world.getType(blockposition); IBlockData iblockdata = this.a.world.getType(blockposition);
if (iblockdata.getBlock().a(TagsBlock.BEDS)) { if (iblockdata.getBlock().a(TagsBlock.BEDS)) {
this.c = (BlockPosition)iblockdata.d(BlockBed.FACING).map((enumdirection) -> { this.c = (BlockPosition)iblockdata.d(BlockBed.FACING).map((enumdirection) -> {
return blockposition.shift(enumdirection.opposite()); return blockposition.shift(enumdirection.opposite());
}).orElseGet(() -> { }).orElseGet(() -> {
return new BlockPosition(blockposition); return new BlockPosition(blockposition);
}); });
return !this.g(); return !this.g();
} }
} }
return false; return false;
} }
} }
private boolean g() { private boolean g() {
List<EntityTamableFox> list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D)); List<EntityTamableFox> list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D));
Iterator iterator = list.iterator(); Iterator iterator = list.iterator();
EntityTamableFox entityTamableFox; EntityTamableFox entityTamableFox;
do { do {
do { do {
if (!iterator.hasNext()) { if (!iterator.hasNext()) {
return false; return false;
} }
entityTamableFox = (EntityTamableFox) iterator.next(); entityTamableFox = (EntityTamableFox) iterator.next();
} while(entityTamableFox == this.a); } while(entityTamableFox == this.a);
} while(!entityTamableFox.isSleeping()); // !entityTamableFox.eY() } while(!entityTamableFox.isSleeping()); // !entityTamableFox.eY()
return true; return true;
} }
public boolean b() { public boolean b() {
//!this.a.isWillSit() //!this.a.isWillSit()
return this.a.isTamed() && !this.a.isSitting() && this.b != null && this.b.isSleeping() && this.c != null && !this.g(); return this.a.isTamed() && !this.a.isSitting() && this.b != null && this.b.isSleeping() && this.c != null && !this.g();
} }
public void c() { public void c() {
if (this.c != null) { if (this.c != null) {
this.a.setSitting(false); this.a.setSitting(false);
this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D); this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D);
} }
} }
public void d() { public void d() {
this.a.setSleeping(false); this.a.setSleeping(false);
float f = this.a.world.f(1.0F); 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) { if (this.b.eB() >= 100 && (double)f > 0.77D && (double)f < 0.8D && (double)this.a.world.getRandom().nextFloat() < 0.7D) {
this.h(); this.h();
} }
this.d = 0; this.d = 0;
//this.a.y(false); // setRelaxStateOne //this.a.y(false); // setRelaxStateOne
this.a.getNavigation().o(); this.a.getNavigation().o();
} }
private void h() { private void h() {
Random random = this.a.getRandom(); Random random = this.a.getRandom();
BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
blockposition_mutableblockposition.g(this.a.getChunkCoordinates()); 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); 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()); blockposition_mutableblockposition.g(this.a.getChunkCoordinates());
LootTable loottable = this.a.world.getMinecraftServer().getLootTableRegistry().getLootTable(LootTables.ak); 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); net.minecraft.server.v1_16_R1.LootTableInfo.Builder loottableinfo_builder = (new net.minecraft.server.v1_16_R1.LootTableInfo.Builder((WorldServer)this.a.world)).set(LootContextParameters.POSITION, blockposition_mutableblockposition).set(LootContextParameters.THIS_ENTITY, this.a).a(random);
List<ItemStack> list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.GIFT)); List<ItemStack> list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.GIFT));
Iterator iterator = list.iterator(); Iterator iterator = list.iterator();
while(iterator.hasNext()) { while(iterator.hasNext()) {
ItemStack itemstack = (ItemStack)iterator.next(); 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)); 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() { public void e() {
if (this.b != null && this.c != null) { if (this.b != null && this.c != null) {
this.a.setSitting(false); this.a.setSitting(false);
this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D); 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) { if (this.a.h(this.b) < 2.5D) {
++this.d; ++this.d;
if (this.d > 16) { if (this.d > 16) {
this.a.setSleeping(true); this.a.setSleeping(true);
//this.a.y(false); // setRelaxStateOne //this.a.y(false); // setRelaxStateOne
} else { } else {
this.a.a(this.b, 45.0F, 45.0F); this.a.a(this.b, 45.0F, 45.0F);
//this.a.y(true); // setRelaxStateOne //this.a.y(true); // setRelaxStateOne
} }
} else { } else {
this.a.setSleeping(false); this.a.setSleeping(false);
//this.a.x(false); //this.a.x(false);
} }
} }
} }
} }

View File

@ -2,10 +2,10 @@ package net.seanomik.tamablefoxes.versions.version_1_16_R2;
import net.minecraft.server.v1_16_R2.*; import net.minecraft.server.v1_16_R2.*;
import net.seanomik.tamablefoxes.TamableFoxes; import net.seanomik.tamablefoxes.TamableFoxes;
import net.seanomik.tamablefoxes.Utils; import net.seanomik.tamablefoxes.util.Utils;
import net.seanomik.tamablefoxes.io.Config; import net.seanomik.tamablefoxes.util.io.Config;
import net.seanomik.tamablefoxes.io.LanguageConfig; import net.seanomik.tamablefoxes.util.io.LanguageConfig;
import net.seanomik.tamablefoxes.io.sqlite.SQLiteHelper; import net.seanomik.tamablefoxes.util.io.sqlite.SQLiteHelper;
import net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding.*; import net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding.*;
import net.wesjd.anvilgui.AnvilGUI; import net.wesjd.anvilgui.AnvilGUI;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -318,7 +318,7 @@ public class EntityTamableFox extends EntityFox {
itemstack.subtract(1); itemstack.subtract(1);
} }
SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(); SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin());
int maxTameCount = Config.getMaxPlayerFoxTames(); int maxTameCount = Config.getMaxPlayerFoxTames();
if ( !((Player) entityhuman.getBukkitEntity()).hasPermission("tamablefoxes.tame.unlimited") && maxTameCount > 0 && sqLiteHelper.getPlayerFoxAmount(entityhuman.getUniqueID()) >= maxTameCount) { 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()); ((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. // Remove the amount of foxes the player has tamed if the limit is enabled.
if (Config.getMaxPlayerFoxTames() > 0) { if (Config.getMaxPlayerFoxTames() > 0) {
SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(); SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin());
sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1); sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1);
} }
} }

View File

@ -1,36 +1,36 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R2; package net.seanomik.tamablefoxes.versions.version_1_16_R2;
import net.minecraft.server.v1_16_R2.EntityFox; import net.minecraft.server.v1_16_R2.EntityFox;
import net.minecraft.server.v1_16_R2.EntityTypes; import net.minecraft.server.v1_16_R2.EntityTypes;
import net.seanomik.tamablefoxes.Utils; import net.seanomik.tamablefoxes.util.FieldHelper;
import net.seanomik.tamablefoxes.io.LanguageConfig; import net.seanomik.tamablefoxes.util.NMSInterface;
import net.seanomik.tamablefoxes.versions.FieldHelper; import net.seanomik.tamablefoxes.util.Utils;
import net.seanomik.tamablefoxes.versions.NMSInterface; import net.seanomik.tamablefoxes.util.io.LanguageConfig;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftEntity; import org.bukkit.craftbukkit.v1_16_R2.entity.CraftEntity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import java.lang.reflect.Field; import java.lang.reflect.Field;
public class NMSInterface_1_16_R2 implements NMSInterface { public class NMSInterface_1_16_R2 implements NMSInterface {
@Override @Override
public void registerCustomFoxEntity() { public void registerCustomFoxEntity() {
try { // Replace the fox entity try { // Replace the fox entity
Field field = EntityTypes.FOX.getClass().getDeclaredField("bf"); Field field = EntityTypes.FOX.getClass().getDeclaredField("bf");
FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b<EntityFox>) EntityTamableFox::new); FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b<EntityFox>) EntityTamableFox::new);
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced());
} catch (Exception e) { } catch (Exception e) {
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace());
e.printStackTrace(); e.printStackTrace();
} }
} }
@Override @Override
public void spawnTamableFox(Location loc, FoxType type) { public void spawnTamableFox(Location loc, FoxType type) {
EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle(); EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle();
tamableFox.setFoxType((type == FoxType.RED) ? EntityFox.Type.RED : EntityFox.Type.SNOW); tamableFox.setFoxType((type == FoxType.RED) ? EntityFox.Type.RED : EntityFox.Type.SNOW);
} }
} }

View File

@ -1,139 +1,139 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding;
import net.minecraft.server.v1_16_R2.*; import net.minecraft.server.v1_16_R2.*;
import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftEntity; import org.bukkit.craftbukkit.v1_16_R2.entity.CraftEntity;
import org.bukkit.event.entity.EntityTeleportEvent; import org.bukkit.event.entity.EntityTeleportEvent;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalFollowOwner extends PathfinderGoal { public class FoxPathfinderGoalFollowOwner extends PathfinderGoal {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityLiving b; private EntityLiving b;
private final IWorldReader c; private final IWorldReader c;
private final double d; private final double d;
private final NavigationAbstract e; private final NavigationAbstract e;
private int f; private int f;
private final float g; private final float g;
private final float h; private final float h;
private float i; private float i;
private final boolean j; private final boolean j;
public FoxPathfinderGoalFollowOwner(EntityTamableFox tamableFox, double d0, float f, float f1, boolean flag) { public FoxPathfinderGoalFollowOwner(EntityTamableFox tamableFox, double d0, float f, float f1, boolean flag) {
this.a = tamableFox; this.a = tamableFox;
this.c = tamableFox.world; this.c = tamableFox.world;
this.d = d0; this.d = d0;
this.e = tamableFox.getNavigation(); this.e = tamableFox.getNavigation();
this.h = f; this.h = f;
this.g = f1; this.g = f1;
this.j = flag; this.j = flag;
this.a(EnumSet.of(Type.MOVE, Type.LOOK)); this.a(EnumSet.of(Type.MOVE, Type.LOOK));
if (!(tamableFox.getNavigation() instanceof Navigation) && !(tamableFox.getNavigation() instanceof NavigationFlying)) { if (!(tamableFox.getNavigation() instanceof Navigation) && !(tamableFox.getNavigation() instanceof NavigationFlying)) {
throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal"); throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal");
} }
} }
public boolean a() { public boolean a() {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else if (entityliving.isSpectator()) { } else if (entityliving.isSpectator()) {
return false; return false;
} else if (this.a.isSitting()) { // this.a.isWillSit() } else if (this.a.isSitting()) { // this.a.isWillSit()
return false; return false;
} else if (this.a.h(entityliving) < (double)(this.h * this.h)) { } else if (this.a.h(entityliving) < (double)(this.h * this.h)) {
return false; return false;
} else { } else {
this.b = entityliving; this.b = entityliving;
return true; return true;
} }
} }
public boolean b() { public boolean b() {
// !this.a.isWillSit() // !this.a.isWillSit()
return !this.e.m() && (!this.a.isSitting() && this.a.h(this.b) > (double) (this.g * this.g)); return !this.e.m() && (!this.a.isSitting() && this.a.h(this.b) > (double) (this.g * this.g));
} }
public void c() { public void c() {
this.f = 0; this.f = 0;
this.i = this.a.a(PathType.WATER); this.i = this.a.a(PathType.WATER);
this.a.a(PathType.WATER, 0.0F); this.a.a(PathType.WATER, 0.0F);
} }
public void d() { public void d() {
this.b = null; this.b = null;
this.e.o(); this.e.o();
this.a.a(PathType.WATER, this.i); this.a.a(PathType.WATER, this.i);
} }
public void e() { public void e() {
this.a.getControllerLook().a(this.b, 10.0F, (float)this.a.eo()); this.a.getControllerLook().a(this.b, 10.0F, (float)this.a.eo());
if (--this.f <= 0) { if (--this.f <= 0) {
this.f = 10; this.f = 10;
if (!this.a.isLeashed() && !this.a.isPassenger()) { if (!this.a.isLeashed() && !this.a.isPassenger()) {
if (this.a.h(this.b) >= 144.0D) { if (this.a.h(this.b) >= 144.0D) {
this.g(); this.g();
} else { } else {
this.e.a(this.b, this.d); this.e.a(this.b, this.d);
} }
} }
} }
} }
private void g() { private void g() {
BlockPosition blockposition = this.b.getChunkCoordinates(); BlockPosition blockposition = this.b.getChunkCoordinates();
for(int i = 0; i < 10; ++i) { for(int i = 0; i < 10; ++i) {
int j = this.a(-3, 3); int j = this.a(-3, 3);
int k = this.a(-1, 1); int k = this.a(-1, 1);
int l = this.a(-3, 3); int l = this.a(-3, 3);
boolean flag = this.a(blockposition.getX() + j, blockposition.getY() + k, blockposition.getZ() + l); boolean flag = this.a(blockposition.getX() + j, blockposition.getY() + k, blockposition.getZ() + l);
if (flag) { if (flag) {
return; return;
} }
} }
} }
private boolean a(int i, int j, int k) { 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) { if (Math.abs((double)i - this.b.locX()) < 2.0D && Math.abs((double)k - this.b.locZ()) < 2.0D) {
return false; return false;
} else if (!this.a(new BlockPosition(i, j, k))) { } else if (!this.a(new BlockPosition(i, j, k))) {
return false; return false;
} else { } else {
CraftEntity entity = this.a.getBukkitEntity(); 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); 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); EntityTeleportEvent event = new EntityTeleportEvent(entity, entity.getLocation(), to);
this.a.world.getServer().getPluginManager().callEvent(event); this.a.world.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) { if (event.isCancelled()) {
return false; return false;
} else { } else {
to = event.getTo(); to = event.getTo();
this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch()); this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch());
this.e.o(); this.e.o();
return true; return true;
} }
} }
} }
private boolean a(BlockPosition blockposition) { private boolean a(BlockPosition blockposition) {
PathType pathtype = PathfinderNormal.a(this.c, blockposition.i()); PathType pathtype = PathfinderNormal.a(this.c, blockposition.i());
if (pathtype != PathType.WALKABLE) { if (pathtype != PathType.WALKABLE) {
return false; return false;
} else { } else {
IBlockData iblockdata = this.c.getType(blockposition.down()); IBlockData iblockdata = this.c.getType(blockposition.down());
if (!this.j && iblockdata.getBlock() instanceof BlockLeaves) { if (!this.j && iblockdata.getBlock() instanceof BlockLeaves) {
return false; return false;
} else { } else {
BlockPosition blockposition1 = blockposition.b(this.a.getChunkCoordinates()); BlockPosition blockposition1 = blockposition.b(this.a.getChunkCoordinates());
return this.c.getCubes(this.a, this.a.getBoundingBox().a(blockposition1)); return this.c.getCubes(this.a, this.a.getBoundingBox().a(blockposition1));
} }
} }
} }
private int a(int i, int j) { private int a(int i, int j) {
return this.a.getRandom().nextInt(j - i + 1) + i; return this.a.getRandom().nextInt(j - i + 1) + i;
} }
} }

View File

@ -1,46 +1,46 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding; 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.EntityLiving;
import net.minecraft.server.v1_16_R2.PathfinderGoalTarget; import net.minecraft.server.v1_16_R2.PathfinderGoalTarget;
import net.minecraft.server.v1_16_R2.PathfinderTargetCondition; import net.minecraft.server.v1_16_R2.PathfinderTargetCondition;
import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox;
import org.bukkit.event.entity.EntityTargetEvent.TargetReason; import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityLiving b; private EntityLiving b;
private int c; private int c;
public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) {
super(tamableFox, false); super(tamableFox, false);
this.a = tamableFox; this.a = tamableFox;
this.a(EnumSet.of(Type.TARGET)); this.a(EnumSet.of(Type.TARGET));
} }
public boolean a() { public boolean a() {
if (this.a.isTamed() && !this.a.isSitting()) { //!this.a.isWillSit if (this.a.isTamed() && !this.a.isSitting()) { //!this.a.isWillSit
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else { } else {
this.b = entityliving.getLastDamager(); this.b = entityliving.getLastDamager();
int i = entityliving.cZ(); int i = entityliving.cZ();
return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving); return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving);
} }
} else { } else {
return false; return false;
} }
} }
public void c() { public void c() {
this.e.setGoalTarget(this.b, TargetReason.TARGET_ATTACKED_OWNER, true); this.e.setGoalTarget(this.b, TargetReason.TARGET_ATTACKED_OWNER, true);
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving != null) { if (entityliving != null) {
this.c = entityliving.cZ(); this.c = entityliving.cZ();
} }
super.c(); super.c();
} }
} }

View File

@ -1,46 +1,46 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding; 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.EntityLiving;
import net.minecraft.server.v1_16_R2.PathfinderGoalTarget; import net.minecraft.server.v1_16_R2.PathfinderGoalTarget;
import net.minecraft.server.v1_16_R2.PathfinderTargetCondition; import net.minecraft.server.v1_16_R2.PathfinderTargetCondition;
import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox;
import org.bukkit.event.entity.EntityTargetEvent.TargetReason; import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityLiving b; private EntityLiving b;
private int c; private int c;
public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) { public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) {
super(tamableFox, false); super(tamableFox, false);
this.a = tamableFox; this.a = tamableFox;
this.a(EnumSet.of(Type.TARGET)); this.a(EnumSet.of(Type.TARGET));
} }
public boolean a() { public boolean a() {
if (this.a.isTamed() && !this.a.isSitting()) { // !this.a.isWillSit() if (this.a.isTamed() && !this.a.isSitting()) { // !this.a.isWillSit()
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else { } else {
this.b = entityliving.da(); this.b = entityliving.da();
int i = entityliving.db(); int i = entityliving.db();
return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving); return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving);
} }
} else { } else {
return false; return false;
} }
} }
public void c() { public void c() {
this.e.setGoalTarget(this.b, TargetReason.OWNER_ATTACKED_TARGET, true); this.e.setGoalTarget(this.b, TargetReason.OWNER_ATTACKED_TARGET, true);
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving != null) { if (entityliving != null) {
this.c = entityliving.db(); this.c = entityliving.db();
} }
super.c(); super.c();
} }
} }

View File

@ -1,133 +1,133 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_16_R2.pathfinding;
import net.minecraft.server.v1_16_R2.*; import net.minecraft.server.v1_16_R2.*;
import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_16_R2.EntityTamableFox;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
public class FoxPathfinderGoalSleepWithOwner extends PathfinderGoal { public class FoxPathfinderGoalSleepWithOwner extends PathfinderGoal {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityHuman b; private EntityHuman b;
private BlockPosition c; private BlockPosition c;
private int d; private int d;
public FoxPathfinderGoalSleepWithOwner(EntityTamableFox tamableFox) { public FoxPathfinderGoalSleepWithOwner(EntityTamableFox tamableFox) {
this.a = tamableFox; this.a = tamableFox;
} }
public boolean a() { public boolean a() {
if (!this.a.isTamed()) { if (!this.a.isTamed()) {
return false; return false;
} else if (this.a.isSitting()) { } else if (this.a.isSitting()) {
return false; return false;
} else { } else {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving instanceof EntityHuman) { if (entityliving instanceof EntityHuman) {
this.b = (EntityHuman)entityliving; this.b = (EntityHuman)entityliving;
if (!entityliving.isSleeping()) { if (!entityliving.isSleeping()) {
return false; return false;
} }
if (this.a.h(this.b) > 100.0D) { if (this.a.h(this.b) > 100.0D) {
return false; return false;
} }
BlockPosition blockposition = this.b.getChunkCoordinates(); BlockPosition blockposition = this.b.getChunkCoordinates();
IBlockData iblockdata = this.a.world.getType(blockposition); IBlockData iblockdata = this.a.world.getType(blockposition);
if (iblockdata.getBlock().a(TagsBlock.BEDS)) { if (iblockdata.getBlock().a(TagsBlock.BEDS)) {
this.c = (BlockPosition)iblockdata.d(BlockBed.FACING).map((enumdirection) -> { this.c = (BlockPosition)iblockdata.d(BlockBed.FACING).map((enumdirection) -> {
return blockposition.shift(enumdirection.opposite()); return blockposition.shift(enumdirection.opposite());
}).orElseGet(() -> { }).orElseGet(() -> {
return new BlockPosition(blockposition); return new BlockPosition(blockposition);
}); });
return !this.g(); return !this.g();
} }
} }
return false; return false;
} }
} }
private boolean g() { private boolean g() {
List<EntityTamableFox> list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D)); List<EntityTamableFox> list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D));
Iterator iterator = list.iterator(); Iterator iterator = list.iterator();
EntityTamableFox entityTamableFox; EntityTamableFox entityTamableFox;
do { do {
do { do {
if (!iterator.hasNext()) { if (!iterator.hasNext()) {
return false; return false;
} }
entityTamableFox = (EntityTamableFox) iterator.next(); entityTamableFox = (EntityTamableFox) iterator.next();
} while(entityTamableFox == this.a); } while(entityTamableFox == this.a);
} while(!entityTamableFox.isSleeping()); // !entityTamableFox.eY() } while(!entityTamableFox.isSleeping()); // !entityTamableFox.eY()
return true; return true;
} }
public boolean b() { public boolean b() {
//!this.a.isWillSit() //!this.a.isWillSit()
return this.a.isTamed() && !this.a.isSitting() && this.b != null && this.b.isSleeping() && this.c != null && !this.g(); return this.a.isTamed() && !this.a.isSitting() && this.b != null && this.b.isSleeping() && this.c != null && !this.g();
} }
public void c() { public void c() {
if (this.c != null) { if (this.c != null) {
this.a.setSitting(false); this.a.setSitting(false);
this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D); this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D);
} }
} }
public void d() { public void d() {
this.a.setSleeping(false); this.a.setSleeping(false);
float f = this.a.world.f(1.0F); 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) { if (this.b.eB() >= 100 && (double)f > 0.77D && (double)f < 0.8D && (double)this.a.world.getRandom().nextFloat() < 0.7D) {
this.h(); this.h();
} }
this.d = 0; this.d = 0;
//this.a.y(false); // setRelaxStateOne //this.a.y(false); // setRelaxStateOne
this.a.getNavigation().o(); this.a.getNavigation().o();
} }
private void h() { private void h() {
Random random = this.a.getRandom(); Random random = this.a.getRandom();
BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
blockposition_mutableblockposition.g(this.a.getChunkCoordinates()); 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); 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()); blockposition_mutableblockposition.g(this.a.getChunkCoordinates());
LootTable loottable = this.a.world.getMinecraftServer().getLootTableRegistry().getLootTable(LootTables.ak); 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); 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<ItemStack> list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.GIFT)); List<ItemStack> list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.GIFT));
Iterator iterator = list.iterator(); Iterator iterator = list.iterator();
while(iterator.hasNext()) { while(iterator.hasNext()) {
ItemStack itemstack = (ItemStack)iterator.next(); 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)); 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() { public void e() {
if (this.b != null && this.c != null) { if (this.b != null && this.c != null) {
this.a.setSitting(false); this.a.setSitting(false);
this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D); 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) { if (this.a.h(this.b) < 2.5D) {
++this.d; ++this.d;
if (this.d > 16) { if (this.d > 16) {
this.a.setSleeping(true); this.a.setSleeping(true);
//this.a.y(false); // setRelaxStateOne //this.a.y(false); // setRelaxStateOne
} else { } else {
this.a.a(this.b, 45.0F, 45.0F); this.a.a(this.b, 45.0F, 45.0F);
//this.a.y(true); // setRelaxStateOne //this.a.y(true); // setRelaxStateOne
} }
} else { } else {
this.a.setSleeping(false); this.a.setSleeping(false);
//this.a.x(false); //this.a.x(false);
} }
} }
} }
} }

View File

@ -2,10 +2,10 @@ package net.seanomik.tamablefoxes.versions.version_1_16_R3;
import net.minecraft.server.v1_16_R3.*; import net.minecraft.server.v1_16_R3.*;
import net.seanomik.tamablefoxes.TamableFoxes; import net.seanomik.tamablefoxes.TamableFoxes;
import net.seanomik.tamablefoxes.Utils; import net.seanomik.tamablefoxes.util.Utils;
import net.seanomik.tamablefoxes.io.Config; import net.seanomik.tamablefoxes.util.io.Config;
import net.seanomik.tamablefoxes.io.LanguageConfig; import net.seanomik.tamablefoxes.util.io.LanguageConfig;
import net.seanomik.tamablefoxes.io.sqlite.SQLiteHelper; import net.seanomik.tamablefoxes.util.io.sqlite.SQLiteHelper;
import net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding.*; import net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding.*;
import net.wesjd.anvilgui.AnvilGUI; import net.wesjd.anvilgui.AnvilGUI;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -319,7 +319,7 @@ public class EntityTamableFox extends EntityFox {
itemstack.subtract(1); itemstack.subtract(1);
} }
SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(); SQLiteHelper sqLiteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin());
int maxTameCount = Config.getMaxPlayerFoxTames(); int maxTameCount = Config.getMaxPlayerFoxTames();
if ( !((Player) entityhuman.getBukkitEntity()).hasPermission("tamablefoxes.tame.unlimited") && maxTameCount > 0 && sqLiteHelper.getPlayerFoxAmount(entityhuman.getUniqueID()) >= maxTameCount) { 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()); ((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. // Remove the amount of foxes the player has tamed if the limit is enabled.
if (Config.getMaxPlayerFoxTames() > 0) { if (Config.getMaxPlayerFoxTames() > 0) {
SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(); SQLiteHelper sqliteHelper = SQLiteHelper.getInstance(TamableFoxes.getPlugin());
sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1); sqliteHelper.removePlayerFoxAmount(this.getOwner().getUniqueID(), 1);
} }
} }

View File

@ -1,36 +1,36 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R3; package net.seanomik.tamablefoxes.versions.version_1_16_R3;
import net.minecraft.server.v1_16_R3.EntityFox; import net.minecraft.server.v1_16_R3.EntityFox;
import net.minecraft.server.v1_16_R3.EntityTypes; import net.minecraft.server.v1_16_R3.EntityTypes;
import net.seanomik.tamablefoxes.Utils; import net.seanomik.tamablefoxes.util.FieldHelper;
import net.seanomik.tamablefoxes.io.LanguageConfig; import net.seanomik.tamablefoxes.util.NMSInterface;
import net.seanomik.tamablefoxes.versions.FieldHelper; import net.seanomik.tamablefoxes.util.Utils;
import net.seanomik.tamablefoxes.versions.NMSInterface; import net.seanomik.tamablefoxes.util.io.LanguageConfig;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity; import org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import java.lang.reflect.Field; import java.lang.reflect.Field;
public class NMSInterface_1_16_R3 implements NMSInterface { public class NMSInterface_1_16_R3 implements NMSInterface {
@Override @Override
public void registerCustomFoxEntity() { public void registerCustomFoxEntity() {
try { // Replace the fox entity try { // Replace the fox entity
Field field = EntityTypes.FOX.getClass().getDeclaredField("bf"); Field field = EntityTypes.FOX.getClass().getDeclaredField("bf");
FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b<EntityFox>) EntityTamableFox::new); FieldHelper.setField(field, EntityTypes.FOX, (EntityTypes.b<EntityFox>) EntityTamableFox::new);
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced()); Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.GREEN + LanguageConfig.getSuccessReplaced());
} catch (Exception e) { } catch (Exception e) {
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace()); Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace());
e.printStackTrace(); e.printStackTrace();
} }
} }
@Override @Override
public void spawnTamableFox(Location loc, FoxType type) { public void spawnTamableFox(Location loc, FoxType type) {
EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle(); EntityTamableFox tamableFox = (EntityTamableFox) ((CraftEntity) loc.getWorld().spawnEntity(loc, EntityType.FOX)).getHandle();
tamableFox.setFoxType((type == FoxType.RED) ? EntityFox.Type.RED : EntityFox.Type.SNOW); tamableFox.setFoxType((type == FoxType.RED) ? EntityFox.Type.RED : EntityFox.Type.SNOW);
} }
} }

View File

@ -1,139 +1,139 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding;
import net.minecraft.server.v1_16_R3.*; import net.minecraft.server.v1_16_R3.*;
import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity; import org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity;
import org.bukkit.event.entity.EntityTeleportEvent; import org.bukkit.event.entity.EntityTeleportEvent;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalFollowOwner extends PathfinderGoal { public class FoxPathfinderGoalFollowOwner extends PathfinderGoal {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityLiving b; private EntityLiving b;
private final IWorldReader c; private final IWorldReader c;
private final double d; private final double d;
private final NavigationAbstract e; private final NavigationAbstract e;
private int f; private int f;
private final float g; private final float g;
private final float h; private final float h;
private float i; private float i;
private final boolean j; private final boolean j;
public FoxPathfinderGoalFollowOwner(EntityTamableFox tamableFox, double d0, float f, float f1, boolean flag) { public FoxPathfinderGoalFollowOwner(EntityTamableFox tamableFox, double d0, float f, float f1, boolean flag) {
this.a = tamableFox; this.a = tamableFox;
this.c = tamableFox.world; this.c = tamableFox.world;
this.d = d0; this.d = d0;
this.e = tamableFox.getNavigation(); this.e = tamableFox.getNavigation();
this.h = f; this.h = f;
this.g = f1; this.g = f1;
this.j = flag; this.j = flag;
this.a(EnumSet.of(Type.MOVE, Type.LOOK)); this.a(EnumSet.of(Type.MOVE, Type.LOOK));
if (!(tamableFox.getNavigation() instanceof Navigation) && !(tamableFox.getNavigation() instanceof NavigationFlying)) { if (!(tamableFox.getNavigation() instanceof Navigation) && !(tamableFox.getNavigation() instanceof NavigationFlying)) {
throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal"); throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal");
} }
} }
public boolean a() { public boolean a() {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else if (entityliving.isSpectator()) { } else if (entityliving.isSpectator()) {
return false; return false;
} else if (this.a.isSitting()) { // this.a.isWillSit() } else if (this.a.isSitting()) { // this.a.isWillSit()
return false; return false;
} else if (this.a.h(entityliving) < (double)(this.h * this.h)) { } else if (this.a.h(entityliving) < (double)(this.h * this.h)) {
return false; return false;
} else { } else {
this.b = entityliving; this.b = entityliving;
return true; return true;
} }
} }
public boolean b() { public boolean b() {
// !this.a.isWillSit() // !this.a.isWillSit()
return !this.e.m() && (!this.a.isSitting() && this.a.h(this.b) > (double) (this.g * this.g)); return !this.e.m() && (!this.a.isSitting() && this.a.h(this.b) > (double) (this.g * this.g));
} }
public void c() { public void c() {
this.f = 0; this.f = 0;
this.i = this.a.a(PathType.WATER); this.i = this.a.a(PathType.WATER);
this.a.a(PathType.WATER, 0.0F); this.a.a(PathType.WATER, 0.0F);
} }
public void d() { public void d() {
this.b = null; this.b = null;
this.e.o(); this.e.o();
this.a.a(PathType.WATER, this.i); this.a.a(PathType.WATER, this.i);
} }
public void e() { public void e() {
this.a.getControllerLook().a(this.b, 10.0F, (float)this.a.O()); this.a.getControllerLook().a(this.b, 10.0F, (float)this.a.O());
if (--this.f <= 0) { if (--this.f <= 0) {
this.f = 10; this.f = 10;
if (!this.a.isLeashed() && !this.a.isPassenger()) { if (!this.a.isLeashed() && !this.a.isPassenger()) {
if (this.a.h(this.b) >= 144.0D) { if (this.a.h(this.b) >= 144.0D) {
this.g(); this.g();
} else { } else {
this.e.a(this.b, this.d); this.e.a(this.b, this.d);
} }
} }
} }
} }
private void g() { private void g() {
BlockPosition blockposition = this.b.getChunkCoordinates(); BlockPosition blockposition = this.b.getChunkCoordinates();
for(int i = 0; i < 10; ++i) { for(int i = 0; i < 10; ++i) {
int j = this.a(-3, 3); int j = this.a(-3, 3);
int k = this.a(-1, 1); int k = this.a(-1, 1);
int l = this.a(-3, 3); int l = this.a(-3, 3);
boolean flag = this.a(blockposition.getX() + j, blockposition.getY() + k, blockposition.getZ() + l); boolean flag = this.a(blockposition.getX() + j, blockposition.getY() + k, blockposition.getZ() + l);
if (flag) { if (flag) {
return; return;
} }
} }
} }
private boolean a(int i, int j, int k) { 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) { if (Math.abs((double)i - this.b.locX()) < 2.0D && Math.abs((double)k - this.b.locZ()) < 2.0D) {
return false; return false;
} else if (!this.a(new BlockPosition(i, j, k))) { } else if (!this.a(new BlockPosition(i, j, k))) {
return false; return false;
} else { } else {
CraftEntity entity = this.a.getBukkitEntity(); 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); 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); EntityTeleportEvent event = new EntityTeleportEvent(entity, entity.getLocation(), to);
this.a.world.getServer().getPluginManager().callEvent(event); this.a.world.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) { if (event.isCancelled()) {
return false; return false;
} else { } else {
to = event.getTo(); to = event.getTo();
this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch()); this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch());
this.e.o(); this.e.o();
return true; return true;
} }
} }
} }
private boolean a(BlockPosition blockposition) { private boolean a(BlockPosition blockposition) {
PathType pathtype = PathfinderNormal.a(this.c, blockposition.i()); PathType pathtype = PathfinderNormal.a(this.c, blockposition.i());
if (pathtype != PathType.WALKABLE) { if (pathtype != PathType.WALKABLE) {
return false; return false;
} else { } else {
IBlockData iblockdata = this.c.getType(blockposition.down()); IBlockData iblockdata = this.c.getType(blockposition.down());
if (!this.j && iblockdata.getBlock() instanceof BlockLeaves) { if (!this.j && iblockdata.getBlock() instanceof BlockLeaves) {
return false; return false;
} else { } else {
BlockPosition blockposition1 = blockposition.b(this.a.getChunkCoordinates()); BlockPosition blockposition1 = blockposition.b(this.a.getChunkCoordinates());
return this.c.getCubes(this.a, this.a.getBoundingBox().a(blockposition1)); return this.c.getCubes(this.a, this.a.getBoundingBox().a(blockposition1));
} }
} }
} }
private int a(int i, int j) { private int a(int i, int j) {
return this.a.getRandom().nextInt(j - i + 1) + i; return this.a.getRandom().nextInt(j - i + 1) + i;
} }
} }

View File

@ -1,46 +1,46 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding; 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.EntityLiving;
import net.minecraft.server.v1_16_R3.PathfinderGoalTarget; import net.minecraft.server.v1_16_R3.PathfinderGoalTarget;
import net.minecraft.server.v1_16_R3.PathfinderTargetCondition; import net.minecraft.server.v1_16_R3.PathfinderTargetCondition;
import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox;
import org.bukkit.event.entity.EntityTargetEvent.TargetReason; import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget { public class FoxPathfinderGoalOwnerHurtByTarget extends PathfinderGoalTarget {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityLiving b; private EntityLiving b;
private int c; private int c;
public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) { public FoxPathfinderGoalOwnerHurtByTarget(EntityTamableFox tamableFox) {
super(tamableFox, false); super(tamableFox, false);
this.a = tamableFox; this.a = tamableFox;
this.a(EnumSet.of(Type.TARGET)); this.a(EnumSet.of(Type.TARGET));
} }
public boolean a() { public boolean a() {
if (this.a.isTamed() && !this.a.isSitting()) { //!this.a.isWillSit if (this.a.isTamed() && !this.a.isSitting()) { //!this.a.isWillSit
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else { } else {
this.b = entityliving.getLastDamager(); this.b = entityliving.getLastDamager();
int i = entityliving.da(); int i = entityliving.da();
return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving); return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving);
} }
} else { } else {
return false; return false;
} }
} }
public void c() { public void c() {
this.e.setGoalTarget(this.b, TargetReason.TARGET_ATTACKED_OWNER, true); this.e.setGoalTarget(this.b, TargetReason.TARGET_ATTACKED_OWNER, true);
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving != null) { if (entityliving != null) {
this.c = entityliving.da(); this.c = entityliving.da();
} }
super.c(); super.c();
} }
} }

View File

@ -1,46 +1,46 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding; 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.EntityLiving;
import net.minecraft.server.v1_16_R3.PathfinderGoalTarget; import net.minecraft.server.v1_16_R3.PathfinderGoalTarget;
import net.minecraft.server.v1_16_R3.PathfinderTargetCondition; import net.minecraft.server.v1_16_R3.PathfinderTargetCondition;
import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox;
import org.bukkit.event.entity.EntityTargetEvent.TargetReason; import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
import java.util.EnumSet; import java.util.EnumSet;
public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget { public class FoxPathfinderGoalOwnerHurtTarget extends PathfinderGoalTarget {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityLiving b; private EntityLiving b;
private int c; private int c;
public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) { public FoxPathfinderGoalOwnerHurtTarget(EntityTamableFox tamableFox) {
super(tamableFox, false); super(tamableFox, false);
this.a = tamableFox; this.a = tamableFox;
this.a(EnumSet.of(Type.TARGET)); this.a(EnumSet.of(Type.TARGET));
} }
public boolean a() { public boolean a() {
if (this.a.isTamed() && !this.a.isSitting()) { // !this.a.isWillSit() if (this.a.isTamed() && !this.a.isSitting()) { // !this.a.isWillSit()
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) { if (entityliving == null) {
return false; return false;
} else { } else {
this.b = entityliving.db(); this.b = entityliving.db();
int i = entityliving.dc(); int i = entityliving.dc();
return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving); return i != this.c && this.a(this.b, PathfinderTargetCondition.a) && this.a.a(this.b, entityliving);
} }
} else { } else {
return false; return false;
} }
} }
public void c() { public void c() {
this.e.setGoalTarget(this.b, TargetReason.OWNER_ATTACKED_TARGET, true); this.e.setGoalTarget(this.b, TargetReason.OWNER_ATTACKED_TARGET, true);
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving != null) { if (entityliving != null) {
this.c = entityliving.dc(); this.c = entityliving.dc();
} }
super.c(); super.c();
} }
} }

View File

@ -1,132 +1,132 @@
package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding; package net.seanomik.tamablefoxes.versions.version_1_16_R3.pathfinding;
import net.minecraft.server.v1_16_R3.*; import net.minecraft.server.v1_16_R3.*;
import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox; import net.seanomik.tamablefoxes.versions.version_1_16_R3.EntityTamableFox;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
public class FoxPathfinderGoalSleepWithOwner extends PathfinderGoal { public class FoxPathfinderGoalSleepWithOwner extends PathfinderGoal {
private final EntityTamableFox a; private final EntityTamableFox a;
private EntityHuman b; private EntityHuman b;
private BlockPosition c; private BlockPosition c;
private int d; private int d;
public FoxPathfinderGoalSleepWithOwner(EntityTamableFox entitycat) { public FoxPathfinderGoalSleepWithOwner(EntityTamableFox entitycat) {
this.a = entitycat; this.a = entitycat;
} }
public boolean a() { public boolean a() {
if (!this.a.isTamed()) { if (!this.a.isTamed()) {
return false; return false;
} else if (this.a.isSitting()) { } else if (this.a.isSitting()) {
return false; return false;
} else { } else {
EntityLiving entityliving = this.a.getOwner(); EntityLiving entityliving = this.a.getOwner();
if (entityliving instanceof EntityHuman) { if (entityliving instanceof EntityHuman) {
this.b = (EntityHuman) entityliving; this.b = (EntityHuman) entityliving;
if (!entityliving.isSleeping()) { if (!entityliving.isSleeping()) {
return false; return false;
} }
if (this.a.h(this.b) > 100.0D) { if (this.a.h(this.b) > 100.0D) {
return false; return false;
} }
BlockPosition blockposition = this.b.getChunkCoordinates(); BlockPosition blockposition = this.b.getChunkCoordinates();
IBlockData iblockdata = this.a.world.getType(blockposition); IBlockData iblockdata = this.a.world.getType(blockposition);
if (iblockdata.getBlock().a(TagsBlock.BEDS)) { if (iblockdata.getBlock().a(TagsBlock.BEDS)) {
this.c = (BlockPosition) iblockdata.d(BlockBed.FACING).map((enumdirection) -> { this.c = (BlockPosition) iblockdata.d(BlockBed.FACING).map((enumdirection) -> {
return blockposition.shift(enumdirection.opposite()); return blockposition.shift(enumdirection.opposite());
}).orElseGet(() -> { }).orElseGet(() -> {
return new BlockPosition(blockposition); return new BlockPosition(blockposition);
}); });
return !this.g(); return !this.g();
} }
} }
} }
return false; return false;
} }
private boolean g() { private boolean g() {
List<EntityTamableFox> list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D)); List<EntityTamableFox> list = this.a.world.a(EntityTamableFox.class, (new AxisAlignedBB(this.c)).g(2.0D));
Iterator iterator = list.iterator(); Iterator iterator = list.iterator();
EntityTamableFox entitycat; EntityTamableFox entitycat;
do { do {
do { do {
if (!iterator.hasNext()) { if (!iterator.hasNext()) {
return false; return false;
} }
entitycat = (EntityTamableFox)iterator.next(); entitycat = (EntityTamableFox)iterator.next();
} while(entitycat == this.a); } while(entitycat == this.a);
} while(!entitycat.eW()); } while(!entitycat.eW());
return true; return true;
} }
public boolean b() { public boolean b() {
return this.a.isTamed() && this.b != null && this.b.isSleeping() && this.c != null && !this.g(); return this.a.isTamed() && this.b != null && this.b.isSleeping() && this.c != null && !this.g();
} }
public void c() { public void c() {
if (this.c != null) { if (this.c != null) {
this.a.setSitting(false); this.a.setSitting(false);
this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D); this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D);
} }
} }
public void d() { public void d() {
this.a.setSleeping(false); this.a.setSleeping(false);
float f = this.a.world.f(1.0F); 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) { if (this.b.eC() >= 100 && (double)f > 0.77D && (double)f < 0.8D && (double)this.a.world.getRandom().nextFloat() < 0.7D) {
this.h(); this.h();
} }
this.d = 0; this.d = 0;
//this.a.y(false); //this.a.y(false);
this.a.getNavigation().o(); this.a.getNavigation().o();
} }
private void h() { private void h() {
Random random = this.a.getRandom(); Random random = this.a.getRandom();
BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
blockposition_mutableblockposition.g(this.a.getChunkCoordinates()); 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); 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()); blockposition_mutableblockposition.g(this.a.getChunkCoordinates());
LootTable loottable = this.a.world.getMinecraftServer().getLootTableRegistry().getLootTable(LootTables.ak); 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); 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<ItemStack> list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.GIFT)); List<ItemStack> list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.GIFT));
Iterator iterator = list.iterator(); Iterator iterator = list.iterator();
while(iterator.hasNext()) { while(iterator.hasNext()) {
ItemStack itemstack = (ItemStack)iterator.next(); 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)); 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() { public void e() {
if (this.b != null && this.c != null) { if (this.b != null && this.c != null) {
this.a.setSitting(false); this.a.setSitting(false);
this.a.getNavigation().a((double)this.c.getX(), (double)this.c.getY(), (double)this.c.getZ(), 1.100000023841858D); 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) { if (this.a.h(this.b) < 2.5D) {
++this.d; ++this.d;
if (this.d > 16) { if (this.d > 16) {
this.a.setSleeping(true); this.a.setSleeping(true);
//this.a.y(false); //this.a.y(false);
} else { } else {
this.a.a(this.b, 45.0F, 45.0F); this.a.a(this.b, 45.0F, 45.0F);
//this.a.y(true); //this.a.y(true);
} }
} else { } else {
this.a.setSleeping(false); this.a.setSleeping(false);
} }
} }
} }
} }

View File

@ -1,7 +1,7 @@
# Config for Tamable Foxes # Config for Tamable Foxes
show-owner-in-fox-name: true show-owner-in-fox-name: true
ask-for-name-after-taming: true ask-for-name-after-taming: true
max-fox-tames: 0 max-fox-tames: 0
tamed-behavior: tamed-behavior:
attack-wild-animals: true attack-wild-animals: true

View File

@ -1,19 +1,19 @@
mc-version-loading: "Registering entity for MC Version %MC_VERSION%..." 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-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!" 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!" success-replaced-entity: "Replaced tamable fox entity!"
error-to-replaced-entity: "Failed to replace tamable fox entity!" error-to-replaced-entity: "Failed to replace tamable fox entity!"
saving-foxes-message: "Saving foxes." saving-foxes-message: "Saving foxes."
taming-tamed-message: "You just tamed a wild fox!" taming-tamed-message: "You just tamed a wild fox!"
taming-asking-for-name-message: "What do you want to call it?" taming-asking-for-name-message: "What do you want to call it?"
taming-chosen-name-perfect: "%NEW_FOX_NAME% is perfect!" taming-chosen-name-perfect: "%NEW_FOX_NAME% is perfect!"
fox-name-format: "%FOX_NAME% (%OWNER%'s Fox)" fox-name-format: "%FOX_NAME% (%OWNER%'s Fox)"
fox-name-no-owner-name-format: "%FOX_NAME%" fox-name-no-owner-name-format: "%FOX_NAME%"
fox-doesnt-trust: "The fox doesn't trust you! You have too many foxes!" 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." no-permission: "You do not have the permission for this command."
only-run-by-player: "Command can only be run from player state!" only-run-by-player: "Command can only be run from player state!"
spawned-fox-message: "Spawned a %TYPE% fox." spawned-fox-message: "Spawned a %TYPE% fox."
failed-to-spawn-message: "Failed to spawn fox!" failed-to-spawn-message: "Failed to spawn fox!"
reloaded-message: "Reloaded." reloaded-message: "Reloaded."

View File

@ -1,22 +1,22 @@
name: Tamablefoxes name: Tamablefoxes
version: ${project.version} version: ${project.version}
main: net.seanomik.tamablefoxes.TamableFoxes main: net.seanomik.tamablefoxes.TamableFoxes
api-version: 1.14 api-version: 1.14
load: STARTUP load: STARTUP
description: Adds tamable foxes to Minecraft! description: Adds tamable foxes to Minecraft!
commands: commands:
spawntamablefox: spawntamablefox:
aliases: [tamablefox, stf, spawntf] aliases: [tamablefox, stf, spawntf]
usage: /spawntamablefox [type] usage: /spawntamablefox [type]
description: Spawn a tamable fox at the standing location. Type can be snow or red, or left empty for a red. description: Spawn a tamable fox at the standing location. Type can be snow or red, or left empty for a red.
permissions: permissions:
tamablefoxes.spawn: tamablefoxes.spawn:
description: "Gives the player the ability to spawn tamable foxes." description: "Gives the player the ability to spawn tamable foxes."
default: op default: op
tamablefoxes.tame: tamablefoxes.tame:
description: "Gives the player the ability to tame a fox." description: "Gives the player the ability to tame a fox."
default: true default: true
tamablefoxes.tame.unlimited: tamablefoxes.tame.unlimited:
description: "Lets players bypass the tame limit." description: "Lets players bypass the tame limit."
default: op default: op

30
Utility/pom.xml Normal file
View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.seanomik</groupId>
<artifactId>tamablefoxes-parent</artifactId>
<version>2.0.0-SNAPSHOT</version>
</parent>
<artifactId>tamablefoxes-util</artifactId>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.14-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -1,12 +1,10 @@
package net.seanomik.tamablefoxes.versions; package net.seanomik.tamablefoxes.util;
import net.seanomik.tamablefoxes.Utils; import net.seanomik.tamablefoxes.util.io.LanguageConfig;
import net.seanomik.tamablefoxes.io.LanguageConfig;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.invoke.VarHandle; import java.lang.invoke.VarHandle;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;

View File

@ -1,15 +1,13 @@
package net.seanomik.tamablefoxes.versions; package net.seanomik.tamablefoxes.util;
//import net.minecraft.server.v1_15_R1.EntityFox; import org.bukkit.Location;
import net.seanomik.tamablefoxes.TamableFoxes;
import org.bukkit.Location; public interface NMSInterface {
enum FoxType {
public interface NMSInterface { RED,
enum FoxType { SNOW
RED, }
SNOW
} public void registerCustomFoxEntity();
public void spawnTamableFox(Location loc, FoxType type);
public void registerCustomFoxEntity();
public void spawnTamableFox(Location loc, FoxType type);
} }

View File

@ -1,51 +1,53 @@
package net.seanomik.tamablefoxes; package net.seanomik.tamablefoxes.util;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.plugin.Plugin;
import java.lang.reflect.Constructor;
import java.util.List; import java.lang.reflect.Constructor;
import java.util.List;
public class Utils {
public static String getPrefix() { public class Utils {
return ChatColor.RED + "[Tamable Foxes] "; public static String getPrefix() {
} return ChatColor.RED + "[Tamable Foxes] ";
}
public static Class<?> getPrivateInnerClass(Class outer, String innerName) { public static Plugin tamableFoxesPlugin;
for (Class<?> declaredClass : outer.getDeclaredClasses()) {
if (declaredClass.getSimpleName().equals(innerName)) return declaredClass; public static Class<?> getPrivateInnerClass(Class outer, String innerName) {
} for (Class<?> declaredClass : outer.getDeclaredClasses()) {
if (declaredClass.getSimpleName().equals(innerName)) return declaredClass;
return null; }
}
return null;
public static Object instantiatePrivateInnerClass(Class outer, String innerName, Object outerObject, List<Object> args, List<Class<?>> argTypes) { }
try {
Class<?> innerClass = getPrivateInnerClass(outer, innerName); public static Object instantiatePrivateInnerClass(Class outer, String innerName, Object outerObject, List<Object> args, List<Class<?>> argTypes) {
try {
Object[] argObjects = new Object[args.size() + 1]; Class<?> innerClass = getPrivateInnerClass(outer, innerName);
Class<?>[] argClasses = new Class<?>[argTypes.size() + 1];
Object[] argObjects = new Object[args.size() + 1];
// Needed due to how List#toArray() converts the classes to objects Class<?>[] argClasses = new Class<?>[argTypes.size() + 1];
for (int i = 0; i < argClasses.length; i++) {
if (i == argClasses.length - 1) continue; // Needed due to how List#toArray() converts the classes to objects
argObjects[i + 1] = args.get(i); for (int i = 0; i < argClasses.length; i++) {
argClasses[i + 1] = argTypes.get(i); if (i == argClasses.length - 1) continue;
} argObjects[i + 1] = args.get(i);
argObjects[0] = outerObject; argClasses[i + 1] = argTypes.get(i);
argClasses[0] = outer; }
argObjects[0] = outerObject;
Constructor<?> innerConstructor = innerClass.getDeclaredConstructor(argClasses); argClasses[0] = outer;
innerConstructor.setAccessible(true);
Constructor<?> innerConstructor = innerClass.getDeclaredConstructor(argClasses);
Object instantiatedClass = innerConstructor.newInstance(argObjects); innerConstructor.setAccessible(true);
innerConstructor.setAccessible(false); Object instantiatedClass = innerConstructor.newInstance(argObjects);
return instantiatedClass; innerConstructor.setAccessible(false);
} catch (Exception e) {
e.printStackTrace(); return instantiatedClass;
return null; } catch (Exception e) {
} e.printStackTrace();
} return null;
}
} }
}

View File

@ -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.configuration.file.FileConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public class Config { 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? // Does the owner's name show if the foxes name?
public static boolean doesShowOwnerInFoxName() { return config.getBoolean("show-owner-in-fox-name"); } public static boolean doesShowOwnerInFoxName() { return config.getBoolean("show-owner-in-fox-name"); }

View File

@ -1,161 +1,161 @@
package net.seanomik.tamablefoxes.io; package net.seanomik.tamablefoxes.util.io;
import net.seanomik.tamablefoxes.TamableFoxes; import net.seanomik.tamablefoxes.util.NMSInterface;
import net.seanomik.tamablefoxes.versions.NMSInterface; import org.bukkit.ChatColor;
import org.bukkit.ChatColor; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.java.JavaPlugin;
import java.io.File; import java.io.File;
public class LanguageConfig extends YamlConfiguration { public class LanguageConfig extends YamlConfiguration {
private static LanguageConfig config; private static LanguageConfig config;
private TamableFoxes plugin; private JavaPlugin plugin;
private File configFile; private File configFile;
public static LanguageConfig getConfig() { public static LanguageConfig getConfig(JavaPlugin plugin) {
if (LanguageConfig.config == null) { if (LanguageConfig.config == null) {
LanguageConfig.config = new LanguageConfig(); LanguageConfig.config = new LanguageConfig(plugin);
} }
return LanguageConfig.config; return LanguageConfig.config;
} }
public LanguageConfig() { public LanguageConfig(JavaPlugin plugin) {
this.plugin = TamableFoxes.getPlugin(); this.plugin = plugin;
this.configFile = new File(this.plugin.getDataFolder(), "language.yml"); this.configFile = new File(this.plugin.getDataFolder(), "language.yml");
this.saveDefault(); this.saveDefault();
this.reload(); this.reload();
} }
public void reload() { public void reload() {
try { try {
super.load(this.configFile); super.load(this.configFile);
} }
catch (Exception e) { catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
public void save() { public void save() {
try { try {
super.save(this.configFile); super.save(this.configFile);
} }
catch (Exception e) { catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
public void saveDefault() { public void saveDefault() {
this.plugin.saveResource("language.yml", false); this.plugin.saveResource("language.yml", false);
} }
public void saveConfig() { public void saveConfig() {
try { try {
super.save(this.configFile); super.save(this.configFile);
} }
catch (Exception e) { catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
public void reloadConfig() { public void reloadConfig() {
try { try {
super.load(this.configFile); super.load(this.configFile);
} }
catch (Exception e) { catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
public void saveDefaultConfig() { public void saveDefaultConfig() {
try { try {
this.plugin.saveDefaultConfig(); this.plugin.saveDefaultConfig();
} }
catch (Exception e) { catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
// Auto replace alternate color codes. // Auto replace alternate color codes.
@Override @Override
public String getString(String path) { public String getString(String path) {
// Only attempt to translate if the text is not empty. // Only attempt to translate if the text is not empty.
return (super.getString(path).isEmpty()) ? super.getString(path) : ChatColor.translateAlternateColorCodes('&', super.getString(path)); return (super.getString(path).isEmpty()) ? super.getString(path) : ChatColor.translateAlternateColorCodes('&', super.getString(path));
} }
// This is the text that shows when registering the custom entity // This is the text that shows when registering the custom entity
public static String getMCVersionLoading(String mcVersionStr) { public static String getMCVersionLoading(String mcVersionStr) {
return getConfig().getString("mc-version-loading").replaceAll("%MC_VERSION%", 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. // Get the error that shows during register when they try to run the plugin on an unsupported mc version.
public static String getUnsupportedMCVersionRegister() { public static String getUnsupportedMCVersionRegister() {
return getConfig().getString("unsupported-mc-version-not-registering"); 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. // Get the error that shows during disable when they try to run the plugin on an unsupported mc version.
public static String getUnsupportedMCVersionDisable() { public static String getUnsupportedMCVersionDisable() {
return getConfig().getString("unsupported-mc-version-disabling"); return config.getString("unsupported-mc-version-disabling");
} }
// Get the message that shows when we successfully replaced the entity. // Get the message that shows when we successfully replaced the entity.
public static String getSuccessReplaced() { public static String getSuccessReplaced() {
return getConfig().getString("success-replaced-entity"); return config.getString("success-replaced-entity");
} }
// Get the error when it failed to replace the entity. // Get the error when it failed to replace the entity.
public static String getFailureReplace() { public static String getFailureReplace() {
return getConfig().getString("error-to-replaced-entity"); return config.getString("error-to-replaced-entity");
} }
// Get the message when saving foxes. // Get the message when saving foxes.
public static String getSavingFoxMessage() { public static String getSavingFoxMessage() {
return getConfig().getString("saving-foxes-message"); return config.getString("saving-foxes-message");
} }
// Get the message that shows when you tame a fox. // Get the message that shows when you tame a fox.
public static String getTamedMessage() { public static String getTamedMessage() {
return getConfig().getString("taming-tamed-message"); return config.getString("taming-tamed-message");
} }
// Get the message when you ask for the foxes name. // Get the message when you ask for the foxes name.
public static String getTamingAskingName() { public static String getTamingAskingName() {
return getConfig().getString("taming-asking-for-name-message"); return config.getString("taming-asking-for-name-message");
} }
// Get the message when you give feed back on the new fox name. // Get the message when you give feed back on the new fox name.
public static String getTamingChosenPerfect(String chosen) { public static String getTamingChosenPerfect(String chosen) {
return getConfig().getString("taming-chosen-name-perfect").replaceAll("%NEW_FOX_NAME%", chosen); return config.getString("taming-chosen-name-perfect").replaceAll("%NEW_FOX_NAME%", chosen);
} }
// Get the fox name format. // Get the fox name format.
public static String getFoxNameFormat(String foxName, String ownerName) { 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); 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() { public static String getFoxDoesntTrust() {
return getConfig().getString("fox-doesnt-trust"); return config.getString("fox-doesnt-trust");
} }
public static String getNoPermMessage() { public static String getNoPermMessage() {
return getConfig().getString("no-permission"); return config.getString("no-permission");
} }
public static String getOnlyRunPlayer() { public static String getOnlyRunPlayer() {
return getConfig().getString("only-run-by-player"); return config.getString("only-run-by-player");
} }
public static String getSpawnedFoxMessage(NMSInterface.FoxType type) { public static String getSpawnedFoxMessage(NMSInterface.FoxType type) {
String typeStr = ((type == type.SNOW) ? ChatColor.AQUA + "Snow" : ChatColor.RED + "Red") + ChatColor.RESET; String typeStr = ((type == type.SNOW) ? ChatColor.AQUA + "Snow" : ChatColor.RED + "Red") + ChatColor.RESET;
return getConfig().getString("spawned-fox-message").replaceAll("%TYPE%", typeStr); return config.getString("spawned-fox-message").replaceAll("%TYPE%", typeStr);
} }
public static String getFailureSpawn() { public static String getFailureSpawn() {
return getConfig().getString("failed-to-spawn-message"); return config.getString("failed-to-spawn-message");
} }
public static String getReloadMessage() { public static String getReloadMessage() {
return getConfig().getString("reloaded-message"); return config.getString("reloaded-message");
} }
} }

View File

@ -1,58 +1,61 @@
package net.seanomik.tamablefoxes.io.sqlite; package net.seanomik.tamablefoxes.util.io.sqlite;
import net.seanomik.tamablefoxes.TamableFoxes; import org.bukkit.plugin.Plugin;
import org.bukkit.Bukkit;
import java.sql.Connection;
import java.sql.Connection; import java.sql.DriverManager;
import java.sql.DriverManager; import java.sql.SQLException;
import java.sql.SQLException;
public class SQLiteHandler {
public class SQLiteHandler { private Connection connection;
private Connection connection;
private static SQLiteHandler instance;
private static SQLiteHandler instance;
public static SQLiteHandler getInstance() {
public static SQLiteHandler getInstance() { if (instance == null) {
if (instance == null) { instance = new SQLiteHandler();
instance = new SQLiteHandler(); }
}
return instance;
return instance; }
}
public void connect(Plugin plugin) {
public void connect() { String pluginFolder = plugin.getDataFolder().getAbsolutePath();
try { connect(pluginFolder);
String pluginFolder = TamableFoxes.getPlugin().getDataFolder().getAbsolutePath(); }
String url = "jdbc:sqlite:" + pluginFolder + "/userFoxAmount.db";
connection = DriverManager.getConnection(url); public void connect(String pluginFolder) {
try {
} catch (SQLException e) { String url = "jdbc:sqlite:" + pluginFolder + "/userFoxAmount.db";
e.printStackTrace(); connection = DriverManager.getConnection(url);
}
} } catch (SQLException e) {
e.printStackTrace();
public Connection getConnection() { }
return connection; }
}
public Connection getConnection() {
public void closeConnection() { return connection;
try { }
connection.close();
} catch (SQLException e) { public void closeConnection() {
e.printStackTrace(); try {
} connection.close();
} } catch (SQLException e) {
e.printStackTrace();
public void newConnection() { }
try { }
connection.close();
connect(); public void newConnection(String pluginFolder) {
} catch (SQLException e) { try {
e.printStackTrace(); connection.close();
} connect(pluginFolder);
} } catch (SQLException e) {
e.printStackTrace();
public void setConnection(Connection connection) { }
this.connection = connection; }
}
} public void setConnection(Connection connection) {
this.connection = connection;
}
}

View File

@ -1,130 +1,130 @@
package net.seanomik.tamablefoxes.io.sqlite; package net.seanomik.tamablefoxes.util.io.sqlite;
import net.seanomik.tamablefoxes.TamableFoxes; import net.seanomik.tamablefoxes.util.Utils;
import net.seanomik.tamablefoxes.Utils; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.Plugin;
import java.sql.DatabaseMetaData;
import java.sql.DatabaseMetaData; import java.sql.PreparedStatement;
import java.sql.PreparedStatement; import java.sql.ResultSet;
import java.sql.ResultSet; import java.sql.SQLException;
import java.sql.SQLException; import java.util.*;
import java.util.*;
public class SQLiteHelper {
public class SQLiteHelper { public static Plugin plugin;
public static Plugin plugin; public static SQLiteHandler sqLiteHandler;
public static SQLiteHandler sqLiteHandler;
private static SQLiteHelper instance;
private static SQLiteHelper instance; private static String userAmountTableName = "USER_FOX_AMT";
private static String userAmountTableName = "USER_FOX_AMT";
public static SQLiteHelper getInstance(Plugin plugin) {
public static SQLiteHelper getInstance() { if (instance == null) {
if (instance == null) { instance = new SQLiteHelper();
instance = new SQLiteHelper(); instance.plugin = plugin;
} }
return instance; return instance;
} }
public void createTablesIfNotExist() { public void createTablesIfNotExist() {
sqLiteHandler = SQLiteHandler.getInstance(); sqLiteHandler = SQLiteHandler.getInstance();
String userFoxAmountQuery = String userFoxAmountQuery =
"CREATE TABLE IF NOT EXISTS `" + userAmountTableName + "` ( " + "CREATE TABLE IF NOT EXISTS `" + userAmountTableName + "` ( " +
"`UUID` TEXT PRIMARY KEY , " + "`UUID` TEXT PRIMARY KEY , " +
"`AMOUNT` INT NOT NULL);"; "`AMOUNT` INT NOT NULL);";
try { try {
sqLiteHandler.connect(); sqLiteHandler.connect(plugin);
// Create previous bans table // Create previous bans table
DatabaseMetaData dbm = sqLiteHandler.getConnection().getMetaData(); DatabaseMetaData dbm = sqLiteHandler.getConnection().getMetaData();
ResultSet tables = dbm.getTables(null, null, userAmountTableName, null); ResultSet tables = dbm.getTables(null, null, userAmountTableName, null);
if (!tables.next()) { if (!tables.next()) {
PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement(userFoxAmountQuery); PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement(userFoxAmountQuery);
statement.executeUpdate(); statement.executeUpdate();
plugin.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + "Created previous player bans table!"); plugin.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + "Created previous player bans table!");
} }
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
if (sqLiteHandler.getConnection() != null) { if (sqLiteHandler.getConnection() != null) {
try { try {
sqLiteHandler.getConnection().close(); sqLiteHandler.getConnection().close();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }
} }
public int getPlayerFoxAmount(UUID uuid) { public int getPlayerFoxAmount(UUID uuid) {
try { try {
sqLiteHandler.connect(); sqLiteHandler.connect(plugin);
PreparedStatement statement = sqLiteHandler.getConnection() PreparedStatement statement = sqLiteHandler.getConnection()
.prepareStatement("SELECT * FROM " + userAmountTableName + " WHERE UUID=?"); .prepareStatement("SELECT * FROM " + userAmountTableName + " WHERE UUID=?");
statement.setString(1, uuid.toString()); statement.setString(1, uuid.toString());
ResultSet results = statement.executeQuery(); ResultSet results = statement.executeQuery();
if (results.next()) { if (results.next()) {
return results.getInt("AMOUNT"); return results.getInt("AMOUNT");
} }
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
if (sqLiteHandler.getConnection() != null) { if (sqLiteHandler.getConnection() != null) {
try { try {
sqLiteHandler.getConnection().close(); sqLiteHandler.getConnection().close();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }
return -1; return -1;
} }
public void addPlayerFoxAmount(UUID uuid, int amt) { public void addPlayerFoxAmount(UUID uuid, int amt) {
try { try {
String query = "UPDATE " + userAmountTableName + " SET AMOUNT = AMOUNT + " + amt + " WHERE UUID = '" + uuid.toString() + "'"; String query = "UPDATE " + userAmountTableName + " SET AMOUNT = AMOUNT + " + amt + " WHERE UUID = '" + uuid.toString() + "'";
if (getPlayerFoxAmount(uuid) == -1) { if (getPlayerFoxAmount(uuid) == -1) {
query = "INSERT INTO " + userAmountTableName + " (UUID, AMOUNT) VALUES('" + uuid.toString() + "'," + amt + ")"; query = "INSERT INTO " + userAmountTableName + " (UUID, AMOUNT) VALUES('" + uuid.toString() + "'," + amt + ")";
} }
sqLiteHandler.connect(); sqLiteHandler.connect(plugin);
PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement(query); PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement(query);
statement.executeUpdate(); statement.executeUpdate();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
if (sqLiteHandler.getConnection() != null) { if (sqLiteHandler.getConnection() != null) {
try { try {
sqLiteHandler.getConnection().close(); sqLiteHandler.getConnection().close();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }
} }
public void removePlayerFoxAmount(UUID uuid, int amt) { public void removePlayerFoxAmount(UUID uuid, int amt) {
try { try {
String query = "UPDATE " + userAmountTableName + " SET AMOUNT = AMOUNT - " + amt + " WHERE UUID = '" + uuid.toString() + "'"; String query = "UPDATE " + userAmountTableName + " SET AMOUNT = AMOUNT - " + amt + " WHERE UUID = '" + uuid.toString() + "'";
sqLiteHandler.connect(); sqLiteHandler.connect(plugin);
PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement(query); PreparedStatement statement = sqLiteHandler.getConnection().prepareStatement(query);
statement.executeUpdate(); statement.executeUpdate();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
if (sqLiteHandler.getConnection() != null) { if (sqLiteHandler.getConnection() != null) {
try { try {
sqLiteHandler.getConnection().close(); sqLiteHandler.getConnection().close();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }
} }
} }

125
pom.xml
View File

@ -5,98 +5,51 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>net.seanomik</groupId> <groupId>net.seanomik</groupId>
<artifactId>tamablefoxes</artifactId> <artifactId>tamablefoxes-parent</artifactId>
<version>1.9.2.1-SNAPSHOT</version> <version>2.0.0-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>pom</packaging>
<name>Tamablefoxes</name> <modules>
<module>Plugin</module>
<module>Utility</module>
<module>1_17_R1</module>
</modules>
<properties> <properties>
<java.version>8</java.version> <maven.compiler.target>16</maven.compiler.target>
<maven.compiler.source>16</maven.compiler.source>
<!--<java.version.source>16</java.version.source>
<java.version.target>16</java.version.target>-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<build> <build>
<defaultGoal>clean package</defaultGoal> <pluginManagement>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version> <version>3.8.1</version>
<configuration> <!--<configuration>
<source>${java.version}</source> <source>${java.version.source}</source>
<target>${java.version}</target> <target>${java.version.target}</target>
</configuration> </configuration>-->
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version> <version>3.2.4</version>
<executions> <executions>
<execution> <execution>
<phase>package</phase> <phase>package</phase>
<goals> <goals>
<goal>shade</goal> <goal>shade</goal>
</goals> </goals>
<configuration> </execution>
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.14.4_\plugins\TamableFoxes_v${project.version}.jar</outputFile>--> </executions>
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.15.2_\plugins\TamableFoxes_v${project.version}.jar</outputFile>--> </plugin>
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_PAPER_1.16.1_\plugins\TamableFoxes_v${project.version}.jar</outputFile>--> </plugins>
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.1_\plugins\TamableFoxes_v${project.version}.jar</outputFile>--> </pluginManagement>
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.2_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_PAPER_1.16.2_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.3_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.4_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.5_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_PAPER_1.16.4_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_PAPER_1.16.5_\plugins\TamableFoxes_v${project.version}.jar</outputFile>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build> </build>
<repositories> </project>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>sonatype</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
<repository>
<id>codemc-snapshots</id>
<url>https://repo.codemc.io/repository/maven-snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>local.spigot.nms</groupId>
<artifactId>AllSpigotNMS</artifactId>
<version>LATEST</version>
<scope>system</scope>
<systemPath>${project.basedir}/Spigot_v14_v15_v16-v165.jar</systemPath>
</dependency>
<dependency> <!-- We need to do this so we get the spigot api without nms. -->
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.14.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.wesjd</groupId>
<artifactId>anvilgui</artifactId>
<version>1.5.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>