diff --git a/main/pom.xml b/main/pom.xml
index ccdb8b4ea..7614a257c 100644
--- a/main/pom.xml
+++ b/main/pom.xml
@@ -4,12 +4,12 @@
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
+ 2.0.31-SNAPSHOT
citizens-main
UTF-8
- 1.19.3-R0.1-SNAPSHOT
+ 1.19.4-R0.1-SNAPSHOT
2.11.2
${project.version}
7.0.4
diff --git a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java
index 325bea1cc..f507fdd75 100644
--- a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java
+++ b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java
@@ -191,8 +191,8 @@ public class CitizensNPC extends AbstractNPC {
@Override
public boolean requiresNameHologram() {
- return super.requiresNameHologram()
- || (getEntityType() != EntityType.ARMOR_STAND && Setting.ALWAYS_USE_NAME_HOLOGRAM.asBoolean());
+ return super.requiresNameHologram() || (getEntityType() != EntityType.ARMOR_STAND
+ && !getEntityType().name().equals("TEXT_DISPLAY") && Setting.ALWAYS_USE_NAME_HOLOGRAM.asBoolean());
}
private void resetCachedCoord() {
diff --git a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java
index dc87fe51e..3936b2530 100644
--- a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java
+++ b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java
@@ -1,6 +1,7 @@
package net.citizensnpcs.trait;
import java.util.Collection;
+import java.util.IllegalFormatException;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -9,7 +10,7 @@ import java.util.stream.Collectors;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
-import org.bukkit.entity.ArmorStand;
+import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.inventory.ItemStack;
@@ -87,8 +88,13 @@ public class HologramTrait extends Trait {
}
private NPC createHologram(String line, double heightOffset) {
- NPC hologramNPC = registry.createNPC(EntityType.ARMOR_STAND, line);
- hologramNPC.getOrAddTrait(ArmorStandTrait.class).setAsHelperEntityWithName(npc);
+ NPC hologramNPC = null;
+ if (SUPPORTS_TEXT_DISPLAY) {
+ hologramNPC = registry.createNPC(EntityType.TEXT_DISPLAY, line);
+ } else {
+ hologramNPC = registry.createNPC(EntityType.ARMOR_STAND, line);
+ hologramNPC.getOrAddTrait(ArmorStandTrait.class).setAsHelperEntityWithName(npc);
+ }
if (Setting.PACKET_HOLOGRAMS.asBoolean()) {
hologramNPC.addTrait(PacketNPC.class);
}
@@ -107,7 +113,7 @@ public class HologramTrait extends Trait {
.setColor(Util.matchEnum(ChatColor.values(), itemMatcher.group(2).substring(1)));
}
itemNPC.spawn(currentLoc);
- ((ArmorStand) hologramNPC.getEntity()).addPassenger(itemNPC.getEntity());
+ hologramNPC.getEntity().addPassenger(itemNPC.getEntity());
itemNPC.addRunnable(new Runnable() {
@Override
public void run() {
@@ -147,9 +153,9 @@ public class HologramTrait extends Trait {
/**
* Note: this is implementation-specific and may be removed at a later date.
*/
- public Collection getHologramEntities() {
+ public Collection getHologramEntities() {
return lines.stream().filter(l -> l.hologram != null && l.hologram.getEntity() != null)
- .map(l -> (ArmorStand) l.hologram.getEntity()).collect(Collectors.toList());
+ .map(l -> l.hologram.getEntity()).collect(Collectors.toList());
}
/**
@@ -173,8 +179,8 @@ public class HologramTrait extends Trait {
/**
* Note: this is implementation-specific and may be removed at a later date.
*/
- public ArmorStand getNameEntity() {
- return nameNPC != null && nameNPC.isSpawned() ? ((ArmorStand) nameNPC.getEntity()) : null;
+ public Entity getNameEntity() {
+ return nameNPC != null && nameNPC.isSpawned() ? nameNPC.getEntity() : null;
}
@Override
@@ -318,7 +324,7 @@ public class HologramTrait extends Trait {
if (!updateName)
continue;
- hologramNPC.setName(Placeholders.replace(text, null, npc));
+ line.setText(text);
hologramNPC.data().set(NPC.Metadata.NAMEPLATE_VISIBLE, npc.getRawName().length() > 0);
}
}
@@ -428,4 +434,12 @@ public class HologramTrait extends Trait {
}
private static final Pattern ITEM_MATCHER = Pattern.compile("");
+ private static boolean SUPPORTS_TEXT_DISPLAY = true;
+ static {
+ try {
+ EntityType.valueOf("TEXT_DISPLAY");
+ } catch (IllegalFormatException e) {
+ SUPPORTS_TEXT_DISPLAY = false;
+ }
+ }
}
diff --git a/main/src/main/java/net/citizensnpcs/trait/versioned/SnifferTrait.java b/main/src/main/java/net/citizensnpcs/trait/versioned/SnifferTrait.java
new file mode 100644
index 000000000..4ce2c1307
--- /dev/null
+++ b/main/src/main/java/net/citizensnpcs/trait/versioned/SnifferTrait.java
@@ -0,0 +1,78 @@
+package net.citizensnpcs.trait.versioned;
+
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Sniffer;
+
+import net.citizensnpcs.api.command.Command;
+import net.citizensnpcs.api.command.CommandContext;
+import net.citizensnpcs.api.command.Flag;
+import net.citizensnpcs.api.command.Requirements;
+import net.citizensnpcs.api.command.exception.CommandException;
+import net.citizensnpcs.api.command.exception.CommandUsageException;
+import net.citizensnpcs.api.npc.NPC;
+import net.citizensnpcs.api.persistence.Persist;
+import net.citizensnpcs.api.trait.Trait;
+import net.citizensnpcs.api.trait.TraitName;
+import net.citizensnpcs.api.util.Messaging;
+import net.citizensnpcs.util.Messages;
+import net.citizensnpcs.util.NMS;
+
+@TraitName("sniffertrait")
+public class SnifferTrait extends Trait {
+ @Persist
+ private SnifferState state = null;
+
+ public SnifferTrait() {
+ super("sniffertrait");
+ }
+
+ public SnifferState getState() {
+ return state;
+ }
+
+ @Override
+ public void run() {
+ if (!npc.isSpawned() || !(npc.getEntity() instanceof Sniffer))
+ return;
+ NMS.setSnifferState(npc.getEntity(), state);
+ }
+
+ public void setState(SnifferState state) {
+ this.state = state;
+ }
+
+ public enum SnifferState {
+ DIGGING,
+ FEELING_HAPPY,
+ IDLING,
+ RISING,
+ SCENTING,
+ SEARCHING,
+ SNIFFING
+ }
+
+ @Command(
+ aliases = { "npc" },
+ usage = "sniffer (--state [state])",
+ desc = "Sets sniffer modifiers",
+ modifiers = { "sniffer" },
+ min = 1,
+ max = 1,
+ permission = "citizens.npc.sniffer")
+ @Requirements(selected = true, ownership = true, types = EntityType.SNIFFER)
+ public static void sniffer(CommandContext args, CommandSender sender, NPC npc, @Flag("state") SnifferState state)
+ throws CommandException {
+ SnifferTrait trait = npc.getOrAddTrait(SnifferTrait.class);
+ String output = "";
+ if (state != null) {
+ trait.setState(state);
+ output += ' ' + Messaging.tr(Messages.SNIFFER_STATE_SET, npc.getName(), state);
+ }
+ if (!output.isEmpty()) {
+ Messaging.send(sender, output.trim());
+ } else {
+ throw new CommandUsageException();
+ }
+ }
+}
diff --git a/main/src/main/java/net/citizensnpcs/util/Messages.java b/main/src/main/java/net/citizensnpcs/util/Messages.java
index a25b8f310..bd7e11d66 100644
--- a/main/src/main/java/net/citizensnpcs/util/Messages.java
+++ b/main/src/main/java/net/citizensnpcs/util/Messages.java
@@ -363,6 +363,7 @@ public class Messages {
public static final String SKIPPING_BROKEN_TRAIT = "citizens.notifications.skipping-broken-trait";
public static final String SKIPPING_INVALID_ANCHOR = "citizens.notifications.skipping-invalid-anchor";
public static final String SKIPPING_INVALID_POSE = "citizens.notifications.skipping-invalid-pose";
+ public static final String SNIFFER_STATE_SET = "citizens.commands.npc.sniffer.state-set";
public static final String SNOWMAN_DERP_SET = "citizens.commands.npc.snowman.derp-set";
public static final String SNOWMAN_DERP_STOPPED = "citizens.commands.npc.snowman.derp-stopped";
public static final String SOUND_INFO = "citizens.commands.npc.sound.info";
diff --git a/main/src/main/java/net/citizensnpcs/util/NMS.java b/main/src/main/java/net/citizensnpcs/util/NMS.java
index f8481f8c3..109f1bc52 100644
--- a/main/src/main/java/net/citizensnpcs/util/NMS.java
+++ b/main/src/main/java/net/citizensnpcs/util/NMS.java
@@ -9,6 +9,7 @@ import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;
+import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@@ -31,6 +32,7 @@ import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.scoreboard.Team;
import org.bukkit.util.Vector;
+import com.google.common.collect.Lists;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.GameProfileRepository;
@@ -52,6 +54,7 @@ import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator;
import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator;
import net.citizensnpcs.npc.skin.SkinnableEntity;
import net.citizensnpcs.trait.versioned.CamelTrait.CamelPose;
+import net.citizensnpcs.trait.versioned.SnifferTrait.SnifferState;
public class NMS {
private NMS() {
@@ -148,6 +151,33 @@ public class NMS {
}
}
+ private static List getFieldsMatchingType(Class> clazz, Class> type, boolean allowStatic) {
+ List found = Lists.newArrayList();
+ for (Field field : clazz.getDeclaredFields()) {
+ if (allowStatic ^ Modifier.isStatic(field.getModifiers()))
+ continue;
+ if (field.getType() == type) {
+ found.add(field);
+ field.setAccessible(true);
+ }
+ }
+ return found;
+ }
+
+ public static List getFieldsOfType(Class> clazz, Class> type) {
+ List found = getFieldsMatchingType(clazz, type, false);
+ if (found.isEmpty())
+ return null;
+ return found.stream().map(f -> {
+ try {
+ return LOOKUP.unreflectGetter(f);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ return null;
+ }).filter(f -> f != null).collect(Collectors.toList());
+ }
+
public static MethodHandle getFinalSetter(Class> clazz, String field) {
return getFinalSetter(clazz, field, true);
}
@@ -212,28 +242,12 @@ public class NMS {
return null;
}
- private static Field getFirstFieldMatchingType(Class> clazz, Class> type, boolean allowStatic) {
- Field found = null;
- for (Field field : clazz.getDeclaredFields()) {
- if (allowStatic ^ Modifier.isStatic(field.getModifiers()))
- continue;
- if (field.getType() == type) {
- found = field;
- break;
- }
- }
- if (found != null) {
- found.setAccessible(true);
- }
- return found;
- }
-
public static MethodHandle getFirstFinalSetter(Class> clazz, Class> type) {
try {
- Field found = getFirstFieldMatchingType(clazz, type, false);
- if (found == null)
+ List found = getFieldsMatchingType(clazz, type, false);
+ if (found.isEmpty())
return null;
- return getFinalSetter(clazz, found.getName());
+ return getFinalSetter(clazz, found.get(0).getName());
} catch (Exception e) {
Messaging.logTr(Messages.ERROR_GETTING_FIELD, type, e.getLocalizedMessage());
}
@@ -242,10 +256,10 @@ public class NMS {
public static MethodHandle getFirstGetter(Class> clazz, Class> type) {
try {
- Field found = getFirstFieldMatchingType(clazz, type, false);
- if (found == null)
+ List found = getFieldsMatchingType(clazz, type, false);
+ if (found.isEmpty())
return null;
- return LOOKUP.unreflectGetter(found);
+ return LOOKUP.unreflectGetter(found.get(0));
} catch (Exception e) {
Messaging.logTr(Messages.ERROR_GETTING_FIELD, type, e.getLocalizedMessage());
}
@@ -292,10 +306,10 @@ public class NMS {
public static MethodHandle getFirstSetter(Class> clazz, Class> type) {
try {
- Field found = getFirstFieldMatchingType(clazz, type, false);
- if (found == null)
+ List found = getFieldsMatchingType(clazz, type, false);
+ if (found.isEmpty())
return null;
- return LOOKUP.unreflectSetter(found);
+ return LOOKUP.unreflectSetter(found.get(0));
} catch (Exception e) {
Messaging.logTr(Messages.ERROR_GETTING_FIELD, type, e.getLocalizedMessage());
}
@@ -304,10 +318,10 @@ public class NMS {
public static MethodHandle getFirstStaticGetter(Class> clazz, Class> type) {
try {
- Field found = getFirstFieldMatchingType(clazz, type, true);
- if (found == null)
+ List found = getFieldsMatchingType(clazz, type, true);
+ if (found.isEmpty())
return null;
- return LOOKUP.unreflectGetter(found);
+ return LOOKUP.unreflectGetter(found.get(0));
} catch (Exception e) {
Messaging.logTr(Messages.ERROR_GETTING_FIELD, type, e.getLocalizedMessage());
}
@@ -698,6 +712,10 @@ public class NMS {
BRIDGE.setSneaking(entity, sneaking);
}
+ public static void setSnifferState(Entity entity, SnifferState state) {
+ BRIDGE.setSnifferState(entity, state);
+ }
+
public static void setStepHeight(org.bukkit.entity.Entity entity, float height) {
BRIDGE.setStepHeight(entity, height);
}
@@ -757,6 +775,7 @@ public class NMS {
private static Object UNSAFE;
private static MethodHandle UNSAFE_FIELD_OFFSET;
private static MethodHandle UNSAFE_PUT_OBJECT;
+
private static MethodHandle UNSAFE_STATIC_FIELD_OFFSET;
static {
diff --git a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java
index 34b37f51b..fc2f4c595 100644
--- a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java
+++ b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java
@@ -40,6 +40,7 @@ import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator;
import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator;
import net.citizensnpcs.npc.skin.SkinnableEntity;
import net.citizensnpcs.trait.versioned.CamelTrait.CamelPose;
+import net.citizensnpcs.trait.versioned.SnifferTrait.SnifferState;
public interface NMSBridge {
default void activate(Entity entity) {
@@ -227,6 +228,9 @@ public interface NMSBridge {
public void setSneaking(Entity entity, boolean sneaking);
+ public default void setSnifferState(Entity entity, SnifferState state) {
+ }
+
public void setStepHeight(Entity entity, float height);
public void setTeamNameTagVisible(Team team, boolean visible);
@@ -249,5 +253,5 @@ public interface NMSBridge {
public void updateNavigationWorld(Entity entity, World world);
- public void updatePathfindingRange(NPC npc, float pathfindingRange);
+ public void updatePathfindingRange(NPC npc, float pathfindingRange);;
}
diff --git a/main/src/main/resources/messages_en.properties b/main/src/main/resources/messages_en.properties
index 812dc2738..15c60bcde 100644
--- a/main/src/main/resources/messages_en.properties
+++ b/main/src/main/resources/messages_en.properties
@@ -280,6 +280,7 @@ citizens.commands.npc.skin.cleared=[[{0}]]''s skin name was cleared.
citizens.commands.npc.skin.layers-set=[[{0}]]''s skin layers: cape - [[{1}]], hat - [[{2}]], jacket - [[{3}]], sleeves - [[{4}]], pants - [[{5}]].
citizens.commands.npc.size.description=[[{0}]]''s size is [[{1}]].
citizens.commands.npc.size.set=[[{0}]]''s size set to [[{1}]].
+citizens.commands.npc.sniffer.state-set=[[{0}]]''s state set to [[{1}]].
citizens.commands.npc.spellcaster.spell-set=Spell set to [[{0}]].
citizens.commands.npc.sound.invalid-sound=Invalid sound.
citizens.commands.npc.sound.set=[[{0}]]''s sounds are now: ambient - [[{1}]] hurt - [[{2}]] and death - [[{3}]].
diff --git a/pom.xml b/pom.xml
index 3bacbf552..e92e46ea0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,35 +1,29 @@
4.0.0
-
pom
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
-
+ 2.0.31-SNAPSHOT
Unknown
- 2.0.30
+ 2.0.31
-
citizens-repo
https://maven.citizensnpcs.co/repo
-
citizens-repo
https://maven.citizensnpcs.co/repo
-
clean package install
-
main
v1_8_R3
@@ -37,7 +31,7 @@
v1_16_R3
v1_17_R1
v1_18_R2
- v1_19_R2
+ v1_19_R3
dist
\ No newline at end of file
diff --git a/v1_10_R1/pom.xml b/v1_10_R1/pom.xml
index 0758515c0..03c2acce1 100644
--- a/v1_10_R1/pom.xml
+++ b/v1_10_R1/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
+ 2.0.31-SNAPSHOT
citizens-v1_10_R1
diff --git a/v1_11_R1/pom.xml b/v1_11_R1/pom.xml
index 236324d35..91bef0a3a 100644
--- a/v1_11_R1/pom.xml
+++ b/v1_11_R1/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
+ 2.0.31-SNAPSHOT
citizens-v1_11_R1
diff --git a/v1_12_R1/pom.xml b/v1_12_R1/pom.xml
index 7c4176cf4..cc3818d0d 100644
--- a/v1_12_R1/pom.xml
+++ b/v1_12_R1/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
+ 2.0.31-SNAPSHOT
citizens-v1_12_R1
diff --git a/v1_13_R2/pom.xml b/v1_13_R2/pom.xml
index febb2a90f..39ddfc179 100644
--- a/v1_13_R2/pom.xml
+++ b/v1_13_R2/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
+ 2.0.31-SNAPSHOT
citizens-v1_13_R2
diff --git a/v1_14_R1/pom.xml b/v1_14_R1/pom.xml
index 7dddf5173..c5a86f218 100644
--- a/v1_14_R1/pom.xml
+++ b/v1_14_R1/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
+ 2.0.31-SNAPSHOT
citizens-v1_14_R1
diff --git a/v1_15_R1/pom.xml b/v1_15_R1/pom.xml
index b2bd4dd40..1cb7203a0 100644
--- a/v1_15_R1/pom.xml
+++ b/v1_15_R1/pom.xml
@@ -4,7 +4,7 @@
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
+ 2.0.31-SNAPSHOT
citizens-v1_15_R1
diff --git a/v1_16_R3/pom.xml b/v1_16_R3/pom.xml
index 4c28f887a..1cede8ae3 100644
--- a/v1_16_R3/pom.xml
+++ b/v1_16_R3/pom.xml
@@ -4,7 +4,7 @@
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
+ 2.0.31-SNAPSHOT
citizens-v1_16_R3
diff --git a/v1_17_R1/pom.xml b/v1_17_R1/pom.xml
index a288e0306..927072c3b 100644
--- a/v1_17_R1/pom.xml
+++ b/v1_17_R1/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
+ 2.0.31-SNAPSHOT
citizens-v1_17_R1
diff --git a/v1_18_R2/pom.xml b/v1_18_R2/pom.xml
index c9b7fd4d2..6829ed143 100644
--- a/v1_18_R2/pom.xml
+++ b/v1_18_R2/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
+ 2.0.31-SNAPSHOT
citizens-v1_18_R2
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerNodeEvaluator.java b/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerNodeEvaluator.java
deleted file mode 100644
index 4ddda15ae..000000000
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerNodeEvaluator.java
+++ /dev/null
@@ -1,510 +0,0 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
-
-import java.util.EnumSet;
-
-import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
-import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
-import it.unimi.dsi.fastutil.objects.Object2BooleanMap;
-import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap;
-import net.citizensnpcs.nms.v1_19_R2.entity.EntityHumanNPC;
-import net.minecraft.core.BlockPos;
-import net.minecraft.core.Direction;
-import net.minecraft.tags.BlockTags;
-import net.minecraft.tags.FluidTags;
-import net.minecraft.util.Mth;
-import net.minecraft.world.entity.Mob;
-import net.minecraft.world.level.BlockGetter;
-import net.minecraft.world.level.PathNavigationRegion;
-import net.minecraft.world.level.block.Block;
-import net.minecraft.world.level.block.Blocks;
-import net.minecraft.world.level.block.CampfireBlock;
-import net.minecraft.world.level.block.DoorBlock;
-import net.minecraft.world.level.block.FenceGateBlock;
-import net.minecraft.world.level.block.state.BlockState;
-import net.minecraft.world.level.block.state.properties.Property;
-import net.minecraft.world.level.material.FluidState;
-import net.minecraft.world.level.material.Fluids;
-import net.minecraft.world.level.material.Material;
-import net.minecraft.world.level.pathfinder.BlockPathTypes;
-import net.minecraft.world.level.pathfinder.Node;
-import net.minecraft.world.level.pathfinder.PathComputationType;
-import net.minecraft.world.level.pathfinder.Target;
-import net.minecraft.world.phys.AABB;
-import net.minecraft.world.phys.Vec3;
-import net.minecraft.world.phys.shapes.VoxelShape;
-
-public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase {
- private final Long2ObjectMap l = new Long2ObjectOpenHashMap();
- private final Object2BooleanMap m = new Object2BooleanOpenHashMap();
- protected float oldWaterCost;
-
- private boolean canReachWithoutCollision(Node var0) {
- Vec3 var1 = new Vec3(var0.x - this.mob.getX(), var0.y - this.mob.getY(), var0.z - this.mob.getZ());
- AABB var2 = this.mob.getBoundingBox();
- int var3 = Mth.ceil(var1.length() / var2.getSize());
- var1 = var1.scale((1.0F / var3));
- for (int var4 = 1; var4 <= var3; var4++) {
- var2 = var2.move(var1);
- if (hasCollisions(var2))
- return false;
- }
- return true;
- }
-
- @Override
- public void done() {
- this.mob.setPathfindingMalus(BlockPathTypes.WATER, this.oldWaterCost);
- this.l.clear();
- this.m.clear();
- super.done();
- }
-
- protected BlockPathTypes evaluateBlockPathType(BlockGetter var0, boolean var1, boolean var2, BlockPos var3,
- BlockPathTypes var4) {
- if (var4 == BlockPathTypes.DOOR_WOOD_CLOSED && var1 && var2)
- var4 = BlockPathTypes.WALKABLE_DOOR;
- if (var4 == BlockPathTypes.DOOR_OPEN && !var2)
- var4 = BlockPathTypes.BLOCKED;
- if (var4 == BlockPathTypes.RAIL
- && !(var0.getBlockState(var3).getBlock() instanceof net.minecraft.world.level.block.BaseRailBlock)
- && !(var0.getBlockState(var3.below())
- .getBlock() instanceof net.minecraft.world.level.block.BaseRailBlock))
- var4 = BlockPathTypes.UNPASSABLE_RAIL;
- if (var4 == BlockPathTypes.LEAVES)
- var4 = BlockPathTypes.BLOCKED;
- return var4;
- }
-
- protected Node findAcceptedNode(int var0, int var1, int var2, int var3, double var4, Direction var6,
- BlockPathTypes var7) {
- Node var8 = null;
- BlockPos.MutableBlockPos var9 = new BlockPos.MutableBlockPos();
- double var10 = getFloorLevel(var9.set(var0, var1, var2));
- if (var10 - var4 > 1.125D)
- return null;
- BlockPathTypes var12 = getCachedBlockType(this.mob, var0, var1, var2);
- float var13 = this.mob.getPathfindingMalus(var12);
- double var14 = this.mob.getBbWidth() / 2.0D;
- if (var13 >= 0.0F) {
- var8 = getNode(var0, var1, var2);
- var8.type = var12;
- var8.costMalus = Math.max(var8.costMalus, var13);
- }
- if (var7 == BlockPathTypes.FENCE && var8 != null && var8.costMalus >= 0.0F && !canReachWithoutCollision(var8))
- var8 = null;
- if (var12 == BlockPathTypes.WALKABLE || (isAmphibious() && var12 == BlockPathTypes.WATER))
- return var8;
- if ((var8 == null || var8.costMalus < 0.0F) && var3 > 0 && var12 != BlockPathTypes.FENCE
- && var12 != BlockPathTypes.UNPASSABLE_RAIL && var12 != BlockPathTypes.TRAPDOOR
- && var12 != BlockPathTypes.POWDER_SNOW) {
- var8 = findAcceptedNode(var0, var1 + 1, var2, var3 - 1, var4, var6, var7);
- if (var8 != null && (var8.type == BlockPathTypes.OPEN || var8.type == BlockPathTypes.WALKABLE)
- && this.mob.getBbWidth() < 1.0F) {
- double var16 = (var0 - var6.getStepX()) + 0.5D;
- double var18 = (var2 - var6.getStepZ()) + 0.5D;
- AABB var20 = new AABB(var16 - var14,
- getFloorLevel(this.level, var9.set(var16, (var1 + 1), var18)) + 0.001D, var18 - var14,
- var16 + var14,
- this.mob.getBbHeight() + getFloorLevel(this.level, var9.set(var8.x, var8.y, var8.z)) - 0.002D,
- var18 + var14);
- if (hasCollisions(var20))
- var8 = null;
- }
- }
- if (!isAmphibious() && var12 == BlockPathTypes.WATER && !canFloat()) {
- if (getCachedBlockType(this.mob, var0, var1 - 1, var2) != BlockPathTypes.WATER)
- return var8;
- while (var1 > this.mob.level.getMinBuildHeight()) {
- var1--;
- var12 = getCachedBlockType(this.mob, var0, var1, var2);
- if (var12 == BlockPathTypes.WATER) {
- var8 = getNode(var0, var1, var2);
- var8.type = var12;
- var8.costMalus = Math.max(var8.costMalus, this.mob.getPathfindingMalus(var12));
- continue;
- }
- return var8;
- }
- }
- if (var12 == BlockPathTypes.OPEN) {
- int var16 = 0;
- int var17 = var1;
- while (var12 == BlockPathTypes.OPEN) {
- var1--;
- if (var1 < this.mob.level.getMinBuildHeight()) {
- Node var18 = getNode(var0, var17, var2);
- var18.type = BlockPathTypes.BLOCKED;
- var18.costMalus = -1.0F;
- return var18;
- }
- if (var16++ >= this.mob.getMaxFallDistance()) {
- Node var18 = getNode(var0, var1, var2);
- var18.type = BlockPathTypes.BLOCKED;
- var18.costMalus = -1.0F;
- return var18;
- }
- var12 = getCachedBlockType(this.mob, var0, var1, var2);
- var13 = this.mob.getPathfindingMalus(var12);
- if (var12 != BlockPathTypes.OPEN && var13 >= 0.0F) {
- var8 = getNode(var0, var1, var2);
- var8.type = var12;
- var8.costMalus = Math.max(var8.costMalus, var13);
- break;
- }
- if (var13 < 0.0F) {
- Node var18 = getNode(var0, var1, var2);
- var18.type = BlockPathTypes.BLOCKED;
- var18.costMalus = -1.0F;
- return var18;
- }
- }
- }
- if (var12 == BlockPathTypes.FENCE) {
- var8 = getNode(var0, var1, var2);
- var8.closed = true;
- var8.type = var12;
- var8.costMalus = var12.getMalus();
- }
- return var8;
- }
-
- @Override
- public BlockPathTypes getBlockPathType(BlockGetter var0, int var1, int var2, int var3) {
- return getBlockPathTypeStatic(var0, new BlockPos.MutableBlockPos(var1, var2, var3));
- }
-
- public BlockPathTypes getBlockPathType(BlockGetter var0, int var1, int var2, int var3, EntityHumanNPC var4,
- int var5, int var6, int var7, boolean var8, boolean var9) {
- EnumSet var10 = EnumSet.noneOf(BlockPathTypes.class);
- BlockPathTypes var11 = BlockPathTypes.BLOCKED;
- BlockPos var12 = var4.blockPosition();
- var11 = getBlockPathTypes(var0, var1, var2, var3, var5, var6, var7, var8, var9, var10, var11, var12);
- if (var10.contains(BlockPathTypes.FENCE))
- return BlockPathTypes.FENCE;
- if (var10.contains(BlockPathTypes.UNPASSABLE_RAIL))
- return BlockPathTypes.UNPASSABLE_RAIL;
- BlockPathTypes var13 = BlockPathTypes.BLOCKED;
- for (BlockPathTypes var15 : var10) {
- if (var4.getPathfindingMalus(var15) < 0.0F)
- return var15;
- if (var4.getPathfindingMalus(var15) >= var4.getPathfindingMalus(var13))
- var13 = var15;
- }
- if (var11 == BlockPathTypes.OPEN && var4.getPathfindingMalus(var13) == 0.0F && var5 <= 1)
- return BlockPathTypes.OPEN;
- return var13;
- }
-
- @Override
- public BlockPathTypes getBlockPathType(BlockGetter var0, int var1, int var2, int var3, Mob var4, int var5, int var6,
- int var7, boolean var8, boolean var9) {
- EnumSet var10 = EnumSet.noneOf(BlockPathTypes.class);
- BlockPathTypes var11 = BlockPathTypes.BLOCKED;
- BlockPos var12 = var4.blockPosition();
- var11 = getBlockPathTypes(var0, var1, var2, var3, var5, var6, var7, var8, var9, var10, var11, var12);
- if (var10.contains(BlockPathTypes.FENCE))
- return BlockPathTypes.FENCE;
- if (var10.contains(BlockPathTypes.UNPASSABLE_RAIL))
- return BlockPathTypes.UNPASSABLE_RAIL;
- BlockPathTypes var13 = BlockPathTypes.BLOCKED;
- for (BlockPathTypes var15 : var10) {
- if (var4.getPathfindingMalus(var15) < 0.0F)
- return var15;
- if (var4.getPathfindingMalus(var15) >= var4.getPathfindingMalus(var13))
- var13 = var15;
- }
- if (var11 == BlockPathTypes.OPEN && var4.getPathfindingMalus(var13) == 0.0F && var5 <= 1)
- return BlockPathTypes.OPEN;
- return var13;
- }
-
- private BlockPathTypes getBlockPathType(EntityHumanNPC var0, BlockPos var1) {
- return getCachedBlockType(var0, var1.getX(), var1.getY(), var1.getZ());
- }
-
- public BlockPathTypes getBlockPathTypee(BlockGetter var0, int var1, int var2, int var3, EntityHumanNPC var4,
- int var5, int var6, int var7, boolean var8, boolean var9) {
- EnumSet var10 = EnumSet.noneOf(BlockPathTypes.class);
- BlockPathTypes var11 = BlockPathTypes.BLOCKED;
- BlockPos var12 = var4.blockPosition();
- var11 = getBlockPathTypes(var0, var1, var2, var3, var5, var6, var7, var8, var9, var10, var11, var12);
- if (var10.contains(BlockPathTypes.FENCE))
- return BlockPathTypes.FENCE;
- if (var10.contains(BlockPathTypes.UNPASSABLE_RAIL))
- return BlockPathTypes.UNPASSABLE_RAIL;
- BlockPathTypes var13 = BlockPathTypes.BLOCKED;
- for (BlockPathTypes var15 : var10) {
- if (var4.getPathfindingMalus(var15) < 0.0F)
- return var15;
- if (var4.getPathfindingMalus(var15) >= var4.getPathfindingMalus(var13))
- var13 = var15;
- }
- if (var11 == BlockPathTypes.OPEN && var4.getPathfindingMalus(var13) == 0.0F && var5 <= 1)
- return BlockPathTypes.OPEN;
- return var13;
- }
-
- public BlockPathTypes getBlockPathTypes(BlockGetter var0, int var1, int var2, int var3, int var4, int var5,
- int var6, boolean var7, boolean var8, EnumSet var9, BlockPathTypes var10, BlockPos var11) {
- for (int var12 = 0; var12 < var4; var12++) {
- for (int var13 = 0; var13 < var5; var13++) {
- for (int var14 = 0; var14 < var6; var14++) {
- int var15 = var12 + var1;
- int var16 = var13 + var2;
- int var17 = var14 + var3;
- BlockPathTypes var18 = getBlockPathType(var0, var15, var16, var17);
- var18 = evaluateBlockPathType(var0, var7, var8, var11, var18);
- if (var12 == 0 && var13 == 0 && var14 == 0)
- var10 = var18;
- var9.add(var18);
- }
- }
- }
- return var10;
- }
-
- protected BlockPathTypes getCachedBlockType(EntityHumanNPC var0, int var1, int var2, int var3) {
- return this.l.computeIfAbsent(BlockPos.asLong(var1, var2, var3),
- var4 -> getBlockPathType(this.level, var1, var2, var3, var0, this.entityWidth, this.entityHeight,
- this.entityDepth, canOpenDoors(), canPassDoors()));
- }
-
- protected BlockPathTypes getCachedBlockType(Mob var0, int var1, int var2, int var3) {
- return this.l.computeIfAbsent(BlockPos.asLong(var1, var2, var3),
- var4 -> getBlockPathType(this.level, var1, var2, var3, var0, this.entityWidth, this.entityHeight,
- this.entityDepth, canOpenDoors(), canPassDoors()));
- }
-
- protected double getFloorLevel(BlockPos var0) {
- return getFloorLevel(this.level, var0);
- }
-
- @Override
- public Target getGoal(double var0, double var2, double var4) {
- return new Target(getNode(Mth.floor(var0), Mth.floor(var2), Mth.floor(var4)));
- }
-
- @Override
- public int getNeighbors(Node[] var0, Node var1) {
- int var2 = 0;
- int var3 = 0;
- BlockPathTypes var4 = getCachedBlockType(this.mob, var1.x, var1.y + 1, var1.z);
- BlockPathTypes var5 = getCachedBlockType(this.mob, var1.x, var1.y, var1.z);
- if (this.mob.getPathfindingMalus(var4) >= 0.0F && var5 != BlockPathTypes.STICKY_HONEY)
- var3 = Mth.floor(Math.max(1.0F, this.mob.maxUpStep));
- double var6 = getFloorLevel(new BlockPos(var1.x, var1.y, var1.z));
- Node var8 = findAcceptedNode(var1.x, var1.y, var1.z + 1, var3, var6, Direction.SOUTH, var5);
- if (isNeighborValid(var8, var1))
- var0[var2++] = var8;
- Node var9 = findAcceptedNode(var1.x - 1, var1.y, var1.z, var3, var6, Direction.WEST, var5);
- if (isNeighborValid(var9, var1))
- var0[var2++] = var9;
- Node var10 = findAcceptedNode(var1.x + 1, var1.y, var1.z, var3, var6, Direction.EAST, var5);
- if (isNeighborValid(var10, var1))
- var0[var2++] = var10;
- Node var11 = findAcceptedNode(var1.x, var1.y, var1.z - 1, var3, var6, Direction.NORTH, var5);
- if (isNeighborValid(var11, var1))
- var0[var2++] = var11;
- Node var12 = findAcceptedNode(var1.x - 1, var1.y, var1.z - 1, var3, var6, Direction.NORTH, var5);
- if (isDiagonalValid(var1, var9, var11, var12))
- var0[var2++] = var12;
- Node var13 = findAcceptedNode(var1.x + 1, var1.y, var1.z - 1, var3, var6, Direction.NORTH, var5);
- if (isDiagonalValid(var1, var10, var11, var13))
- var0[var2++] = var13;
- Node var14 = findAcceptedNode(var1.x - 1, var1.y, var1.z + 1, var3, var6, Direction.SOUTH, var5);
- if (isDiagonalValid(var1, var9, var8, var14))
- var0[var2++] = var14;
- Node var15 = findAcceptedNode(var1.x + 1, var1.y, var1.z + 1, var3, var6, Direction.SOUTH, var5);
- if (isDiagonalValid(var1, var10, var8, var15))
- var0[var2++] = var15;
- return var2;
- }
-
- @Override
- public Node getStart() {
- BlockPos.MutableBlockPos var1 = new BlockPos.MutableBlockPos();
- int var0 = this.mob.getBlockY();
- BlockState var2 = this.level.getBlockState(var1.set(this.mob.getX(), var0, this.mob.getZ()));
- if (this.mob.canStandOnFluid(var2.getFluidState())) {
- while (this.mob.canStandOnFluid(var2.getFluidState())) {
- var0++;
- var2 = this.level.getBlockState(var1.set(this.mob.getX(), var0, this.mob.getZ()));
- }
- var0--;
- } else if (canFloat() && this.mob.isInWater()) {
- while (var2.is(Blocks.WATER) || var2.getFluidState() == Fluids.WATER.getSource(false)) {
- var0++;
- var2 = this.level.getBlockState(var1.set(this.mob.getX(), var0, this.mob.getZ()));
- }
- var0--;
- } else if (this.mob.isOnGround()) {
- var0 = Mth.floor(this.mob.getY() + 0.5D);
- } else {
- BlockPos blockPos = this.mob.blockPosition();
- while ((this.level.getBlockState(blockPos).isAir() || this.level.getBlockState(blockPos)
- .isPathfindable(this.level, blockPos, PathComputationType.LAND))
- && blockPos.getY() > this.mob.level.getMinBuildHeight())
- blockPos = blockPos.below();
- var0 = blockPos.above().getY();
- }
- BlockPos var3 = this.mob.blockPosition();
- BlockPathTypes var4 = getCachedBlockType(this.mob, var3.getX(), var0, var3.getZ());
- if (this.mob.getPathfindingMalus(var4) < 0.0F) {
- AABB aABB = this.mob.getBoundingBox();
- if (hasPositiveMalus(var1.set(aABB.minX, var0, aABB.minZ))
- || hasPositiveMalus(var1.set(aABB.minX, var0, aABB.maxZ))
- || hasPositiveMalus(var1.set(aABB.maxX, var0, aABB.minZ))
- || hasPositiveMalus(var1.set(aABB.maxX, var0, aABB.maxZ))) {
- Node var6 = getNode(var1);
- var6.type = getBlockPathType(this.mob, var6.asBlockPos());
- var6.costMalus = this.mob.getPathfindingMalus(var6.type);
- return var6;
- }
- }
- Node var5 = getNode(var3.getX(), var0, var3.getZ());
- var5.type = getBlockPathType(this.mob, var5.asBlockPos());
- var5.costMalus = this.mob.getPathfindingMalus(var5.type);
- return var5;
- }
-
- private boolean hasCollisions(AABB var0) {
- return this.m.computeIfAbsent(var0, var1 -> !this.level.noCollision(this.mob, var0));
- }
-
- private boolean hasPositiveMalus(BlockPos var0) {
- BlockPathTypes var1 = getBlockPathType(this.mob, var0);
- return (this.mob.getPathfindingMalus(var1) >= 0.0F);
- }
-
- protected boolean isAmphibious() {
- return false;
- }
-
- protected boolean isDiagonalValid(Node var0, Node var1, Node var2, Node var3) {
- if (var3 == null || var2 == null || var1 == null || var3.closed)
- return false;
- if (var2.y > var0.y || var1.y > var0.y)
- return false;
- if (var1.type == BlockPathTypes.WALKABLE_DOOR || var2.type == BlockPathTypes.WALKABLE_DOOR
- || var3.type == BlockPathTypes.WALKABLE_DOOR)
- return false;
- boolean var4 = (var2.type == BlockPathTypes.FENCE && var1.type == BlockPathTypes.FENCE
- && this.mob.getBbWidth() < 0.5D);
- return (var3.costMalus >= 0.0F && (var2.y < var0.y || var2.costMalus >= 0.0F || var4)
- && (var1.y < var0.y || var1.costMalus >= 0.0F || var4));
- }
-
- protected boolean isNeighborValid(Node var0, Node var1) {
- return (var0 != null && !var0.closed && (var0.costMalus >= 0.0F || var1.costMalus < 0.0F));
- }
-
- @Override
- public void prepare(PathNavigationRegion var0, Mob var1) {
- super.prepare(var0, var1);
- this.oldWaterCost = var1.getPathfindingMalus(BlockPathTypes.WATER);
- }
-
- public static BlockPathTypes checkNeighbourBlocks(BlockGetter var0, BlockPos.MutableBlockPos var1,
- BlockPathTypes var2) {
- int var3 = var1.getX();
- int var4 = var1.getY();
- int var5 = var1.getZ();
- for (int var6 = -1; var6 <= 1; var6++) {
- for (int var7 = -1; var7 <= 1; var7++) {
- for (int var8 = -1; var8 <= 1; var8++) {
- if (var6 != 0 || var8 != 0) {
- var1.set(var3 + var6, var4 + var7, var5 + var8);
- BlockState var9 = var0.getBlockState(var1);
- if (var9.is(Blocks.CACTUS))
- return BlockPathTypes.DANGER_CACTUS;
- if (var9.is(Blocks.SWEET_BERRY_BUSH))
- return BlockPathTypes.DANGER_OTHER;
- if (isBurningBlock(var9))
- return BlockPathTypes.DANGER_FIRE;
- if (var0.getFluidState(var1).is(FluidTags.WATER))
- return BlockPathTypes.WATER_BORDER;
- }
- }
- }
- }
- return var2;
- }
-
- protected static BlockPathTypes getBlockPathTypeRaw(BlockGetter var0, BlockPos var1) {
- BlockState var2 = var0.getBlockState(var1);
- Block var3 = var2.getBlock();
- Material var4 = var2.getMaterial();
- if (var2.isAir())
- return BlockPathTypes.OPEN;
- if (var2.is(BlockTags.TRAPDOORS) || var2.is(Blocks.LILY_PAD) || var2.is(Blocks.BIG_DRIPLEAF))
- return BlockPathTypes.TRAPDOOR;
- if (var2.is(Blocks.POWDER_SNOW))
- return BlockPathTypes.POWDER_SNOW;
- if (var2.is(Blocks.CACTUS))
- return BlockPathTypes.DAMAGE_CACTUS;
- if (var2.is(Blocks.SWEET_BERRY_BUSH))
- return BlockPathTypes.DAMAGE_OTHER;
- if (var2.is(Blocks.HONEY_BLOCK))
- return BlockPathTypes.STICKY_HONEY;
- if (var2.is(Blocks.COCOA))
- return BlockPathTypes.COCOA;
- FluidState var5 = var0.getFluidState(var1);
- if (var5.is(FluidTags.LAVA))
- return BlockPathTypes.LAVA;
- if (isBurningBlock(var2))
- return BlockPathTypes.DAMAGE_FIRE;
- if (DoorBlock.isWoodenDoor(var2) && !((Boolean) var2.getValue((Property>) DoorBlock.OPEN)).booleanValue())
- return BlockPathTypes.DOOR_WOOD_CLOSED;
- if (var3 instanceof DoorBlock && var4 == Material.METAL
- && !((Boolean) var2.getValue((Property>) DoorBlock.OPEN)).booleanValue())
- return BlockPathTypes.DOOR_IRON_CLOSED;
- if (var3 instanceof DoorBlock && ((Boolean) var2.getValue((Property>) DoorBlock.OPEN)).booleanValue())
- return BlockPathTypes.DOOR_OPEN;
- if (var3 instanceof net.minecraft.world.level.block.BaseRailBlock)
- return BlockPathTypes.RAIL;
- if (var3 instanceof net.minecraft.world.level.block.LeavesBlock)
- return BlockPathTypes.LEAVES;
- if (var2.is(BlockTags.FENCES) || var2.is(BlockTags.WALLS) || (var3 instanceof FenceGateBlock
- && !((Boolean) var2.getValue((Property>) FenceGateBlock.OPEN)).booleanValue()))
- return BlockPathTypes.FENCE;
- if (!var2.isPathfindable(var0, var1, PathComputationType.LAND))
- return BlockPathTypes.BLOCKED;
- if (var5.is(FluidTags.WATER))
- return BlockPathTypes.WATER;
- return BlockPathTypes.OPEN;
- }
-
- public static BlockPathTypes getBlockPathTypeStatic(BlockGetter var0, BlockPos.MutableBlockPos var1) {
- int var2 = var1.getX();
- int var3 = var1.getY();
- int var4 = var1.getZ();
- BlockPathTypes var5 = getBlockPathTypeRaw(var0, var1);
- if (var5 == BlockPathTypes.OPEN && var3 >= var0.getMinBuildHeight() + 1) {
- BlockPathTypes var6 = getBlockPathTypeRaw(var0, var1.set(var2, var3 - 1, var4));
- var5 = (var6 == BlockPathTypes.WALKABLE || var6 == BlockPathTypes.OPEN || var6 == BlockPathTypes.WATER
- || var6 == BlockPathTypes.LAVA) ? BlockPathTypes.OPEN : BlockPathTypes.WALKABLE;
- if (var6 == BlockPathTypes.DAMAGE_FIRE)
- var5 = BlockPathTypes.DAMAGE_FIRE;
- if (var6 == BlockPathTypes.DAMAGE_CACTUS)
- var5 = BlockPathTypes.DAMAGE_CACTUS;
- if (var6 == BlockPathTypes.DAMAGE_OTHER)
- var5 = BlockPathTypes.DAMAGE_OTHER;
- if (var6 == BlockPathTypes.STICKY_HONEY)
- var5 = BlockPathTypes.STICKY_HONEY;
- }
- if (var5 == BlockPathTypes.WALKABLE)
- var5 = checkNeighbourBlocks(var0, var1.set(var2, var3, var4), var5);
- return var5;
- }
-
- public static double getFloorLevel(BlockGetter var0, BlockPos var1) {
- BlockPos var2 = var1.below();
- VoxelShape var3 = var0.getBlockState(var2).getCollisionShape(var0, var2);
- return var2.getY() + (var3.isEmpty() ? 0.0D : var3.max(Direction.Axis.Y));
- }
-
- public static boolean isBurningBlock(BlockState var0) {
- return (var0.is(BlockTags.FIRE) || var0.is(Blocks.LAVA) || var0.is(Blocks.MAGMA_BLOCK)
- || CampfireBlock.isLitCampfire(var0) || var0.is(Blocks.LAVA_CAULDRON));
- }
-}
diff --git a/v1_19_R2/pom.xml b/v1_19_R3/pom.xml
similarity index 92%
rename from v1_19_R2/pom.xml
rename to v1_19_R3/pom.xml
index e57b73f20..4705808da 100644
--- a/v1_19_R2/pom.xml
+++ b/v1_19_R3/pom.xml
@@ -4,12 +4,12 @@
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
+ 2.0.31-SNAPSHOT
- citizens-v1_19_R2
+ citizens-v1_19_R3
UTF-8
- 1.19.3-R0.1-SNAPSHOT
+ 1.19.4-R0.1-SNAPSHOT
@@ -30,13 +30,7 @@
${craftbukkit.version}
remapped-mojang
provided
-
-
- com.viaversion
- viaversion-api
- 4.5.1
- provided
-
+
clean package install
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/AllayController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/AllayController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/AllayController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/AllayController.java
index 8ea53c8de..ff9a70d41 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/AllayController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/AllayController.java
@@ -1,9 +1,9 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftAllay;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftAllay;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import com.google.common.collect.Lists;
@@ -11,9 +11,9 @@ import com.mojang.datafixers.util.Pair;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ArmorStandController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ArmorStandController.java
similarity index 92%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ArmorStandController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ArmorStandController.java
index 3c4f3a59a..e8a0077b1 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ArmorStandController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ArmorStandController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftArmorStand;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftArmorStand;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/AxolotlController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/AxolotlController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/AxolotlController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/AxolotlController.java
index 47df5821f..92728212a 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/AxolotlController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/AxolotlController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftAxolotl;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftAxolotl;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import com.mojang.serialization.Dynamic;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/BatController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/BatController.java
similarity index 93%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/BatController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/BatController.java
index 403d842c8..378f66dc9 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/BatController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/BatController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftBat;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftBat;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/BeeController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/BeeController.java
similarity index 93%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/BeeController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/BeeController.java
index 983bc2dce..b54651de4 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/BeeController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/BeeController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftBee;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftBee;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/BlazeController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/BlazeController.java
similarity index 93%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/BlazeController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/BlazeController.java
index d71d039a6..dcbd7e130 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/BlazeController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/BlazeController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftBlaze;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftBlaze;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CamelController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CamelController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CamelController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CamelController.java
index e23a6a4f0..a406f74e5 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CamelController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CamelController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftCamel;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftCamel;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.HorseModifiers;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CatController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CatController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CatController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CatController.java
index 6686318df..ae7a4512e 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CatController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CatController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftCat;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftCat;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CaveSpiderController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CaveSpiderController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CaveSpiderController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CaveSpiderController.java
index 5597a5ea4..5836ef449 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CaveSpiderController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CaveSpiderController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftCaveSpider;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftCaveSpider;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ChickenController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ChickenController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ChickenController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ChickenController.java
index 7b55b3b69..f16c1dd41 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ChickenController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ChickenController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftChicken;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftChicken;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CodController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CodController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CodController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CodController.java
index 750dac1e3..be47de44f 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CodController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CodController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftCod;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftCod;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
-import net.citizensnpcs.nms.v1_19_R2.util.PlayerMoveControl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.PlayerMoveControl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CowController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CowController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CowController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CowController.java
index b23dfe1f4..34154a5fa 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CowController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CowController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftCow;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftCow;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CreeperController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CreeperController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CreeperController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CreeperController.java
index d3f2590e8..3ce84ff5a 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/CreeperController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/CreeperController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftCreeper;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftCreeper;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/DolphinController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/DolphinController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/DolphinController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/DolphinController.java
index 900c27250..71212ab92 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/DolphinController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/DolphinController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftDolphin;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftDolphin;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/DrownedController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/DrownedController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/DrownedController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/DrownedController.java
index 6546d4628..8f9772886 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/DrownedController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/DrownedController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftDrowned;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftDrowned;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EnderDragonController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EnderDragonController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EnderDragonController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EnderDragonController.java
index 3d243ae36..2c1515a72 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EnderDragonController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EnderDragonController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEnderDragon;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEnderDragon;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EndermanController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EndermanController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EndermanController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EndermanController.java
index 8f98f6d46..0d4db524f 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EndermanController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EndermanController.java
@@ -1,18 +1,18 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import java.util.Optional;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEnderman;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEnderman;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EndermiteController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EndermiteController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EndermiteController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EndermiteController.java
index 2ae991583..e5bef88ab 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EndermiteController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EndermiteController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEndermite;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEndermite;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EntityHumanNPC.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java
similarity index 96%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EntityHumanNPC.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java
index 00fbdad1b..28526afe9 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EntityHumanNPC.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import java.io.IOException;
import java.lang.invoke.MethodHandle;
@@ -8,8 +8,8 @@ import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.metadata.MetadataValue;
@@ -24,20 +24,19 @@ import com.mojang.datafixers.util.Pair;
import net.citizensnpcs.Settings.Setting;
import net.citizensnpcs.api.CitizensAPI;
-
import net.citizensnpcs.api.event.NPCKnockbackEvent;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.npc.NPC.NPCUpdate;
import net.citizensnpcs.api.trait.trait.Inventory;
import net.citizensnpcs.api.util.SpigotUtil;
-import net.citizensnpcs.nms.v1_19_R2.network.EmptyNetHandler;
-import net.citizensnpcs.nms.v1_19_R2.network.EmptyNetworkManager;
-import net.citizensnpcs.nms.v1_19_R2.util.EmptyAdvancementDataPlayer;
-import net.citizensnpcs.nms.v1_19_R2.util.EmptyServerStatsCounter;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
-import net.citizensnpcs.nms.v1_19_R2.util.PlayerControllerJump;
-import net.citizensnpcs.nms.v1_19_R2.util.PlayerMoveControl;
-import net.citizensnpcs.nms.v1_19_R2.util.PlayerNavigation;
+import net.citizensnpcs.nms.v1_19_R3.network.EmptyNetHandler;
+import net.citizensnpcs.nms.v1_19_R3.network.EmptyNetworkManager;
+import net.citizensnpcs.nms.v1_19_R3.util.EmptyAdvancementDataPlayer;
+import net.citizensnpcs.nms.v1_19_R3.util.EmptyServerStatsCounter;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.PlayerControllerJump;
+import net.citizensnpcs.nms.v1_19_R3.util.PlayerMoveControl;
+import net.citizensnpcs.nms.v1_19_R3.util.PlayerNavigation;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.npc.skin.SkinPacketTracker;
@@ -108,7 +107,7 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable
}
public boolean canCutCorner(BlockPathTypes pathtype) {
- return (pathtype != BlockPathTypes.DANGER_FIRE && pathtype != BlockPathTypes.DANGER_CACTUS
+ return (pathtype != BlockPathTypes.DANGER_FIRE && pathtype != BlockPathTypes.DANGER_POWDER_SNOW
&& pathtype != BlockPathTypes.DANGER_OTHER && pathtype != BlockPathTypes.WALKABLE_DOOR);
}
@@ -144,8 +143,6 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable
}, 15); // give enough time for death and smoke animation
}
-
-
@Override
public void doTick() {
if (npc == null) {
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EvokerController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EvokerController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EvokerController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EvokerController.java
index a06f44140..228ad1c4e 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/EvokerController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EvokerController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEvoker;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEvoker;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/FoxController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/FoxController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/FoxController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/FoxController.java
index b5806720e..a4531b721 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/FoxController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/FoxController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftFox;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftFox;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/FrogController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/FrogController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/FrogController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/FrogController.java
index 99f524b10..19b72f31f 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/FrogController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/FrogController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftFrog;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftFrog;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GhastController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GhastController.java
similarity index 93%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GhastController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GhastController.java
index 8f8c7cd58..7a9c3f896 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GhastController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GhastController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftGhast;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftGhast;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GiantController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GiantController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GiantController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GiantController.java
index 886fff391..27c2c2823 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GiantController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GiantController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftGiant;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftGiant;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GlowSquidController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GlowSquidController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GlowSquidController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GlowSquidController.java
index 6e1817c2f..dfdfa6aa7 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GlowSquidController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GlowSquidController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftGlowSquid;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftGlowSquid;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GoatController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GoatController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GoatController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GoatController.java
index ff5266dcc..5feafc106 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GoatController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GoatController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftGoat;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftGoat;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GuardianController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GuardianController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GuardianController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GuardianController.java
index b381606fb..f78cb9514 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GuardianController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GuardianController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftGuardian;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftGuardian;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GuardianElderController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GuardianElderController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GuardianElderController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GuardianElderController.java
index b0bd8ad82..ca594ddfe 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/GuardianElderController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/GuardianElderController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftElderGuardian;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftElderGuardian;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HoglinController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HoglinController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HoglinController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HoglinController.java
index 8e68f0c48..daa7b7a27 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HoglinController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HoglinController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftHoglin;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftHoglin;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseController.java
index 22622db55..2cbd26f1d 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftHorse;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftHorse;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseDonkeyController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseDonkeyController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseDonkeyController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseDonkeyController.java
index 837d15e9f..d9b76f05b 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseDonkeyController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseDonkeyController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftDonkey;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftDonkey;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseMuleController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseMuleController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseMuleController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseMuleController.java
index 7a4a3b838..72d437918 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseMuleController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseMuleController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftMule;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftMule;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseSkeletonController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseSkeletonController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseSkeletonController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseSkeletonController.java
index 73a2e92de..56c2ef956 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseSkeletonController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseSkeletonController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftSkeletonHorse;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftSkeletonHorse;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseZombieController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseZombieController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseZombieController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseZombieController.java
index a07864bcb..c88100a9a 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HorseZombieController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HorseZombieController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftZombieHorse;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftZombieHorse;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HumanController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HumanController.java
similarity index 96%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HumanController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HumanController.java
index 5ffb8a432..f8ae20a0b 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/HumanController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HumanController.java
@@ -1,10 +1,10 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
+import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/IllusionerController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/IllusionerController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/IllusionerController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/IllusionerController.java
index 58a7338e0..a01d6c8d5 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/IllusionerController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/IllusionerController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftIllusioner;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftIllusioner;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/IronGolemController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/IronGolemController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/IronGolemController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/IronGolemController.java
index 9840bcf81..5663ec571 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/IronGolemController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/IronGolemController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftIronGolem;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftIronGolem;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/LlamaController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/LlamaController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/LlamaController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/LlamaController.java
index 5aa0d8c61..d62321201 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/LlamaController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/LlamaController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftLlama;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftLlama;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.HorseModifiers;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/MagmaCubeController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/MagmaCubeController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/MagmaCubeController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/MagmaCubeController.java
index 84c995b8d..36811c106 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/MagmaCubeController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/MagmaCubeController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftMagmaCube;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftMagmaCube;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
-import net.citizensnpcs.nms.v1_19_R2.util.PlayerMoveControl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.PlayerMoveControl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/MobEntityController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/MobEntityController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/MobEntityController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/MobEntityController.java
index 338c4da5e..74fe46507 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/MobEntityController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/MobEntityController.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import java.lang.reflect.Constructor;
import java.util.Map;
@@ -6,12 +6,12 @@ import java.util.WeakHashMap;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
-import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
+import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
import org.bukkit.entity.Entity;
import net.citizensnpcs.Settings.Setting;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.trait.ScoreboardTrait;
import net.minecraft.world.entity.EntityType;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/MushroomCowController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/MushroomCowController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/MushroomCowController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/MushroomCowController.java
index b6cab6cf4..266be4de2 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/MushroomCowController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/MushroomCowController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftMushroomCow;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftMushroomCow;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/OcelotController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/OcelotController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/OcelotController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/OcelotController.java
index ecd2fada4..0470e55c6 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/OcelotController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/OcelotController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftOcelot;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftOcelot;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PandaController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PandaController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PandaController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PandaController.java
index fc69d318e..f55e8139d 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PandaController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PandaController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPanda;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPanda;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ParrotController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ParrotController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ParrotController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ParrotController.java
index d22c822da..0d3596775 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ParrotController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ParrotController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftParrot;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftParrot;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PhantomController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PhantomController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PhantomController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PhantomController.java
index 0cd01b3bb..5c4a7e14c 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PhantomController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PhantomController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPhantom;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPhantom;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
-import net.citizensnpcs.nms.v1_19_R2.util.PlayerMoveControl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.PlayerMoveControl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PigController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PigController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PigController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PigController.java
index 92ce75308..7e864bc5a 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PigController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PigController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPig;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPig;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PigZombieController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PigZombieController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PigZombieController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PigZombieController.java
index 65906262f..db9efb1ca 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PigZombieController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PigZombieController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPigZombie;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPigZombie;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PiglinBruteController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PiglinBruteController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PiglinBruteController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PiglinBruteController.java
index 8aade1360..e41a11259 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PiglinBruteController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PiglinBruteController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPiglinBrute;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPiglinBrute;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PiglinController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PiglinController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PiglinController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PiglinController.java
index 327d8cde7..acc14eea8 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PiglinController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PiglinController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPiglin;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPiglin;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PillagerController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PillagerController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PillagerController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PillagerController.java
index a6e13a81a..5a6d7fe70 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PillagerController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PillagerController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPillager;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPillager;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PolarBearController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PolarBearController.java
similarity index 93%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PolarBearController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PolarBearController.java
index 5179e3ba6..f0681a672 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PolarBearController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PolarBearController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPolarBear;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPolarBear;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PufferFishController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PufferFishController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PufferFishController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PufferFishController.java
index 5026835aa..22ac5b168 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/PufferFishController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/PufferFishController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPufferFish;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPufferFish;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
-import net.citizensnpcs.nms.v1_19_R2.util.PlayerMoveControl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.PlayerMoveControl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.versioned.PufferFishTrait;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/RabbitController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/RabbitController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/RabbitController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/RabbitController.java
index 49a314780..3f95818eb 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/RabbitController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/RabbitController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftRabbit;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftRabbit;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/RavagerController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/RavagerController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/RavagerController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/RavagerController.java
index 34cab7905..5c93c760f 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/RavagerController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/RavagerController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftRavager;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftRavager;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SalmonController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SalmonController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SalmonController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SalmonController.java
index f1a775db7..20362fbe3 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SalmonController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SalmonController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftSalmon;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftSalmon;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
-import net.citizensnpcs.nms.v1_19_R2.util.PlayerMoveControl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.PlayerMoveControl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SheepController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SheepController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SheepController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SheepController.java
index 476be96f8..7ff5f1049 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SheepController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SheepController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftSheep;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftSheep;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ShulkerController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ShulkerController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ShulkerController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ShulkerController.java
index ec9290fa3..c2c2a418e 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ShulkerController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ShulkerController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftShulker;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftShulker;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SilverfishController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SilverfishController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SilverfishController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SilverfishController.java
index b2fd86bf9..dfca722ef 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SilverfishController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SilverfishController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftSilverfish;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftSilverfish;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SkeletonController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SkeletonController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SkeletonController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SkeletonController.java
index 11b863c6f..fd9decebf 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SkeletonController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SkeletonController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftSkeleton;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftSkeleton;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SkeletonStrayController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SkeletonStrayController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SkeletonStrayController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SkeletonStrayController.java
index 5674372fd..acea925f9 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SkeletonStrayController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SkeletonStrayController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftStray;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftStray;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SkeletonWitherController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SkeletonWitherController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SkeletonWitherController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SkeletonWitherController.java
index d7ca379a3..c6fafbbd7 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SkeletonWitherController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SkeletonWitherController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftWitherSkeleton;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftWitherSkeleton;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SlimeController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SlimeController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SlimeController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SlimeController.java
index 54864d68d..afa193f59 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SlimeController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SlimeController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftSlime;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftSlime;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
-import net.citizensnpcs.nms.v1_19_R2.util.PlayerMoveControl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.PlayerMoveControl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SnifferController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SnifferController.java
new file mode 100644
index 000000000..533454779
--- /dev/null
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SnifferController.java
@@ -0,0 +1,236 @@
+package net.citizensnpcs.nms.v1_19_R3.entity;
+
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftSniffer;
+import org.bukkit.util.Vector;
+
+import net.citizensnpcs.api.npc.NPC;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.npc.CitizensNPC;
+import net.citizensnpcs.npc.ai.NPCHolder;
+import net.citizensnpcs.util.NMS;
+import net.citizensnpcs.util.Util;
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.PositionImpl;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.network.syncher.EntityDataAccessor;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.sounds.SoundEvent;
+import net.minecraft.tags.TagKey;
+import net.minecraft.world.InteractionHand;
+import net.minecraft.world.InteractionResult;
+import net.minecraft.world.damagesource.DamageSource;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.animal.sniffer.Sniffer;
+import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.entity.vehicle.AbstractMinecart;
+import net.minecraft.world.entity.vehicle.Boat;
+import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.item.Items;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraft.world.level.material.Fluid;
+import net.minecraft.world.phys.AABB;
+import net.minecraft.world.phys.Vec3;
+
+public class SnifferController extends MobEntityController {
+ public SnifferController() {
+ super(EntitySnifferNPC.class);
+ }
+
+ @Override
+ public org.bukkit.entity.Sniffer getBukkitEntity() {
+ return (org.bukkit.entity.Sniffer) super.getBukkitEntity();
+ }
+
+ public static class EntitySnifferNPC extends Sniffer implements NPCHolder {
+ private final CitizensNPC npc;
+
+ public EntitySnifferNPC(EntityType extends Sniffer> types, Level level) {
+ this(types, level, null);
+ }
+
+ public EntitySnifferNPC(EntityType extends Sniffer> types, Level level, NPC npc) {
+ super(types, level);
+ this.npc = (CitizensNPC) npc;
+ }
+
+ @Override
+ protected boolean canRide(Entity entity) {
+ if (npc != null && (entity instanceof Boat || entity instanceof AbstractMinecart)) {
+ return !npc.isProtected();
+ }
+ return super.canRide(entity);
+ }
+
+ @Override
+ public boolean causeFallDamage(float f, float f1, DamageSource damagesource) {
+ if (npc == null || !npc.isFlyable()) {
+ return super.causeFallDamage(f, f1, damagesource);
+ }
+ return false;
+ }
+
+ @Override
+ public void checkDespawn() {
+ if (npc == null) {
+ super.checkDespawn();
+ }
+ }
+
+ @Override
+ protected void checkFallDamage(double d0, boolean flag, BlockState iblockdata, BlockPos blockposition) {
+ if (npc == null || !npc.isFlyable()) {
+ super.checkFallDamage(d0, flag, iblockdata, blockposition);
+ }
+ }
+
+ @Override
+ public void customServerAiStep() {
+ super.customServerAiStep();
+ if (npc != null) {
+ NMSImpl.updateMinecraftAIState(npc, this);
+ npc.update();
+ }
+ }
+
+ @Override
+ protected SoundEvent getAmbientSound() {
+ return NMSImpl.getSoundEffect(npc, super.getAmbientSound(), NPC.Metadata.AMBIENT_SOUND);
+ }
+
+ @Override
+ public CraftEntity getBukkitEntity() {
+ if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) {
+ NMSImpl.setBukkitEntity(this, new SnifferNPC(this));
+ }
+ return super.getBukkitEntity();
+ }
+
+ @Override
+ protected SoundEvent getDeathSound() {
+ return NMSImpl.getSoundEffect(npc, super.getDeathSound(), NPC.Metadata.DEATH_SOUND);
+ }
+
+ @Override
+ protected SoundEvent getHurtSound(DamageSource damagesource) {
+ return NMSImpl.getSoundEffect(npc, super.getHurtSound(damagesource), NPC.Metadata.HURT_SOUND);
+ }
+
+ @Override
+ public int getMaxFallDistance() {
+ return NMS.getFallDistance(npc, super.getMaxFallDistance());
+ }
+
+ @Override
+ public NPC getNPC() {
+ return npc;
+ }
+
+ @Override
+ public boolean isLeashed() {
+ return NMSImpl.isLeashed(npc, super::isLeashed, this);
+ }
+
+ @Override
+ public boolean isPushable() {
+ return npc == null ? super.isPushable()
+ : npc.data(). get(NPC.Metadata.COLLIDABLE, !npc.isProtected());
+ }
+
+ @Override
+ public void knockback(double strength, double dx, double dz) {
+ NMS.callKnockbackEvent(npc, (float) strength, dx, dz, (evt) -> super.knockback((float) evt.getStrength(),
+ evt.getKnockbackVector().getX(), evt.getKnockbackVector().getZ()));
+ }
+
+ @Override
+ protected AABB makeBoundingBox() {
+ return NMSBoundingBox.makeBB(npc, super.makeBoundingBox());
+ }
+
+ @Override
+ public InteractionResult mobInteract(Player entityhuman, InteractionHand enumhand) {
+ if (npc == null || !npc.isProtected())
+ return super.mobInteract(entityhuman, enumhand);
+ ItemStack itemstack = entityhuman.getItemInHand(enumhand);
+ if (itemstack.getItem() == Items.BUCKET && !entityhuman.getAbilities().instabuild && !this.isBaby()) {
+ return InteractionResult.FAIL;
+ }
+ return super.mobInteract(entityhuman, enumhand);
+ }
+
+ @Override
+ public boolean onClimbable() {
+ if (npc == null || !npc.isFlyable()) {
+ return super.onClimbable();
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public void onSyncedDataUpdated(EntityDataAccessor> datawatcherobject) {
+ if (npc == null) {
+ super.onSyncedDataUpdated(datawatcherobject);
+ return;
+ }
+ NMSImpl.checkAndUpdateHeight(this, datawatcherobject, super::onSyncedDataUpdated);
+ }
+
+ @Override
+ public void push(double x, double y, double z) {
+ Vector vector = Util.callPushEvent(npc, x, y, z);
+ if (vector != null) {
+ super.push(vector.getX(), vector.getY(), vector.getZ());
+ }
+ }
+
+ @Override
+ public void push(Entity entity) {
+ // this method is called by both the entities involved - cancelling
+ // it will not stop the NPC from moving.
+ super.push(entity);
+ if (npc != null) {
+ Util.callCollisionEvent(npc, entity.getBukkitEntity());
+ }
+ }
+
+ @Override
+ public boolean save(CompoundTag save) {
+ return npc == null ? super.save(save) : false;
+ }
+
+ @Override
+ public Entity teleportTo(ServerLevel worldserver, PositionImpl location) {
+ if (npc == null)
+ return super.teleportTo(worldserver, location);
+ return NMSImpl.teleportAcrossWorld(this, worldserver, location);
+ }
+
+ @Override
+ public void travel(Vec3 vec3d) {
+ if (npc == null || !npc.isFlyable()) {
+ super.travel(vec3d);
+ } else {
+ NMSImpl.flyingMoveLogic(this, vec3d);
+ }
+ }
+
+ @Override
+ public boolean updateFluidHeightAndDoFluidPushing(TagKey tagkey, double d0) {
+ return NMSImpl.fluidPush(npc, this, () -> super.updateFluidHeightAndDoFluidPushing(tagkey, d0));
+ }
+ }
+
+ public static class SnifferNPC extends CraftSniffer implements ForwardingNPCHolder {
+ public SnifferNPC(EntitySnifferNPC entity) {
+ super((CraftServer) Bukkit.getServer(), entity);
+ }
+ }
+}
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SnowmanController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SnowmanController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SnowmanController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SnowmanController.java
index 4cd8575f2..55551bf64 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SnowmanController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SnowmanController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftSnowman;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftSnowman;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SpiderController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SpiderController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SpiderController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SpiderController.java
index eac71958b..a29c476da 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SpiderController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SpiderController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftSpider;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftSpider;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SquidController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SquidController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SquidController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SquidController.java
index af567c44a..ba5b5a711 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/SquidController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/SquidController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftSquid;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftSquid;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/StriderController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/StriderController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/StriderController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/StriderController.java
index 849412bf3..08e47f6b4 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/StriderController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/StriderController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftStrider;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftStrider;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/TadpoleController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/TadpoleController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/TadpoleController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/TadpoleController.java
index a35e0e0d6..995359bdd 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/TadpoleController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/TadpoleController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftTadpole;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftTadpole;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
-import net.citizensnpcs.nms.v1_19_R2.util.PlayerMoveControl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.PlayerMoveControl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/TraderLlamaController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/TraderLlamaController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/TraderLlamaController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/TraderLlamaController.java
index cbf3e5a66..29d7a5f64 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/TraderLlamaController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/TraderLlamaController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftTraderLlama;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftTraderLlama;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.HorseModifiers;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/TropicalFishController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/TropicalFishController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/TropicalFishController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/TropicalFishController.java
index 7114e2da5..6ca120e67 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/TropicalFishController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/TropicalFishController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftTropicalFish;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftTropicalFish;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
-import net.citizensnpcs.nms.v1_19_R2.util.PlayerMoveControl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.PlayerMoveControl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/TurtleController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/TurtleController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/TurtleController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/TurtleController.java
index 45d95603e..d24062e96 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/TurtleController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/TurtleController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftTurtle;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftTurtle;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
-import net.citizensnpcs.nms.v1_19_R2.util.PlayerMoveControl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.PlayerMoveControl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/VexController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/VexController.java
similarity index 93%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/VexController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/VexController.java
index ac55a8632..5f364c9db 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/VexController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/VexController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftVex;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftVex;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/VillagerController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/VillagerController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/VillagerController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/VillagerController.java
index 3474023b6..5db8e6851 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/VillagerController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/VillagerController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftVillager;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftVillager;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/VindicatorController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/VindicatorController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/VindicatorController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/VindicatorController.java
index 98449618c..cbc769b52 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/VindicatorController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/VindicatorController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftVindicator;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftVindicator;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WanderingTraderController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WanderingTraderController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WanderingTraderController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WanderingTraderController.java
index 7325ca003..edf0d6c71 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WanderingTraderController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WanderingTraderController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftWanderingTrader;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftWanderingTrader;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WardenController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WardenController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WardenController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WardenController.java
index 81b82f4be..f53db69b0 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WardenController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WardenController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftWarden;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftWarden;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WitchController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WitchController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WitchController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WitchController.java
index d7c622e79..c355189f4 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WitchController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WitchController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftWitch;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftWitch;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WitherController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WitherController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WitherController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WitherController.java
index 82b2c58c3..dcc506a77 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WitherController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WitherController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftWither;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftWither;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WolfController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WolfController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WolfController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WolfController.java
index bbf516265..e809812dd 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/WolfController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/WolfController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftWolf;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftWolf;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ZoglinController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ZoglinController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ZoglinController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ZoglinController.java
index 882f46285..dde99c8b3 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ZoglinController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ZoglinController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftZoglin;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftZoglin;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ZombieController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ZombieController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ZombieController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ZombieController.java
index d2a8be59b..348bad320 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ZombieController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ZombieController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftZombie;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftZombie;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ZombieHuskController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ZombieHuskController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ZombieHuskController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ZombieHuskController.java
index d0dabb23b..abddaf495 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ZombieHuskController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ZombieHuskController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftHusk;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftHusk;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ZombieVillagerController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ZombieVillagerController.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ZombieVillagerController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ZombieVillagerController.java
index ead4915ea..ebb7bbde2 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/ZombieVillagerController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/ZombieVillagerController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_19_R2.entity;
+package net.citizensnpcs.nms.v1_19_R3.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftVillagerZombie;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftVillagerZombie;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/AreaEffectCloudController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/AreaEffectCloudController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/AreaEffectCloudController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/AreaEffectCloudController.java
index 0427f6ebb..f3479c73e 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/AreaEffectCloudController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/AreaEffectCloudController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftAreaEffectCloud;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftAreaEffectCloud;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/BlockDisplayController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/BlockDisplayController.java
new file mode 100644
index 000000000..10b8dd221
--- /dev/null
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/BlockDisplayController.java
@@ -0,0 +1,124 @@
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
+
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftBlockDisplay;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.util.Vector;
+
+import net.citizensnpcs.api.npc.NPC;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.npc.CitizensNPC;
+import net.citizensnpcs.npc.ai.NPCHolder;
+import net.citizensnpcs.util.Util;
+import net.minecraft.core.PositionImpl;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.tags.TagKey;
+import net.minecraft.world.entity.Display.BlockDisplay;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.material.Fluid;
+import net.minecraft.world.phys.AABB;
+
+public class BlockDisplayController extends MobEntityController {
+ public BlockDisplayController() {
+ super(EntityBlockDisplayNPC.class);
+ }
+
+ @Override
+ public org.bukkit.entity.BlockDisplay getBukkitEntity() {
+ return (org.bukkit.entity.BlockDisplay) super.getBukkitEntity();
+ }
+
+ public static class BlockDisplayNPC extends CraftBlockDisplay implements ForwardingNPCHolder {
+ public BlockDisplayNPC(EntityBlockDisplayNPC entity) {
+ super((CraftServer) Bukkit.getServer(), entity);
+ }
+ }
+
+ public static class EntityBlockDisplayNPC extends BlockDisplay implements NPCHolder {
+ private final CitizensNPC npc;
+
+ public EntityBlockDisplayNPC(EntityType extends BlockDisplay> types, Level level) {
+ this(types, level, null);
+ }
+
+ public EntityBlockDisplayNPC(EntityType extends BlockDisplay> types, Level level, NPC npc) {
+ super(types, level);
+ this.npc = (CitizensNPC) npc;
+ }
+
+ @Override
+ public CraftEntity getBukkitEntity() {
+ if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) {
+ NMSImpl.setBukkitEntity(this, new BlockDisplayNPC(this));
+ }
+ return super.getBukkitEntity();
+ }
+
+ @Override
+ public NPC getNPC() {
+ return npc;
+ }
+
+ @Override
+ public boolean isPushable() {
+ return npc == null ? super.isPushable()
+ : npc.data(). get(NPC.Metadata.COLLIDABLE, !npc.isProtected());
+ }
+
+ @Override
+ protected AABB makeBoundingBox() {
+ return NMSBoundingBox.makeBB(npc, super.makeBoundingBox());
+ }
+
+ @Override
+ public void push(double x, double y, double z) {
+ Vector vector = Util.callPushEvent(npc, x, y, z);
+ if (vector != null) {
+ super.push(vector.getX(), vector.getY(), vector.getZ());
+ }
+ }
+
+ @Override
+ public void push(Entity entity) {
+ // this method is called by both the entities involved - cancelling
+ // it will not stop the NPC from moving.
+ super.push(entity);
+ if (npc != null) {
+ Util.callCollisionEvent(npc, entity.getBukkitEntity());
+ }
+ }
+
+ @Override
+ public boolean save(CompoundTag save) {
+ return npc == null ? super.save(save) : false;
+ }
+
+ @Override
+ public Entity teleportTo(ServerLevel worldserver, PositionImpl location) {
+ if (npc == null)
+ return super.teleportTo(worldserver, location);
+ return NMSImpl.teleportAcrossWorld(this, worldserver, location);
+ }
+
+ @Override
+ public void tick() {
+ if (npc != null) {
+ npc.update();
+ } else {
+ super.tick();
+ }
+ }
+
+ @Override
+ public boolean updateFluidHeightAndDoFluidPushing(TagKey tagkey, double d0) {
+ return NMSImpl.fluidPush(npc, this, () -> super.updateFluidHeightAndDoFluidPushing(tagkey, d0));
+ }
+ }
+}
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/BoatController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/BoatController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/BoatController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/BoatController.java
index e2ebc20ed..f68f74dbe 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/BoatController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/BoatController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftBoat;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftBoat;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ChestBoatController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ChestBoatController.java
similarity index 95%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ChestBoatController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ChestBoatController.java
index 4e0e27f08..7db0d712f 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ChestBoatController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ChestBoatController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftChestBoat;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftChestBoat;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/DragonFireballController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/DragonFireballController.java
similarity index 90%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/DragonFireballController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/DragonFireballController.java
index 840548dd4..be213fd80 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/DragonFireballController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/DragonFireballController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftDragonFireball;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftDragonFireball;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EggController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EggController.java
similarity index 90%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EggController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EggController.java
index 960bcf7bb..39a750135 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EggController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EggController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEgg;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEgg;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EnderCrystalController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EnderCrystalController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EnderCrystalController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EnderCrystalController.java
index 8c8424e03..c5e644dcc 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EnderCrystalController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EnderCrystalController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEnderCrystal;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEnderCrystal;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EnderPearlController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EnderPearlController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EnderPearlController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EnderPearlController.java
index d629ab16e..34ea023c9 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EnderPearlController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EnderPearlController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEnderPearl;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEnderPearl;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.entity.EnderPearl;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EnderSignalController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EnderSignalController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EnderSignalController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EnderSignalController.java
index d4ec3971f..19e29d8e2 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EnderSignalController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EnderSignalController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEnderSignal;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEnderSignal;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.entity.EnderSignal;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EvokerFangsController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EvokerFangsController.java
similarity index 90%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EvokerFangsController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EvokerFangsController.java
index 8d6e548a6..7bd9e7693 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/EvokerFangsController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/EvokerFangsController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEvokerFangs;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEvokerFangs;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ExperienceOrbController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ExperienceOrbController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ExperienceOrbController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ExperienceOrbController.java
index c7c6d71f1..a7ff2813e 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ExperienceOrbController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ExperienceOrbController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftExperienceOrb;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftExperienceOrb;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/FallingBlockController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/FallingBlockController.java
similarity index 92%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/FallingBlockController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/FallingBlockController.java
index f741a2f6e..e69bde449 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/FallingBlockController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/FallingBlockController.java
@@ -1,18 +1,18 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftFallingBlock;
-import org.bukkit.craftbukkit.v1_19_R2.util.CraftMagicNumbers;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftFallingBlock;
+import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers;
import org.bukkit.entity.FallingBlock;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/FireworkController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/FireworkController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/FireworkController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/FireworkController.java
index 55b6213b5..b61a9222f 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/FireworkController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/FireworkController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftFirework;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftFirework;
import org.bukkit.entity.Firework;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/FishingHookController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/FishingHookController.java
similarity index 91%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/FishingHookController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/FishingHookController.java
index 9f97a4fe2..08e978edb 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/FishingHookController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/FishingHookController.java
@@ -1,21 +1,21 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import java.util.UUID;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftFishHook;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftFishHook;
import org.bukkit.entity.FishHook;
import org.bukkit.util.Vector;
import com.mojang.authlib.GameProfile;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/GlowItemFrameController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/GlowItemFrameController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/GlowItemFrameController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/GlowItemFrameController.java
index 27b39b12b..4979c8284 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/GlowItemFrameController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/GlowItemFrameController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftGlowItemFrame;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftGlowItemFrame;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.ItemFrameController.EntityItemFrameNPC;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.ItemFrameController.EntityItemFrameNPC;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
@@ -38,7 +38,7 @@ public class GlowItemFrameController extends MobEntityController {
org.bukkit.entity.Entity e = super.createEntity(at, npc);
GlowItemFrame item = (GlowItemFrame) ((CraftEntity) e).getHandle();
item.setDirection(Direction.EAST);
- item.pos = new BlockPos(at.getX(), at.getY(), at.getZ());
+ item.pos = new BlockPos(at.getBlockX(), at.getBlockY(), at.getBlockZ());
return e;
}
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ItemController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ItemController.java
similarity index 91%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ItemController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ItemController.java
index 40db0fac8..00d2c6121 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ItemController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ItemController.java
@@ -1,18 +1,18 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftItem;
-import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftItem;
+import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
import org.bukkit.entity.Item;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ItemDisplayController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ItemDisplayController.java
new file mode 100644
index 000000000..e7764343d
--- /dev/null
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ItemDisplayController.java
@@ -0,0 +1,124 @@
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
+
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftItemDisplay;
+import org.bukkit.util.Vector;
+
+import net.citizensnpcs.api.npc.NPC;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.npc.CitizensNPC;
+import net.citizensnpcs.npc.ai.NPCHolder;
+import net.citizensnpcs.util.Util;
+import net.minecraft.core.PositionImpl;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.tags.TagKey;
+import net.minecraft.world.entity.Display.ItemDisplay;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.material.Fluid;
+import net.minecraft.world.phys.AABB;
+
+public class ItemDisplayController extends MobEntityController {
+ public ItemDisplayController() {
+ super(EntityItemDisplayNPC.class);
+ }
+
+ @Override
+ public org.bukkit.entity.ItemDisplay getBukkitEntity() {
+ return (org.bukkit.entity.ItemDisplay) super.getBukkitEntity();
+ }
+
+ public static class EntityItemDisplayNPC extends ItemDisplay implements NPCHolder {
+ private final CitizensNPC npc;
+
+ public EntityItemDisplayNPC(EntityType extends ItemDisplay> types, Level level) {
+ this(types, level, null);
+ }
+
+ public EntityItemDisplayNPC(EntityType extends ItemDisplay> types, Level level, NPC npc) {
+ super(types, level);
+ this.npc = (CitizensNPC) npc;
+ }
+
+ @Override
+ public CraftEntity getBukkitEntity() {
+ if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) {
+ NMSImpl.setBukkitEntity(this, new ItemDisplayNPC(this));
+ }
+ return super.getBukkitEntity();
+ }
+
+ @Override
+ public NPC getNPC() {
+ return npc;
+ }
+
+ @Override
+ public boolean isPushable() {
+ return npc == null ? super.isPushable()
+ : npc.data(). get(NPC.Metadata.COLLIDABLE, !npc.isProtected());
+ }
+
+ @Override
+ protected AABB makeBoundingBox() {
+ return NMSBoundingBox.makeBB(npc, super.makeBoundingBox());
+ }
+
+ @Override
+ public void push(double x, double y, double z) {
+ Vector vector = Util.callPushEvent(npc, x, y, z);
+ if (vector != null) {
+ super.push(vector.getX(), vector.getY(), vector.getZ());
+ }
+ }
+
+ @Override
+ public void push(Entity entity) {
+ // this method is called by both the entities involved - cancelling
+ // it will not stop the NPC from moving.
+ super.push(entity);
+ if (npc != null) {
+ Util.callCollisionEvent(npc, entity.getBukkitEntity());
+ }
+ }
+
+ @Override
+ public boolean save(CompoundTag save) {
+ return npc == null ? super.save(save) : false;
+ }
+
+ @Override
+ public Entity teleportTo(ServerLevel worldserver, PositionImpl location) {
+ if (npc == null)
+ return super.teleportTo(worldserver, location);
+ return NMSImpl.teleportAcrossWorld(this, worldserver, location);
+ }
+
+ @Override
+ public void tick() {
+ if (npc != null) {
+ npc.update();
+ } else {
+ super.tick();
+ }
+ }
+
+ @Override
+ public boolean updateFluidHeightAndDoFluidPushing(TagKey tagkey, double d0) {
+ return NMSImpl.fluidPush(npc, this, () -> super.updateFluidHeightAndDoFluidPushing(tagkey, d0));
+ }
+ }
+
+ public static class ItemDisplayNPC extends CraftItemDisplay implements ForwardingNPCHolder {
+ public ItemDisplayNPC(EntityItemDisplayNPC entity) {
+ super((CraftServer) Bukkit.getServer(), entity);
+ }
+ }
+}
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ItemFrameController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ItemFrameController.java
similarity index 90%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ItemFrameController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ItemFrameController.java
index 4069351f4..f0ee60a59 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ItemFrameController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ItemFrameController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftItemFrame;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftItemFrame;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
@@ -37,7 +37,7 @@ public class ItemFrameController extends MobEntityController {
org.bukkit.entity.Entity e = super.createEntity(at, npc);
ItemFrame item = (ItemFrame) ((CraftEntity) e).getHandle();
item.setDirection(Direction.EAST);
- item.pos = new BlockPos(at.getX(), at.getY(), at.getZ());
+ item.pos = new BlockPos(at.getBlockX(), at.getBlockY(), at.getBlockZ());
return e;
}
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/LargeFireballController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/LargeFireballController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/LargeFireballController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/LargeFireballController.java
index 76ab8929c..67cb78d74 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/LargeFireballController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/LargeFireballController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftLargeFireball;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftLargeFireball;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/LeashController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/LeashController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/LeashController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/LeashController.java
index cacf71b81..37d9b790c 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/LeashController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/LeashController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftLeash;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftLeash;
import org.bukkit.entity.LeashHitch;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/LlamaSpitController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/LlamaSpitController.java
similarity index 91%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/LlamaSpitController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/LlamaSpitController.java
index 015f2e0d2..a65442c43 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/LlamaSpitController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/LlamaSpitController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftLlamaSpit;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftLlamaSpit;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MarkerController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MarkerController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MarkerController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MarkerController.java
index 2564ea6fc..185ca07de 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MarkerController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MarkerController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftMarker;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftMarker;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartChestController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartChestController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartChestController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartChestController.java
index db0ca2898..f65b947e4 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartChestController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartChestController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftMinecartChest;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftMinecartChest;
import org.bukkit.entity.Minecart;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartCommandController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartCommandController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartCommandController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartCommandController.java
index b9466a2f4..25ad84b22 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartCommandController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartCommandController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftMinecartCommand;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftMinecartCommand;
import org.bukkit.entity.Minecart;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartFurnaceController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartFurnaceController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartFurnaceController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartFurnaceController.java
index 6fa2b9751..900f24ba1 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartFurnaceController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartFurnaceController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftMinecartFurnace;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftMinecartFurnace;
import org.bukkit.entity.Minecart;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartHopperController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartHopperController.java
similarity index 93%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartHopperController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartHopperController.java
index faea8d6c4..5d6322276 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartHopperController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartHopperController.java
@@ -1,12 +1,12 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.entity.Minecart;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartRideableController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartRideableController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartRideableController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartRideableController.java
index 29eeac73c..f04c9d8aa 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartRideableController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartRideableController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftMinecartRideable;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftMinecartRideable;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartSpawnerController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartSpawnerController.java
similarity index 93%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartSpawnerController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartSpawnerController.java
index e174936ce..6a80bc064 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartSpawnerController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartSpawnerController.java
@@ -1,12 +1,12 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.entity.Minecart;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartTNTController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartTNTController.java
similarity index 93%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartTNTController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartTNTController.java
index b502268d6..5142cf5a6 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/MinecartTNTController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/MinecartTNTController.java
@@ -1,12 +1,12 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.entity.Minecart;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/PaintingController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/PaintingController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/PaintingController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/PaintingController.java
index 9fc5347ad..9fd9c60c7 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/PaintingController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/PaintingController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPainting;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPainting;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ShulkerBulletController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ShulkerBulletController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ShulkerBulletController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ShulkerBulletController.java
index 5364de60c..f6e90bf8d 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ShulkerBulletController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ShulkerBulletController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftShulkerBullet;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftShulkerBullet;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/SmallFireballController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/SmallFireballController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/SmallFireballController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/SmallFireballController.java
index 1f001f88d..aa8cded7a 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/SmallFireballController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/SmallFireballController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftSmallFireball;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftSmallFireball;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/SnowballController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/SnowballController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/SnowballController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/SnowballController.java
index 3c111058e..d0ca2786a 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/SnowballController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/SnowballController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftSnowball;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftSnowball;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/SpectralArrowController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/SpectralArrowController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/SpectralArrowController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/SpectralArrowController.java
index 801cff038..fc3908782 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/SpectralArrowController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/SpectralArrowController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftArrow;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftArrow;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.entity.Arrow;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/TNTPrimedController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/TNTPrimedController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/TNTPrimedController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/TNTPrimedController.java
index 73f8cb5aa..7bb3fc166 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/TNTPrimedController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/TNTPrimedController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftTNTPrimed;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftTNTPrimed;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/TextDisplayController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/TextDisplayController.java
new file mode 100644
index 000000000..09dfc7578
--- /dev/null
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/TextDisplayController.java
@@ -0,0 +1,124 @@
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
+
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftTextDisplay;
+import org.bukkit.util.Vector;
+
+import net.citizensnpcs.api.npc.NPC;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
+import net.citizensnpcs.npc.CitizensNPC;
+import net.citizensnpcs.npc.ai.NPCHolder;
+import net.citizensnpcs.util.Util;
+import net.minecraft.core.PositionImpl;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.tags.TagKey;
+import net.minecraft.world.entity.Display.TextDisplay;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.material.Fluid;
+import net.minecraft.world.phys.AABB;
+
+public class TextDisplayController extends MobEntityController {
+ public TextDisplayController() {
+ super(EntityTextDisplayNPC.class);
+ }
+
+ @Override
+ public org.bukkit.entity.TextDisplay getBukkitEntity() {
+ return (org.bukkit.entity.TextDisplay) super.getBukkitEntity();
+ }
+
+ public static class EntityTextDisplayNPC extends TextDisplay implements NPCHolder {
+ private final CitizensNPC npc;
+
+ public EntityTextDisplayNPC(EntityType extends TextDisplay> types, Level level) {
+ this(types, level, null);
+ }
+
+ public EntityTextDisplayNPC(EntityType extends TextDisplay> types, Level level, NPC npc) {
+ super(types, level);
+ this.npc = (CitizensNPC) npc;
+ }
+
+ @Override
+ public CraftEntity getBukkitEntity() {
+ if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) {
+ NMSImpl.setBukkitEntity(this, new TextDisplayNPC(this));
+ }
+ return super.getBukkitEntity();
+ }
+
+ @Override
+ public NPC getNPC() {
+ return npc;
+ }
+
+ @Override
+ public boolean isPushable() {
+ return npc == null ? super.isPushable()
+ : npc.data(). get(NPC.Metadata.COLLIDABLE, !npc.isProtected());
+ }
+
+ @Override
+ protected AABB makeBoundingBox() {
+ return NMSBoundingBox.makeBB(npc, super.makeBoundingBox());
+ }
+
+ @Override
+ public void push(double x, double y, double z) {
+ Vector vector = Util.callPushEvent(npc, x, y, z);
+ if (vector != null) {
+ super.push(vector.getX(), vector.getY(), vector.getZ());
+ }
+ }
+
+ @Override
+ public void push(Entity entity) {
+ // this method is called by both the entities involved - cancelling
+ // it will not stop the NPC from moving.
+ super.push(entity);
+ if (npc != null) {
+ Util.callCollisionEvent(npc, entity.getBukkitEntity());
+ }
+ }
+
+ @Override
+ public boolean save(CompoundTag save) {
+ return npc == null ? super.save(save) : false;
+ }
+
+ @Override
+ public Entity teleportTo(ServerLevel worldserver, PositionImpl location) {
+ if (npc == null)
+ return super.teleportTo(worldserver, location);
+ return NMSImpl.teleportAcrossWorld(this, worldserver, location);
+ }
+
+ @Override
+ public void tick() {
+ if (npc != null) {
+ npc.update();
+ } else {
+ super.tick();
+ }
+ }
+
+ @Override
+ public boolean updateFluidHeightAndDoFluidPushing(TagKey tagkey, double d0) {
+ return NMSImpl.fluidPush(npc, this, () -> super.updateFluidHeightAndDoFluidPushing(tagkey, d0));
+ }
+ }
+
+ public static class TextDisplayNPC extends CraftTextDisplay implements ForwardingNPCHolder {
+ public TextDisplayNPC(EntityTextDisplayNPC entity) {
+ super((CraftServer) Bukkit.getServer(), entity);
+ }
+ }
+}
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ThrownExpBottleController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ThrownExpBottleController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ThrownExpBottleController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ThrownExpBottleController.java
index cb1e219df..03a09bffa 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ThrownExpBottleController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ThrownExpBottleController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftThrownExpBottle;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftThrownExpBottle;
import org.bukkit.entity.ThrownExpBottle;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ThrownPotionController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ThrownPotionController.java
similarity index 90%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ThrownPotionController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ThrownPotionController.java
index 13185a183..4a49d6684 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ThrownPotionController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ThrownPotionController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftThrownPotion;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftThrownPotion;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ThrownTridentController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ThrownTridentController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ThrownTridentController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ThrownTridentController.java
index 3f38f2cdb..e3e6cc723 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/ThrownTridentController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/ThrownTridentController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftTrident;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftTrident;
import org.bukkit.entity.Trident;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/TippedArrowController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/TippedArrowController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/TippedArrowController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/TippedArrowController.java
index c9d66fc94..145ee1a50 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/TippedArrowController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/TippedArrowController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftTippedArrow;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftTippedArrow;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/WitherSkullController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/WitherSkullController.java
similarity index 89%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/WitherSkullController.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/WitherSkullController.java
index 39d425552..bba145bc5 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/entity/nonliving/WitherSkullController.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/nonliving/WitherSkullController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_19_R2.entity.nonliving;
+package net.citizensnpcs.nms.v1_19_R3.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftWitherSkull;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftWitherSkull;
import org.bukkit.util.Vector;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_19_R2.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_19_R3.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/network/EmptyNetHandler.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/network/EmptyNetHandler.java
similarity index 92%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/network/EmptyNetHandler.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/network/EmptyNetHandler.java
index 7e29c09e0..a94b52312 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/network/EmptyNetHandler.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/network/EmptyNetHandler.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_19_R2.network;
+package net.citizensnpcs.nms.v1_19_R3.network;
import net.minecraft.network.Connection;
import net.minecraft.network.protocol.Packet;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/network/EmptyNetworkManager.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/network/EmptyNetworkManager.java
similarity index 85%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/network/EmptyNetworkManager.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/network/EmptyNetworkManager.java
index 10685ee9d..744b93e68 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/network/EmptyNetworkManager.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/network/EmptyNetworkManager.java
@@ -1,8 +1,8 @@
-package net.citizensnpcs.nms.v1_19_R2.network;
+package net.citizensnpcs.nms.v1_19_R3.network;
import java.io.IOException;
-import net.citizensnpcs.nms.v1_19_R2.util.NMSImpl;
+import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl;
import net.minecraft.network.Connection;
import net.minecraft.network.PacketSendListener;
import net.minecraft.network.protocol.Packet;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/CitizensBlockBreaker.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CitizensBlockBreaker.java
similarity index 97%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/CitizensBlockBreaker.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CitizensBlockBreaker.java
index a45599573..25867f5bc 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/CitizensBlockBreaker.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CitizensBlockBreaker.java
@@ -1,6 +1,6 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
-import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
import net.citizensnpcs.util.AbstractBlockBreaker;
import net.minecraft.core.BlockPos;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/CitizensEntityTracker.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CitizensEntityTracker.java
similarity index 98%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/CitizensEntityTracker.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CitizensEntityTracker.java
index 5bbd4cb60..d7a528584 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/CitizensEntityTracker.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CitizensEntityTracker.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
import java.lang.invoke.MethodHandle;
import java.util.Set;
@@ -12,7 +12,7 @@ import com.google.common.collect.ForwardingSet;
import net.citizensnpcs.Settings.Setting;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.EntityHumanNPC;
+import net.citizensnpcs.nms.v1_19_R3.entity.EntityHumanNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
import net.minecraft.network.protocol.game.ClientboundAnimatePacket;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/CustomEntityRegistry.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CustomEntityRegistry.java
similarity index 97%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/CustomEntityRegistry.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CustomEntityRegistry.java
index 286206c2e..445981f15 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/CustomEntityRegistry.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CustomEntityRegistry.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
import java.lang.invoke.MethodHandle;
import java.util.Iterator;
@@ -32,6 +32,7 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.AreaEffectCloud;
+import net.minecraft.world.entity.Display;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ExperienceOrb;
import net.minecraft.world.entity.GlowSquid;
@@ -429,6 +430,10 @@ public class CustomEntityRegistry extends DefaultedMappedRegistry>
minecraftClassMap.put(EntityType.SHEEP, Sheep.class);
minecraftClassMap.put(EntityType.SHULKER, Shulker.class);
minecraftClassMap.put(EntityType.SHULKER_BULLET, ShulkerBullet.class);
+ minecraftClassMap.put(EntityType.SNIFFER, net.minecraft.world.entity.animal.sniffer.Sniffer.class);
+ minecraftClassMap.put(EntityType.BLOCK_DISPLAY, Display.ItemDisplay.class);
+ minecraftClassMap.put(EntityType.ITEM_DISPLAY, Display.TextDisplay.class);
+ minecraftClassMap.put(EntityType.TEXT_DISPLAY, Display.BlockDisplay.class);
minecraftClassMap.put(EntityType.SILVERFISH, Silverfish.class);
minecraftClassMap.put(EntityType.SKELETON, Skeleton.class);
minecraftClassMap.put(EntityType.SKELETON_HORSE, SkeletonHorse.class);
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/EmptyAdvancementDataPlayer.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/EmptyAdvancementDataPlayer.java
similarity index 76%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/EmptyAdvancementDataPlayer.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/EmptyAdvancementDataPlayer.java
index f1b2f4205..6a61adaa8 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/EmptyAdvancementDataPlayer.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/EmptyAdvancementDataPlayer.java
@@ -1,7 +1,9 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
import java.io.File;
import java.lang.invoke.MethodHandle;
+import java.util.List;
+import java.util.Map;
import java.util.Set;
import com.mojang.datafixers.DataFixer;
@@ -18,7 +20,7 @@ import net.minecraft.server.players.PlayerList;
public class EmptyAdvancementDataPlayer extends PlayerAdvancements {
public EmptyAdvancementDataPlayer(DataFixer datafixer, PlayerList playerlist,
ServerAdvancementManager advancementdataworld, File file, ServerPlayer entityplayer) {
- super(datafixer, playerlist, advancementdataworld, CitizensAPI.getDataFolder(), entityplayer);
+ super(datafixer, playerlist, advancementdataworld, CitizensAPI.getDataFolder().toPath(), entityplayer);
this.save();
}
@@ -60,17 +62,16 @@ public class EmptyAdvancementDataPlayer extends PlayerAdvancements {
public static void clear(PlayerAdvancements data) {
data.stopListening();
- data.advancements.clear();
try {
- ((Set>) I.invoke(data)).clear();
- ((Set>) J.invoke(data)).clear();
- ((Set>) K.invoke(data)).clear();
+ ((Map, ?>) PROGRESS.invoke(data)).clear();
+ for (MethodHandle handle : SETS) {
+ ((Set>) handle.invoke(data)).clear();
+ }
} catch (Throwable e) {
e.printStackTrace();
}
}
- private static final MethodHandle I = NMS.getGetter(PlayerAdvancements.class, "i");
- private static final MethodHandle J = NMS.getGetter(PlayerAdvancements.class, "j");
- private static final MethodHandle K = NMS.getGetter(PlayerAdvancements.class, "k");
+ private static final MethodHandle PROGRESS = NMS.getFirstGetter(PlayerAdvancements.class, Map.class);
+ private static final List SETS = NMS.getFieldsOfType(PlayerAdvancements.class, Set.class);
}
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/EmptyServerStatsCounter.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/EmptyServerStatsCounter.java
similarity index 81%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/EmptyServerStatsCounter.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/EmptyServerStatsCounter.java
index b86db615d..6bc87448c 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/EmptyServerStatsCounter.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/EmptyServerStatsCounter.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
import com.mojang.datafixers.DataFixer;
@@ -36,7 +36,7 @@ public class EmptyServerStatsCounter extends ServerStatsCounter {
@Override
protected String toJson() {
- return "{\"stats\":{},\"DataVersion\":" + Integer.valueOf(SharedConstants.getCurrentVersion().getWorldVersion())
- + "}";
+ return "{\"stats\":{},\"DataVersion\":"
+ + Integer.valueOf(SharedConstants.getCurrentVersion().getDataVersion().getVersion()) + "}";
}
}
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/ForwardingNPCHolder.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/ForwardingNPCHolder.java
similarity index 93%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/ForwardingNPCHolder.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/ForwardingNPCHolder.java
index ce0514735..ab1f04370 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/ForwardingNPCHolder.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/ForwardingNPCHolder.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
import org.bukkit.entity.Entity;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/NMSBoundingBox.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSBoundingBox.java
similarity index 94%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/NMSBoundingBox.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSBoundingBox.java
index a33602558..8143ebffc 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/NMSBoundingBox.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSBoundingBox.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
import java.util.function.Supplier;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/NMSImpl.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java
similarity index 90%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/NMSImpl.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java
index 0b744d6e0..6b4747668 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/NMSImpl.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
import java.lang.invoke.MethodHandle;
import java.net.SocketAddress;
@@ -27,20 +27,20 @@ import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarStyle;
import org.bukkit.boss.BossBar;
import org.bukkit.command.BlockCommandSender;
-import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_19_R2.CraftSound;
-import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R2.block.CraftBlock;
-import org.bukkit.craftbukkit.v1_19_R2.boss.CraftBossBar;
-import org.bukkit.craftbukkit.v1_19_R2.command.CraftBlockCommandSender;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftWither;
-import org.bukkit.craftbukkit.v1_19_R2.event.CraftEventFactory;
-import org.bukkit.craftbukkit.v1_19_R2.event.CraftPortalEvent;
-import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryAnvil;
-import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryView;
-import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.CraftSound;
+import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_19_R3.block.CraftBlock;
+import org.bukkit.craftbukkit.v1_19_R3.boss.CraftBossBar;
+import org.bukkit.craftbukkit.v1_19_R3.command.CraftBlockCommandSender;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftWither;
+import org.bukkit.craftbukkit.v1_19_R3.event.CraftEventFactory;
+import org.bukkit.craftbukkit.v1_19_R3.event.CraftPortalEvent;
+import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryAnvil;
+import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryView;
+import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.FishHook;
import org.bukkit.entity.Player;
@@ -68,7 +68,6 @@ import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService;
import com.mojang.authlib.yggdrasil.response.MinecraftProfilePropertiesResponse;
import com.mojang.util.UUIDTypeAdapter;
-import com.viaversion.viaversion.api.Via;
import net.citizensnpcs.Settings.Setting;
import net.citizensnpcs.api.CitizensAPI;
@@ -101,123 +100,127 @@ import net.citizensnpcs.api.trait.TraitInfo;
import net.citizensnpcs.api.util.BoundingBox;
import net.citizensnpcs.api.util.EntityDim;
import net.citizensnpcs.api.util.Messaging;
-import net.citizensnpcs.nms.v1_19_R2.entity.AllayController;
-import net.citizensnpcs.nms.v1_19_R2.entity.ArmorStandController;
-import net.citizensnpcs.nms.v1_19_R2.entity.AxolotlController;
-import net.citizensnpcs.nms.v1_19_R2.entity.BatController;
-import net.citizensnpcs.nms.v1_19_R2.entity.BeeController;
-import net.citizensnpcs.nms.v1_19_R2.entity.BlazeController;
-import net.citizensnpcs.nms.v1_19_R2.entity.CamelController;
-import net.citizensnpcs.nms.v1_19_R2.entity.CatController;
-import net.citizensnpcs.nms.v1_19_R2.entity.CaveSpiderController;
-import net.citizensnpcs.nms.v1_19_R2.entity.ChickenController;
-import net.citizensnpcs.nms.v1_19_R2.entity.CodController;
-import net.citizensnpcs.nms.v1_19_R2.entity.CowController;
-import net.citizensnpcs.nms.v1_19_R2.entity.CreeperController;
-import net.citizensnpcs.nms.v1_19_R2.entity.DolphinController;
-import net.citizensnpcs.nms.v1_19_R2.entity.DrownedController;
-import net.citizensnpcs.nms.v1_19_R2.entity.EnderDragonController;
-import net.citizensnpcs.nms.v1_19_R2.entity.EndermanController;
-import net.citizensnpcs.nms.v1_19_R2.entity.EndermiteController;
-import net.citizensnpcs.nms.v1_19_R2.entity.EntityHumanNPC;
-import net.citizensnpcs.nms.v1_19_R2.entity.EvokerController;
-import net.citizensnpcs.nms.v1_19_R2.entity.FoxController;
-import net.citizensnpcs.nms.v1_19_R2.entity.FrogController;
-import net.citizensnpcs.nms.v1_19_R2.entity.GhastController;
-import net.citizensnpcs.nms.v1_19_R2.entity.GiantController;
-import net.citizensnpcs.nms.v1_19_R2.entity.GlowSquidController;
-import net.citizensnpcs.nms.v1_19_R2.entity.GoatController;
-import net.citizensnpcs.nms.v1_19_R2.entity.GuardianController;
-import net.citizensnpcs.nms.v1_19_R2.entity.GuardianElderController;
-import net.citizensnpcs.nms.v1_19_R2.entity.HoglinController;
-import net.citizensnpcs.nms.v1_19_R2.entity.HorseController;
-import net.citizensnpcs.nms.v1_19_R2.entity.HorseDonkeyController;
-import net.citizensnpcs.nms.v1_19_R2.entity.HorseMuleController;
-import net.citizensnpcs.nms.v1_19_R2.entity.HorseSkeletonController;
-import net.citizensnpcs.nms.v1_19_R2.entity.HorseZombieController;
-import net.citizensnpcs.nms.v1_19_R2.entity.HumanController;
-import net.citizensnpcs.nms.v1_19_R2.entity.IllusionerController;
-import net.citizensnpcs.nms.v1_19_R2.entity.IronGolemController;
-import net.citizensnpcs.nms.v1_19_R2.entity.LlamaController;
-import net.citizensnpcs.nms.v1_19_R2.entity.MagmaCubeController;
-import net.citizensnpcs.nms.v1_19_R2.entity.MushroomCowController;
-import net.citizensnpcs.nms.v1_19_R2.entity.OcelotController;
-import net.citizensnpcs.nms.v1_19_R2.entity.PandaController;
-import net.citizensnpcs.nms.v1_19_R2.entity.ParrotController;
-import net.citizensnpcs.nms.v1_19_R2.entity.PhantomController;
-import net.citizensnpcs.nms.v1_19_R2.entity.PigController;
-import net.citizensnpcs.nms.v1_19_R2.entity.PigZombieController;
-import net.citizensnpcs.nms.v1_19_R2.entity.PiglinBruteController;
-import net.citizensnpcs.nms.v1_19_R2.entity.PiglinController;
-import net.citizensnpcs.nms.v1_19_R2.entity.PillagerController;
-import net.citizensnpcs.nms.v1_19_R2.entity.PolarBearController;
-import net.citizensnpcs.nms.v1_19_R2.entity.PufferFishController;
-import net.citizensnpcs.nms.v1_19_R2.entity.RabbitController;
-import net.citizensnpcs.nms.v1_19_R2.entity.RavagerController;
-import net.citizensnpcs.nms.v1_19_R2.entity.SalmonController;
-import net.citizensnpcs.nms.v1_19_R2.entity.SheepController;
-import net.citizensnpcs.nms.v1_19_R2.entity.ShulkerController;
-import net.citizensnpcs.nms.v1_19_R2.entity.SilverfishController;
-import net.citizensnpcs.nms.v1_19_R2.entity.SkeletonController;
-import net.citizensnpcs.nms.v1_19_R2.entity.SkeletonStrayController;
-import net.citizensnpcs.nms.v1_19_R2.entity.SkeletonWitherController;
-import net.citizensnpcs.nms.v1_19_R2.entity.SlimeController;
-import net.citizensnpcs.nms.v1_19_R2.entity.SnowmanController;
-import net.citizensnpcs.nms.v1_19_R2.entity.SpiderController;
-import net.citizensnpcs.nms.v1_19_R2.entity.SquidController;
-import net.citizensnpcs.nms.v1_19_R2.entity.StriderController;
-import net.citizensnpcs.nms.v1_19_R2.entity.TadpoleController;
-import net.citizensnpcs.nms.v1_19_R2.entity.TraderLlamaController;
-import net.citizensnpcs.nms.v1_19_R2.entity.TropicalFishController;
-import net.citizensnpcs.nms.v1_19_R2.entity.TurtleController;
-import net.citizensnpcs.nms.v1_19_R2.entity.VexController;
-import net.citizensnpcs.nms.v1_19_R2.entity.VillagerController;
-import net.citizensnpcs.nms.v1_19_R2.entity.VindicatorController;
-import net.citizensnpcs.nms.v1_19_R2.entity.WanderingTraderController;
-import net.citizensnpcs.nms.v1_19_R2.entity.WardenController;
-import net.citizensnpcs.nms.v1_19_R2.entity.WitchController;
-import net.citizensnpcs.nms.v1_19_R2.entity.WitherController;
-import net.citizensnpcs.nms.v1_19_R2.entity.WolfController;
-import net.citizensnpcs.nms.v1_19_R2.entity.ZoglinController;
-import net.citizensnpcs.nms.v1_19_R2.entity.ZombieController;
-import net.citizensnpcs.nms.v1_19_R2.entity.ZombieHuskController;
-import net.citizensnpcs.nms.v1_19_R2.entity.ZombieVillagerController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.AreaEffectCloudController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.BoatController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.ChestBoatController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.DragonFireballController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.EggController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.EnderCrystalController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.EnderPearlController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.EnderSignalController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.EvokerFangsController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.FallingBlockController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.FireworkController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.FishingHookController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.GlowItemFrameController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.ItemController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.ItemFrameController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.LargeFireballController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.LeashController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.LlamaSpitController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.MarkerController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.MinecartChestController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.MinecartCommandController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.MinecartFurnaceController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.MinecartHopperController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.MinecartRideableController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.MinecartTNTController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.PaintingController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.ShulkerBulletController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.SmallFireballController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.SnowballController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.SpectralArrowController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.TNTPrimedController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.ThrownExpBottleController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.ThrownPotionController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.ThrownTridentController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.TippedArrowController;
-import net.citizensnpcs.nms.v1_19_R2.entity.nonliving.WitherSkullController;
+import net.citizensnpcs.nms.v1_19_R3.entity.AllayController;
+import net.citizensnpcs.nms.v1_19_R3.entity.ArmorStandController;
+import net.citizensnpcs.nms.v1_19_R3.entity.AxolotlController;
+import net.citizensnpcs.nms.v1_19_R3.entity.BatController;
+import net.citizensnpcs.nms.v1_19_R3.entity.BeeController;
+import net.citizensnpcs.nms.v1_19_R3.entity.BlazeController;
+import net.citizensnpcs.nms.v1_19_R3.entity.CamelController;
+import net.citizensnpcs.nms.v1_19_R3.entity.CatController;
+import net.citizensnpcs.nms.v1_19_R3.entity.CaveSpiderController;
+import net.citizensnpcs.nms.v1_19_R3.entity.ChickenController;
+import net.citizensnpcs.nms.v1_19_R3.entity.CodController;
+import net.citizensnpcs.nms.v1_19_R3.entity.CowController;
+import net.citizensnpcs.nms.v1_19_R3.entity.CreeperController;
+import net.citizensnpcs.nms.v1_19_R3.entity.DolphinController;
+import net.citizensnpcs.nms.v1_19_R3.entity.DrownedController;
+import net.citizensnpcs.nms.v1_19_R3.entity.EnderDragonController;
+import net.citizensnpcs.nms.v1_19_R3.entity.EndermanController;
+import net.citizensnpcs.nms.v1_19_R3.entity.EndermiteController;
+import net.citizensnpcs.nms.v1_19_R3.entity.EntityHumanNPC;
+import net.citizensnpcs.nms.v1_19_R3.entity.EvokerController;
+import net.citizensnpcs.nms.v1_19_R3.entity.FoxController;
+import net.citizensnpcs.nms.v1_19_R3.entity.FrogController;
+import net.citizensnpcs.nms.v1_19_R3.entity.GhastController;
+import net.citizensnpcs.nms.v1_19_R3.entity.GiantController;
+import net.citizensnpcs.nms.v1_19_R3.entity.GlowSquidController;
+import net.citizensnpcs.nms.v1_19_R3.entity.GoatController;
+import net.citizensnpcs.nms.v1_19_R3.entity.GuardianController;
+import net.citizensnpcs.nms.v1_19_R3.entity.GuardianElderController;
+import net.citizensnpcs.nms.v1_19_R3.entity.HoglinController;
+import net.citizensnpcs.nms.v1_19_R3.entity.HorseController;
+import net.citizensnpcs.nms.v1_19_R3.entity.HorseDonkeyController;
+import net.citizensnpcs.nms.v1_19_R3.entity.HorseMuleController;
+import net.citizensnpcs.nms.v1_19_R3.entity.HorseSkeletonController;
+import net.citizensnpcs.nms.v1_19_R3.entity.HorseZombieController;
+import net.citizensnpcs.nms.v1_19_R3.entity.HumanController;
+import net.citizensnpcs.nms.v1_19_R3.entity.IllusionerController;
+import net.citizensnpcs.nms.v1_19_R3.entity.IronGolemController;
+import net.citizensnpcs.nms.v1_19_R3.entity.LlamaController;
+import net.citizensnpcs.nms.v1_19_R3.entity.MagmaCubeController;
+import net.citizensnpcs.nms.v1_19_R3.entity.MushroomCowController;
+import net.citizensnpcs.nms.v1_19_R3.entity.OcelotController;
+import net.citizensnpcs.nms.v1_19_R3.entity.PandaController;
+import net.citizensnpcs.nms.v1_19_R3.entity.ParrotController;
+import net.citizensnpcs.nms.v1_19_R3.entity.PhantomController;
+import net.citizensnpcs.nms.v1_19_R3.entity.PigController;
+import net.citizensnpcs.nms.v1_19_R3.entity.PigZombieController;
+import net.citizensnpcs.nms.v1_19_R3.entity.PiglinBruteController;
+import net.citizensnpcs.nms.v1_19_R3.entity.PiglinController;
+import net.citizensnpcs.nms.v1_19_R3.entity.PillagerController;
+import net.citizensnpcs.nms.v1_19_R3.entity.PolarBearController;
+import net.citizensnpcs.nms.v1_19_R3.entity.PufferFishController;
+import net.citizensnpcs.nms.v1_19_R3.entity.RabbitController;
+import net.citizensnpcs.nms.v1_19_R3.entity.RavagerController;
+import net.citizensnpcs.nms.v1_19_R3.entity.SalmonController;
+import net.citizensnpcs.nms.v1_19_R3.entity.SheepController;
+import net.citizensnpcs.nms.v1_19_R3.entity.ShulkerController;
+import net.citizensnpcs.nms.v1_19_R3.entity.SilverfishController;
+import net.citizensnpcs.nms.v1_19_R3.entity.SkeletonController;
+import net.citizensnpcs.nms.v1_19_R3.entity.SkeletonStrayController;
+import net.citizensnpcs.nms.v1_19_R3.entity.SkeletonWitherController;
+import net.citizensnpcs.nms.v1_19_R3.entity.SlimeController;
+import net.citizensnpcs.nms.v1_19_R3.entity.SnifferController;
+import net.citizensnpcs.nms.v1_19_R3.entity.SnowmanController;
+import net.citizensnpcs.nms.v1_19_R3.entity.SpiderController;
+import net.citizensnpcs.nms.v1_19_R3.entity.SquidController;
+import net.citizensnpcs.nms.v1_19_R3.entity.StriderController;
+import net.citizensnpcs.nms.v1_19_R3.entity.TadpoleController;
+import net.citizensnpcs.nms.v1_19_R3.entity.TraderLlamaController;
+import net.citizensnpcs.nms.v1_19_R3.entity.TropicalFishController;
+import net.citizensnpcs.nms.v1_19_R3.entity.TurtleController;
+import net.citizensnpcs.nms.v1_19_R3.entity.VexController;
+import net.citizensnpcs.nms.v1_19_R3.entity.VillagerController;
+import net.citizensnpcs.nms.v1_19_R3.entity.VindicatorController;
+import net.citizensnpcs.nms.v1_19_R3.entity.WanderingTraderController;
+import net.citizensnpcs.nms.v1_19_R3.entity.WardenController;
+import net.citizensnpcs.nms.v1_19_R3.entity.WitchController;
+import net.citizensnpcs.nms.v1_19_R3.entity.WitherController;
+import net.citizensnpcs.nms.v1_19_R3.entity.WolfController;
+import net.citizensnpcs.nms.v1_19_R3.entity.ZoglinController;
+import net.citizensnpcs.nms.v1_19_R3.entity.ZombieController;
+import net.citizensnpcs.nms.v1_19_R3.entity.ZombieHuskController;
+import net.citizensnpcs.nms.v1_19_R3.entity.ZombieVillagerController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.AreaEffectCloudController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.BlockDisplayController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.BoatController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.ChestBoatController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.DragonFireballController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.EggController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.EnderCrystalController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.EnderPearlController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.EnderSignalController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.EvokerFangsController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.FallingBlockController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.FireworkController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.FishingHookController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.GlowItemFrameController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.ItemController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.ItemDisplayController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.ItemFrameController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.LargeFireballController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.LeashController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.LlamaSpitController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.MarkerController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.MinecartChestController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.MinecartCommandController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.MinecartFurnaceController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.MinecartHopperController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.MinecartRideableController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.MinecartTNTController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.PaintingController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.ShulkerBulletController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.SmallFireballController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.SnowballController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.SpectralArrowController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.TNTPrimedController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.TextDisplayController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.ThrownExpBottleController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.ThrownPotionController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.ThrownTridentController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.TippedArrowController;
+import net.citizensnpcs.nms.v1_19_R3.entity.nonliving.WitherSkullController;
import net.citizensnpcs.npc.EntityControllers;
import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator;
import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator;
@@ -245,6 +248,7 @@ import net.citizensnpcs.trait.versioned.PiglinTrait;
import net.citizensnpcs.trait.versioned.PolarBearTrait;
import net.citizensnpcs.trait.versioned.PufferFishTrait;
import net.citizensnpcs.trait.versioned.ShulkerTrait;
+import net.citizensnpcs.trait.versioned.SnifferTrait.SnifferState;
import net.citizensnpcs.trait.versioned.SnowmanTrait;
import net.citizensnpcs.trait.versioned.SpellcasterTrait;
import net.citizensnpcs.trait.versioned.TropicalFishTrait;
@@ -286,7 +290,6 @@ import net.minecraft.sounds.SoundEvent;
import net.minecraft.tags.FluidTags;
import net.minecraft.util.Mth;
import net.minecraft.world.Container;
-import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.Entity.RemovalReason;
@@ -421,7 +424,7 @@ public class NMSImpl implements NMSBridge {
int i = 0;
f += EnchantmentHelper.getDamageBonus(source.getMainHandItem(), target.getMobType());
i += EnchantmentHelper.getKnockbackBonus(source);
- boolean flag = target.hurt(DamageSource.mobAttack(source), f);
+ boolean flag = target.hurt(target.damageSources().mobAttack(source), f);
if (!flag)
return;
if (i > 0) {
@@ -696,7 +699,7 @@ public class NMSImpl implements NMSBridge {
@Override
public float getStepHeight(org.bukkit.entity.Entity entity) {
- return NMSImpl.getHandle(entity).maxUpStep;
+ return NMSImpl.getHandle(entity).maxUpStep();
}
@Override
@@ -892,12 +895,6 @@ public class NMSImpl implements NMSBridge {
registerTraitWithCommand(manager, SnowmanTrait.class);
registerTraitWithCommand(manager, TropicalFishTrait.class);
registerTraitWithCommand(manager, VillagerTrait.class);
- try {
- Via.getAPI();
- VIA_ENABLED = true;
- } catch (Throwable t) {
- VIA_ENABLED = false;
- }
}
private void loadEntityTypes() {
@@ -1019,6 +1016,10 @@ public class NMSImpl implements NMSBridge {
EntityControllers.setEntityControllerForType(EntityType.WITHER_SKELETON, SkeletonWitherController.class);
EntityControllers.setEntityControllerForType(EntityType.ZOMBIE, ZombieController.class);
EntityControllers.setEntityControllerForType(EntityType.ZOMBIE_VILLAGER, ZombieVillagerController.class);
+ EntityControllers.setEntityControllerForType(EntityType.SNIFFER, SnifferController.class);
+ EntityControllers.setEntityControllerForType(EntityType.BLOCK_DISPLAY, BlockDisplayController.class);
+ EntityControllers.setEntityControllerForType(EntityType.ITEM_DISPLAY, TextDisplayController.class);
+ EntityControllers.setEntityControllerForType(EntityType.TEXT_DISPLAY, ItemDisplayController.class);
}
@Override
@@ -1405,7 +1406,7 @@ public class NMSImpl implements NMSBridge {
}
return;
case SITTING:
- if (!camel.isPoseSitting()) {
+ if (!camel.isCamelSitting()) {
camel.sitDown();
}
return;
@@ -1419,7 +1420,13 @@ public class NMSImpl implements NMSBridge {
@Override
public void setCustomName(org.bukkit.entity.Entity entity, Object component, String string) {
- getHandle(entity).setCustomName((Component) component);
+ if (getHandle(entity) instanceof net.minecraft.world.entity.Display.TextDisplay) {
+ net.minecraft.world.entity.Display.TextDisplay disp = (net.minecraft.world.entity.Display.TextDisplay) getHandle(
+ entity);
+ disp.setText((Component) component);
+ } else {
+ getHandle(entity).setCustomName((Component) component);
+ }
}
@Override
@@ -1579,9 +1586,16 @@ public class NMSImpl implements NMSBridge {
getHandle(entity).setPose(pose);
}
+ @Override
+ public void setSnifferState(org.bukkit.entity.Entity entity, SnifferState state) {
+ net.minecraft.world.entity.animal.sniffer.Sniffer handle = (net.minecraft.world.entity.animal.sniffer.Sniffer) getHandle(
+ entity);
+ handle.transitionTo(net.minecraft.world.entity.animal.sniffer.Sniffer.State.valueOf(state.name()));
+ }
+
@Override
public void setStepHeight(org.bukkit.entity.Entity entity, float height) {
- NMSImpl.getHandle(entity).maxUpStep = height;
+ NMSImpl.getHandle(entity).setMaxUpStep(height);
}
@Override
@@ -2063,19 +2077,15 @@ public class NMSImpl implements NMSBridge {
double d6 = d3 - d5;
float f4 = (float) (d6 * 10.0D - 3.0D);
if (f4 > 0.0F) {
- try {
- entity.playSound((SoundEvent) ENTITY_GET_SOUND_FALL.invoke(entity, (int) f4), 1.0F, 1.0F);
- } catch (Throwable e) {
- e.printStackTrace();
- }
- entity.hurt(DamageSource.FLY_INTO_WALL, f4);
+ entity.playSound(entity.getFallDamageSound0((int) f4), 1.0F, 1.0F);
+ entity.hurt(entity.damageSources().flyIntoWall(), f4);
}
}
if (entity.isOnGround() && !entity.level.isClientSide && entity.getSharedFlag(7)
&& !CraftEventFactory.callToggleGlideEvent(entity, false).isCancelled())
entity.setSharedFlag(7, false);
} else {
- BlockPos blockposition = new BlockPos(entity.getX(), (entity.getBoundingBox()).minY - 0.5D,
+ BlockPos blockposition = BlockPos.containing(entity.getX(), (entity.getBoundingBox()).minY - 0.5D,
entity.getZ());
float f5 = entity.level.getBlockState(blockposition).getBlock().getFriction();
float f = entity.isOnGround() ? (f5 * 0.91F) : 0.91F;
@@ -2100,7 +2110,7 @@ public class NMSImpl implements NMSBridge {
}
}
}
- entity.calculateEntityAnimation(entity, entity instanceof net.minecraft.world.entity.animal.FlyingAnimal);
+ entity.calculateEntityAnimation(entity instanceof net.minecraft.world.entity.animal.FlyingAnimal);
}
public static TreeMap, ?> getBehaviorMap(LivingEntity entity) {
@@ -2408,7 +2418,8 @@ public class NMSImpl implements NMSBridge {
}
}
- private static final MethodHandle ADVANCEMENTS_PLAYER_FIELD = NMS.getFinalSetter(ServerPlayer.class, "cq");
+ private static final MethodHandle ADVANCEMENTS_PLAYER_FIELD = NMS.getFirstFinalSetter(ServerPlayer.class,
+ PlayerAdvancements.class);
private static final Set BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.BEE,
EntityType.SILVERFISH, EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT,
EntityType.SLIME, EntityType.DOLPHIN, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST,
@@ -2424,8 +2435,6 @@ public class NMSImpl implements NMSBridge {
private static EntityDataAccessor ENDERMAN_CREEPY = null;
private static final MethodHandle ENTITY_FISH_NUM_IN_SCHOOL = NMS.getFirstSetter(AbstractSchoolingFish.class,
int.class);
- private static final MethodHandle ENTITY_GET_SOUND_FALL = NMS.getMethodHandle(LivingEntity.class, "c", true,
- int.class);
private static CustomEntityRegistry ENTITY_REGISTRY;
private static MethodHandle ENTITY_REGISTRY_SETTER;
private static final MethodHandle FALLING_BLOCK_STATE_SETTER = NMS.getFirstSetter(FallingBlockEntity.class,
@@ -2433,23 +2442,24 @@ public class NMSImpl implements NMSBridge {
private static final MethodHandle FIND_DIMENSION_ENTRY_POINT = NMS.getFirstMethodHandleWithReturnType(Entity.class,
true, PortalInfo.class, ServerLevel.class);
// first int of block of 4
- private static final MethodHandle FISHING_HOOK_LIFE = NMS.getSetter(FishingHook.class, "aq");
+ private static final MethodHandle FISHING_HOOK_LIFE = NMS.getSetter(FishingHook.class, "i");
private static final MethodHandle FLYING_MOVECONTROL_FLOAT_GETTER = NMS.getFirstGetter(FlyingMoveControl.class,
boolean.class);
private static final MethodHandle FLYING_MOVECONTROL_FLOAT_SETTER = NMS.getFirstSetter(FlyingMoveControl.class,
boolean.class);
private static final Location FROM_LOCATION = new Location(null, 0, 0, 0);
- private static final MethodHandle HEAD_HEIGHT = NMS.getSetter(Entity.class, "ba");
+ private static final MethodHandle HEAD_HEIGHT = NMS.getSetter(Entity.class, "bf");
private static final MethodHandle HEAD_HEIGHT_METHOD = NMS.getFirstMethodHandle(Entity.class, true, Pose.class,
EntityDimensions.class);
- private static final MethodHandle JUMP_FIELD = NMS.getGetter(LivingEntity.class, "bn");
+ private static final MethodHandle JUMP_FIELD = NMS.getGetter(LivingEntity.class, "bi");
private static final MethodHandle MAKE_REQUEST = NMS.getMethodHandle(YggdrasilAuthenticationService.class,
"makeRequest", true, URL.class, Object.class, Class.class);
private static MethodHandle MOVE_CONTROLLER_OPERATION = NMS.getSetter(MoveControl.class, "k");
private static final MethodHandle NAVIGATION_CREATE_PATHFINDER = NMS
.getFirstMethodHandleWithReturnType(PathNavigation.class, true, PathFinder.class, int.class);
private static MethodHandle NAVIGATION_PATH = NMS.getFirstGetter(PathNavigation.class, Path.class);
- private static final MethodHandle NAVIGATION_PATHFINDER = NMS.getFinalSetter(PathNavigation.class, "v");
+ private static final MethodHandle NAVIGATION_PATHFINDER = NMS.getFirstFinalSetter(PathNavigation.class,
+ PathFinder.class);
private static final MethodHandle NAVIGATION_WORLD_FIELD = NMS.getFirstSetter(PathNavigation.class, Level.class);
public static final Location PACKET_CACHE_LOCATION = new Location(null, 0, 0, 0);
private static final MethodHandle PLAYER_CHUNK_MAP_VIEW_DISTANCE_GETTER = NMS.getGetter(ChunkMap.class, "P");
@@ -2457,10 +2467,10 @@ public class NMSImpl implements NMSBridge {
private static final MethodHandle PLAYER_INFO_ENTRIES_LIST = NMS
.getFinalSetter(ClientboundPlayerInfoUpdatePacket.class, "b");
private static final MethodHandle PLAYERINFO_ENTRIES = PLAYER_INFO_ENTRIES_LIST;
- private static MethodHandle PORTAL_ENTRANCE_POS_GETTER = NMS.getGetter(Entity.class, "ai");
- private static MethodHandle PORTAL_ENTRANCE_POS_SETTER = NMS.getSetter(Entity.class, "ai");
- private static final MethodHandle PUFFERFISH_C = NMS.getSetter(Pufferfish.class, "bX");
- private static final MethodHandle PUFFERFISH_D = NMS.getSetter(Pufferfish.class, "bY");
+ private static MethodHandle PORTAL_ENTRANCE_POS_GETTER = NMS.getGetter(Entity.class, "aw");
+ private static MethodHandle PORTAL_ENTRANCE_POS_SETTER = NMS.getSetter(Entity.class, "aw");
+ private static final MethodHandle PUFFERFISH_C = NMS.getSetter(Pufferfish.class, "bS");
+ private static final MethodHandle PUFFERFISH_D = NMS.getSetter(Pufferfish.class, "bT");
private static EntityDataAccessor RABBIT_TYPE_DATAWATCHER = null;
private static final Random RANDOM = Util.getFastRandom();
private static MethodHandle SET_PROFILE_METHOD;
@@ -2468,7 +2478,6 @@ public class NMSImpl implements NMSBridge {
private static final MethodHandle SIZE_FIELD_SETTER = NMS.getFirstSetter(Entity.class, EntityDimensions.class);
private static MethodHandle SKULL_META_PROFILE;
private static MethodHandle TEAM_FIELD;
- private static Boolean VIA_ENABLED = null;
static {
try {
ENTITY_REGISTRY = new CustomEntityRegistry(BuiltInRegistries.ENTITY_TYPE);
@@ -2479,7 +2488,8 @@ public class NMSImpl implements NMSBridge {
e.printStackTrace();
}
try {
- ENDERMAN_CREEPY = (EntityDataAccessor) NMS.getField(EnderMan.class, "bZ").get(null);
+ // Middle one
+ ENDERMAN_CREEPY = (EntityDataAccessor) NMS.getField(EnderMan.class, "bU").get(null);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerAnimationImpl.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerAnimationImpl.java
similarity index 98%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerAnimationImpl.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerAnimationImpl.java
index d00ebb8e9..66c167a53 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerAnimationImpl.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerAnimationImpl.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
import java.util.Map;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerControllerJump.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerControllerJump.java
similarity index 77%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerControllerJump.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerControllerJump.java
index 32268d2ff..fa9446da0 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerControllerJump.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerControllerJump.java
@@ -1,6 +1,6 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
-import net.citizensnpcs.nms.v1_19_R2.entity.EntityHumanNPC;
+import net.citizensnpcs.nms.v1_19_R3.entity.EntityHumanNPC;
public class PlayerControllerJump {
private boolean a;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerMoveControl.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerMoveControl.java
similarity index 97%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerMoveControl.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerMoveControl.java
index 1ab307d45..7686f9148 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerMoveControl.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerMoveControl.java
@@ -1,8 +1,8 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
import java.util.Random;
-import net.citizensnpcs.nms.v1_19_R2.entity.EntityHumanNPC;
+import net.citizensnpcs.nms.v1_19_R3.entity.EntityHumanNPC;
import net.citizensnpcs.util.NMS;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.EntityType;
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerNavigation.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerNavigation.java
similarity index 91%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerNavigation.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerNavigation.java
index 0e61b3ea5..c15869108 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerNavigation.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerNavigation.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
import java.util.Set;
import java.util.stream.Collectors;
@@ -7,7 +7,7 @@ import java.util.stream.Stream;
import com.google.common.collect.ImmutableSet;
import net.citizensnpcs.Settings;
-import net.citizensnpcs.nms.v1_19_R2.entity.EntityHumanNPC;
+import net.citizensnpcs.nms.v1_19_R3.entity.EntityHumanNPC;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Vec3i;
import net.minecraft.tags.BlockTags;
@@ -27,7 +27,6 @@ import net.minecraft.world.level.pathfinder.Node;
import net.minecraft.world.level.pathfinder.NodeEvaluator;
import net.minecraft.world.level.pathfinder.Path;
import net.minecraft.world.level.pathfinder.PathFinder;
-import net.minecraft.world.level.pathfinder.WalkNodeEvaluator;
import net.minecraft.world.phys.Vec3;
public class PlayerNavigation extends PathNavigation {
@@ -41,7 +40,7 @@ public class PlayerNavigation extends PathNavigation {
protected final Level level;
protected float maxDistanceToWaypoint = 0.5F;
private float maxVisitedNodesMultiplier = 1.0F;
- protected final EntityHumanNPC mob;
+ private final EntityHumanNPC mob;
protected PlayerNodeEvaluator nodeEvaluator;
protected Path path;
private final PlayerPathfinder pathFinder;
@@ -225,16 +224,19 @@ public class PlayerNavigation extends PathNavigation {
return null;
if (this.path != null && !this.path.isDone() && var0.contains(this.targetPos))
return this.path;
+ this.level.getProfiler().push("pathfind");
BlockPos var5 = var2 ? this.mob.blockPosition().above() : this.mob.blockPosition();
int var6 = (int) (var4 + var1);
PathNavigationRegion var7 = new PathNavigationRegion(this.level, var5.offset(-var6, -var6, -var6),
var5.offset(var6, var6, var6));
Path var8 = this.pathFinder.findPath(var7, this.mob, var0, var4, var3, this.maxVisitedNodesMultiplier);
+ this.level.getProfiler().pop();
if (var8 != null && var8.getTarget() != null) {
this.targetPos = var8.getTarget();
this.reachRange = var3;
- resetStuckTimeout();
+ this.resetStuckTimeout();
}
+
return var8;
}
@@ -310,18 +312,25 @@ public class PlayerNavigation extends PathNavigation {
}
private int getSurfaceY() {
- if (!this.mob.isInWater() || !canFloat())
- return Mth.floor(this.mob.getY() + 0.5D);
- int var0 = this.mob.getBlockY();
- BlockState var1 = this.level.getBlockState(new BlockPos(this.mob.getX(), var0, this.mob.getZ()));
- int var2 = 0;
- while (var1.is(Blocks.WATER)) {
- var0++;
- var1 = this.level.getBlockState(new BlockPos(this.mob.getX(), var0, this.mob.getZ()));
- if (++var2 > 16)
- return this.mob.getBlockY();
+ if (this.mob.isInWater() && this.canFloat()) {
+ int var0 = this.mob.getBlockY();
+ BlockState var1 = this.level.getBlockState(BlockPos.containing(this.mob.getX(), var0, this.mob.getZ()));
+ int var2 = 0;
+
+ do {
+ if (!var1.is(Blocks.WATER)) {
+ return var0;
+ }
+
+ ++var0;
+ var1 = this.level.getBlockState(BlockPos.containing(this.mob.getX(), var0, this.mob.getZ()));
+ ++var2;
+ } while (var2 <= 16);
+
+ return this.mob.getBlockY();
+ } else {
+ return Mth.floor(this.mob.getY() + 0.5);
}
- return var0;
}
@Override
@@ -335,9 +344,13 @@ public class PlayerNavigation extends PathNavigation {
}
protected boolean hasValidPathType(BlockPathTypes var0) {
- if ((var0 == BlockPathTypes.WATER) || (var0 == BlockPathTypes.LAVA) || (var0 == BlockPathTypes.OPEN))
+ if (var0 == BlockPathTypes.WATER) {
return false;
- return true;
+ } else if (var0 == BlockPathTypes.LAVA) {
+ return false;
+ } else {
+ return var0 != BlockPathTypes.OPEN;
+ }
}
@Override
@@ -368,7 +381,7 @@ public class PlayerNavigation extends PathNavigation {
@Override
public boolean moveTo(double var0, double var2, double var4, double var6) {
- return moveTo(createPath(new BlockPos(var0, var2, var4), 1), var6);
+ return moveTo(createPath(BlockPos.containing(var0, var2, var4), 1), var6);
}
@Override
@@ -492,14 +505,15 @@ public class PlayerNavigation extends PathNavigation {
protected void supertrimPath() {
if (this.path == null)
return;
- for (int var0 = 0; var0 < this.path.getNodeCount(); var0++) {
+ for (int var0 = 0; var0 < this.path.getNodeCount(); ++var0) {
Node var1 = this.path.getNode(var0);
- Node var2 = (var0 + 1 < this.path.getNodeCount()) ? this.path.getNode(var0 + 1) : null;
+ Node var2 = var0 + 1 < this.path.getNodeCount() ? this.path.getNode(var0 + 1) : null;
BlockState var3 = this.level.getBlockState(new BlockPos(var1.x, var1.y, var1.z));
if (var3.is(BlockTags.CAULDRONS)) {
this.path.replaceNode(var0, var1.cloneAndMove(var1.x, var1.y + 1, var1.z));
- if (var2 != null && var1.y >= var2.y)
+ if (var2 != null && var1.y >= var2.y) {
this.path.replaceNode(var0 + 1, var1.cloneAndMove(var2.x, var1.y + 1, var2.z));
+ }
}
}
}
@@ -524,9 +538,7 @@ public class PlayerNavigation extends PathNavigation {
if (isDone())
return;
Vec3 var0 = this.path.getNextEntityPos(this.mob);
- BlockPos var1 = new BlockPos(var0);
- this.mob.getMoveControl().setWantedPosition(var0.x, this.level.getBlockState(var1.below()).isAir() ? var0.y
- : WalkNodeEvaluator.getFloorLevel(this.level, var1), var0.z, this.speedModifier);
+ this.mob.getMoveControl().setWantedPosition(var0.x, this.getGroundY(var0), var0.z, this.speedModifier);
}
private void timeoutPath() {
@@ -538,9 +550,11 @@ public class PlayerNavigation extends PathNavigation {
protected void trimPath() {
supertrimPath();
if (this.avoidSun) {
- if (this.level.canSeeSky(new BlockPos(this.mob.getX(), this.mob.getY() + 0.5D, this.mob.getZ())))
+ if (this.level.canSeeSky(BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5, this.mob.getZ()))) {
return;
- for (int var0 = 0; var0 < this.path.getNodeCount(); var0++) {
+ }
+
+ for (int var0 = 0; var0 < this.path.getNodeCount(); ++var0) {
Node var1 = this.path.getNode(var0);
if (this.level.canSeeSky(new BlockPos(var1.x, var1.y, var1.z))) {
this.path.truncateNodes(var0);
diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerNodeEvaluator.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerNodeEvaluator.java
new file mode 100644
index 000000000..f443d90e9
--- /dev/null
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerNodeEvaluator.java
@@ -0,0 +1,615 @@
+package net.citizensnpcs.nms.v1_19_R3.util;
+
+import java.util.EnumSet;
+import java.util.Iterator;
+
+import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
+import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.objects.Object2BooleanMap;
+import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap;
+import net.citizensnpcs.nms.v1_19_R3.entity.EntityHumanNPC;
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Direction;
+import net.minecraft.core.Direction.Axis;
+import net.minecraft.tags.BlockTags;
+import net.minecraft.tags.FluidTags;
+import net.minecraft.util.Mth;
+import net.minecraft.world.entity.Mob;
+import net.minecraft.world.level.BlockGetter;
+import net.minecraft.world.level.PathNavigationRegion;
+import net.minecraft.world.level.block.BaseRailBlock;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.CampfireBlock;
+import net.minecraft.world.level.block.DoorBlock;
+import net.minecraft.world.level.block.FenceGateBlock;
+import net.minecraft.world.level.block.LeavesBlock;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraft.world.level.material.FluidState;
+import net.minecraft.world.level.material.Fluids;
+import net.minecraft.world.level.material.Material;
+import net.minecraft.world.level.pathfinder.BlockPathTypes;
+import net.minecraft.world.level.pathfinder.Node;
+import net.minecraft.world.level.pathfinder.PathComputationType;
+import net.minecraft.world.level.pathfinder.Target;
+import net.minecraft.world.phys.AABB;
+import net.minecraft.world.phys.Vec3;
+import net.minecraft.world.phys.shapes.VoxelShape;
+
+public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase {
+ private final Object2BooleanMap collisionCache = new Object2BooleanOpenHashMap();
+ protected float oldWaterCost;
+ private final Long2ObjectMap pathTypesByPosCache = new Long2ObjectOpenHashMap();
+
+ private boolean canReachWithoutCollision(Node var0) {
+ AABB var1 = this.mob.getBoundingBox();
+ Vec3 var2 = new Vec3(var0.x - this.mob.getX() + var1.getXsize() / 2.0,
+ var0.y - this.mob.getY() + var1.getYsize() / 2.0, var0.z - this.mob.getZ() + var1.getZsize() / 2.0);
+ int var3 = Mth.ceil(var2.length() / var1.getSize());
+ var2 = var2.scale(1.0F / var3);
+
+ for (int var4 = 1; var4 <= var3; ++var4) {
+ var1 = var1.move(var2);
+ if (this.hasCollisions(var1)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ protected boolean canStartAt(BlockPos var0) {
+ BlockPathTypes var1 = this.getBlockPathType(this.mob, var0);
+ return var1 != BlockPathTypes.OPEN && this.mob.getPathfindingMalus(var1) >= 0.0F;
+ }
+
+ @Override
+ public void done() {
+ this.mob.setPathfindingMalus(BlockPathTypes.WATER, this.oldWaterCost);
+ this.pathTypesByPosCache.clear();
+ this.collisionCache.clear();
+ super.done();
+ }
+
+ protected BlockPathTypes evaluateBlockPathType(BlockGetter var0, BlockPos var1, BlockPathTypes var2) {
+ boolean var3 = this.canPassDoors();
+ if (var2 == BlockPathTypes.DOOR_WOOD_CLOSED && this.canOpenDoors() && var3) {
+ var2 = BlockPathTypes.WALKABLE_DOOR;
+ }
+
+ if (var2 == BlockPathTypes.DOOR_OPEN && !var3) {
+ var2 = BlockPathTypes.BLOCKED;
+ }
+
+ if (var2 == BlockPathTypes.RAIL && !(var0.getBlockState(var1).getBlock() instanceof BaseRailBlock)
+ && !(var0.getBlockState(var1.below()).getBlock() instanceof BaseRailBlock)) {
+ var2 = BlockPathTypes.UNPASSABLE_RAIL;
+ }
+
+ return var2;
+ }
+
+ protected Node findAcceptedNode(int var0, int var1, int var2, int var3, double var4, Direction var6,
+ BlockPathTypes var7) {
+ Node var8 = null;
+ BlockPos.MutableBlockPos var9 = new BlockPos.MutableBlockPos();
+ double var10 = this.getFloorLevel(var9.set(var0, var1, var2));
+ if (var10 - var4 > this.getMobJumpHeight()) {
+ return null;
+ } else {
+ BlockPathTypes var12 = this.getCachedBlockType(this.mob, var0, var1, var2);
+ float var13 = this.mob.getPathfindingMalus(var12);
+ double var14 = this.mob.getBbWidth() / 2.0;
+ if (var13 >= 0.0F) {
+ var8 = this.getNodeAndUpdateCostToMax(var0, var1, var2, var12, var13);
+ }
+
+ if (doesBlockHavePartialCollision(var7) && var8 != null && var8.costMalus >= 0.0F
+ && !this.canReachWithoutCollision(var8)) {
+ var8 = null;
+ }
+
+ if (var12 == BlockPathTypes.WALKABLE || this.isAmphibious() && var12 == BlockPathTypes.WATER) {
+ return var8;
+ } else {
+ if ((var8 == null || var8.costMalus < 0.0F) && var3 > 0
+ && (var12 != BlockPathTypes.FENCE || this.canWalkOverFences())
+ && var12 != BlockPathTypes.UNPASSABLE_RAIL && var12 != BlockPathTypes.TRAPDOOR
+ && var12 != BlockPathTypes.POWDER_SNOW) {
+ var8 = this.findAcceptedNode(var0, var1 + 1, var2, var3 - 1, var4, var6, var7);
+ if (var8 != null && (var8.type == BlockPathTypes.OPEN || var8.type == BlockPathTypes.WALKABLE)
+ && this.mob.getBbWidth() < 1.0F) {
+ double var16 = var0 - var6.getStepX() + 0.5;
+ double var18 = var2 - var6.getStepZ() + 0.5;
+ AABB var20 = new AABB(var16 - var14,
+ this.getFloorLevel(var9.set(var16, var1 + 1, var18)) + 0.001, var18 - var14,
+ var16 + var14,
+ this.mob.getBbHeight() + this
+ .getFloorLevel(var9.set((double) var8.x, (double) var8.y, (double) var8.z))
+ - 0.002,
+ var18 + var14);
+ if (this.hasCollisions(var20)) {
+ var8 = null;
+ }
+ }
+ }
+
+ if (!this.isAmphibious() && var12 == BlockPathTypes.WATER && !this.canFloat()) {
+ if (this.getCachedBlockType(this.mob, var0, var1 - 1, var2) != BlockPathTypes.WATER) {
+ return var8;
+ }
+
+ while (var1 > this.mob.level.getMinBuildHeight()) {
+ --var1;
+ var12 = this.getCachedBlockType(this.mob, var0, var1, var2);
+ if (var12 != BlockPathTypes.WATER) {
+ return var8;
+ }
+
+ var8 = this.getNodeAndUpdateCostToMax(var0, var1, var2, var12,
+ this.mob.getPathfindingMalus(var12));
+ }
+ }
+
+ if (var12 == BlockPathTypes.OPEN) {
+ int var16 = 0;
+ int var17 = var1;
+
+ while (var12 == BlockPathTypes.OPEN) {
+ --var1;
+ if (var1 < this.mob.level.getMinBuildHeight()) {
+ return this.getBlockedNode(var0, var17, var2);
+ }
+
+ if (var16++ >= this.mob.getMaxFallDistance()) {
+ return this.getBlockedNode(var0, var1, var2);
+ }
+
+ var12 = this.getCachedBlockType(this.mob, var0, var1, var2);
+ var13 = this.mob.getPathfindingMalus(var12);
+ if (var12 != BlockPathTypes.OPEN && var13 >= 0.0F) {
+ var8 = this.getNodeAndUpdateCostToMax(var0, var1, var2, var12, var13);
+ break;
+ }
+
+ if (var13 < 0.0F) {
+ return this.getBlockedNode(var0, var1, var2);
+ }
+ }
+ }
+
+ if (doesBlockHavePartialCollision(var12) && var8 == null) {
+ var8 = this.getNode(var0, var1, var2);
+ var8.closed = true;
+ var8.type = var12;
+ var8.costMalus = var12.getMalus();
+ }
+
+ return var8;
+ }
+ }
+ }
+
+ private Node getBlockedNode(int var0, int var1, int var2) {
+ Node var3 = this.getNode(var0, var1, var2);
+ var3.type = BlockPathTypes.BLOCKED;
+ var3.costMalus = -1.0F;
+ return var3;
+ }
+
+ @Override
+ public BlockPathTypes getBlockPathType(BlockGetter var0, int var1, int var2, int var3) {
+ return getBlockPathTypeStatic(var0, new BlockPos.MutableBlockPos(var1, var2, var3));
+ }
+
+ public BlockPathTypes getBlockPathType(BlockGetter var0, int var1, int var2, int var3, EntityHumanNPC var4) {
+ EnumSet var5 = EnumSet.noneOf(BlockPathTypes.class);
+ BlockPathTypes var6 = BlockPathTypes.BLOCKED;
+ var6 = this.getBlockPathTypes(var0, var1, var2, var3, var5, var6, var4.blockPosition());
+ if (var5.contains(BlockPathTypes.FENCE)) {
+ return BlockPathTypes.FENCE;
+ } else if (var5.contains(BlockPathTypes.UNPASSABLE_RAIL)) {
+ return BlockPathTypes.UNPASSABLE_RAIL;
+ } else {
+ BlockPathTypes var7 = BlockPathTypes.BLOCKED;
+ Iterator var9 = var5.iterator();
+
+ while (var9.hasNext()) {
+ BlockPathTypes varr9 = (BlockPathTypes) var9.next();
+ if (var4.getPathfindingMalus(varr9) < 0.0F) {
+ return varr9;
+ }
+
+ if (var4.getPathfindingMalus(varr9) >= var4.getPathfindingMalus(var7)) {
+ var7 = varr9;
+ }
+ }
+
+ if (var6 == BlockPathTypes.OPEN && var4.getPathfindingMalus(var7) == 0.0F && this.entityWidth <= 1) {
+ return BlockPathTypes.OPEN;
+ } else {
+ return var7;
+ }
+ }
+ }
+
+ @Override
+ public BlockPathTypes getBlockPathType(BlockGetter var0, int var1, int var2, int var3, Mob var4) {
+ EnumSet var5 = EnumSet.noneOf(BlockPathTypes.class);
+ BlockPathTypes var6 = BlockPathTypes.BLOCKED;
+ var6 = this.getBlockPathTypes(var0, var1, var2, var3, var5, var6, var4.blockPosition());
+ if (var5.contains(BlockPathTypes.FENCE)) {
+ return BlockPathTypes.FENCE;
+ } else if (var5.contains(BlockPathTypes.UNPASSABLE_RAIL)) {
+ return BlockPathTypes.UNPASSABLE_RAIL;
+ } else {
+ BlockPathTypes var7 = BlockPathTypes.BLOCKED;
+ Iterator var9 = var5.iterator();
+
+ while (var9.hasNext()) {
+ BlockPathTypes varr9 = (BlockPathTypes) var9.next();
+ if (var4.getPathfindingMalus(varr9) < 0.0F) {
+ return varr9;
+ }
+
+ if (var4.getPathfindingMalus(varr9) >= var4.getPathfindingMalus(var7)) {
+ var7 = varr9;
+ }
+ }
+
+ if (var6 == BlockPathTypes.OPEN && var4.getPathfindingMalus(var7) == 0.0F && this.entityWidth <= 1) {
+ return BlockPathTypes.OPEN;
+ } else {
+ return var7;
+ }
+ }
+ }
+
+ protected BlockPathTypes getBlockPathType(EntityHumanNPC var0, BlockPos var1) {
+ return this.getCachedBlockType(var0, var1.getX(), var1.getY(), var1.getZ());
+ }
+
+ public BlockPathTypes getBlockPathTypes(BlockGetter var0, int var1, int var2, int var3, EnumSet var4,
+ BlockPathTypes var5, BlockPos var6) {
+ for (int var7 = 0; var7 < this.entityWidth; ++var7) {
+ for (int var8 = 0; var8 < this.entityHeight; ++var8) {
+ for (int var9 = 0; var9 < this.entityDepth; ++var9) {
+ int var10 = var7 + var1;
+ int var11 = var8 + var2;
+ int var12 = var9 + var3;
+ BlockPathTypes var13 = this.getBlockPathType(var0, var10, var11, var12);
+ var13 = this.evaluateBlockPathType(var0, var6, var13);
+ if (var7 == 0 && var8 == 0 && var9 == 0) {
+ var5 = var13;
+ }
+
+ var4.add(var13);
+ }
+ }
+ }
+
+ return var5;
+ }
+
+ protected BlockPathTypes getCachedBlockType(EntityHumanNPC var0, int var1, int var2, int var3) {
+ return (BlockPathTypes) this.pathTypesByPosCache.computeIfAbsent(BlockPos.asLong(var1, var2, var3), (var4) -> {
+ return this.getBlockPathType(this.level, var1, var2, var3, var0);
+ });
+ }
+
+ protected double getFloorLevel(BlockPos var0) {
+ return (this.canFloat() || this.isAmphibious()) && this.level.getFluidState(var0).is(FluidTags.WATER)
+ ? var0.getY() + 0.5
+ : getFloorLevel(this.level, var0);
+ }
+
+ @Override
+ public Target getGoal(double var0, double var2, double var4) {
+ return this.getTargetFromNode(this.getNode(Mth.floor(var0), Mth.floor(var2), Mth.floor(var4)));
+ }
+
+ private double getMobJumpHeight() {
+ return Math.max(1.125, this.mob.maxUpStep());
+ }
+
+ @Override
+ public int getNeighbors(Node[] var0, Node var1) {
+ int var2 = 0;
+ int var3 = 0;
+ BlockPathTypes var4 = this.getCachedBlockType(this.mob, var1.x, var1.y + 1, var1.z);
+ BlockPathTypes var5 = this.getCachedBlockType(this.mob, var1.x, var1.y, var1.z);
+ if (this.mob.getPathfindingMalus(var4) >= 0.0F && var5 != BlockPathTypes.STICKY_HONEY) {
+ var3 = Mth.floor(Math.max(1.0F, this.mob.maxUpStep()));
+ }
+
+ double var6 = this.getFloorLevel(new BlockPos(var1.x, var1.y, var1.z));
+ Node var8 = this.findAcceptedNode(var1.x, var1.y, var1.z + 1, var3, var6, Direction.SOUTH, var5);
+ if (this.isNeighborValid(var8, var1)) {
+ var0[var2++] = var8;
+ }
+
+ Node var9 = this.findAcceptedNode(var1.x - 1, var1.y, var1.z, var3, var6, Direction.WEST, var5);
+ if (this.isNeighborValid(var9, var1)) {
+ var0[var2++] = var9;
+ }
+
+ Node var10 = this.findAcceptedNode(var1.x + 1, var1.y, var1.z, var3, var6, Direction.EAST, var5);
+ if (this.isNeighborValid(var10, var1)) {
+ var0[var2++] = var10;
+ }
+
+ Node var11 = this.findAcceptedNode(var1.x, var1.y, var1.z - 1, var3, var6, Direction.NORTH, var5);
+ if (this.isNeighborValid(var11, var1)) {
+ var0[var2++] = var11;
+ }
+
+ Node var12 = this.findAcceptedNode(var1.x - 1, var1.y, var1.z - 1, var3, var6, Direction.NORTH, var5);
+ if (this.isDiagonalValid(var1, var9, var11, var12)) {
+ var0[var2++] = var12;
+ }
+
+ Node var13 = this.findAcceptedNode(var1.x + 1, var1.y, var1.z - 1, var3, var6, Direction.NORTH, var5);
+ if (this.isDiagonalValid(var1, var10, var11, var13)) {
+ var0[var2++] = var13;
+ }
+
+ Node var14 = this.findAcceptedNode(var1.x - 1, var1.y, var1.z + 1, var3, var6, Direction.SOUTH, var5);
+ if (this.isDiagonalValid(var1, var9, var8, var14)) {
+ var0[var2++] = var14;
+ }
+
+ Node var15 = this.findAcceptedNode(var1.x + 1, var1.y, var1.z + 1, var3, var6, Direction.SOUTH, var5);
+ if (this.isDiagonalValid(var1, var10, var8, var15)) {
+ var0[var2++] = var15;
+ }
+
+ return var2;
+ }
+
+ private Node getNodeAndUpdateCostToMax(int var0, int var1, int var2, BlockPathTypes var3, float var4) {
+ Node var5 = this.getNode(var0, var1, var2);
+ var5.type = var3;
+ var5.costMalus = Math.max(var5.costMalus, var4);
+ return var5;
+ }
+
+ @Override
+ public Node getStart() {
+ BlockPos.MutableBlockPos var1 = new BlockPos.MutableBlockPos();
+ int var0 = this.mob.getBlockY();
+ BlockState var2 = this.level.getBlockState(var1.set(this.mob.getX(), var0, this.mob.getZ()));
+ BlockPos var3;
+ if (!this.mob.canStandOnFluid(var2.getFluidState())) {
+ if (this.canFloat() && this.mob.isInWater()) {
+ while (true) {
+ if (!var2.is(Blocks.WATER) && var2.getFluidState() != Fluids.WATER.getSource(false)) {
+ --var0;
+ break;
+ }
+
+ ++var0;
+ var2 = this.level.getBlockState(var1.set(this.mob.getX(), var0, this.mob.getZ()));
+ }
+ } else if (this.mob.isOnGround()) {
+ var0 = Mth.floor(this.mob.getY() + 0.5);
+ } else {
+ for (var3 = this.mob.blockPosition(); (this.level.getBlockState(var3).isAir()
+ || this.level.getBlockState(var3).isPathfindable(this.level, var3, PathComputationType.LAND))
+ && var3.getY() > this.mob.level.getMinBuildHeight(); var3 = var3.below()) {
+ }
+
+ var0 = var3.above().getY();
+ }
+ } else {
+ while (true) {
+ if (!this.mob.canStandOnFluid(var2.getFluidState())) {
+ --var0;
+ break;
+ }
+
+ ++var0;
+ var2 = this.level.getBlockState(var1.set(this.mob.getX(), var0, this.mob.getZ()));
+ }
+ }
+
+ var3 = this.mob.blockPosition();
+ if (!this.canStartAt(var1.set(var3.getX(), var0, var3.getZ()))) {
+ AABB var4 = this.mob.getBoundingBox();
+ if (this.canStartAt(var1.set(var4.minX, var0, var4.minZ))
+ || this.canStartAt(var1.set(var4.minX, var0, var4.maxZ))
+ || this.canStartAt(var1.set(var4.maxX, var0, var4.minZ))
+ || this.canStartAt(var1.set(var4.maxX, var0, var4.maxZ))) {
+ return this.getStartNode(var1);
+ }
+ }
+
+ return this.getStartNode(new BlockPos(var3.getX(), var0, var3.getZ()));
+ }
+
+ protected Node getStartNode(BlockPos var0) {
+ Node var1 = this.getNode(var0);
+ var1.type = this.getBlockPathType(this.mob, var1.asBlockPos());
+ var1.costMalus = this.mob.getPathfindingMalus(var1.type);
+ return var1;
+ }
+
+ private boolean hasCollisions(AABB var0) {
+ return this.collisionCache.computeIfAbsent(var0, (var1) -> {
+ return !this.level.noCollision(this.mob, var0);
+ });
+ }
+
+ protected boolean isAmphibious() {
+ return false;
+ }
+
+ protected boolean isDiagonalValid(Node var0, Node var1, Node var2, Node var3) {
+ if (var3 != null && var2 != null && var1 != null) {
+ if (var3.closed) {
+ return false;
+ } else if (var2.y <= var0.y && var1.y <= var0.y) {
+ if (var1.type != BlockPathTypes.WALKABLE_DOOR && var2.type != BlockPathTypes.WALKABLE_DOOR
+ && var3.type != BlockPathTypes.WALKABLE_DOOR) {
+ boolean var4 = var2.type == BlockPathTypes.FENCE && var1.type == BlockPathTypes.FENCE
+ && this.mob.getBbWidth() < 0.5;
+ return var3.costMalus >= 0.0F && (var2.y < var0.y || var2.costMalus >= 0.0F || var4)
+ && (var1.y < var0.y || var1.costMalus >= 0.0F || var4);
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ protected boolean isNeighborValid(Node var0, Node var1) {
+ return var0 != null && !var0.closed && (var0.costMalus >= 0.0F || var1.costMalus < 0.0F);
+ }
+
+ @Override
+ public void prepare(PathNavigationRegion var0, EntityHumanNPC var1) {
+ super.prepare(var0, var1);
+ this.oldWaterCost = var1.getPathfindingMalus(BlockPathTypes.WATER);
+ }
+
+ @Override
+ public void prepare(PathNavigationRegion var0, Mob var1) {
+ super.prepare(var0, var1);
+ this.oldWaterCost = var1.getPathfindingMalus(BlockPathTypes.WATER);
+ }
+
+ public static BlockPathTypes checkNeighbourBlocks(BlockGetter var0, BlockPos.MutableBlockPos var1,
+ BlockPathTypes var2) {
+ int var3 = var1.getX();
+ int var4 = var1.getY();
+ int var5 = var1.getZ();
+
+ for (int var6 = -1; var6 <= 1; ++var6) {
+ for (int var7 = -1; var7 <= 1; ++var7) {
+ for (int var8 = -1; var8 <= 1; ++var8) {
+ if (var6 != 0 || var8 != 0) {
+ var1.set(var3 + var6, var4 + var7, var5 + var8);
+ BlockState var9 = var0.getBlockState(var1);
+ if (var9.is(Blocks.CACTUS) || var9.is(Blocks.SWEET_BERRY_BUSH)) {
+ return BlockPathTypes.DANGER_OTHER;
+ }
+
+ if (isBurningBlock(var9)) {
+ return BlockPathTypes.DANGER_FIRE;
+ }
+
+ if (var0.getFluidState(var1).is(FluidTags.WATER)) {
+ return BlockPathTypes.WATER_BORDER;
+ }
+ }
+ }
+ }
+ }
+
+ return var2;
+ }
+
+ private static boolean doesBlockHavePartialCollision(BlockPathTypes var0) {
+ return var0 == BlockPathTypes.FENCE || var0 == BlockPathTypes.DOOR_WOOD_CLOSED
+ || var0 == BlockPathTypes.DOOR_IRON_CLOSED;
+ }
+
+ protected static BlockPathTypes getBlockPathTypeRaw(BlockGetter var0, BlockPos var1) {
+ BlockState var2 = var0.getBlockState(var1);
+ Block var3 = var2.getBlock();
+ Material var4 = var2.getMaterial();
+ if (var2.isAir()) {
+ return BlockPathTypes.OPEN;
+ } else if (!var2.is(BlockTags.TRAPDOORS) && !var2.is(Blocks.LILY_PAD) && !var2.is(Blocks.BIG_DRIPLEAF)) {
+ if (var2.is(Blocks.POWDER_SNOW)) {
+ return BlockPathTypes.POWDER_SNOW;
+ } else if (!var2.is(Blocks.CACTUS) && !var2.is(Blocks.SWEET_BERRY_BUSH)) {
+ if (var2.is(Blocks.HONEY_BLOCK)) {
+ return BlockPathTypes.STICKY_HONEY;
+ } else if (var2.is(Blocks.COCOA)) {
+ return BlockPathTypes.COCOA;
+ } else {
+ FluidState var5 = var0.getFluidState(var1);
+ if (var5.is(FluidTags.LAVA)) {
+ return BlockPathTypes.LAVA;
+ } else if (isBurningBlock(var2)) {
+ return BlockPathTypes.DAMAGE_FIRE;
+ } else if (DoorBlock.isWoodenDoor(var2) && !(Boolean) var2.getValue(DoorBlock.OPEN)) {
+ return BlockPathTypes.DOOR_WOOD_CLOSED;
+ } else if (var3 instanceof DoorBlock && var4 == Material.METAL
+ && !(Boolean) var2.getValue(DoorBlock.OPEN)) {
+ return BlockPathTypes.DOOR_IRON_CLOSED;
+ } else if (var3 instanceof DoorBlock && var2.getValue(DoorBlock.OPEN)) {
+ return BlockPathTypes.DOOR_OPEN;
+ } else if (var3 instanceof BaseRailBlock) {
+ return BlockPathTypes.RAIL;
+ } else if (var3 instanceof LeavesBlock) {
+ return BlockPathTypes.LEAVES;
+ } else if (var2.is(BlockTags.FENCES) || var2.is(BlockTags.WALLS)
+ || var3 instanceof FenceGateBlock && !(Boolean) var2.getValue(FenceGateBlock.OPEN)) {
+ return BlockPathTypes.FENCE;
+ } else if (!var2.isPathfindable(var0, var1, PathComputationType.LAND)) {
+ return BlockPathTypes.BLOCKED;
+ } else {
+ return var5.is(FluidTags.WATER) ? BlockPathTypes.WATER : BlockPathTypes.OPEN;
+ }
+ }
+ } else {
+ return BlockPathTypes.DAMAGE_OTHER;
+ }
+ } else {
+ return BlockPathTypes.TRAPDOOR;
+ }
+ }
+
+ public static BlockPathTypes getBlockPathTypeStatic(BlockGetter var0, BlockPos.MutableBlockPos var1) {
+ int var2 = var1.getX();
+ int var3 = var1.getY();
+ int var4 = var1.getZ();
+ BlockPathTypes var5 = getBlockPathTypeRaw(var0, var1);
+ if (var5 == BlockPathTypes.OPEN && var3 >= var0.getMinBuildHeight() + 1) {
+ BlockPathTypes var6 = getBlockPathTypeRaw(var0, var1.set(var2, var3 - 1, var4));
+ var5 = var6 != BlockPathTypes.WALKABLE && var6 != BlockPathTypes.OPEN && var6 != BlockPathTypes.WATER
+ && var6 != BlockPathTypes.LAVA ? BlockPathTypes.WALKABLE : BlockPathTypes.OPEN;
+ if (var6 == BlockPathTypes.DAMAGE_FIRE) {
+ var5 = BlockPathTypes.DAMAGE_FIRE;
+ }
+
+ if (var6 == BlockPathTypes.DAMAGE_OTHER) {
+ var5 = BlockPathTypes.DAMAGE_OTHER;
+ }
+
+ if (var6 == BlockPathTypes.STICKY_HONEY) {
+ var5 = BlockPathTypes.STICKY_HONEY;
+ }
+
+ if (var6 == BlockPathTypes.POWDER_SNOW) {
+ var5 = BlockPathTypes.DANGER_POWDER_SNOW;
+ }
+ }
+
+ if (var5 == BlockPathTypes.WALKABLE) {
+ var5 = checkNeighbourBlocks(var0, var1.set(var2, var3, var4), var5);
+ }
+
+ return var5;
+ }
+
+ public static double getFloorLevel(BlockGetter var0, BlockPos var1) {
+ BlockPos var2 = var1.below();
+ VoxelShape var3 = var0.getBlockState(var2).getCollisionShape(var0, var2);
+ return var2.getY() + (var3.isEmpty() ? 0.0 : var3.max(Axis.Y));
+ }
+
+ public static boolean isBurningBlock(BlockState var0) {
+ return var0.is(BlockTags.FIRE) || var0.is(Blocks.LAVA) || var0.is(Blocks.MAGMA_BLOCK)
+ || CampfireBlock.isLitCampfire(var0) || var0.is(Blocks.LAVA_CAULDRON);
+ }
+
+ private static final double DEFAULT_MOB_JUMP_HEIGHT = 1.125;
+ public static final double SPACE_BETWEEN_WALL_POSTS = 0.5;
+
+}
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerNodeEvaluatorBase.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerNodeEvaluatorBase.java
similarity index 70%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerNodeEvaluatorBase.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerNodeEvaluatorBase.java
index 727cc20c5..57c02eebc 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerNodeEvaluatorBase.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerNodeEvaluatorBase.java
@@ -1,8 +1,8 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
-import net.citizensnpcs.nms.v1_19_R2.entity.EntityHumanNPC;
+import net.citizensnpcs.nms.v1_19_R3.entity.EntityHumanNPC;
import net.minecraft.core.BlockPos;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Mob;
@@ -11,15 +11,16 @@ import net.minecraft.world.level.pathfinder.Node;
import net.minecraft.world.level.pathfinder.NodeEvaluator;
public abstract class PlayerNodeEvaluatorBase extends NodeEvaluator {
- protected final Int2ObjectMap c = new Int2ObjectOpenHashMap();
protected boolean canFloat;
protected boolean canOpenDoors;
protected boolean canPassDoors;
+ protected boolean canWalkOverFences;
protected int entityDepth;
protected int entityHeight;
protected int entityWidth;
protected PathNavigationRegion level;
protected EntityHumanNPC mob;
+ protected final Int2ObjectMap nodes = new Int2ObjectOpenHashMap();
@Override
public boolean canFloat() {
@@ -36,6 +37,11 @@ public abstract class PlayerNodeEvaluatorBase extends NodeEvaluator {
return this.canPassDoors;
}
+ @Override
+ public boolean canWalkOverFences() {
+ return this.canWalkOverFences;
+ }
+
@Override
public void done() {
this.level = null;
@@ -44,18 +50,25 @@ public abstract class PlayerNodeEvaluatorBase extends NodeEvaluator {
@Override
protected Node getNode(BlockPos var0) {
- return getNode(var0.getX(), var0.getY(), var0.getZ());
+ return this.getNode(var0.getX(), var0.getY(), var0.getZ());
}
@Override
protected Node getNode(int var0, int var1, int var2) {
- return this.c.computeIfAbsent(Node.createHash(var0, var1, var2), var3 -> new Node(var0, var1, var2));
+ return this.nodes.computeIfAbsent(Node.createHash(var0, var1, var2), (var3) -> {
+ return new Node(var0, var1, var2);
+ });
+ }
+
+ @Override
+ protected net.minecraft.world.level.pathfinder.Target getTargetFromNode(Node var0) {
+ return new net.minecraft.world.level.pathfinder.Target(var0);
}
public void prepare(PathNavigationRegion var0, EntityHumanNPC var1) {
- this.level = var0;
this.mob = var1;
- this.c.clear();
+ this.level = var0;
+ this.nodes.clear();
this.entityWidth = Mth.floor(var1.getBbWidth() + 1.0F);
this.entityHeight = Mth.floor(var1.getBbHeight() + 1.0F);
this.entityDepth = Mth.floor(var1.getBbWidth() + 1.0F);
@@ -64,7 +77,7 @@ public abstract class PlayerNodeEvaluatorBase extends NodeEvaluator {
@Override
public void prepare(PathNavigationRegion var0, Mob var1) {
this.level = var0;
- this.c.clear();
+ this.nodes.clear();
this.entityWidth = Mth.floor(var1.getBbWidth() + 1.0F);
this.entityHeight = Mth.floor(var1.getBbHeight() + 1.0F);
this.entityDepth = Mth.floor(var1.getBbWidth() + 1.0F);
@@ -84,4 +97,9 @@ public abstract class PlayerNodeEvaluatorBase extends NodeEvaluator {
public void setCanPassDoors(boolean var0) {
this.canPassDoors = var0;
}
+
+ @Override
+ public void setCanWalkOverFences(boolean var0) {
+ this.canWalkOverFences = var0;
+ }
}
diff --git a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerPathfinder.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerPathfinder.java
similarity index 98%
rename from v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerPathfinder.java
rename to v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerPathfinder.java
index b9a8a0699..8898b0f2c 100644
--- a/v1_19_R2/src/main/java/net/citizensnpcs/nms/v1_19_R2/util/PlayerPathfinder.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerPathfinder.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_19_R2.util;
+package net.citizensnpcs.nms.v1_19_R3.util;
import java.util.Comparator;
import java.util.List;
@@ -13,7 +13,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import net.citizensnpcs.Settings.Setting;
-import net.citizensnpcs.nms.v1_19_R2.entity.EntityHumanNPC;
+import net.citizensnpcs.nms.v1_19_R3.entity.EntityHumanNPC;
import net.minecraft.core.BlockPos;
import net.minecraft.util.profiling.ProfilerFiller;
import net.minecraft.world.entity.Mob;
diff --git a/v1_8_R3/pom.xml b/v1_8_R3/pom.xml
index cd7b5bea9..e870ebf35 100644
--- a/v1_8_R3/pom.xml
+++ b/v1_8_R3/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.30-SNAPSHOT
+ 2.0.31-SNAPSHOT
citizens-v1_8_R3