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:
parent
e842dee1b0
commit
1dbdfb0049
|
@ -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 #
|
||||||
###################
|
###################
|
||||||
|
|
BIN
1.14 TRANS.xlsx
BIN
1.14 TRANS.xlsx
Binary file not shown.
|
@ -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>
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
|
@ -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>
|
|
@ -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"
|
||||||
}
|
));
|
||||||
}
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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 );
|
}
|
||||||
}
|
}
|
||||||
}
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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 );
|
}
|
||||||
}
|
}
|
||||||
}
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
}
|
||||||
}
|
}
|
||||||
}
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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
|
|
@ -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."
|
|
@ -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
|
|
@ -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>
|
|
@ -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;
|
|
@ -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);
|
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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"); }
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
125
pom.xml
|
@ -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>
|
|
Loading…
Reference in New Issue