diff --git a/main/pom.xml b/main/pom.xml
index a5639c1d3..ae7f49d62 100644
--- a/main/pom.xml
+++ b/main/pom.xml
@@ -4,12 +4,12 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
citizens-main
UTF-8
- 1.20.4-R0.1-SNAPSHOT
+ 1.20.5-R0.1-SNAPSHOT
2.11.5
${project.version}
7.1.0-SNAPSHOT
diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
index fa3dfa366..a35c37aff 100644
--- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
+++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
@@ -960,8 +960,11 @@ public class NPCCommands {
max = 1,
flags = "b",
permission = "citizens.npc.endercrystal")
- @Requirements(ownership = true, selected = true, types = EntityType.ENDER_CRYSTAL)
+ @Requirements(ownership = true, selected = true)
public void endercrystal(CommandContext args, CommandSender sender, NPC npc) throws CommandException {
+ if (!npc.getOrAddTrait(MobType.class).getType().name().equals("END_CRYSTAL")
+ && !npc.getOrAddTrait(MobType.class).getType().name().equals("ENDER_CRYSTAL"))
+ throw new CommandException();
if (args.hasFlag('b')) {
EnderCrystalTrait trait = npc.getOrAddTrait(EnderCrystalTrait.class);
boolean showing = !trait.isShowBase();
@@ -1396,8 +1399,9 @@ public class NPCCommands {
public void item(CommandContext args, CommandSender sender, NPC npc, @Arg(1) Material mat, @Arg(2) String modify)
throws CommandException {
EntityType type = npc.getOrAddTrait(MobType.class).getType();
- if (!type.name().contains("ITEM_FRAME") && !type.name().contains("ITEM_DISPLAY")
- && !type.name().contains("BLOCK_DISPLAY") && type != EntityType.DROPPED_ITEM
+ if (!type.name().equals("OMINOUS_ITEM_SPAWNER") && !type.name().contains("ITEM_FRAME")
+ && !type.name().contains("ITEM_DISPLAY") && !type.name().contains("BLOCK_DISPLAY")
+ && !type.name().equals("DROPPED_ITEM") && !type.name().equals("ITEM")
&& type != EntityType.FALLING_BLOCK)
throw new CommandException(CommandMessages.REQUIREMENTS_INVALID_MOB_TYPE, Util.prettyEnum(type));
ItemStack stack = args.hasFlag('h') ? ((Player) sender).getItemInHand() : new ItemStack(mat, 1);
@@ -1745,14 +1749,11 @@ public class NPCCommands {
max = 1,
flags = "",
permission = "citizens.npc.minecart")
- @Requirements(
- selected = true,
- ownership = true,
- types = { EntityType.MINECART, EntityType.MINECART_CHEST, EntityType.MINECART_COMMAND,
- EntityType.MINECART_FURNACE, EntityType.MINECART_HOPPER, EntityType.MINECART_MOB_SPAWNER,
- EntityType.MINECART_TNT })
+ @Requirements(selected = true, ownership = true)
public void minecart(CommandContext args, CommandSender sender, NPC npc, @Flag("item") String item)
throws CommandException {
+ if (!npc.getOrAddTrait(MobType.class).getType().name().contains("MINECRAFT"))
+ throw new CommandUsageException();
if (item != null) {
int data = 0;
if (item.contains(":")) {
diff --git a/main/src/main/java/net/citizensnpcs/npc/CitizensNPCRegistry.java b/main/src/main/java/net/citizensnpcs/npc/CitizensNPCRegistry.java
index 44bb5292b..5676e3eab 100644
--- a/main/src/main/java/net/citizensnpcs/npc/CitizensNPCRegistry.java
+++ b/main/src/main/java/net/citizensnpcs/npc/CitizensNPCRegistry.java
@@ -85,7 +85,8 @@ public class CitizensNPCRegistry implements NPCRegistry {
@Override
public NPC createNPCUsingItem(EntityType type, String name, ItemStack item) {
NPC npc = createNPC(type, name);
- if (type == EntityType.DROPPED_ITEM || type == EntityType.FALLING_BLOCK || type == EntityType.ITEM_FRAME
+ if (type.name().equals("OMINOUS_ITEM_SPAWNER") || type.name().equals("DROPPED_ITEM")
+ || type.name().equals("ITEM") || type == EntityType.FALLING_BLOCK || type == EntityType.ITEM_FRAME
|| type.name().equals("GLOW_ITEM_FRAME") || type.name().equals("ITEM_DISPLAY")
|| type.name().equals("BLOCK_DISPLAY")) {
npc.data().set(NPC.Metadata.ITEM_AMOUNT, item.getAmount());
diff --git a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java
index b790bb66a..4b39a073d 100644
--- a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java
+++ b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java
@@ -538,7 +538,7 @@ public class HologramTrait extends Trait {
Material item = SpigotUtil.isUsing1_13API() ? Material.matchMaterial(itemMatcher.group(1), false)
: Material.matchMaterial(itemMatcher.group(1));
ItemStack itemStack = new ItemStack(item, 1);
- itemNPC = registry.createNPCUsingItem(EntityType.DROPPED_ITEM, "", itemStack);
+ itemNPC = registry.createNPCUsingItem(Util.getFallbackEntityType("ITEM", "DROPPED_ITEM"), "", itemStack);
itemNPC.data().setPersistent(NPC.Metadata.NAMEPLATE_VISIBLE, false);
if (itemMatcher.group(2) != null) {
if (itemMatcher.group(2).charAt(1) == '{') {
diff --git a/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java b/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java
index 548a2442f..78c90ecaf 100644
--- a/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java
+++ b/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java
@@ -245,12 +245,6 @@ public class ScoreboardTrait extends Trait {
changed = false;
}
- public enum TeamPacketMode {
- ADD,
- REMOVE,
- UPDATE;
- }
-
private static boolean SUPPORT_COLLIDABLE_SETOPTION = true;
private static boolean SUPPORT_GLOWING_COLOR = true;
private static boolean SUPPORT_TAGS = true;
diff --git a/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java b/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java
index 99c94f6a2..aaf0e80c9 100644
--- a/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java
+++ b/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java
@@ -279,7 +279,7 @@ public class ItemAction extends NPCShopAction {
"Compare item similarity", base.compareSimilarity ? ChatColor.GREEN + "On" : ChatColor.RED + "Off");
ctx.getSlot(3 * 9 + 2)
.addClickHandler(InputMenus.toggler(res -> base.compareSimilarity = res, base.compareSimilarity));
- ctx.getSlot(3 * 9 + 3).setItemStack(new ItemStack(Material.BOOK), "NBT comparison filter",
+ ctx.getSlot(3 * 9 + 3).setItemStack(new ItemStack(Material.BOOK), "Component comparison filter",
Joiner.on("\n").join(base.metaFilter));
ctx.getSlot(3 * 9 + 3)
.addClickHandler(event -> ctx.getMenu()
diff --git a/main/src/main/java/net/citizensnpcs/trait/versioned/MushroomCowTrait.java b/main/src/main/java/net/citizensnpcs/trait/versioned/MushroomCowTrait.java
index 8de113c26..ef1b0d861 100644
--- a/main/src/main/java/net/citizensnpcs/trait/versioned/MushroomCowTrait.java
+++ b/main/src/main/java/net/citizensnpcs/trait/versioned/MushroomCowTrait.java
@@ -1,7 +1,6 @@
package net.citizensnpcs.trait.versioned;
import org.bukkit.command.CommandSender;
-import org.bukkit.entity.EntityType;
import org.bukkit.entity.MushroomCow;
import org.bukkit.entity.MushroomCow.Variant;
@@ -15,6 +14,7 @@ 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.trait.trait.MobType;
import net.citizensnpcs.api.util.Messaging;
import net.citizensnpcs.util.Messages;
import net.citizensnpcs.util.Util;
@@ -52,13 +52,16 @@ public class MushroomCowTrait extends Trait {
aliases = { "npc" },
usage = "mushroomcow (--variant [variant])",
desc = "",
- modifiers = { "mushroomcow" },
+ modifiers = { "mushroomcow", "mooshroom" },
min = 1,
max = 1,
permission = "citizens.npc.mushroomcow")
- @Requirements(selected = true, ownership = true, types = { EntityType.MUSHROOM_COW })
+ @Requirements(selected = true, ownership = true)
public static void mushroomcow(CommandContext args, CommandSender sender, NPC npc,
@Flag("variant") MushroomCow.Variant variant) throws CommandException {
+ if (!npc.getOrAddTrait(MobType.class).getType().name().equals("MOOSHROOM")
+ && !npc.getOrAddTrait(MobType.class).getType().name().equals("MUSHROOM_COW"))
+ throw new CommandUsageException();
MushroomCowTrait trait = npc.getOrAddTrait(MushroomCowTrait.class);
boolean hasArg = false;
if (args.hasValueFlag("variant")) {
diff --git a/main/src/main/java/net/citizensnpcs/trait/versioned/SnowmanTrait.java b/main/src/main/java/net/citizensnpcs/trait/versioned/SnowmanTrait.java
index be4130a20..ae8134673 100644
--- a/main/src/main/java/net/citizensnpcs/trait/versioned/SnowmanTrait.java
+++ b/main/src/main/java/net/citizensnpcs/trait/versioned/SnowmanTrait.java
@@ -1,7 +1,6 @@
package net.citizensnpcs.trait.versioned;
import org.bukkit.command.CommandSender;
-import org.bukkit.entity.EntityType;
import org.bukkit.entity.Snowman;
import net.citizensnpcs.api.command.Command;
@@ -13,6 +12,7 @@ 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.trait.trait.MobType;
import net.citizensnpcs.api.util.Messaging;
import net.citizensnpcs.util.Messages;
@@ -58,13 +58,16 @@ public class SnowmanTrait extends Trait {
aliases = { "npc" },
usage = "snowman (-d[erp]) (-f[orm snow])",
desc = "",
- modifiers = { "snowman" },
+ modifiers = { "snowman", "snowgolem" },
min = 1,
max = 1,
flags = "df",
permission = "citizens.npc.snowman")
- @Requirements(selected = true, ownership = true, types = { EntityType.SNOWMAN })
+ @Requirements(selected = true, ownership = true)
public static void snowman(CommandContext args, CommandSender sender, NPC npc) throws CommandException {
+ if (!npc.getOrAddTrait(MobType.class).getType().name().equals("SNOWMAN")
+ && !npc.getOrAddTrait(MobType.class).getType().name().equals("SNOW_GOLEM"))
+ throw new CommandUsageException();
SnowmanTrait trait = npc.getOrAddTrait(SnowmanTrait.class);
boolean hasArg = false;
if (args.hasFlag('d')) {
diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/EntityMarkers.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/EntityMarkers.java
index 157d41680..69f605726 100644
--- a/main/src/main/java/net/citizensnpcs/trait/waypoint/EntityMarkers.java
+++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/EntityMarkers.java
@@ -15,6 +15,7 @@ import net.citizensnpcs.api.npc.MemoryNPCDataStore;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.npc.NPCRegistry;
import net.citizensnpcs.npc.ai.NPCHolder;
+import net.citizensnpcs.util.Util;
/**
* A helper class for storing a number of entity markers. By default an entity marker is a non-persisted EnderSignal.
@@ -78,12 +79,6 @@ public class EntityMarkers {
return npc.getEntity();
}
- private static EntityType DEFAULT_ENTITY_TYPE = EntityType.ENDER_SIGNAL;
+ private static final EntityType DEFAULT_ENTITY_TYPE = Util.getFallbackEntityType("SHULKER_BULLET", "ENDER_SIGNAL");
- static {
- try {
- DEFAULT_ENTITY_TYPE = EntityType.valueOf("SHULKER_BULLET");
- } catch (IllegalArgumentException e) {
- }
- }
}
\ No newline at end of file
diff --git a/main/src/main/java/net/citizensnpcs/util/Util.java b/main/src/main/java/net/citizensnpcs/util/Util.java
index 63fd00ae9..2dc863573 100644
--- a/main/src/main/java/net/citizensnpcs/util/Util.java
+++ b/main/src/main/java/net/citizensnpcs/util/Util.java
@@ -240,6 +240,16 @@ public class Util {
return entity instanceof LivingEntity ? ((LivingEntity) entity).getEyeLocation() : entity.getLocation();
}
+ public static EntityType getFallbackEntityType(String first, String second) {
+ for (EntityType type : EntityType.values()) {
+ if (type.name().equals(first))
+ return type;
+ if (type.name().equals(second))
+ return type;
+ }
+ return null;
+ }
+
public static Material getFallbackMaterial(String first, String... second) {
try {
return Material.valueOf(first);
@@ -274,10 +284,8 @@ public class Util {
}
public static boolean isAlwaysFlyable(EntityType type) {
- if (type.name().toLowerCase().equals("vex") || type.name().toLowerCase().equals("parrot")
- || type.name().toLowerCase().equals("allay") || type.name().toLowerCase().equals("bee")
- || type.name().toLowerCase().equals("phantom"))
- // 1.8.8 compatibility
+ if (type.name().equals("VEX") || type.name().equals("PARROT") || type.name().equals("ALLAY")
+ || type.name().equals("BEE") || type.name().equals("PHANTOM") || type.name().equals("BREEZE"))
return true;
switch (type) {
case BAT:
@@ -339,7 +347,7 @@ public class Util {
toMatch = toMatch.toLowerCase().replace('-', '_').replace(' ', '_');
for (T check : values) {
if (toMatch.equals(check.name().toLowerCase())
- || toMatch.equals("item") && check == EntityType.DROPPED_ITEM)
+ || toMatch.equals("item") && check.name().equals("DROPPED_ITEM"))
return check; // check for an exact match first
}
@@ -600,6 +608,7 @@ public class Util {
private static final Scoreboard DUMMY_SCOREBOARD = Bukkit.getScoreboardManager().getNewScoreboard();
private static boolean SUPPORTS_BUKKIT_GETENTITY = true;
private static boolean SUPPORTS_ENTITY_CANSEE = true;
+
private static final DecimalFormat TWO_DIGIT_DECIMAL = new DecimalFormat();
static {
diff --git a/pom.xml b/pom.xml
index ddd473b47..070c8163e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,16 +6,16 @@
pom
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
Unknown
- 2.0.33
- 3.5.0
- 3.5.0
+ 2.0.34
+ 3.6.3
+ 3.7.1
3.1.1
- 3.11.0
- 3.3.0
- 3.4.1
+ 3.13.0
+ 3.4.1
+ 3.5.2
@@ -44,7 +44,7 @@
v1_16_R3
v1_18_R2
v1_19_R3
- v1_20_R3
+ v1_20_R4
dist
@@ -63,7 +63,7 @@
v1_17_R1
v1_18_R2
v1_19_R3
- v1_20_R3
+ v1_20_R4
dist
@@ -71,7 +71,7 @@
dev
main
- v1_20_R3
+ v1_20_R4
dist
diff --git a/v1_10_R1/pom.xml b/v1_10_R1/pom.xml
index 5a34ce579..da6921ff6 100644
--- a/v1_10_R1/pom.xml
+++ b/v1_10_R1/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
citizens-v1_10_R1
diff --git a/v1_11_R1/pom.xml b/v1_11_R1/pom.xml
index 38d6cdf42..88e223af9 100644
--- a/v1_11_R1/pom.xml
+++ b/v1_11_R1/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
citizens-v1_11_R1
diff --git a/v1_12_R1/pom.xml b/v1_12_R1/pom.xml
index 15dced94e..d5830357f 100644
--- a/v1_12_R1/pom.xml
+++ b/v1_12_R1/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
citizens-v1_12_R1
diff --git a/v1_13_R2/pom.xml b/v1_13_R2/pom.xml
index 2bd21559a..6e4d3e20e 100644
--- a/v1_13_R2/pom.xml
+++ b/v1_13_R2/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
citizens-v1_13_R2
diff --git a/v1_14_R1/pom.xml b/v1_14_R1/pom.xml
index 2c5cd717f..30461c6ae 100644
--- a/v1_14_R1/pom.xml
+++ b/v1_14_R1/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
citizens-v1_14_R1
diff --git a/v1_15_R1/pom.xml b/v1_15_R1/pom.xml
index ca5718a63..dc87f710f 100644
--- a/v1_15_R1/pom.xml
+++ b/v1_15_R1/pom.xml
@@ -4,7 +4,7 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
citizens-v1_15_R1
diff --git a/v1_16_R3/pom.xml b/v1_16_R3/pom.xml
index 2b14af460..b4d1f4f6f 100644
--- a/v1_16_R3/pom.xml
+++ b/v1_16_R3/pom.xml
@@ -4,7 +4,7 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
citizens-v1_16_R3
diff --git a/v1_17_R1/pom.xml b/v1_17_R1/pom.xml
index 419fa00f2..748235957 100644
--- a/v1_17_R1/pom.xml
+++ b/v1_17_R1/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
citizens-v1_17_R1
diff --git a/v1_18_R2/pom.xml b/v1_18_R2/pom.xml
index 0e70aee77..7450f89d7 100644
--- a/v1_18_R2/pom.xml
+++ b/v1_18_R2/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
citizens-v1_18_R2
diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/CustomEntityRegistry.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/CustomEntityRegistry.java
index 970ac8ca5..ef11f1001 100644
--- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/CustomEntityRegistry.java
+++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/CustomEntityRegistry.java
@@ -311,26 +311,32 @@ public class CustomEntityRegistry extends DefaultedRegistry implements Supplier<
minecraftClassMap.put(EntityType.BOAT, Boat.class);
minecraftClassMap.put(EntityType.CAT, Cat.class);
minecraftClassMap.put(EntityType.CAVE_SPIDER, CaveSpider.class);
+ minecraftClassMap.put(EntityType.CHEST_MINECART, MinecartChest.class);
minecraftClassMap.put(EntityType.CHICKEN, Chicken.class);
minecraftClassMap.put(EntityType.COD, Cod.class);
+ minecraftClassMap.put(EntityType.COMMAND_BLOCK_MINECART, MinecartCommandBlock.class);
minecraftClassMap.put(EntityType.COW, Cow.class);
minecraftClassMap.put(EntityType.CREEPER, Creeper.class);
minecraftClassMap.put(EntityType.DOLPHIN, Dolphin.class);
minecraftClassMap.put(EntityType.DONKEY, Donkey.class);
minecraftClassMap.put(EntityType.DRAGON_FIREBALL, DragonFireball.class);
minecraftClassMap.put(EntityType.DROWNED, Drowned.class);
+ minecraftClassMap.put(EntityType.EGG, ThrownEgg.class);
minecraftClassMap.put(EntityType.ELDER_GUARDIAN, ElderGuardian.class);
minecraftClassMap.put(EntityType.END_CRYSTAL, EndCrystal.class);
minecraftClassMap.put(EntityType.ENDER_DRAGON, EnderDragon.class);
+ minecraftClassMap.put(EntityType.ENDER_PEARL, ThrownEnderpearl.class);
minecraftClassMap.put(EntityType.ENDERMAN, EnderMan.class);
minecraftClassMap.put(EntityType.ENDERMITE, Endermite.class);
minecraftClassMap.put(EntityType.EVOKER, Evoker.class);
minecraftClassMap.put(EntityType.EVOKER_FANGS, EvokerFangs.class);
+ minecraftClassMap.put(EntityType.EXPERIENCE_BOTTLE, ThrownExperienceBottle.class);
minecraftClassMap.put(EntityType.EXPERIENCE_ORB, ExperienceOrb.class);
minecraftClassMap.put(EntityType.EYE_OF_ENDER, EyeOfEnder.class);
minecraftClassMap.put(EntityType.FALLING_BLOCK, FallingBlockEntity.class);
minecraftClassMap.put(EntityType.FIREWORK_ROCKET, FireworkRocketEntity.class);
minecraftClassMap.put(EntityType.FOX, Fox.class);
+ minecraftClassMap.put(EntityType.FURNACE_MINECART, MinecartFurnace.class);
minecraftClassMap.put(EntityType.GHAST, Ghast.class);
minecraftClassMap.put(EntityType.GIANT, Giant.class);
minecraftClassMap.put(EntityType.GLOW_ITEM_FRAME, GlowItemFrame.class);
@@ -338,6 +344,7 @@ public class CustomEntityRegistry extends DefaultedRegistry implements Supplier<
minecraftClassMap.put(EntityType.GOAT, Goat.class);
minecraftClassMap.put(EntityType.GUARDIAN, Guardian.class);
minecraftClassMap.put(EntityType.HOGLIN, Hoglin.class);
+ minecraftClassMap.put(EntityType.HOPPER_MINECART, MinecartHopper.class);
minecraftClassMap.put(EntityType.HORSE, Horse.class);
minecraftClassMap.put(EntityType.HUSK, Husk.class);
minecraftClassMap.put(EntityType.ILLUSIONER, Illusioner.class);
@@ -352,14 +359,8 @@ public class CustomEntityRegistry extends DefaultedRegistry implements Supplier<
minecraftClassMap.put(EntityType.MAGMA_CUBE, MagmaCube.class);
minecraftClassMap.put(EntityType.MARKER, Marker.class);
minecraftClassMap.put(EntityType.MINECART, Minecart.class);
- minecraftClassMap.put(EntityType.CHEST_MINECART, MinecartChest.class);
- minecraftClassMap.put(EntityType.COMMAND_BLOCK_MINECART, MinecartCommandBlock.class);
- minecraftClassMap.put(EntityType.FURNACE_MINECART, MinecartFurnace.class);
- minecraftClassMap.put(EntityType.HOPPER_MINECART, MinecartHopper.class);
- minecraftClassMap.put(EntityType.SPAWNER_MINECART, MinecartSpawner.class);
- minecraftClassMap.put(EntityType.TNT_MINECART, MinecartTNT.class);
- minecraftClassMap.put(EntityType.MULE, Mule.class);
minecraftClassMap.put(EntityType.MOOSHROOM, MushroomCow.class);
+ minecraftClassMap.put(EntityType.MULE, Mule.class);
minecraftClassMap.put(EntityType.OCELOT, Ocelot.class);
minecraftClassMap.put(EntityType.PAINTING, Painting.class);
minecraftClassMap.put(EntityType.PANDA, Panda.class);
@@ -370,7 +371,7 @@ public class CustomEntityRegistry extends DefaultedRegistry implements Supplier<
minecraftClassMap.put(EntityType.PIGLIN_BRUTE, PiglinBrute.class);
minecraftClassMap.put(EntityType.PILLAGER, Pillager.class);
minecraftClassMap.put(EntityType.POLAR_BEAR, PolarBear.class);
- minecraftClassMap.put(EntityType.TNT, PrimedTnt.class);
+ minecraftClassMap.put(EntityType.POTION, ThrownPotion.class);
minecraftClassMap.put(EntityType.PUFFERFISH, Pufferfish.class);
minecraftClassMap.put(EntityType.RABBIT, Rabbit.class);
minecraftClassMap.put(EntityType.RAVAGER, Ravager.class);
@@ -385,17 +386,16 @@ public class CustomEntityRegistry extends DefaultedRegistry implements Supplier<
minecraftClassMap.put(EntityType.SMALL_FIREBALL, SmallFireball.class);
minecraftClassMap.put(EntityType.SNOW_GOLEM, SnowGolem.class);
minecraftClassMap.put(EntityType.SNOWBALL, Snowball.class);
+ minecraftClassMap.put(EntityType.SPAWNER_MINECART, MinecartSpawner.class);
minecraftClassMap.put(EntityType.SPECTRAL_ARROW, SpectralArrow.class);
minecraftClassMap.put(EntityType.SPIDER, Spider.class);
minecraftClassMap.put(EntityType.SQUID, Squid.class);
minecraftClassMap.put(EntityType.STRAY, Stray.class);
minecraftClassMap.put(EntityType.STRIDER, Strider.class);
- minecraftClassMap.put(EntityType.EGG, ThrownEgg.class);
- minecraftClassMap.put(EntityType.ENDER_PEARL, ThrownEnderpearl.class);
- minecraftClassMap.put(EntityType.EXPERIENCE_BOTTLE, ThrownExperienceBottle.class);
- minecraftClassMap.put(EntityType.POTION, ThrownPotion.class);
- minecraftClassMap.put(EntityType.TRIDENT, ThrownTrident.class);
+ minecraftClassMap.put(EntityType.TNT, PrimedTnt.class);
+ minecraftClassMap.put(EntityType.TNT_MINECART, MinecartTNT.class);
minecraftClassMap.put(EntityType.TRADER_LLAMA, TraderLlama.class);
+ minecraftClassMap.put(EntityType.TRIDENT, ThrownTrident.class);
minecraftClassMap.put(EntityType.TROPICAL_FISH, TropicalFish.class);
minecraftClassMap.put(EntityType.TURTLE, Turtle.class);
minecraftClassMap.put(EntityType.VEX, Vex.class);
diff --git a/v1_19_R3/pom.xml b/v1_19_R3/pom.xml
index 447b66baf..8cbdd265b 100644
--- a/v1_19_R3/pom.xml
+++ b/v1_19_R3/pom.xml
@@ -4,7 +4,7 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
citizens-v1_19_R3
diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java
index 9b2d2d218..aec83859e 100644
--- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java
@@ -469,9 +469,7 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable
}
private static final float EPSILON = 0.003F;
-
private static final MethodHandle GAMEMODE_SETTING = NMS.getFirstMethodHandle(ServerPlayerGameMode.class, true,
GameType.class, GameType.class);
private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0);
- private static int MAX_LENGTH = 0;
}
diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CustomEntityRegistry.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CustomEntityRegistry.java
index c5b3b96f0..2300d743b 100644
--- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CustomEntityRegistry.java
+++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CustomEntityRegistry.java
@@ -36,6 +36,7 @@ import net.minecraft.world.entity.Display;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ExperienceOrb;
import net.minecraft.world.entity.GlowSquid;
+import net.minecraft.world.entity.Interaction;
import net.minecraft.world.entity.LightningBolt;
import net.minecraft.world.entity.Marker;
import net.minecraft.world.entity.ambient.Bat;
@@ -75,6 +76,7 @@ import net.minecraft.world.entity.animal.horse.Mule;
import net.minecraft.world.entity.animal.horse.SkeletonHorse;
import net.minecraft.world.entity.animal.horse.TraderLlama;
import net.minecraft.world.entity.animal.horse.ZombieHorse;
+import net.minecraft.world.entity.animal.sniffer.Sniffer;
import net.minecraft.world.entity.boss.enderdragon.EndCrystal;
import net.minecraft.world.entity.boss.enderdragon.EnderDragon;
import net.minecraft.world.entity.boss.wither.WitherBoss;
@@ -353,32 +355,39 @@ public class CustomEntityRegistry extends DefaultedMappedRegistry>
minecraftClassMap.put(EntityType.BAT, Bat.class);
minecraftClassMap.put(EntityType.BEE, Bee.class);
minecraftClassMap.put(EntityType.BLAZE, Blaze.class);
+ minecraftClassMap.put(EntityType.BLOCK_DISPLAY, Display.BlockDisplay.class);
minecraftClassMap.put(EntityType.BOAT, Boat.class);
- minecraftClassMap.put(EntityType.CHEST_BOAT, ChestBoat.class);
- minecraftClassMap.put(EntityType.CAT, Cat.class);
minecraftClassMap.put(EntityType.CAMEL, Camel.class);
+ minecraftClassMap.put(EntityType.CAT, Cat.class);
minecraftClassMap.put(EntityType.CAVE_SPIDER, CaveSpider.class);
+ minecraftClassMap.put(EntityType.CHEST_BOAT, ChestBoat.class);
+ minecraftClassMap.put(EntityType.CHEST_MINECART, MinecartChest.class);
minecraftClassMap.put(EntityType.CHICKEN, Chicken.class);
minecraftClassMap.put(EntityType.COD, Cod.class);
+ minecraftClassMap.put(EntityType.COMMAND_BLOCK_MINECART, MinecartCommandBlock.class);
minecraftClassMap.put(EntityType.COW, Cow.class);
minecraftClassMap.put(EntityType.CREEPER, Creeper.class);
minecraftClassMap.put(EntityType.DOLPHIN, Dolphin.class);
minecraftClassMap.put(EntityType.DONKEY, Donkey.class);
minecraftClassMap.put(EntityType.DRAGON_FIREBALL, DragonFireball.class);
minecraftClassMap.put(EntityType.DROWNED, Drowned.class);
+ minecraftClassMap.put(EntityType.EGG, ThrownEgg.class);
minecraftClassMap.put(EntityType.ELDER_GUARDIAN, ElderGuardian.class);
minecraftClassMap.put(EntityType.END_CRYSTAL, EndCrystal.class);
minecraftClassMap.put(EntityType.ENDER_DRAGON, EnderDragon.class);
+ minecraftClassMap.put(EntityType.ENDER_PEARL, ThrownEnderpearl.class);
minecraftClassMap.put(EntityType.ENDERMAN, EnderMan.class);
minecraftClassMap.put(EntityType.ENDERMITE, Endermite.class);
minecraftClassMap.put(EntityType.EVOKER, Evoker.class);
minecraftClassMap.put(EntityType.EVOKER_FANGS, EvokerFangs.class);
+ minecraftClassMap.put(EntityType.EXPERIENCE_BOTTLE, ThrownExperienceBottle.class);
minecraftClassMap.put(EntityType.EXPERIENCE_ORB, ExperienceOrb.class);
minecraftClassMap.put(EntityType.EYE_OF_ENDER, EyeOfEnder.class);
minecraftClassMap.put(EntityType.FALLING_BLOCK, FallingBlockEntity.class);
minecraftClassMap.put(EntityType.FIREWORK_ROCKET, FireworkRocketEntity.class);
minecraftClassMap.put(EntityType.FOX, Fox.class);
minecraftClassMap.put(EntityType.FROG, Frog.class);
+ minecraftClassMap.put(EntityType.FURNACE_MINECART, MinecartFurnace.class);
minecraftClassMap.put(EntityType.GHAST, Ghast.class);
minecraftClassMap.put(EntityType.GIANT, Giant.class);
minecraftClassMap.put(EntityType.GLOW_ITEM_FRAME, GlowItemFrame.class);
@@ -386,11 +395,14 @@ public class CustomEntityRegistry extends DefaultedMappedRegistry>
minecraftClassMap.put(EntityType.GOAT, Goat.class);
minecraftClassMap.put(EntityType.GUARDIAN, Guardian.class);
minecraftClassMap.put(EntityType.HOGLIN, Hoglin.class);
+ minecraftClassMap.put(EntityType.HOPPER_MINECART, MinecartHopper.class);
minecraftClassMap.put(EntityType.HORSE, Horse.class);
minecraftClassMap.put(EntityType.HUSK, Husk.class);
minecraftClassMap.put(EntityType.ILLUSIONER, Illusioner.class);
+ minecraftClassMap.put(EntityType.INTERACTION, Interaction.class);
minecraftClassMap.put(EntityType.IRON_GOLEM, IronGolem.class);
minecraftClassMap.put(EntityType.ITEM, ItemEntity.class);
+ minecraftClassMap.put(EntityType.ITEM_DISPLAY, Display.ItemDisplay.class);
minecraftClassMap.put(EntityType.ITEM_FRAME, ItemFrame.class);
minecraftClassMap.put(EntityType.FIREBALL, LargeFireball.class);
minecraftClassMap.put(EntityType.LEASH_KNOT, LeashFenceKnotEntity.class);
@@ -400,14 +412,8 @@ public class CustomEntityRegistry extends DefaultedMappedRegistry>
minecraftClassMap.put(EntityType.MAGMA_CUBE, MagmaCube.class);
minecraftClassMap.put(EntityType.MARKER, Marker.class);
minecraftClassMap.put(EntityType.MINECART, Minecart.class);
- minecraftClassMap.put(EntityType.CHEST_MINECART, MinecartChest.class);
- minecraftClassMap.put(EntityType.COMMAND_BLOCK_MINECART, MinecartCommandBlock.class);
- minecraftClassMap.put(EntityType.FURNACE_MINECART, MinecartFurnace.class);
- minecraftClassMap.put(EntityType.HOPPER_MINECART, MinecartHopper.class);
- minecraftClassMap.put(EntityType.SPAWNER_MINECART, MinecartSpawner.class);
- minecraftClassMap.put(EntityType.TNT_MINECART, MinecartTNT.class);
- minecraftClassMap.put(EntityType.MULE, Mule.class);
minecraftClassMap.put(EntityType.MOOSHROOM, MushroomCow.class);
+ minecraftClassMap.put(EntityType.MULE, Mule.class);
minecraftClassMap.put(EntityType.OCELOT, Ocelot.class);
minecraftClassMap.put(EntityType.PAINTING, Painting.class);
minecraftClassMap.put(EntityType.PANDA, Panda.class);
@@ -418,7 +424,7 @@ public class CustomEntityRegistry extends DefaultedMappedRegistry>
minecraftClassMap.put(EntityType.PIGLIN_BRUTE, PiglinBrute.class);
minecraftClassMap.put(EntityType.PILLAGER, Pillager.class);
minecraftClassMap.put(EntityType.POLAR_BEAR, PolarBear.class);
- minecraftClassMap.put(EntityType.TNT, PrimedTnt.class);
+ minecraftClassMap.put(EntityType.POTION, ThrownPotion.class);
minecraftClassMap.put(EntityType.PUFFERFISH, Pufferfish.class);
minecraftClassMap.put(EntityType.RABBIT, Rabbit.class);
minecraftClassMap.put(EntityType.RAVAGER, Ravager.class);
@@ -426,30 +432,26 @@ 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.BlockDisplay.class);
- minecraftClassMap.put(EntityType.ITEM_DISPLAY, Display.ItemDisplay.class);
- minecraftClassMap.put(EntityType.TEXT_DISPLAY, Display.TextDisplay.class);
- minecraftClassMap.put(EntityType.INTERACTION, net.minecraft.world.entity.Interaction.class);
minecraftClassMap.put(EntityType.SILVERFISH, Silverfish.class);
minecraftClassMap.put(EntityType.SKELETON, Skeleton.class);
minecraftClassMap.put(EntityType.SKELETON_HORSE, SkeletonHorse.class);
minecraftClassMap.put(EntityType.SLIME, Slime.class);
minecraftClassMap.put(EntityType.SMALL_FIREBALL, SmallFireball.class);
+ minecraftClassMap.put(EntityType.SNIFFER, Sniffer.class);
minecraftClassMap.put(EntityType.SNOW_GOLEM, SnowGolem.class);
minecraftClassMap.put(EntityType.SNOWBALL, Snowball.class);
+ minecraftClassMap.put(EntityType.SPAWNER_MINECART, MinecartSpawner.class);
minecraftClassMap.put(EntityType.SPECTRAL_ARROW, SpectralArrow.class);
minecraftClassMap.put(EntityType.SPIDER, Spider.class);
minecraftClassMap.put(EntityType.SQUID, Squid.class);
minecraftClassMap.put(EntityType.STRAY, Stray.class);
minecraftClassMap.put(EntityType.STRIDER, Strider.class);
minecraftClassMap.put(EntityType.TADPOLE, Tadpole.class);
- minecraftClassMap.put(EntityType.EGG, ThrownEgg.class);
- minecraftClassMap.put(EntityType.ENDER_PEARL, ThrownEnderpearl.class);
- minecraftClassMap.put(EntityType.EXPERIENCE_BOTTLE, ThrownExperienceBottle.class);
- minecraftClassMap.put(EntityType.POTION, ThrownPotion.class);
- minecraftClassMap.put(EntityType.TRIDENT, ThrownTrident.class);
+ minecraftClassMap.put(EntityType.TEXT_DISPLAY, Display.TextDisplay.class);
+ minecraftClassMap.put(EntityType.TNT, PrimedTnt.class);
+ minecraftClassMap.put(EntityType.TNT_MINECART, MinecartTNT.class);
minecraftClassMap.put(EntityType.TRADER_LLAMA, TraderLlama.class);
+ minecraftClassMap.put(EntityType.TRIDENT, ThrownTrident.class);
minecraftClassMap.put(EntityType.TROPICAL_FISH, TropicalFish.class);
minecraftClassMap.put(EntityType.TURTLE, Turtle.class);
minecraftClassMap.put(EntityType.VEX, Vex.class);
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityNodeEvaluator.java b/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityNodeEvaluator.java
deleted file mode 100644
index 82804db56..000000000
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityNodeEvaluator.java
+++ /dev/null
@@ -1,565 +0,0 @@
-package net.citizensnpcs.nms.v1_20_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.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.LivingEntity;
-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.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 EntityNodeEvaluator extends EntityNodeEvaluatorBase {
- 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.mvmt.getPathfindingMalus(var1) >= 0.0F;
- }
-
- @Override
- public void done() {
- this.mvmt.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.mvmt.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.mvmt.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.mvmt.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, LivingEntity 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 (mvmt.getPathfindingMalus(varr9) < 0.0F)
- return varr9;
-
- if (mvmt.getPathfindingMalus(varr9) >= mvmt.getPathfindingMalus(var7)) {
- var7 = varr9;
- }
- }
- if (var6 == BlockPathTypes.OPEN && mvmt.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 (mvmt.getPathfindingMalus(varr9) < 0.0F)
- return varr9;
-
- if (mvmt.getPathfindingMalus(varr9) >= mvmt.getPathfindingMalus(var7)) {
- var7 = varr9;
- }
- }
- if (var6 == BlockPathTypes.OPEN && mvmt.getPathfindingMalus(var7) == 0.0F && this.entityWidth <= 1)
- return BlockPathTypes.OPEN;
- else
- return var7;
- }
- }
-
- protected BlockPathTypes getBlockPathType(LivingEntity 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(LivingEntity var0, int var1, int var2, int var3) {
- return (BlockPathTypes) this.pathTypesByPosCache.computeIfAbsent(BlockPos.asLong(var1, var2, var3),
- var4 -> 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.mvmt.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.onGround()) {
- 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.mvmt.getPathfindingMalus(var1.type);
- return var1;
- }
-
- private boolean hasCollisions(AABB var0) {
- return this.collisionCache.computeIfAbsent(var0, var1 -> !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, LivingEntity var1) {
- super.prepare(var0, var1);
- this.oldWaterCost = mvmt.getPathfindingMalus(BlockPathTypes.WATER);
- }
-
- @Override
- public void prepare(PathNavigationRegion var0, Mob var1) {
- super.prepare(var0, var1);
- this.oldWaterCost = mvmt.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;
-
- if (var9.is(Blocks.WITHER_ROSE) || var9.is(Blocks.POINTED_DRIPSTONE))
- return BlockPathTypes.DAMAGE_CAUTIOUS;
- }
- }
- }
- }
- 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();
- 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 if (!var2.is(Blocks.WITHER_ROSE) && !var2.is(Blocks.POINTED_DRIPSTONE)) {
- FluidState var4 = var0.getFluidState(var1);
- if (var4.is(FluidTags.LAVA))
- return BlockPathTypes.LAVA;
- else if (isBurningBlock(var2))
- return BlockPathTypes.DAMAGE_FIRE;
- else if (var3 instanceof DoorBlock) {
- DoorBlock var5 = (DoorBlock) var3;
- if (var2.getValue(DoorBlock.OPEN))
- return BlockPathTypes.DOOR_OPEN;
- else
- return var5.type().canOpenByHand() ? BlockPathTypes.DOOR_WOOD_CLOSED
- : BlockPathTypes.DOOR_IRON_CLOSED;
- } 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 var4.is(FluidTags.WATER) ? BlockPathTypes.WATER : BlockPathTypes.OPEN;
- } else
- return BlockPathTypes.DAMAGE_CAUTIOUS;
- } 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 (var6 == BlockPathTypes.DAMAGE_CAUTIOUS) {
- var5 = BlockPathTypes.DAMAGE_CAUTIOUS;
- }
- }
- 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);
- }
-
- public static final double SPACE_BETWEEN_WALL_POSTS = 0.5;
-}
diff --git a/v1_20_R3/pom.xml b/v1_20_R4/pom.xml
similarity index 95%
rename from v1_20_R3/pom.xml
rename to v1_20_R4/pom.xml
index 5b436509d..e022441fa 100644
--- a/v1_20_R3/pom.xml
+++ b/v1_20_R4/pom.xml
@@ -4,12 +4,12 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
- citizens-v1_20_R3
+ citizens-v1_20_R4
UTF-8
- 1.20.4-R0.1-SNAPSHOT
+ 1.20.5-R0.1-SNAPSHOT
@@ -55,7 +55,7 @@
net.md-5
specialsource-maven-plugin
- 1.2.4
+ 2.0.2
package
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/AllayController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/AllayController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/AllayController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/AllayController.java
index f220a3209..0b15d6ba1 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/AllayController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/AllayController.java
@@ -1,18 +1,18 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftAllay;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftAllay;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import com.google.common.collect.Lists;
import com.mojang.datafixers.util.Pair;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ArmadilloController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ArmadilloController.java
new file mode 100644
index 000000000..774c13468
--- /dev/null
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ArmadilloController.java
@@ -0,0 +1,225 @@
+package net.citizensnpcs.nms.v1_20_R4.entity;
+
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftArmadillo;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+
+import net.citizensnpcs.api.npc.NPC;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.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.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.damagesource.DamageSource;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.animal.armadillo.Armadillo;
+import net.minecraft.world.entity.vehicle.AbstractMinecart;
+import net.minecraft.world.entity.vehicle.Boat;
+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.level.material.PushReaction;
+import net.minecraft.world.phys.AABB;
+import net.minecraft.world.phys.Vec3;
+
+public class ArmadilloController extends MobEntityController {
+ public ArmadilloController() {
+ super(EntityArmadilloNPC.class);
+ }
+
+ @Override
+ public org.bukkit.entity.Armadillo getBukkitEntity() {
+ return (org.bukkit.entity.Armadillo) super.getBukkitEntity();
+ }
+
+ public static class ArmadilloNPC extends CraftArmadillo implements ForwardingNPCHolder {
+ public ArmadilloNPC(EntityArmadilloNPC entity) {
+ super((CraftServer) Bukkit.getServer(), entity);
+ }
+ }
+
+ public static class EntityArmadilloNPC extends Armadillo implements NPCHolder {
+ private final CitizensNPC npc;
+
+ public EntityArmadilloNPC(EntityType extends Armadillo> types, Level level) {
+ this(types, level, null);
+ }
+
+ public EntityArmadilloNPC(EntityType extends Armadillo> 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 ArmadilloNPC(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 float getJumpPower() {
+ return NMS.getJumpPower(npc, super.getJumpPower());
+ }
+
+ @Override
+ public int getMaxFallDistance() {
+ return NMS.getFallDistance(npc, super.getMaxFallDistance());
+ }
+
+ @Override
+ public NPC getNPC() {
+ return npc;
+ }
+
+ @Override
+ public PushReaction getPistonPushReaction() {
+ return Util.callPistonPushEvent(npc) ? PushReaction.IGNORE : super.getPistonPushReaction();
+ }
+
+ @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 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(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, Vec3 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) {
+ if (npc == null)
+ return super.updateFluidHeightAndDoFluidPushing(tagkey, d0);
+ Vec3 old = getDeltaMovement().add(0, 0, 0);
+ boolean res = super.updateFluidHeightAndDoFluidPushing(tagkey, d0);
+ if (!npc.isPushableByFluids()) {
+ setDeltaMovement(old);
+ }
+ return res;
+ }
+ }
+}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ArmorStandController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ArmorStandController.java
similarity index 90%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ArmorStandController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ArmorStandController.java
index 439bbf987..0056647cb 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ArmorStandController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ArmorStandController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftArmorStand;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftArmorStand;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.MobAI;
-import net.citizensnpcs.nms.v1_20_R3.util.MobAI.ForwardingMobAI;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.MobAI;
+import net.citizensnpcs.nms.v1_20_R4.util.MobAI.ForwardingMobAI;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/AxolotlController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/AxolotlController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/AxolotlController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/AxolotlController.java
index 85de92f7d..7009212ab 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/AxolotlController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/AxolotlController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftAxolotl;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftAxolotl;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import com.mojang.serialization.Dynamic;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/BatController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BatController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/BatController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BatController.java
index b117643a1..ce3ea6b2d 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/BatController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BatController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftBat;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftBat;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/BeeController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BeeController.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/BeeController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BeeController.java
index 831578a95..edd77cf3c 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/BeeController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BeeController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftBee;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftBee;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/BlazeController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BlazeController.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/BlazeController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BlazeController.java
index d8ccd6798..8ae4c0494 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/BlazeController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BlazeController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftBlaze;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftBlaze;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BoggedController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BoggedController.java
new file mode 100644
index 000000000..8e3220422
--- /dev/null
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BoggedController.java
@@ -0,0 +1,225 @@
+package net.citizensnpcs.nms.v1_20_R4.entity;
+
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftBogged;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+
+import net.citizensnpcs.api.npc.NPC;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.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.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.damagesource.DamageSource;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.monster.Bogged;
+import net.minecraft.world.entity.vehicle.AbstractMinecart;
+import net.minecraft.world.entity.vehicle.Boat;
+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.level.material.PushReaction;
+import net.minecraft.world.phys.AABB;
+import net.minecraft.world.phys.Vec3;
+
+public class BoggedController extends MobEntityController {
+ public BoggedController() {
+ super(EntityBoggedNPC.class);
+ }
+
+ @Override
+ public org.bukkit.entity.Bogged getBukkitEntity() {
+ return (org.bukkit.entity.Bogged) super.getBukkitEntity();
+ }
+
+ public static class BoggedNPC extends CraftBogged implements ForwardingNPCHolder {
+ public BoggedNPC(EntityBoggedNPC entity) {
+ super((CraftServer) Bukkit.getServer(), entity);
+ }
+ }
+
+ public static class EntityBoggedNPC extends Bogged implements NPCHolder {
+ private final CitizensNPC npc;
+
+ public EntityBoggedNPC(EntityType extends Bogged> types, Level level) {
+ this(types, level, null);
+ }
+
+ public EntityBoggedNPC(EntityType extends Bogged> 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 BoggedNPC(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 float getJumpPower() {
+ return NMS.getJumpPower(npc, super.getJumpPower());
+ }
+
+ @Override
+ public int getMaxFallDistance() {
+ return NMS.getFallDistance(npc, super.getMaxFallDistance());
+ }
+
+ @Override
+ public NPC getNPC() {
+ return npc;
+ }
+
+ @Override
+ public PushReaction getPistonPushReaction() {
+ return Util.callPistonPushEvent(npc) ? PushReaction.IGNORE : super.getPistonPushReaction();
+ }
+
+ @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 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(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, Vec3 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) {
+ if (npc == null)
+ return super.updateFluidHeightAndDoFluidPushing(tagkey, d0);
+ Vec3 old = getDeltaMovement().add(0, 0, 0);
+ boolean res = super.updateFluidHeightAndDoFluidPushing(tagkey, d0);
+ if (!npc.isPushableByFluids()) {
+ setDeltaMovement(old);
+ }
+ return res;
+ }
+ }
+}
diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BreezeController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BreezeController.java
new file mode 100644
index 000000000..2d286580e
--- /dev/null
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/BreezeController.java
@@ -0,0 +1,225 @@
+package net.citizensnpcs.nms.v1_20_R4.entity;
+
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftBreeze;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+
+import net.citizensnpcs.api.npc.NPC;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.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.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.damagesource.DamageSource;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.monster.breeze.Breeze;
+import net.minecraft.world.entity.vehicle.AbstractMinecart;
+import net.minecraft.world.entity.vehicle.Boat;
+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.level.material.PushReaction;
+import net.minecraft.world.phys.AABB;
+import net.minecraft.world.phys.Vec3;
+
+public class BreezeController extends MobEntityController {
+ public BreezeController() {
+ super(EntityBreezeNPC.class);
+ }
+
+ @Override
+ public org.bukkit.entity.Breeze getBukkitEntity() {
+ return (org.bukkit.entity.Breeze) super.getBukkitEntity();
+ }
+
+ public static class BreezeNPC extends CraftBreeze implements ForwardingNPCHolder {
+ public BreezeNPC(EntityBreezeNPC entity) {
+ super((CraftServer) Bukkit.getServer(), entity);
+ }
+ }
+
+ public static class EntityBreezeNPC extends Breeze implements NPCHolder {
+ private final CitizensNPC npc;
+
+ public EntityBreezeNPC(EntityType extends Breeze> types, Level level) {
+ this(types, level, null);
+ }
+
+ public EntityBreezeNPC(EntityType extends Breeze> 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 BreezeNPC(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 float getJumpPower() {
+ return NMS.getJumpPower(npc, super.getJumpPower());
+ }
+
+ @Override
+ public int getMaxFallDistance() {
+ return NMS.getFallDistance(npc, super.getMaxFallDistance());
+ }
+
+ @Override
+ public NPC getNPC() {
+ return npc;
+ }
+
+ @Override
+ public PushReaction getPistonPushReaction() {
+ return Util.callPistonPushEvent(npc) ? PushReaction.IGNORE : super.getPistonPushReaction();
+ }
+
+ @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 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(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, Vec3 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) {
+ if (npc == null)
+ return super.updateFluidHeightAndDoFluidPushing(tagkey, d0);
+ Vec3 old = getDeltaMovement().add(0, 0, 0);
+ boolean res = super.updateFluidHeightAndDoFluidPushing(tagkey, d0);
+ if (!npc.isPushableByFluids()) {
+ setDeltaMovement(old);
+ }
+ return res;
+ }
+ }
+}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CamelController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CamelController.java
similarity index 96%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CamelController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CamelController.java
index 9281b9059..e3c4449ed 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CamelController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CamelController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftCamel;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftCamel;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CatController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CatController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CatController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CatController.java
index 16c7c6edc..bbe51263c 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CatController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CatController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftCat;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftCat;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CaveSpiderController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CaveSpiderController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CaveSpiderController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CaveSpiderController.java
index 03e31e1fd..70a23257a 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CaveSpiderController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CaveSpiderController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftCaveSpider;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftCaveSpider;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ChickenController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ChickenController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ChickenController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ChickenController.java
index 1ca592c71..7d96fa945 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ChickenController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ChickenController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftChicken;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftChicken;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CodController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CodController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CodController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CodController.java
index c65d3c99e..c4dc871e8 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CodController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CodController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftCod;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftCod;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.EntityMoveControl;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.EntityMoveControl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CowController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CowController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CowController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CowController.java
index 46c1aa6f4..6817c7280 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CowController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CowController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftCow;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftCow;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CreeperController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CreeperController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CreeperController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CreeperController.java
index ed1834ee4..21b1f3ac7 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/CreeperController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/CreeperController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftCreeper;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftCreeper;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/DolphinController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/DolphinController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/DolphinController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/DolphinController.java
index 02900bca5..7a05f8b36 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/DolphinController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/DolphinController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftDolphin;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftDolphin;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/DrownedController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/DrownedController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/DrownedController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/DrownedController.java
index 12c7a745e..68b102d48 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/DrownedController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/DrownedController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftDrowned;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftDrowned;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EnderDragonController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EnderDragonController.java
similarity index 96%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EnderDragonController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EnderDragonController.java
index 598e86f1d..deae5d04a 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EnderDragonController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EnderDragonController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEnderDragon;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEnderDragon;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.versioned.EnderDragonTrait;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EndermanController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EndermanController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EndermanController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EndermanController.java
index 11ba9c0d0..d34497362 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EndermanController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EndermanController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import java.util.Optional;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEnderman;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEnderman;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import org.bukkit.event.player.PlayerTeleportEvent;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EndermiteController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EndermiteController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EndermiteController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EndermiteController.java
index 3c07b7597..f74002b51 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EndermiteController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EndermiteController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEndermite;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEndermite;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EntityHumanNPC.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EntityHumanNPC.java
similarity index 96%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EntityHumanNPC.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EntityHumanNPC.java
index ce30381e5..a8525fb12 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EntityHumanNPC.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EntityHumanNPC.java
@@ -1,12 +1,12 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import java.io.IOException;
import java.lang.invoke.MethodHandle;
import java.util.List;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.plugin.Plugin;
@@ -18,13 +18,13 @@ 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_20_R3.network.EmptyConnection;
-import net.citizensnpcs.nms.v1_20_R3.network.EmptyPacketListener;
-import net.citizensnpcs.nms.v1_20_R3.util.EmptyAdvancementDataPlayer;
-import net.citizensnpcs.nms.v1_20_R3.util.EmptyServerStatsCounter;
-import net.citizensnpcs.nms.v1_20_R3.util.MobAI;
-import net.citizensnpcs.nms.v1_20_R3.util.MobAI.ForwardingMobAI;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.network.EmptyConnection;
+import net.citizensnpcs.nms.v1_20_R4.network.EmptyPacketListener;
+import net.citizensnpcs.nms.v1_20_R4.util.EmptyAdvancementDataPlayer;
+import net.citizensnpcs.nms.v1_20_R4.util.EmptyServerStatsCounter;
+import net.citizensnpcs.nms.v1_20_R4.util.MobAI;
+import net.citizensnpcs.nms.v1_20_R4.util.MobAI.ForwardingMobAI;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.npc.skin.SkinPacketTracker;
@@ -237,7 +237,7 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable
try {
EmptyConnection conn = new EmptyConnection(PacketFlow.CLIENTBOUND);
connection = new EmptyPacketListener(minecraftServer, conn, this,
- new CommonListenerCookie(getProfile(), 0, clientInfo));
+ new CommonListenerCookie(getProfile(), 0, clientInfo, false));
} catch (IOException e) {
e.printStackTrace();
}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EvokerController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EvokerController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EvokerController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EvokerController.java
index 06389e956..bbf796ad7 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/EvokerController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EvokerController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEvoker;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEvoker;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/FoxController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/FoxController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/FoxController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/FoxController.java
index 8e44d8606..592239bc8 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/FoxController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/FoxController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import java.lang.invoke.MethodHandle;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftFox;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftFox;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.versioned.FoxTrait;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/FrogController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/FrogController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/FrogController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/FrogController.java
index 6a400636f..0ff4e016d 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/FrogController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/FrogController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftFrog;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftFrog;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GhastController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GhastController.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GhastController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GhastController.java
index b181be40e..91bf3d303 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GhastController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GhastController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftGhast;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftGhast;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GiantController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GiantController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GiantController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GiantController.java
index cb36c506e..db70dabca 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GiantController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GiantController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftGiant;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftGiant;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GlowSquidController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GlowSquidController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GlowSquidController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GlowSquidController.java
index fcd9b4111..2676acbac 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GlowSquidController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GlowSquidController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftGlowSquid;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftGlowSquid;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GoatController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GoatController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GoatController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GoatController.java
index 547c49077..547b0ac1e 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GoatController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GoatController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftGoat;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftGoat;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GuardianController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GuardianController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GuardianController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GuardianController.java
index 396f666ac..286835fcb 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GuardianController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GuardianController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftGuardian;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftGuardian;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GuardianElderController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GuardianElderController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GuardianElderController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GuardianElderController.java
index f459b0581..a898feadb 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/GuardianElderController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/GuardianElderController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftElderGuardian;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftElderGuardian;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HoglinController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HoglinController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HoglinController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HoglinController.java
index ccef1b7a2..24387e5d2 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HoglinController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HoglinController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftHoglin;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftHoglin;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseController.java
index f9aa757a4..7f12097b7 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftHorse;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftHorse;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseDonkeyController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseDonkeyController.java
similarity index 96%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseDonkeyController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseDonkeyController.java
index 9d22b3cc5..2a3b090c5 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseDonkeyController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseDonkeyController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftDonkey;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftDonkey;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseMuleController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseMuleController.java
similarity index 96%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseMuleController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseMuleController.java
index 0d66e92c9..0489b8c92 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseMuleController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseMuleController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftMule;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftMule;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseSkeletonController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseSkeletonController.java
similarity index 96%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseSkeletonController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseSkeletonController.java
index e545106a8..a9bff6b5b 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseSkeletonController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseSkeletonController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftSkeletonHorse;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSkeletonHorse;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseZombieController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseZombieController.java
similarity index 96%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseZombieController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseZombieController.java
index ad402161c..1fe92a52b 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HorseZombieController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HorseZombieController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftZombieHorse;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftZombieHorse;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HumanController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HumanController.java
similarity index 96%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HumanController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HumanController.java
index 45cd30b8a..ced4d551e 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/HumanController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HumanController.java
@@ -1,10 +1,10 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/IllusionerController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/IllusionerController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/IllusionerController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/IllusionerController.java
index 2378d143f..fd8aefb22 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/IllusionerController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/IllusionerController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftIllusioner;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftIllusioner;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/IronGolemController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/IronGolemController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/IronGolemController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/IronGolemController.java
index a229d646d..0b37d9a37 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/IronGolemController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/IronGolemController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftIronGolem;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftIronGolem;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/LlamaController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/LlamaController.java
similarity index 96%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/LlamaController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/LlamaController.java
index 7b2a7f906..18eb9012f 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/LlamaController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/LlamaController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftLlama;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftLlama;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/MagmaCubeController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/MagmaCubeController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/MagmaCubeController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/MagmaCubeController.java
index 0d11e065f..8e8ba20f8 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/MagmaCubeController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/MagmaCubeController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftMagmaCube;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftMagmaCube;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.EntityMoveControl;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.EntityMoveControl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/MobEntityController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/MobEntityController.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/MobEntityController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/MobEntityController.java
index 03694f3e4..d4a7c490e 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/MobEntityController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/MobEntityController.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import java.lang.reflect.Constructor;
import java.util.Map;
@@ -6,13 +6,13 @@ import java.util.WeakHashMap;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
-import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
import org.bukkit.entity.Entity;
import net.citizensnpcs.Settings.Setting;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
-import net.citizensnpcs.nms.v1_20_R3.util.PitchableLookControl;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.PitchableLookControl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.trait.ScoreboardTrait;
import net.minecraft.world.entity.EntityType;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/MushroomCowController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/MushroomCowController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/MushroomCowController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/MushroomCowController.java
index 511bc4fa2..86680c383 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/MushroomCowController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/MushroomCowController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftMushroomCow;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftMushroomCow;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/OcelotController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/OcelotController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/OcelotController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/OcelotController.java
index 2eb9b1d99..ed6c307a6 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/OcelotController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/OcelotController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftOcelot;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftOcelot;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PandaController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PandaController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PandaController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PandaController.java
index 432f0e84a..384a682e2 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PandaController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PandaController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPanda;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPanda;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ParrotController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ParrotController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ParrotController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ParrotController.java
index 53ff1a557..4154d7a64 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ParrotController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ParrotController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftParrot;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftParrot;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PhantomController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PhantomController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PhantomController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PhantomController.java
index 4b6b6b779..193aa954d 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PhantomController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PhantomController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPhantom;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPhantom;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.EntityMoveControl;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.EntityMoveControl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
@@ -82,7 +82,7 @@ public class PhantomController extends MobEntityController {
this.lookControl = new LookControl(this);
}
if (npc.isProtected()) {
- setSecondsOnFire(0);
+ igniteForSeconds(0);
}
npc.update();
}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PigController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PigController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PigController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PigController.java
index 430b6c156..f679723e7 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PigController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PigController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPig;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPig;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PigZombieController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PigZombieController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PigZombieController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PigZombieController.java
index c08f296ee..8c20cdf19 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PigZombieController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PigZombieController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPigZombie;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPigZombie;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PiglinBruteController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PiglinBruteController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PiglinBruteController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PiglinBruteController.java
index 936db62ba..8c593e771 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PiglinBruteController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PiglinBruteController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPiglinBrute;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPiglinBrute;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PiglinController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PiglinController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PiglinController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PiglinController.java
index ccd75bb74..2035fbdd6 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PiglinController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PiglinController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPiglin;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPiglin;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PillagerController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PillagerController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PillagerController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PillagerController.java
index 29db069a2..767ba0ac1 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PillagerController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PillagerController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPillager;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPillager;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PolarBearController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PolarBearController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PolarBearController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PolarBearController.java
index 805d2f230..c3784d524 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PolarBearController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PolarBearController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPolarBear;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPolarBear;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PufferFishController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PufferFishController.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PufferFishController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PufferFishController.java
index f844da571..61c83dfa9 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/PufferFishController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/PufferFishController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPufferFish;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPufferFish;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.EntityMoveControl;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.EntityMoveControl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.versioned.PufferFishTrait;
@@ -146,10 +146,10 @@ public class PufferFishController extends MobEntityController {
}
@Override
- public EntityDimensions getDimensions(Pose entitypose) {
+ public EntityDimensions getDefaultDimensions(Pose entitypose) {
if (npc == null)
- return super.getDimensions(entitypose);
- return super.getDimensions(entitypose).scale(1 / s(getPuffState())).scale(0.5F);
+ return super.getDefaultDimensions(entitypose);
+ return super.getDefaultDimensions(entitypose).scale(1 / s(getPuffState())).scale(0.5F);
}
@Override
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/RabbitController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/RabbitController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/RabbitController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/RabbitController.java
index e782d8df8..419aef64c 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/RabbitController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/RabbitController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftRabbit;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftRabbit;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/RavagerController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/RavagerController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/RavagerController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/RavagerController.java
index 585c42afc..0c5f21690 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/RavagerController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/RavagerController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftRavager;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftRavager;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SalmonController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SalmonController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SalmonController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SalmonController.java
index f690d02ea..3812022e3 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SalmonController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SalmonController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftSalmon;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSalmon;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.EntityMoveControl;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.EntityMoveControl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SheepController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SheepController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SheepController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SheepController.java
index 41b58d32e..b7651a36f 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SheepController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SheepController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftSheep;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSheep;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ShulkerController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ShulkerController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ShulkerController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ShulkerController.java
index 3a2da28f8..e63b116b9 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ShulkerController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ShulkerController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftShulker;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftShulker;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SilverfishController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SilverfishController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SilverfishController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SilverfishController.java
index c4c762121..cff94b273 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SilverfishController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SilverfishController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftSilverfish;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSilverfish;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SkeletonController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SkeletonController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SkeletonController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SkeletonController.java
index d93a99f1d..eb80ff29e 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SkeletonController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SkeletonController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftSkeleton;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSkeleton;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SkeletonStrayController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SkeletonStrayController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SkeletonStrayController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SkeletonStrayController.java
index 4ed944668..fd44a81d6 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SkeletonStrayController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SkeletonStrayController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftStray;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftStray;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SkeletonWitherController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SkeletonWitherController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SkeletonWitherController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SkeletonWitherController.java
index 11f81f898..c4aafc40e 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SkeletonWitherController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SkeletonWitherController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftWitherSkeleton;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftWitherSkeleton;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SlimeController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SlimeController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SlimeController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SlimeController.java
index db6c82755..8e078926e 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SlimeController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SlimeController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftSlime;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSlime;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.EntityMoveControl;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.EntityMoveControl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SnifferController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SnifferController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SnifferController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SnifferController.java
index d4ac759a1..01d5c265e 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SnifferController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SnifferController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftSniffer;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSniffer;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SnowmanController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SnowmanController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SnowmanController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SnowmanController.java
index 78bd96cf3..8908483c0 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SnowmanController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SnowmanController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftSnowman;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSnowman;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SpiderController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SpiderController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SpiderController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SpiderController.java
index 949d29007..336a93a1c 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SpiderController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SpiderController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftSpider;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSpider;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SquidController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SquidController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SquidController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SquidController.java
index 737e43fac..343b860a3 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/SquidController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/SquidController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftSquid;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSquid;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/StriderController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/StriderController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/StriderController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/StriderController.java
index 51b774f28..01f5fd17e 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/StriderController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/StriderController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftStrider;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftStrider;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/TadpoleController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/TadpoleController.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/TadpoleController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/TadpoleController.java
index c01a878ef..2bf683e6c 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/TadpoleController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/TadpoleController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftTadpole;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftTadpole;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.EntityMoveControl;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.EntityMoveControl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
@@ -18,6 +18,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
+import net.minecraft.tags.ItemTags;
import net.minecraft.tags.TagKey;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
@@ -25,7 +26,6 @@ import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ai.control.MoveControl;
-import net.minecraft.world.entity.animal.frog.Frog;
import net.minecraft.world.entity.animal.frog.Tadpole;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
@@ -194,7 +194,7 @@ public class TadpoleController extends MobEntityController {
if (npc == null || !npc.isProtected())
return super.mobInteract(entityhuman, enumhand);
ItemStack itemstack = entityhuman.getItemInHand(enumhand);
- if ((Frog.TEMPTATION_ITEM.test(itemstack) || itemstack.getItem() == Items.WATER_BUCKET) && isAlive())
+ if ((itemstack.is(ItemTags.FROG_FOOD) || itemstack.getItem() == Items.WATER_BUCKET) && isAlive())
return InteractionResult.FAIL;
return super.mobInteract(entityhuman, enumhand);
}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/TraderLlamaController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/TraderLlamaController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/TraderLlamaController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/TraderLlamaController.java
index 4f0934415..f041d65f1 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/TraderLlamaController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/TraderLlamaController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftTraderLlama;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftTraderLlama;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.HorseModifiers;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/TropicalFishController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/TropicalFishController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/TropicalFishController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/TropicalFishController.java
index 96581d12e..85d9fb575 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/TropicalFishController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/TropicalFishController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftTropicalFish;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftTropicalFish;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.EntityMoveControl;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.EntityMoveControl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/TurtleController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/TurtleController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/TurtleController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/TurtleController.java
index 9a84cf11d..c2ab7b643 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/TurtleController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/TurtleController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftTurtle;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftTurtle;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.EntityMoveControl;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.EntityMoveControl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/VexController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/VexController.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/VexController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/VexController.java
index 93af98c02..e0c002289 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/VexController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/VexController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftVex;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftVex;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/VillagerController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/VillagerController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/VillagerController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/VillagerController.java
index b6f3cad0a..e497a72e3 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/VillagerController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/VillagerController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftVillager;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftVillager;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/VindicatorController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/VindicatorController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/VindicatorController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/VindicatorController.java
index d4cf6bea3..a096622be 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/VindicatorController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/VindicatorController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftVindicator;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftVindicator;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WanderingTraderController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WanderingTraderController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WanderingTraderController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WanderingTraderController.java
index 8d3726a45..fb6dee00a 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WanderingTraderController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WanderingTraderController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftWanderingTrader;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftWanderingTrader;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WardenController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WardenController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WardenController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WardenController.java
index c89a05b78..f43ecdd31 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WardenController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WardenController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftWarden;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftWarden;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WitchController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WitchController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WitchController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WitchController.java
index 701dfd54c..a81f14f6d 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WitchController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WitchController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftWitch;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftWitch;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WitherController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WitherController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WitherController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WitherController.java
index 3d2dd8183..e6898ba7f 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WitherController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WitherController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftWither;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftWither;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WolfController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WolfController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WolfController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WolfController.java
index b4fd5990c..febc2e8ca 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/WolfController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/WolfController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftWolf;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftWolf;
import org.bukkit.event.entity.EntityTargetEvent;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ZoglinController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ZoglinController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ZoglinController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ZoglinController.java
index dfade2117..e95d4630c 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ZoglinController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ZoglinController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftZoglin;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftZoglin;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ZombieController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ZombieController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ZombieController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ZombieController.java
index bf6a8d039..90e9dc888 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ZombieController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ZombieController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftZombie;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftZombie;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ZombieHuskController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ZombieHuskController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ZombieHuskController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ZombieHuskController.java
index 6e1bcb3e5..1aa2cc515 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ZombieHuskController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ZombieHuskController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftHusk;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftHusk;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ZombieVillagerController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ZombieVillagerController.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ZombieVillagerController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ZombieVillagerController.java
index 0cbbe5cfa..b614150aa 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/ZombieVillagerController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ZombieVillagerController.java
@@ -1,14 +1,14 @@
-package net.citizensnpcs.nms.v1_20_R3.entity;
+package net.citizensnpcs.nms.v1_20_R4.entity;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftVillagerZombie;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftVillagerZombie;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/AreaEffectCloudController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/AreaEffectCloudController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/AreaEffectCloudController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/AreaEffectCloudController.java
index b1c468463..fc54eff58 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/AreaEffectCloudController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/AreaEffectCloudController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftAreaEffectCloud;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftAreaEffectCloud;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/BlockDisplayController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/BlockDisplayController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/BlockDisplayController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/BlockDisplayController.java
index 8c992ce67..30ef10262 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/BlockDisplayController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/BlockDisplayController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftBlockDisplay;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftBlockDisplay;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/BoatController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/BoatController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/BoatController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/BoatController.java
index d1b91c3bd..8a315a8c2 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/BoatController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/BoatController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftBoat;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftBoat;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/BreezeWindChargeController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/BreezeWindChargeController.java
new file mode 100644
index 000000000..28db64de0
--- /dev/null
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/BreezeWindChargeController.java
@@ -0,0 +1,128 @@
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
+
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftBreezeWindCharge;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+
+import net.citizensnpcs.api.npc.NPC;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
+import net.citizensnpcs.npc.CitizensNPC;
+import net.citizensnpcs.npc.ai.NPCHolder;
+import net.citizensnpcs.util.Util;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.tags.TagKey;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.projectile.windcharge.BreezeWindCharge;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.material.Fluid;
+import net.minecraft.world.level.material.PushReaction;
+import net.minecraft.world.phys.AABB;
+import net.minecraft.world.phys.Vec3;
+
+public class BreezeWindChargeController extends MobEntityController {
+ public BreezeWindChargeController() {
+ super(EntityBreezeWindChargeNPC.class);
+ }
+
+ @Override
+ public org.bukkit.entity.BreezeWindCharge getBukkitEntity() {
+ return (org.bukkit.entity.BreezeWindCharge) super.getBukkitEntity();
+ }
+
+ public static class BreezeWindChargeNPC extends CraftBreezeWindCharge implements ForwardingNPCHolder {
+ public BreezeWindChargeNPC(EntityBreezeWindChargeNPC entity) {
+ super((CraftServer) Bukkit.getServer(), entity);
+ }
+ }
+
+ public static class EntityBreezeWindChargeNPC extends BreezeWindCharge implements NPCHolder {
+ private final CitizensNPC npc;
+
+ public EntityBreezeWindChargeNPC(EntityType extends BreezeWindCharge> types, Level level) {
+ this(types, level, null);
+ }
+
+ public EntityBreezeWindChargeNPC(EntityType extends BreezeWindCharge> 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 BreezeWindChargeNPC(this));
+ }
+ return super.getBukkitEntity();
+ }
+
+ @Override
+ public NPC getNPC() {
+ return npc;
+ }
+
+ @Override
+ public PushReaction getPistonPushReaction() {
+ return Util.callPistonPushEvent(npc) ? PushReaction.IGNORE : super.getPistonPushReaction();
+ }
+
+ @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(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, Vec3 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) {
+ if (npc == null)
+ return super.updateFluidHeightAndDoFluidPushing(tagkey, d0);
+ Vec3 old = getDeltaMovement().add(0, 0, 0);
+ boolean res = super.updateFluidHeightAndDoFluidPushing(tagkey, d0);
+ if (!npc.isPushableByFluids()) {
+ setDeltaMovement(old);
+ }
+ return res;
+ }
+ }
+}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ChestBoatController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ChestBoatController.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ChestBoatController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ChestBoatController.java
index 5e3678adc..4ec3b6758 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ChestBoatController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ChestBoatController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftChestBoat;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftChestBoat;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/DragonFireballController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/DragonFireballController.java
similarity index 90%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/DragonFireballController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/DragonFireballController.java
index 982263d0f..bd906662a 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/DragonFireballController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/DragonFireballController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftDragonFireball;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftDragonFireball;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EggController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EggController.java
similarity index 91%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EggController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EggController.java
index edcce2c52..897b5e716 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EggController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EggController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEgg;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEgg;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EnderCrystalController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EnderCrystalController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EnderCrystalController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EnderCrystalController.java
index 9e9b46fe3..eed54a5e9 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EnderCrystalController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EnderCrystalController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEnderCrystal;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEnderCrystal;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EnderPearlController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EnderPearlController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EnderPearlController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EnderPearlController.java
index d7d354777..b377b1dd3 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EnderPearlController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EnderPearlController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEnderPearl;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEnderPearl;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import org.bukkit.entity.EnderPearl;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EvokerFangsController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EvokerFangsController.java
similarity index 91%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EvokerFangsController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EvokerFangsController.java
index 9bae43cd2..a35307c4b 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EvokerFangsController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EvokerFangsController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEvokerFangs;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEvokerFangs;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ExperienceOrbController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ExperienceOrbController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ExperienceOrbController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ExperienceOrbController.java
index 4d4028312..4c286dadd 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ExperienceOrbController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ExperienceOrbController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftExperienceOrb;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftExperienceOrb;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EnderSignalController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EyeOfEnderController.java
similarity index 87%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EnderSignalController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EyeOfEnderController.java
index e64787387..7df1b079b 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/EnderSignalController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/EyeOfEnderController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEnderSignal;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEnderSignal;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import org.bukkit.entity.EnderSignal;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
@@ -26,8 +26,8 @@ import net.minecraft.world.level.material.PushReaction;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
-public class EnderSignalController extends MobEntityController {
- public EnderSignalController() {
+public class EyeOfEnderController extends MobEntityController {
+ public EyeOfEnderController() {
super(EntityEnderSignalNPC.class);
}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/FallingBlockController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/FallingBlockController.java
similarity index 92%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/FallingBlockController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/FallingBlockController.java
index 1fa8a72e8..3b4757489 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/FallingBlockController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/FallingBlockController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftFallingBlock;
-import org.bukkit.craftbukkit.v1_20_R3.util.CraftMagicNumbers;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftFallingBlock;
+import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers;
import org.bukkit.entity.FallingBlock;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/FireworkController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/FireworkController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/FireworkController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/FireworkController.java
index 19469494a..7efccc098 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/FireworkController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/FireworkController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftFirework;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftFirework;
import org.bukkit.entity.Firework;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/FishingHookController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/FishingHookController.java
similarity index 91%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/FishingHookController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/FishingHookController.java
index c1b50a79b..f4487d53b 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/FishingHookController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/FishingHookController.java
@@ -1,22 +1,22 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftFishHook;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftFishHook;
import org.bukkit.entity.FishHook;
import com.mojang.authlib.GameProfile;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/GlowItemFrameController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/GlowItemFrameController.java
similarity index 92%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/GlowItemFrameController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/GlowItemFrameController.java
index 01b621837..49ee6b9cb 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/GlowItemFrameController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/GlowItemFrameController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftGlowItemFrame;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftGlowItemFrame;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/InteractionController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/InteractionController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/InteractionController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/InteractionController.java
index 37b6fc23d..aaf4353c0 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/InteractionController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/InteractionController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftInteraction;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftInteraction;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ItemController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ItemController.java
similarity index 91%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ItemController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ItemController.java
index 99a771836..a6b93f42e 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ItemController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ItemController.java
@@ -1,17 +1,17 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftItem;
-import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftItem;
+import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack;
import org.bukkit.entity.Item;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ItemDisplayController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ItemDisplayController.java
similarity index 88%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ItemDisplayController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ItemDisplayController.java
index 948edfff7..d70e5ec64 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ItemDisplayController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ItemDisplayController.java
@@ -1,18 +1,18 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftItemDisplay;
-import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftItemDisplay;
+import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ItemFrameController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ItemFrameController.java
similarity index 92%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ItemFrameController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ItemFrameController.java
index 90b56d377..0e4a39346 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ItemFrameController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ItemFrameController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftItemFrame;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftItemFrame;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/LargeFireballController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/LargeFireballController.java
similarity index 90%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/LargeFireballController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/LargeFireballController.java
index ceba3d05e..6fe897a88 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/LargeFireballController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/LargeFireballController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftLargeFireball;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftLargeFireball;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/LeashController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/LeashController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/LeashController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/LeashController.java
index 71c1b030f..140bf84a0 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/LeashController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/LeashController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftLeash;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftLeash;
import org.bukkit.entity.LeashHitch;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/LlamaSpitController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/LlamaSpitController.java
similarity index 91%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/LlamaSpitController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/LlamaSpitController.java
index c75bc4515..968dce2f3 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/LlamaSpitController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/LlamaSpitController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftLlamaSpit;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftLlamaSpit;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MarkerController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MarkerController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MarkerController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MarkerController.java
index 7ee195fe0..15a86d58b 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MarkerController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MarkerController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftMarker;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftMarker;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartChestController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartChestController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartChestController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartChestController.java
index 3a997075e..2a7c13ed2 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartChestController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartChestController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftMinecartChest;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftMinecartChest;
import org.bukkit.entity.Minecart;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartCommandController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartCommandController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartCommandController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartCommandController.java
index eec912933..f65acb115 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartCommandController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartCommandController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftMinecartCommand;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftMinecartCommand;
import org.bukkit.entity.Minecart;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartFurnaceController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartFurnaceController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartFurnaceController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartFurnaceController.java
index 869b20571..3257bf773 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartFurnaceController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartFurnaceController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftMinecartFurnace;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftMinecartFurnace;
import org.bukkit.entity.Minecart;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartHopperController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartHopperController.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartHopperController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartHopperController.java
index 41b128d14..68a9965c6 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartHopperController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartHopperController.java
@@ -1,11 +1,11 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.entity.Minecart;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartRideableController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartRideableController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartRideableController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartRideableController.java
index 7595ae777..f9acac6ac 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartRideableController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartRideableController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftMinecartRideable;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftMinecartRideable;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartSpawnerController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartSpawnerController.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartSpawnerController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartSpawnerController.java
index ba9b9a34e..08986f8d6 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartSpawnerController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartSpawnerController.java
@@ -1,11 +1,11 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.entity.Minecart;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartTNTController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartTNTController.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartTNTController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartTNTController.java
index 1f6f796c4..3fba9c6e7 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/MinecartTNTController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/MinecartTNTController.java
@@ -1,11 +1,11 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.entity.Minecart;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/OminousItemSpawnerController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/OminousItemSpawnerController.java
new file mode 100644
index 000000000..5740a3f5a
--- /dev/null
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/OminousItemSpawnerController.java
@@ -0,0 +1,149 @@
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftOminousItemSpawner;
+import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack;
+
+import net.citizensnpcs.api.npc.NPC;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
+import net.citizensnpcs.npc.CitizensNPC;
+import net.citizensnpcs.npc.ai.NPCHolder;
+import net.citizensnpcs.util.Util;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.tags.TagKey;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.OminousItemSpawner;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.material.Fluid;
+import net.minecraft.world.level.material.PushReaction;
+import net.minecraft.world.phys.AABB;
+import net.minecraft.world.phys.Vec3;
+
+public class OminousItemSpawnerController extends MobEntityController {
+ public OminousItemSpawnerController() {
+ super(EntityOminousItemSpawnerNPC.class);
+ }
+
+ @Override
+ protected org.bukkit.entity.Entity createEntity(Location at, NPC npc) {
+ final EntityOminousItemSpawnerNPC handle = new EntityOminousItemSpawnerNPC(EntityType.OMINOUS_ITEM_SPAWNER,
+ ((CraftWorld) at.getWorld()).getHandle(), npc);
+ if (npc != null) {
+ handle.setItem(CraftItemStack.asNMSCopy(npc.getItemProvider().get()));
+ }
+ return handle.getBukkitEntity();
+ }
+
+ @Override
+ public org.bukkit.entity.OminousItemSpawner getBukkitEntity() {
+ return (org.bukkit.entity.OminousItemSpawner) super.getBukkitEntity();
+ }
+
+ public static class EntityOminousItemSpawnerNPC extends OminousItemSpawner implements NPCHolder {
+ private final CitizensNPC npc;
+
+ public EntityOminousItemSpawnerNPC(EntityType extends OminousItemSpawner> types, Level level) {
+ this(types, level, null);
+ }
+
+ public EntityOminousItemSpawnerNPC(EntityType extends OminousItemSpawner> 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 OminousItemSpawnerNPC(this));
+ }
+ return super.getBukkitEntity();
+ }
+
+ @Override
+ public NPC getNPC() {
+ return npc;
+ }
+
+ @Override
+ public PushReaction getPistonPushReaction() {
+ return Util.callPistonPushEvent(npc) ? PushReaction.IGNORE : super.getPistonPushReaction();
+ }
+
+ @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(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, Vec3 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) {
+ if (npc == null)
+ return super.updateFluidHeightAndDoFluidPushing(tagkey, d0);
+ Vec3 old = getDeltaMovement().add(0, 0, 0);
+ boolean res = super.updateFluidHeightAndDoFluidPushing(tagkey, d0);
+ if (!npc.isPushableByFluids()) {
+ setDeltaMovement(old);
+ }
+ return res;
+ }
+ }
+
+ public static class OminousItemSpawnerNPC extends CraftOminousItemSpawner implements NPCHolder {
+ private final CitizensNPC npc;
+
+ public OminousItemSpawnerNPC(EntityOminousItemSpawnerNPC entity) {
+ super((CraftServer) Bukkit.getServer(), entity);
+ this.npc = entity.npc;
+ setItem(npc.getItemProvider().get());
+ }
+
+ @Override
+ public NPC getNPC() {
+ return npc;
+ }
+ }
+}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/PaintingController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/PaintingController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/PaintingController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/PaintingController.java
index 739a2ca88..5f475330e 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/PaintingController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/PaintingController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPainting;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPainting;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ShulkerBulletController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ShulkerBulletController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ShulkerBulletController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ShulkerBulletController.java
index 878235c72..44e5d6691 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ShulkerBulletController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ShulkerBulletController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftShulkerBullet;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftShulkerBullet;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/SmallFireballController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/SmallFireballController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/SmallFireballController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/SmallFireballController.java
index 7330b72fc..434d167cb 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/SmallFireballController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/SmallFireballController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftSmallFireball;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSmallFireball;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/SnowballController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/SnowballController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/SnowballController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/SnowballController.java
index 3fba8d21d..185dfa22c 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/SnowballController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/SnowballController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftSnowball;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSnowball;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/SpectralArrowController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/SpectralArrowController.java
similarity index 87%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/SpectralArrowController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/SpectralArrowController.java
index 9ab6c26ca..c4afaf103 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/SpectralArrowController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/SpectralArrowController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftArrow;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftSpectralArrow;
import org.bukkit.entity.Arrow;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
@@ -121,7 +121,7 @@ public class SpectralArrowController extends MobEntityController {
}
}
- public static class SpectralArrowNPC extends CraftArrow implements ForwardingNPCHolder {
+ public static class SpectralArrowNPC extends CraftSpectralArrow implements ForwardingNPCHolder {
public SpectralArrowNPC(EntitySpectralArrowNPC entity) {
super((CraftServer) Bukkit.getServer(), entity);
}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/TNTPrimedController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/TNTPrimedController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/TNTPrimedController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/TNTPrimedController.java
index 91b510d5e..30f72d45d 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/TNTPrimedController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/TNTPrimedController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftTNTPrimed;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftTNTPrimed;
import org.bukkit.entity.TNTPrimed;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/TextDisplayController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/TextDisplayController.java
similarity index 90%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/TextDisplayController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/TextDisplayController.java
index 164e26eee..e3a6049c4 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/TextDisplayController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/TextDisplayController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftTextDisplay;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftTextDisplay;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ThrownExpBottleController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ThrownExpBottleController.java
similarity index 90%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ThrownExpBottleController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ThrownExpBottleController.java
index 3fbb12380..bb1abfa13 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ThrownExpBottleController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ThrownExpBottleController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftThrownExpBottle;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftThrownExpBottle;
import org.bukkit.entity.ThrownExpBottle;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ThrownPotionController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ThrownPotionController.java
similarity index 91%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ThrownPotionController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ThrownPotionController.java
index 7c676074c..8f25e7af4 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ThrownPotionController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ThrownPotionController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftThrownPotion;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftThrownPotion;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ThrownTridentController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ThrownTridentController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ThrownTridentController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ThrownTridentController.java
index ea95144b9..58091aa5b 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/ThrownTridentController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/ThrownTridentController.java
@@ -1,16 +1,16 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftTrident;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftTrident;
import org.bukkit.entity.Trident;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/TippedArrowController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/TippedArrowController.java
similarity index 87%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/TippedArrowController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/TippedArrowController.java
index 53e0069b2..1e8d34507 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/TippedArrowController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/TippedArrowController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftTippedArrow;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftArrow;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
@@ -120,7 +120,7 @@ public class TippedArrowController extends MobEntityController {
}
}
- public static class TippedArrowNPC extends CraftTippedArrow implements ForwardingNPCHolder {
+ public static class TippedArrowNPC extends CraftArrow implements ForwardingNPCHolder {
public TippedArrowNPC(EntityTippedArrowNPC entity) {
super((CraftServer) Bukkit.getServer(), entity);
}
diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/WindChargeController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/WindChargeController.java
new file mode 100644
index 000000000..d11f73c8c
--- /dev/null
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/WindChargeController.java
@@ -0,0 +1,128 @@
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
+
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftWindCharge;
+
+import net.citizensnpcs.api.npc.NPC;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
+import net.citizensnpcs.npc.CitizensNPC;
+import net.citizensnpcs.npc.ai.NPCHolder;
+import net.citizensnpcs.util.Util;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.tags.TagKey;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.projectile.windcharge.WindCharge;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.material.Fluid;
+import net.minecraft.world.level.material.PushReaction;
+import net.minecraft.world.phys.AABB;
+import net.minecraft.world.phys.Vec3;
+
+public class WindChargeController extends MobEntityController {
+ public WindChargeController() {
+ super(EntityWindChargeNPC.class);
+ }
+
+ @Override
+ public org.bukkit.entity.WindCharge getBukkitEntity() {
+ return (org.bukkit.entity.WindCharge) super.getBukkitEntity();
+ }
+
+ public static class EntityWindChargeNPC extends WindCharge implements NPCHolder {
+ private final CitizensNPC npc;
+
+ public EntityWindChargeNPC(EntityType extends WindCharge> types, Level level) {
+ this(types, level, null);
+ }
+
+ public EntityWindChargeNPC(EntityType extends WindCharge> 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 WindChargeNPC(this));
+ }
+ return super.getBukkitEntity();
+ }
+
+ @Override
+ public NPC getNPC() {
+ return npc;
+ }
+
+ @Override
+ public PushReaction getPistonPushReaction() {
+ return Util.callPistonPushEvent(npc) ? PushReaction.IGNORE : super.getPistonPushReaction();
+ }
+
+ @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(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, Vec3 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) {
+ if (npc == null)
+ return super.updateFluidHeightAndDoFluidPushing(tagkey, d0);
+ Vec3 old = getDeltaMovement().add(0, 0, 0);
+ boolean res = super.updateFluidHeightAndDoFluidPushing(tagkey, d0);
+ if (!npc.isPushableByFluids()) {
+ setDeltaMovement(old);
+ }
+ return res;
+ }
+ }
+
+ public static class WindChargeNPC extends CraftWindCharge implements ForwardingNPCHolder {
+ public WindChargeNPC(EntityWindChargeNPC entity) {
+ super((CraftServer) Bukkit.getServer(), entity);
+ }
+ }
+}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/WitherSkullController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/WitherSkullController.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/WitherSkullController.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/WitherSkullController.java
index 6df8b6c15..5ac6ea326 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/entity/nonliving/WitherSkullController.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/nonliving/WitherSkullController.java
@@ -1,15 +1,15 @@
-package net.citizensnpcs.nms.v1_20_R3.entity.nonliving;
+package net.citizensnpcs.nms.v1_20_R4.entity.nonliving;
import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftWitherSkull;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftWitherSkull;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.MobEntityController;
-import net.citizensnpcs.nms.v1_20_R3.util.ForwardingNPCHolder;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSBoundingBox;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.entity.MobEntityController;
+import net.citizensnpcs.nms.v1_20_R4.util.ForwardingNPCHolder;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSBoundingBox;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/network/EmptyConnection.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/network/EmptyConnection.java
similarity index 88%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/network/EmptyConnection.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/network/EmptyConnection.java
index 6bd650ba4..80fd0c65c 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/network/EmptyConnection.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/network/EmptyConnection.java
@@ -1,9 +1,9 @@
-package net.citizensnpcs.nms.v1_20_R3.network;
+package net.citizensnpcs.nms.v1_20_R4.network;
import java.io.IOException;
import java.net.SocketAddress;
-import net.citizensnpcs.nms.v1_20_R3.util.NMSImpl;
+import net.citizensnpcs.nms.v1_20_R4.util.NMSImpl;
import net.citizensnpcs.util.EmptyChannel;
import net.minecraft.network.Connection;
import net.minecraft.network.PacketListener;
@@ -42,7 +42,7 @@ public class EmptyConnection extends Connection {
}
@Override
- public void setListener(PacketListener pl) {
+ public void setListenerForServerboundHandshake(PacketListener pl) {
try {
NMSImpl.CONNECTION_PACKET_LISTENER.invoke(this, pl);
NMSImpl.CONNECTION_DISCONNECT_LISTENER.invoke(this, null);
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/network/EmptyPacketListener.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/network/EmptyPacketListener.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/network/EmptyPacketListener.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/network/EmptyPacketListener.java
index 2ef4f99ff..679657d8b 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/network/EmptyPacketListener.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/network/EmptyPacketListener.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.network;
+package net.citizensnpcs.nms.v1_20_R4.network;
import net.minecraft.network.Connection;
import net.minecraft.network.protocol.Packet;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/CitizensBlockBreaker.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/CitizensBlockBreaker.java
similarity index 97%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/CitizensBlockBreaker.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/CitizensBlockBreaker.java
index b2b979c55..cb5b06b92 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/CitizensBlockBreaker.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/CitizensBlockBreaker.java
@@ -1,6 +1,6 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
-import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack;
import net.citizensnpcs.util.AbstractBlockBreaker;
import net.minecraft.core.BlockPos;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/CitizensEntityTracker.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/CitizensEntityTracker.java
similarity index 98%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/CitizensEntityTracker.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/CitizensEntityTracker.java
index 8449a99cd..9faafe988 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/CitizensEntityTracker.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/CitizensEntityTracker.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import java.lang.invoke.MethodHandle;
import java.util.Collection;
@@ -13,7 +13,7 @@ import net.citizensnpcs.api.event.NPCLinkToPlayerEvent;
import net.citizensnpcs.api.event.NPCSeenByPlayerEvent;
import net.citizensnpcs.api.event.NPCUnlinkFromPlayerEvent;
import net.citizensnpcs.api.npc.NPC;
-import net.citizensnpcs.nms.v1_20_R3.entity.EntityHumanNPC;
+import net.citizensnpcs.nms.v1_20_R4.entity.EntityHumanNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/CustomEntityRegistry.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/CustomEntityRegistry.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/CustomEntityRegistry.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/CustomEntityRegistry.java
index 5a9d5cc71..cddac7ead 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/CustomEntityRegistry.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/CustomEntityRegistry.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import java.lang.invoke.MethodHandle;
import java.util.Iterator;
@@ -36,8 +36,10 @@ import net.minecraft.world.entity.Display;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ExperienceOrb;
import net.minecraft.world.entity.GlowSquid;
+import net.minecraft.world.entity.Interaction;
import net.minecraft.world.entity.LightningBolt;
import net.minecraft.world.entity.Marker;
+import net.minecraft.world.entity.OminousItemSpawner;
import net.minecraft.world.entity.ambient.Bat;
import net.minecraft.world.entity.animal.Bee;
import net.minecraft.world.entity.animal.Cat;
@@ -63,6 +65,7 @@ import net.minecraft.world.entity.animal.TropicalFish;
import net.minecraft.world.entity.animal.Turtle;
import net.minecraft.world.entity.animal.Wolf;
import net.minecraft.world.entity.animal.allay.Allay;
+import net.minecraft.world.entity.animal.armadillo.Armadillo;
import net.minecraft.world.entity.animal.axolotl.Axolotl;
import net.minecraft.world.entity.animal.camel.Camel;
import net.minecraft.world.entity.animal.frog.Frog;
@@ -88,6 +91,7 @@ import net.minecraft.world.entity.item.FallingBlockEntity;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.item.PrimedTnt;
import net.minecraft.world.entity.monster.Blaze;
+import net.minecraft.world.entity.monster.Bogged;
import net.minecraft.world.entity.monster.CaveSpider;
import net.minecraft.world.entity.monster.Creeper;
import net.minecraft.world.entity.monster.Drowned;
@@ -119,6 +123,7 @@ import net.minecraft.world.entity.monster.Zoglin;
import net.minecraft.world.entity.monster.Zombie;
import net.minecraft.world.entity.monster.ZombieVillager;
import net.minecraft.world.entity.monster.ZombifiedPiglin;
+import net.minecraft.world.entity.monster.breeze.Breeze;
import net.minecraft.world.entity.monster.hoglin.Hoglin;
import net.minecraft.world.entity.monster.piglin.Piglin;
import net.minecraft.world.entity.monster.piglin.PiglinBrute;
@@ -143,6 +148,8 @@ import net.minecraft.world.entity.projectile.ThrownExperienceBottle;
import net.minecraft.world.entity.projectile.ThrownPotion;
import net.minecraft.world.entity.projectile.ThrownTrident;
import net.minecraft.world.entity.projectile.WitherSkull;
+import net.minecraft.world.entity.projectile.windcharge.BreezeWindCharge;
+import net.minecraft.world.entity.projectile.windcharge.WindCharge;
import net.minecraft.world.entity.vehicle.Boat;
import net.minecraft.world.entity.vehicle.ChestBoat;
import net.minecraft.world.entity.vehicle.Minecart;
@@ -315,11 +322,6 @@ public class CustomEntityRegistry extends DefaultedMappedRegistry>
return wrapped.keySet();
}
- @Override
- public Lifecycle lifecycle(EntityType type) {
- return wrapped.lifecycle(type);
- }
-
public void put(int entityId, ResourceLocation key, EntityType entityClass) {
entities.put(key, entityClass);
entityIds.put(entityClass, entityId);
@@ -341,45 +343,56 @@ public class CustomEntityRegistry extends DefaultedMappedRegistry>
}
private static final MethodHandle IREGISTRY_LIFECYCLE = NMS.getFirstGetter(MappedRegistry.class, Lifecycle.class);
- // replace regex .*?> ([A-Z_]+).*?of\((.*?)::new.*?$ minecraftClassMap.put(EntityType.\1, \2.class);
+ // replace regex ([A-Z_]+) =.*?of\((.*?)::new.*?$ minecraftClassMap.put(EntityType.\1, \2.class);
private static final MethodHandle IREGISTRY_RESOURCE_KEY = NMS.getFirstGetter(MappedRegistry.class,
ResourceKey.class);
private static final BiMap> minecraftClassMap = HashBiMap.create();
static {
minecraftClassMap.put(EntityType.ALLAY, Allay.class);
minecraftClassMap.put(EntityType.AREA_EFFECT_CLOUD, AreaEffectCloud.class);
+ minecraftClassMap.put(EntityType.ARMADILLO, Armadillo.class);
minecraftClassMap.put(EntityType.ARMOR_STAND, ArmorStand.class);
minecraftClassMap.put(EntityType.ARROW, Arrow.class);
minecraftClassMap.put(EntityType.AXOLOTL, Axolotl.class);
minecraftClassMap.put(EntityType.BAT, Bat.class);
minecraftClassMap.put(EntityType.BEE, Bee.class);
minecraftClassMap.put(EntityType.BLAZE, Blaze.class);
+ minecraftClassMap.put(EntityType.BLOCK_DISPLAY, Display.BlockDisplay.class);
minecraftClassMap.put(EntityType.BOAT, Boat.class);
- minecraftClassMap.put(EntityType.CHEST_BOAT, ChestBoat.class);
- minecraftClassMap.put(EntityType.CAT, Cat.class);
+ minecraftClassMap.put(EntityType.BOGGED, Bogged.class);
+ minecraftClassMap.put(EntityType.BREEZE, Breeze.class);
+ minecraftClassMap.put(EntityType.BREEZE_WIND_CHARGE, BreezeWindCharge.class);
minecraftClassMap.put(EntityType.CAMEL, Camel.class);
+ minecraftClassMap.put(EntityType.CAT, Cat.class);
minecraftClassMap.put(EntityType.CAVE_SPIDER, CaveSpider.class);
+ minecraftClassMap.put(EntityType.CHEST_BOAT, ChestBoat.class);
+ minecraftClassMap.put(EntityType.CHEST_MINECART, MinecartChest.class);
minecraftClassMap.put(EntityType.CHICKEN, Chicken.class);
minecraftClassMap.put(EntityType.COD, Cod.class);
+ minecraftClassMap.put(EntityType.COMMAND_BLOCK_MINECART, MinecartCommandBlock.class);
minecraftClassMap.put(EntityType.COW, Cow.class);
minecraftClassMap.put(EntityType.CREEPER, Creeper.class);
minecraftClassMap.put(EntityType.DOLPHIN, Dolphin.class);
minecraftClassMap.put(EntityType.DONKEY, Donkey.class);
minecraftClassMap.put(EntityType.DRAGON_FIREBALL, DragonFireball.class);
minecraftClassMap.put(EntityType.DROWNED, Drowned.class);
+ minecraftClassMap.put(EntityType.EGG, ThrownEgg.class);
minecraftClassMap.put(EntityType.ELDER_GUARDIAN, ElderGuardian.class);
minecraftClassMap.put(EntityType.END_CRYSTAL, EndCrystal.class);
minecraftClassMap.put(EntityType.ENDER_DRAGON, EnderDragon.class);
+ minecraftClassMap.put(EntityType.ENDER_PEARL, ThrownEnderpearl.class);
minecraftClassMap.put(EntityType.ENDERMAN, EnderMan.class);
minecraftClassMap.put(EntityType.ENDERMITE, Endermite.class);
minecraftClassMap.put(EntityType.EVOKER, Evoker.class);
minecraftClassMap.put(EntityType.EVOKER_FANGS, EvokerFangs.class);
+ minecraftClassMap.put(EntityType.EXPERIENCE_BOTTLE, ThrownExperienceBottle.class);
minecraftClassMap.put(EntityType.EXPERIENCE_ORB, ExperienceOrb.class);
minecraftClassMap.put(EntityType.EYE_OF_ENDER, EyeOfEnder.class);
minecraftClassMap.put(EntityType.FALLING_BLOCK, FallingBlockEntity.class);
minecraftClassMap.put(EntityType.FIREWORK_ROCKET, FireworkRocketEntity.class);
minecraftClassMap.put(EntityType.FOX, Fox.class);
minecraftClassMap.put(EntityType.FROG, Frog.class);
+ minecraftClassMap.put(EntityType.FURNACE_MINECART, MinecartFurnace.class);
minecraftClassMap.put(EntityType.GHAST, Ghast.class);
minecraftClassMap.put(EntityType.GIANT, Giant.class);
minecraftClassMap.put(EntityType.GLOW_ITEM_FRAME, GlowItemFrame.class);
@@ -387,12 +400,16 @@ public class CustomEntityRegistry extends DefaultedMappedRegistry>
minecraftClassMap.put(EntityType.GOAT, Goat.class);
minecraftClassMap.put(EntityType.GUARDIAN, Guardian.class);
minecraftClassMap.put(EntityType.HOGLIN, Hoglin.class);
+ minecraftClassMap.put(EntityType.HOPPER_MINECART, MinecartHopper.class);
minecraftClassMap.put(EntityType.HORSE, Horse.class);
minecraftClassMap.put(EntityType.HUSK, Husk.class);
minecraftClassMap.put(EntityType.ILLUSIONER, Illusioner.class);
+ minecraftClassMap.put(EntityType.INTERACTION, Interaction.class);
minecraftClassMap.put(EntityType.IRON_GOLEM, IronGolem.class);
minecraftClassMap.put(EntityType.ITEM, ItemEntity.class);
+ minecraftClassMap.put(EntityType.ITEM_DISPLAY, Display.ItemDisplay.class);
minecraftClassMap.put(EntityType.ITEM_FRAME, ItemFrame.class);
+ minecraftClassMap.put(EntityType.OMINOUS_ITEM_SPAWNER, OminousItemSpawner.class);
minecraftClassMap.put(EntityType.FIREBALL, LargeFireball.class);
minecraftClassMap.put(EntityType.LEASH_KNOT, LeashFenceKnotEntity.class);
minecraftClassMap.put(EntityType.LIGHTNING_BOLT, LightningBolt.class);
@@ -401,14 +418,8 @@ public class CustomEntityRegistry extends DefaultedMappedRegistry>
minecraftClassMap.put(EntityType.MAGMA_CUBE, MagmaCube.class);
minecraftClassMap.put(EntityType.MARKER, Marker.class);
minecraftClassMap.put(EntityType.MINECART, Minecart.class);
- minecraftClassMap.put(EntityType.CHEST_MINECART, MinecartChest.class);
- minecraftClassMap.put(EntityType.COMMAND_BLOCK_MINECART, MinecartCommandBlock.class);
- minecraftClassMap.put(EntityType.FURNACE_MINECART, MinecartFurnace.class);
- minecraftClassMap.put(EntityType.HOPPER_MINECART, MinecartHopper.class);
- minecraftClassMap.put(EntityType.SPAWNER_MINECART, MinecartSpawner.class);
- minecraftClassMap.put(EntityType.TNT_MINECART, MinecartTNT.class);
- minecraftClassMap.put(EntityType.MULE, Mule.class);
minecraftClassMap.put(EntityType.MOOSHROOM, MushroomCow.class);
+ minecraftClassMap.put(EntityType.MULE, Mule.class);
minecraftClassMap.put(EntityType.OCELOT, Ocelot.class);
minecraftClassMap.put(EntityType.PAINTING, Painting.class);
minecraftClassMap.put(EntityType.PANDA, Panda.class);
@@ -419,7 +430,7 @@ public class CustomEntityRegistry extends DefaultedMappedRegistry>
minecraftClassMap.put(EntityType.PIGLIN_BRUTE, PiglinBrute.class);
minecraftClassMap.put(EntityType.PILLAGER, Pillager.class);
minecraftClassMap.put(EntityType.POLAR_BEAR, PolarBear.class);
- minecraftClassMap.put(EntityType.TNT, PrimedTnt.class);
+ minecraftClassMap.put(EntityType.POTION, ThrownPotion.class);
minecraftClassMap.put(EntityType.PUFFERFISH, Pufferfish.class);
minecraftClassMap.put(EntityType.RABBIT, Rabbit.class);
minecraftClassMap.put(EntityType.RAVAGER, Ravager.class);
@@ -427,30 +438,26 @@ 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, Sniffer.class);
- minecraftClassMap.put(EntityType.BLOCK_DISPLAY, Display.BlockDisplay.class);
- minecraftClassMap.put(EntityType.ITEM_DISPLAY, Display.ItemDisplay.class);
- minecraftClassMap.put(EntityType.TEXT_DISPLAY, Display.TextDisplay.class);
- minecraftClassMap.put(EntityType.INTERACTION, net.minecraft.world.entity.Interaction.class);
minecraftClassMap.put(EntityType.SILVERFISH, Silverfish.class);
minecraftClassMap.put(EntityType.SKELETON, Skeleton.class);
minecraftClassMap.put(EntityType.SKELETON_HORSE, SkeletonHorse.class);
minecraftClassMap.put(EntityType.SLIME, Slime.class);
minecraftClassMap.put(EntityType.SMALL_FIREBALL, SmallFireball.class);
+ minecraftClassMap.put(EntityType.SNIFFER, Sniffer.class);
minecraftClassMap.put(EntityType.SNOW_GOLEM, SnowGolem.class);
minecraftClassMap.put(EntityType.SNOWBALL, Snowball.class);
+ minecraftClassMap.put(EntityType.SPAWNER_MINECART, MinecartSpawner.class);
minecraftClassMap.put(EntityType.SPECTRAL_ARROW, SpectralArrow.class);
minecraftClassMap.put(EntityType.SPIDER, Spider.class);
minecraftClassMap.put(EntityType.SQUID, Squid.class);
minecraftClassMap.put(EntityType.STRAY, Stray.class);
minecraftClassMap.put(EntityType.STRIDER, Strider.class);
minecraftClassMap.put(EntityType.TADPOLE, Tadpole.class);
- minecraftClassMap.put(EntityType.EGG, ThrownEgg.class);
- minecraftClassMap.put(EntityType.ENDER_PEARL, ThrownEnderpearl.class);
- minecraftClassMap.put(EntityType.EXPERIENCE_BOTTLE, ThrownExperienceBottle.class);
- minecraftClassMap.put(EntityType.POTION, ThrownPotion.class);
- minecraftClassMap.put(EntityType.TRIDENT, ThrownTrident.class);
+ minecraftClassMap.put(EntityType.TEXT_DISPLAY, Display.TextDisplay.class);
+ minecraftClassMap.put(EntityType.TNT, PrimedTnt.class);
+ minecraftClassMap.put(EntityType.TNT_MINECART, MinecartTNT.class);
minecraftClassMap.put(EntityType.TRADER_LLAMA, TraderLlama.class);
+ minecraftClassMap.put(EntityType.TRIDENT, ThrownTrident.class);
minecraftClassMap.put(EntityType.TROPICAL_FISH, TropicalFish.class);
minecraftClassMap.put(EntityType.TURTLE, Turtle.class);
minecraftClassMap.put(EntityType.VEX, Vex.class);
@@ -458,6 +465,7 @@ public class CustomEntityRegistry extends DefaultedMappedRegistry>
minecraftClassMap.put(EntityType.VINDICATOR, Vindicator.class);
minecraftClassMap.put(EntityType.WANDERING_TRADER, WanderingTrader.class);
minecraftClassMap.put(EntityType.WARDEN, Warden.class);
+ minecraftClassMap.put(EntityType.WIND_CHARGE, WindCharge.class);
minecraftClassMap.put(EntityType.WITCH, Witch.class);
minecraftClassMap.put(EntityType.WITHER, WitherBoss.class);
minecraftClassMap.put(EntityType.WITHER_SKELETON, WitherSkeleton.class);
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EmptyAdvancementDataPlayer.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EmptyAdvancementDataPlayer.java
similarity index 98%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EmptyAdvancementDataPlayer.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EmptyAdvancementDataPlayer.java
index 27341c42e..1c7a9ba93 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EmptyAdvancementDataPlayer.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EmptyAdvancementDataPlayer.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import java.io.File;
import java.lang.invoke.MethodHandle;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EmptyServerStatsCounter.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EmptyServerStatsCounter.java
similarity index 95%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EmptyServerStatsCounter.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EmptyServerStatsCounter.java
index 5d26c0776..b2610bf90 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EmptyServerStatsCounter.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EmptyServerStatsCounter.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import com.mojang.datafixers.DataFixer;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityJumpControl.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityJumpControl.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityJumpControl.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityJumpControl.java
index e99ad0fd6..8ef8f161a 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityJumpControl.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityJumpControl.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityMoveControl.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityMoveControl.java
similarity index 98%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityMoveControl.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityMoveControl.java
index f78c338cf..9c1689bf4 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityMoveControl.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityMoveControl.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import java.util.Random;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityNavigation.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityNavigation.java
similarity index 97%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityNavigation.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityNavigation.java
index c9d6e9a9b..cc29ca3db 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityNavigation.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityNavigation.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import java.util.Set;
import java.util.stream.Collectors;
@@ -24,11 +24,11 @@ import net.minecraft.world.level.PathNavigationRegion;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.LevelChunk;
-import net.minecraft.world.level.pathfinder.BlockPathTypes;
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.PathType;
import net.minecraft.world.level.pathfinder.WalkNodeEvaluator;
import net.minecraft.world.phys.Vec3;
@@ -67,9 +67,9 @@ public class EntityNavigation extends PathNavigation {
}
@Override
- public boolean canCutCorner(BlockPathTypes pathtype) {
- return pathtype != BlockPathTypes.DANGER_FIRE && pathtype != BlockPathTypes.DANGER_POWDER_SNOW
- && pathtype != BlockPathTypes.DANGER_OTHER && pathtype != BlockPathTypes.WALKABLE_DOOR;
+ public boolean canCutCorner(PathType pathtype) {
+ return pathtype != PathType.DANGER_FIRE && pathtype != PathType.DANGER_POWDER_SNOW
+ && pathtype != PathType.DANGER_OTHER && pathtype != PathType.WALKABLE_DOOR;
}
@Override
@@ -325,13 +325,13 @@ public class EntityNavigation extends PathNavigation {
return new Vec3(this.mob.getX(), getSurfaceY(), this.mob.getZ());
}
- protected boolean hasValidPathType(BlockPathTypes var0) {
- if (var0 == BlockPathTypes.WATER) {
+ protected boolean hasValidPathType(PathType var0) {
+ if (var0 == PathType.WATER) {
return false;
- } else if (var0 == BlockPathTypes.LAVA) {
+ } else if (var0 == PathType.LAVA) {
return false;
} else {
- return var0 != BlockPathTypes.OPEN;
+ return var0 != PathType.OPEN;
}
}
diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityNodeEvaluator.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityNodeEvaluator.java
new file mode 100644
index 000000000..112e9ecf8
--- /dev/null
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityNodeEvaluator.java
@@ -0,0 +1,520 @@
+package net.citizensnpcs.nms.v1_20_R4.util;
+
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.Set;
+
+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.minecraft.core.BlockPos;
+import net.minecraft.core.Direction;
+import net.minecraft.core.Direction.Axis;
+import net.minecraft.core.Direction.Plane;
+import net.minecraft.tags.FluidTags;
+import net.minecraft.util.Mth;
+import net.minecraft.world.entity.LivingEntity;
+import net.minecraft.world.entity.Mob;
+import net.minecraft.world.level.BlockGetter;
+import net.minecraft.world.level.PathNavigationRegion;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraft.world.level.material.Fluids;
+import net.minecraft.world.level.pathfinder.Node;
+import net.minecraft.world.level.pathfinder.PathComputationType;
+import net.minecraft.world.level.pathfinder.PathType;
+import net.minecraft.world.level.pathfinder.PathfindingContext;
+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 EntityNodeEvaluator extends EntityNodeEvaluatorBase {
+ private final Object2BooleanMap collisionCache = new Object2BooleanOpenHashMap();
+ protected float oldWaterCost;
+ private final Long2ObjectMap pathTypesByPosCacheByMob = new Long2ObjectOpenHashMap();
+ private final Node[] reusableNeighbors = new Node[Plane.HORIZONTAL.length()];
+
+ 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) {
+ PathType var1 = this.getCachedPathType(var0.getX(), var0.getY(), var0.getZ());
+ return var1 != PathType.OPEN && this.mvmt.getPathfindingMalus(var1) >= 0.0F;
+ }
+
+ @Override
+ public void done() {
+ this.mvmt.setPathfindingMalus(PathType.WATER, this.oldWaterCost);
+ this.pathTypesByPosCacheByMob.clear();
+ this.collisionCache.clear();
+ super.done();
+ }
+
+ protected Node findAcceptedNode(int var0, int var1, int var2, int var3, double var4, Direction var6,
+ PathType 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 {
+ PathType var12 = this.getCachedPathType(var0, var1, var2);
+ float var13 = this.mvmt.getPathfindingMalus(var12);
+ 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 != PathType.WALKABLE && (!this.isAmphibious() || var12 != PathType.WATER)) {
+ if ((var8 == null || var8.costMalus < 0.0F) && var3 > 0
+ && (var12 != PathType.FENCE || this.canWalkOverFences()) && var12 != PathType.UNPASSABLE_RAIL
+ && var12 != PathType.TRAPDOOR && var12 != PathType.POWDER_SNOW) {
+ var8 = this.tryJumpOn(var0, var1, var2, var3, var4, var6, var7, var9);
+ } else if (!this.isAmphibious() && var12 == PathType.WATER && !this.canFloat()) {
+ var8 = this.tryFindFirstNonWaterBelow(var0, var1, var2, var8);
+ } else if (var12 == PathType.OPEN) {
+ var8 = this.tryFindFirstGroundNodeBelow(var0, var1, var2);
+ } else if (doesBlockHavePartialCollision(var12) && var8 == null) {
+ var8 = this.getClosedNode(var0, var1, var2, var12);
+ }
+ return var8;
+ } else {
+ return var8;
+ }
+ }
+ }
+
+ private Node getBlockedNode(int var0, int var1, int var2) {
+ Node var3 = this.getNode(var0, var1, var2);
+ var3.type = PathType.BLOCKED;
+ var3.costMalus = -1.0F;
+ return var3;
+ }
+
+ protected PathType getCachedPathType(int var0, int var1, int var2) {
+ return (PathType) this.pathTypesByPosCacheByMob.computeIfAbsent(BlockPos.asLong(var0, var1, var2), (var3) -> {
+ return this.getPathTypeOfMob(this.currentContext, var0, var1, var2, this.mob);
+ });
+ }
+
+ private Node getClosedNode(int var0, int var1, int var2, PathType var3) {
+ Node var4 = this.getNode(var0, var1, var2);
+ var4.closed = true;
+ var4.type = var3;
+ var4.costMalus = var3.getMalus();
+ return var4;
+ }
+
+ protected double getFloorLevel(BlockPos var0) {
+ BlockGetter var1 = this.currentContext.level();
+ return (this.canFloat() || this.isAmphibious()) && var1.getFluidState(var0).is(FluidTags.WATER)
+ ? var0.getY() + 0.5
+ : getFloorLevel(var1, var0);
+ }
+
+ 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;
+ PathType var4 = this.getCachedPathType(var1.x, var1.y + 1, var1.z);
+ PathType var5 = this.getCachedPathType(var1.x, var1.y, var1.z);
+ if (this.mvmt.getPathfindingMalus(var4) >= 0.0F && var5 != PathType.STICKY_HONEY) {
+ var3 = Mth.floor(Math.max(1.0F, this.mob.maxUpStep()));
+ }
+ double var6 = this.getFloorLevel(new BlockPos(var1.x, var1.y, var1.z));
+ Iterator var99 = Plane.HORIZONTAL.iterator();
+
+ while (var99.hasNext()) {
+ Direction var9 = var99.next();
+ Node var10 = this.findAcceptedNode(var1.x + var9.getStepX(), var1.y, var1.z + var9.getStepZ(), var3, var6,
+ var9, var5);
+ this.reusableNeighbors[var9.get2DDataValue()] = var10;
+ if (this.isNeighborValid(var10, var1)) {
+ var0[var2++] = var10;
+ }
+ }
+ var99 = Plane.HORIZONTAL.iterator();
+
+ while (var99.hasNext()) {
+ Direction var9 = var99.next();
+ Direction var10 = var9.getClockWise();
+ if (this.isDiagonalValid(var1, this.reusableNeighbors[var9.get2DDataValue()],
+ this.reusableNeighbors[var10.get2DDataValue()])) {
+ Node var11 = this.findAcceptedNode(var1.x + var9.getStepX() + var10.getStepX(), var1.y,
+ var1.z + var9.getStepZ() + var10.getStepZ(), var3, var6, var9, var5);
+ if (this.isDiagonalValid(var11)) {
+ var0[var2++] = var11;
+ }
+ }
+ }
+ return var2;
+ }
+
+ private Node getNodeAndUpdateCostToMax(int var0, int var1, int var2, PathType var3, float var4) {
+ Node var5 = this.getNode(var0, var1, var2);
+ var5.type = var3;
+ var5.costMalus = Math.max(var5.costMalus, var4);
+ return var5;
+ }
+
+ @Override
+ public PathType getPathType(PathfindingContext var0, int var1, int var2, int var3) {
+ return getPathTypeStatic(var0, new BlockPos.MutableBlockPos(var1, var2, var3));
+ }
+
+ public PathType getPathTypeOfMob(PathfindingContext var0, int var1, int var2, int var3, LivingEntity var4) {
+ Set var5 = this.getPathTypeWithinMobBB(var0, var1, var2, var3);
+ if (var5.contains(PathType.FENCE)) {
+ return PathType.FENCE;
+ } else if (var5.contains(PathType.UNPASSABLE_RAIL)) {
+ return PathType.UNPASSABLE_RAIL;
+ } else {
+ PathType var6 = PathType.BLOCKED;
+ Iterator var88 = var5.iterator();
+
+ while (var88.hasNext()) {
+ PathType var8 = var88.next();
+ if (mvmt.getPathfindingMalus(var8) < 0.0F) {
+ return var8;
+ }
+ if (mvmt.getPathfindingMalus(var8) >= mvmt.getPathfindingMalus(var6)) {
+ var6 = var8;
+ }
+ }
+ if (this.entityWidth <= 1 && var6 != PathType.OPEN && mvmt.getPathfindingMalus(var6) == 0.0F
+ && this.getPathType(var0, var1, var2, var3) == PathType.OPEN) {
+ return PathType.OPEN;
+ } else {
+ return var6;
+ }
+ }
+ }
+
+ @Override
+ public PathType getPathTypeOfMob(PathfindingContext var0, int var1, int var2, int var3, Mob var4) {
+ Set var5 = this.getPathTypeWithinMobBB(var0, var1, var2, var3);
+ if (var5.contains(PathType.FENCE)) {
+ return PathType.FENCE;
+ } else if (var5.contains(PathType.UNPASSABLE_RAIL)) {
+ return PathType.UNPASSABLE_RAIL;
+ } else {
+ PathType var6 = PathType.BLOCKED;
+ Iterator var88 = var5.iterator();
+
+ while (var88.hasNext()) {
+ PathType var8 = var88.next();
+ if (var4.getPathfindingMalus(var8) < 0.0F) {
+ return var8;
+ }
+ if (var4.getPathfindingMalus(var8) >= var4.getPathfindingMalus(var6)) {
+ var6 = var8;
+ }
+ }
+ if (this.entityWidth <= 1 && var6 != PathType.OPEN && var4.getPathfindingMalus(var6) == 0.0F
+ && this.getPathType(var0, var1, var2, var3) == PathType.OPEN) {
+ return PathType.OPEN;
+ } else {
+ return var6;
+ }
+ }
+ }
+
+ public Set getPathTypeWithinMobBB(PathfindingContext var0, int var1, int var2, int var3) {
+ EnumSet var4 = EnumSet.noneOf(PathType.class);
+
+ for (int var5 = 0; var5 < this.entityWidth; ++var5) {
+ for (int var6 = 0; var6 < this.entityHeight; ++var6) {
+ for (int var7 = 0; var7 < this.entityDepth; ++var7) {
+ int var8 = var5 + var1;
+ int var9 = var6 + var2;
+ int var10 = var7 + var3;
+ PathType var11 = this.getPathType(var0, var8, var9, var10);
+ BlockPos var12 = this.mob.blockPosition();
+ boolean var13 = this.canPassDoors();
+ if (var11 == PathType.DOOR_WOOD_CLOSED && this.canOpenDoors() && var13) {
+ var11 = PathType.WALKABLE_DOOR;
+ }
+ if (var11 == PathType.DOOR_OPEN && !var13) {
+ var11 = PathType.BLOCKED;
+ }
+ if (var11 == PathType.RAIL
+ && this.getPathType(var0, var12.getX(), var12.getY(), var12.getZ()) != PathType.RAIL
+ && this.getPathType(var0, var12.getX(), var12.getY() - 1, var12.getZ()) != PathType.RAIL) {
+ var11 = PathType.UNPASSABLE_RAIL;
+ }
+ var4.add(var11);
+ }
+ }
+ }
+ return var4;
+ }
+
+ @Override
+ public Node getStart() {
+ BlockPos.MutableBlockPos var1 = new BlockPos.MutableBlockPos();
+ int var0 = this.mob.getBlockY();
+ BlockState var2 = this.currentContext.getBlockState(var1.set(this.mob.getX(), var0, this.mob.getZ()));
+ 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.currentContext.getBlockState(var1.set(this.mob.getX(), var0, this.mob.getZ()));
+ }
+ } else if (this.mob.onGround()) {
+ var0 = Mth.floor(this.mob.getY() + 0.5);
+ } else {
+ var1.set(this.mob.getX(), this.mob.getY() + 1.0, this.mob.getZ());
+
+ while (var1.getY() > this.currentContext.level().getMinBuildHeight()) {
+ var0 = var1.getY();
+ var1.setY(var1.getY() - 1);
+ BlockState var3 = this.currentContext.getBlockState(var1);
+ if (!var3.isAir() && !var3.isPathfindable(PathComputationType.LAND)) {
+ break;
+ }
+ }
+ }
+ } else {
+ while (true) {
+ if (!this.mob.canStandOnFluid(var2.getFluidState())) {
+ --var0;
+ break;
+ }
+ ++var0;
+ var2 = this.currentContext.getBlockState(var1.set(this.mob.getX(), var0, this.mob.getZ()));
+ }
+ }
+ BlockPos 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.getCachedPathType(var1.x, var1.y, var1.z);
+ var1.costMalus = this.mvmt.getPathfindingMalus(var1.type);
+ return var1;
+ }
+
+ @Override
+ public Target getTarget(double var0, double var2, double var4) {
+ return this.getTargetNodeAt(var0, var2, var4);
+ }
+
+ private boolean hasCollisions(AABB var0) {
+ return this.collisionCache.computeIfAbsent(var0, (var1) -> {
+ return !this.currentContext.level().noCollision(this.mob, var0);
+ });
+ }
+
+ protected boolean isAmphibious() {
+ return false;
+ }
+
+ protected boolean isDiagonalValid(Node var0) {
+ if (var0 != null && !var0.closed) {
+ if (var0.type == PathType.WALKABLE_DOOR) {
+ return false;
+ } else {
+ return var0.costMalus >= 0.0F;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ protected boolean isDiagonalValid(Node var0, Node var1, Node var2) {
+ if (var2 != null && var1 != null && var2.y <= var0.y && var1.y <= var0.y) {
+ if (var1.type != PathType.WALKABLE_DOOR && var2.type != PathType.WALKABLE_DOOR) {
+ boolean var3 = var2.type == PathType.FENCE && var1.type == PathType.FENCE
+ && this.mob.getBbWidth() < 0.5;
+ return (var2.y < var0.y || var2.costMalus >= 0.0F || var3)
+ && (var1.y < var0.y || var1.costMalus >= 0.0F || var3);
+ } 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, LivingEntity var1) {
+ super.prepare(var0, var1);
+ this.oldWaterCost = mvmt.getPathfindingMalus(PathType.WATER);
+ }
+
+ @Override
+ public void prepare(PathNavigationRegion var0, Mob var1) {
+ super.prepare(var0, var1);
+ this.oldWaterCost = mvmt.getPathfindingMalus(PathType.WATER);
+ }
+
+ private Node tryFindFirstGroundNodeBelow(int var0, int var1, int var2) {
+ for (int var3 = var1 - 1; var3 >= this.mob.level().getMinBuildHeight(); --var3) {
+ if (var1 - var3 > this.mob.getMaxFallDistance()) {
+ return this.getBlockedNode(var0, var3, var2);
+ }
+ PathType var4 = this.getCachedPathType(var0, var3, var2);
+ float var5 = this.mvmt.getPathfindingMalus(var4);
+ if (var4 != PathType.OPEN) {
+ if (var5 >= 0.0F) {
+ return this.getNodeAndUpdateCostToMax(var0, var3, var2, var4, var5);
+ }
+ return this.getBlockedNode(var0, var3, var2);
+ }
+ }
+ return this.getBlockedNode(var0, var1, var2);
+ }
+
+ private Node tryFindFirstNonWaterBelow(int var0, int var1, int var2, Node var3) {
+ --var1;
+
+ while (var1 > this.mob.level().getMinBuildHeight()) {
+ PathType var4 = this.getCachedPathType(var0, var1, var2);
+ if (var4 != PathType.WATER) {
+ return var3;
+ }
+ var3 = this.getNodeAndUpdateCostToMax(var0, var1, var2, var4, this.mvmt.getPathfindingMalus(var4));
+ --var1;
+ }
+ return var3;
+ }
+
+ private Node tryJumpOn(int var0, int var1, int var2, int var3, double var4, Direction var6, PathType var7,
+ BlockPos.MutableBlockPos var8) {
+ Node var9 = this.findAcceptedNode(var0, var1 + 1, var2, var3 - 1, var4, var6, var7);
+ if (var9 == null) {
+ return null;
+ } else if (this.mob.getBbWidth() >= 1.0F) {
+ return var9;
+ } else if (var9.type != PathType.OPEN && var9.type != PathType.WALKABLE) {
+ return var9;
+ } else {
+ double var10 = var0 - var6.getStepX() + 0.5;
+ double var12 = var2 - var6.getStepZ() + 0.5;
+ double var14 = this.mob.getBbWidth() / 2.0;
+ AABB var16 = new AABB(var10 - var14, this.getFloorLevel(var8.set(var10, var1 + 1, var12)) + 0.001,
+ var12 - var14, var10 + var14,
+ this.mob.getBbHeight()
+ + this.getFloorLevel(var8.set((double) var9.x, (double) var9.y, (double) var9.z)) - 0.002,
+ var12 + var14);
+ return this.hasCollisions(var16) ? null : var9;
+ }
+ }
+
+ public static PathType checkNeighbourBlocks(PathfindingContext var0, int var1, int var2, int var3, PathType var4) {
+ for (int var5 = -1; var5 <= 1; ++var5) {
+ for (int var6 = -1; var6 <= 1; ++var6) {
+ for (int var7 = -1; var7 <= 1; ++var7) {
+ if (var5 != 0 || var7 != 0) {
+ PathType var8 = var0.getPathTypeFromState(var1 + var5, var2 + var6, var3 + var7);
+ if (var8 == PathType.DAMAGE_OTHER) {
+ return PathType.DANGER_OTHER;
+ }
+ if (var8 == PathType.DAMAGE_FIRE || var8 == PathType.LAVA) {
+ return PathType.DANGER_FIRE;
+ }
+ if (var8 == PathType.WATER) {
+ return PathType.WATER_BORDER;
+ }
+ if (var8 == PathType.DAMAGE_CAUTIOUS) {
+ return PathType.DAMAGE_CAUTIOUS;
+ }
+ }
+ }
+ }
+ }
+ return var4;
+ }
+
+ private static boolean doesBlockHavePartialCollision(PathType var0) {
+ return var0 == PathType.FENCE || var0 == PathType.DOOR_WOOD_CLOSED || var0 == PathType.DOOR_IRON_CLOSED;
+ }
+
+ 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 PathType getPathTypeStatic(PathfindingContext var0, BlockPos.MutableBlockPos var1) {
+ int var2 = var1.getX();
+ int var3 = var1.getY();
+ int var4 = var1.getZ();
+ PathType var5 = var0.getPathTypeFromState(var2, var3, var4);
+ if (var5 == PathType.OPEN && var3 >= var0.level().getMinBuildHeight() + 1) {
+ PathType var10000;
+ switch (var0.getPathTypeFromState(var2, var3 - 1, var4)) {
+ case OPEN:
+ case WATER:
+ case LAVA:
+ case WALKABLE:
+ var10000 = PathType.OPEN;
+ break;
+ case DAMAGE_FIRE:
+ var10000 = PathType.DAMAGE_FIRE;
+ break;
+ case DAMAGE_OTHER:
+ var10000 = PathType.DAMAGE_OTHER;
+ break;
+ case STICKY_HONEY:
+ var10000 = PathType.STICKY_HONEY;
+ break;
+ case POWDER_SNOW:
+ var10000 = PathType.DANGER_POWDER_SNOW;
+ break;
+ case DAMAGE_CAUTIOUS:
+ var10000 = PathType.DAMAGE_CAUTIOUS;
+ break;
+ case TRAPDOOR:
+ var10000 = PathType.DANGER_TRAPDOOR;
+ break;
+ default:
+ var10000 = checkNeighbourBlocks(var0, var2, var3, var4, PathType.WALKABLE);
+ }
+ return var10000;
+ } else {
+ return var5;
+ }
+ }
+
+ public static final double SPACE_BETWEEN_WALL_POSTS = 0.5;
+}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityNodeEvaluatorBase.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityNodeEvaluatorBase.java
similarity index 70%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityNodeEvaluatorBase.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityNodeEvaluatorBase.java
index 75a9494cd..80c7cb774 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityNodeEvaluatorBase.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityNodeEvaluatorBase.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@@ -9,19 +9,22 @@ import net.minecraft.world.entity.Mob;
import net.minecraft.world.level.PathNavigationRegion;
import net.minecraft.world.level.pathfinder.Node;
import net.minecraft.world.level.pathfinder.NodeEvaluator;
+import net.minecraft.world.level.pathfinder.PathType;
+import net.minecraft.world.level.pathfinder.PathfindingContext;
+import net.minecraft.world.level.pathfinder.Target;
public abstract class EntityNodeEvaluatorBase extends NodeEvaluator {
protected boolean canFloat;
protected boolean canOpenDoors;
protected boolean canPassDoors;
protected boolean canWalkOverFences;
+ protected PathfindingContext currentContext;
protected int entityDepth;
protected int entityHeight;
protected int entityWidth;
- protected PathNavigationRegion level;
protected LivingEntity mob;
protected MobAI mvmt;
- protected final Int2ObjectMap nodes = new Int2ObjectOpenHashMap<>();
+ protected final Int2ObjectMap nodes = new Int2ObjectOpenHashMap();
@Override
public boolean canFloat() {
@@ -45,7 +48,7 @@ public abstract class EntityNodeEvaluatorBase extends NodeEvaluator {
@Override
public void done() {
- this.level = null;
+ this.currentContext = null;
this.mob = null;
this.mvmt = null;
}
@@ -57,18 +60,25 @@ public abstract class EntityNodeEvaluatorBase extends NodeEvaluator {
@Override
protected Node getNode(int var0, int var1, int var2) {
- return this.nodes.computeIfAbsent(Node.createHash(var0, var1, var2), var3 -> new Node(var0, var1, var2));
+ return (Node) 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 PathType getPathType(Mob var0, BlockPos var1) {
+ return this.getPathType(new PathfindingContext(var0.level(), var0), var1.getX(), var1.getY(), var1.getZ());
+ }
+
+ @Override
+ protected Target getTargetNodeAt(double var0, double var2, double var4) {
+ return new Target(this.getNode(Mth.floor(var0), Mth.floor(var2), Mth.floor(var4)));
}
public void prepare(PathNavigationRegion var0, LivingEntity var1) {
this.mob = var1;
this.mvmt = MobAI.from(var1);
- this.level = var0;
+ this.currentContext = new EntityPathfindingContext(var0, var1);
this.nodes.clear();
this.entityWidth = Mth.floor(var1.getBbWidth() + 1.0F);
this.entityHeight = Mth.floor(var1.getBbHeight() + 1.0F);
@@ -77,7 +87,8 @@ public abstract class EntityNodeEvaluatorBase extends NodeEvaluator {
@Override
public void prepare(PathNavigationRegion var0, Mob var1) {
- this.level = var0;
+ this.currentContext = new PathfindingContext(var0, var1);
+ this.mob = var1;
this.nodes.clear();
this.entityWidth = Mth.floor(var1.getBbWidth() + 1.0F);
this.entityHeight = Mth.floor(var1.getBbHeight() + 1.0F);
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityPathfinder.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityPathfinder.java
similarity index 86%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityPathfinder.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityPathfinder.java
index 90be601e4..f20bbd3ca 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/EntityPathfinder.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityPathfinder.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import java.util.Comparator;
import java.util.Iterator;
@@ -43,32 +43,33 @@ public class EntityPathfinder extends PathFinder {
this.openSet.clear();
this.nodeEvaluator.prepare(var0, var1);
Node var6 = this.nodeEvaluator.getStart();
- if (var6 == null)
+ if (var6 == null) {
return null;
-
- Map var7 = var2.stream().collect(Collectors.toMap((var0x) -> {
- return this.nodeEvaluator.getGoal(var0x.getX(), var0x.getY(), var0x.getZ());
- }, Function.identity()));
- Path var8 = this.findPath(var0.getProfiler(), var6, var7, var3, var4, var5);
- this.nodeEvaluator.done();
- return var8;
+ } else {
+ Map var7 = var2.stream().collect(Collectors.toMap((var0x) -> {
+ return this.nodeEvaluator.getTarget(var0x.getX(), var0x.getY(), var0x.getZ());
+ }, Function.identity()));
+ Path var8 = this.findPath(var0.getProfiler(), var6, var7, var3, var4, var5);
+ this.nodeEvaluator.done();
+ return var8;
+ }
}
@Override
-
public Path findPath(PathNavigationRegion var0, Mob var1, Set var2, float var3, int var4, float var5) {
this.openSet.clear();
this.nodeEvaluator.prepare(var0, var1);
Node var6 = this.nodeEvaluator.getStart();
- if (var6 == null)
+ if (var6 == null) {
return null;
-
- Map var7 = var2.stream().collect(Collectors.toMap((var0x) -> {
- return this.nodeEvaluator.getGoal(var0x.getX(), var0x.getY(), var0x.getZ());
- }, Function.identity()));
- Path var8 = this.findPath(var0.getProfiler(), var6, var7, var3, var4, var5);
- this.nodeEvaluator.done();
- return var8;
+ } else {
+ Map var7 = var2.stream().collect(Collectors.toMap((var0x) -> {
+ return this.nodeEvaluator.getTarget(var0x.getX(), var0x.getY(), var0x.getZ());
+ }, Function.identity()));
+ Path var8 = this.findPath(var0.getProfiler(), var6, var7, var3, var4, var5);
+ this.nodeEvaluator.done();
+ return var8;
+ }
}
private Path findPath(ProfilerFiller var0, Node var1, Map var2, float range, int reachRange,
diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityPathfindingContext.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityPathfindingContext.java
new file mode 100644
index 000000000..78e9c55d4
--- /dev/null
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/EntityPathfindingContext.java
@@ -0,0 +1,119 @@
+package net.citizensnpcs.nms.v1_20_R4.util;
+
+import net.citizensnpcs.nms.v1_20_R4.entity.SlimeController.EntitySlimeNPC;
+import net.minecraft.core.BlockPos;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.tags.BlockTags;
+import net.minecraft.tags.FluidTags;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.LivingEntity;
+import net.minecraft.world.level.BlockGetter;
+import net.minecraft.world.level.CollisionGetter;
+import net.minecraft.world.level.Level;
+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.pathfinder.PathComputationType;
+import net.minecraft.world.level.pathfinder.PathType;
+import net.minecraft.world.level.pathfinder.PathTypeCache;
+import net.minecraft.world.level.pathfinder.PathfindingContext;
+
+public class EntityPathfindingContext extends PathfindingContext {
+ private final PathTypeCache cache;
+ private final CollisionGetter level;
+ private final BlockPos mobPosition;
+ private final BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos();
+
+ public EntityPathfindingContext(CollisionGetter var0, LivingEntity var1) {
+ super(var0, new EntitySlimeNPC(EntityType.SLIME, var1.level()));
+ this.level = var0;
+ Level var4 = var1.level();
+ if (var4 instanceof ServerLevel) {
+ this.cache = ((ServerLevel) var4).getPathTypeCache();
+ } else {
+ this.cache = null;
+ }
+ this.mobPosition = var1.blockPosition();
+ }
+
+ @Override
+ public BlockState getBlockState(BlockPos var0) {
+ return this.level.getBlockState(var0);
+ }
+
+ @Override
+ public PathType getPathTypeFromState(int var0, int var1, int var2) {
+ BlockPos var3 = this.mutablePos.set(var0, var1, var2);
+ return this.cache == null ? getPathTypeFromState(this.level, var3) : this.cache.getOrCompute(this.level, var3);
+ }
+
+ @Override
+ public CollisionGetter level() {
+ return this.level;
+ }
+
+ @Override
+ public BlockPos mobPosition() {
+ return this.mobPosition;
+ }
+
+ static PathType getPathTypeFromState(BlockGetter var0, BlockPos var1) {
+ BlockState var2 = var0.getBlockState(var1);
+ Block var3 = var2.getBlock();
+ if (var2.isAir()) {
+ return PathType.OPEN;
+ } else if (!var2.is(BlockTags.TRAPDOORS) && !var2.is(Blocks.LILY_PAD) && !var2.is(Blocks.BIG_DRIPLEAF)) {
+ if (var2.is(Blocks.POWDER_SNOW)) {
+ return PathType.POWDER_SNOW;
+ } else if (!var2.is(Blocks.CACTUS) && !var2.is(Blocks.SWEET_BERRY_BUSH)) {
+ if (var2.is(Blocks.HONEY_BLOCK)) {
+ return PathType.STICKY_HONEY;
+ } else if (var2.is(Blocks.COCOA)) {
+ return PathType.COCOA;
+ } else if (!var2.is(Blocks.WITHER_ROSE) && !var2.is(Blocks.POINTED_DRIPSTONE)) {
+ FluidState var4 = var2.getFluidState();
+ if (var4.is(FluidTags.LAVA)) {
+ return PathType.LAVA;
+ } else if (isBurningBlock(var2)) {
+ return PathType.DAMAGE_FIRE;
+ } else if (var3 instanceof DoorBlock) {
+ DoorBlock var5 = (DoorBlock) var3;
+ if (var2.getValue(DoorBlock.OPEN)) {
+ return PathType.DOOR_OPEN;
+ } else {
+ return var5.type().canOpenByHand() ? PathType.DOOR_WOOD_CLOSED : PathType.DOOR_IRON_CLOSED;
+ }
+ } else if (var3 instanceof BaseRailBlock) {
+ return PathType.RAIL;
+ } else if (var3 instanceof LeavesBlock) {
+ return PathType.LEAVES;
+ } else if (var2.is(BlockTags.FENCES) || var2.is(BlockTags.WALLS)
+ || var3 instanceof FenceGateBlock && !(Boolean) var2.getValue(FenceGateBlock.OPEN)) {
+ return PathType.FENCE;
+ } else if (!var2.isPathfindable(PathComputationType.LAND)) {
+ return PathType.BLOCKED;
+ } else {
+ return var4.is(FluidTags.WATER) ? PathType.WATER : PathType.OPEN;
+ }
+ } else {
+ return PathType.DAMAGE_CAUTIOUS;
+ }
+ } else {
+ return PathType.DAMAGE_OTHER;
+ }
+ } else {
+ return PathType.TRAPDOOR;
+ }
+ }
+
+ 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_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/ForwardingNPCHolder.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/ForwardingNPCHolder.java
similarity index 93%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/ForwardingNPCHolder.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/ForwardingNPCHolder.java
index 1f40f0d96..88de917db 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/ForwardingNPCHolder.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/ForwardingNPCHolder.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import org.bukkit.entity.Entity;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/MobAI.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/MobAI.java
similarity index 85%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/MobAI.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/MobAI.java
index 259a5b574..dd4dd6ddd 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/MobAI.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/MobAI.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import java.util.Map;
@@ -12,25 +12,25 @@ import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.control.JumpControl;
import net.minecraft.world.entity.ai.control.MoveControl;
import net.minecraft.world.entity.ai.navigation.PathNavigation;
-import net.minecraft.world.level.pathfinder.BlockPathTypes;
+import net.minecraft.world.level.pathfinder.PathType;
public interface MobAI {
org.bukkit.entity.Entity getBukkitEntity();
JumpControl getJumpControl();
- Map getMalus();
+ Map getMalus();
MoveControl getMoveControl();
PathNavigation getNavigation();
- default float getPathfindingMalus(BlockPathTypes var1) {
- Map malus = getMalus();
+ default float getPathfindingMalus(PathType var1) {
+ Map malus = getMalus();
return malus.containsKey(var1) ? malus.get(var1) : var1.getMalus();
}
- default void setPathfindingMalus(BlockPathTypes water, float oldWaterCost) {
+ default void setPathfindingMalus(PathType water, float oldWaterCost) {
getMalus().put(water, oldWaterCost);
}
@@ -51,7 +51,7 @@ public interface MobAI {
private final EntityJumpControl controllerJump;
private final EntityMoveControl controllerMove;
private final LivingEntity entity;
- private final Map malus;
+ private final Map malus;
private final EntityNavigation navigation;
public BasicMobAI(LivingEntity entity) {
@@ -61,7 +61,7 @@ public interface MobAI {
controllerJump = new EntityJumpControl(entity);
controllerMove = new EntityMoveControl(entity);
navigation = new EntityNavigation(entity, entity.level());
- malus = Maps.newEnumMap(BlockPathTypes.class);
+ malus = Maps.newEnumMap(PathType.class);
}
@Override
@@ -75,7 +75,7 @@ public interface MobAI {
}
@Override
- public Map getMalus() {
+ public Map getMalus() {
return malus;
}
@@ -105,7 +105,7 @@ public interface MobAI {
}
@Override
- default Map getMalus() {
+ default Map getMalus() {
return getAI().getMalus();
}
@@ -135,7 +135,7 @@ public interface MobAI {
}
@Override
- public Map getMalus() {
+ public Map getMalus() {
return null;
}
@@ -150,12 +150,12 @@ public interface MobAI {
}
@Override
- public float getPathfindingMalus(BlockPathTypes var1) {
+ public float getPathfindingMalus(PathType var1) {
return mob.getPathfindingMalus(var1);
}
@Override
- public void setPathfindingMalus(BlockPathTypes water, float oldWaterCost) {
+ public void setPathfindingMalus(PathType water, float oldWaterCost) {
mob.setPathfindingMalus(water, oldWaterCost);
}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/NMSBoundingBox.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSBoundingBox.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/NMSBoundingBox.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSBoundingBox.java
index c54ea06a2..290bcc312 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/NMSBoundingBox.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSBoundingBox.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import java.util.function.Supplier;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/NMSImpl.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java
similarity index 89%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/NMSImpl.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java
index a41cb1b5e..8e6621c61 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/NMSImpl.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import java.lang.invoke.MethodHandle;
import java.util.Arrays;
@@ -26,19 +26,18 @@ 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_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.CraftSound;
-import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlock;
-import org.bukkit.craftbukkit.v1_20_R3.boss.CraftBossBar;
-import org.bukkit.craftbukkit.v1_20_R3.command.CraftBlockCommandSender;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_20_R3.event.CraftEventFactory;
-import org.bukkit.craftbukkit.v1_20_R3.event.CraftPortalEvent;
-import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftInventoryAnvil;
-import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftInventoryView;
-import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_20_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R4.CraftSound;
+import org.bukkit.craftbukkit.v1_20_R4.CraftWorld;
+import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock;
+import org.bukkit.craftbukkit.v1_20_R4.boss.CraftBossBar;
+import org.bukkit.craftbukkit.v1_20_R4.command.CraftBlockCommandSender;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_20_R4.event.CraftEventFactory;
+import org.bukkit.craftbukkit.v1_20_R4.event.CraftPortalEvent;
+import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryAnvil;
+import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryView;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.FishHook;
import org.bukkit.entity.Player;
@@ -92,127 +91,133 @@ 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_20_R3.entity.AllayController;
-import net.citizensnpcs.nms.v1_20_R3.entity.ArmorStandController;
-import net.citizensnpcs.nms.v1_20_R3.entity.AxolotlController;
-import net.citizensnpcs.nms.v1_20_R3.entity.BatController;
-import net.citizensnpcs.nms.v1_20_R3.entity.BeeController;
-import net.citizensnpcs.nms.v1_20_R3.entity.BlazeController;
-import net.citizensnpcs.nms.v1_20_R3.entity.CamelController;
-import net.citizensnpcs.nms.v1_20_R3.entity.CatController;
-import net.citizensnpcs.nms.v1_20_R3.entity.CaveSpiderController;
-import net.citizensnpcs.nms.v1_20_R3.entity.ChickenController;
-import net.citizensnpcs.nms.v1_20_R3.entity.CodController;
-import net.citizensnpcs.nms.v1_20_R3.entity.CowController;
-import net.citizensnpcs.nms.v1_20_R3.entity.CreeperController;
-import net.citizensnpcs.nms.v1_20_R3.entity.DolphinController;
-import net.citizensnpcs.nms.v1_20_R3.entity.DrownedController;
-import net.citizensnpcs.nms.v1_20_R3.entity.EnderDragonController;
-import net.citizensnpcs.nms.v1_20_R3.entity.EndermanController;
-import net.citizensnpcs.nms.v1_20_R3.entity.EndermiteController;
-import net.citizensnpcs.nms.v1_20_R3.entity.EvokerController;
-import net.citizensnpcs.nms.v1_20_R3.entity.FoxController;
-import net.citizensnpcs.nms.v1_20_R3.entity.FrogController;
-import net.citizensnpcs.nms.v1_20_R3.entity.GhastController;
-import net.citizensnpcs.nms.v1_20_R3.entity.GiantController;
-import net.citizensnpcs.nms.v1_20_R3.entity.GlowSquidController;
-import net.citizensnpcs.nms.v1_20_R3.entity.GoatController;
-import net.citizensnpcs.nms.v1_20_R3.entity.GuardianController;
-import net.citizensnpcs.nms.v1_20_R3.entity.GuardianElderController;
-import net.citizensnpcs.nms.v1_20_R3.entity.HoglinController;
-import net.citizensnpcs.nms.v1_20_R3.entity.HorseController;
-import net.citizensnpcs.nms.v1_20_R3.entity.HorseDonkeyController;
-import net.citizensnpcs.nms.v1_20_R3.entity.HorseMuleController;
-import net.citizensnpcs.nms.v1_20_R3.entity.HorseSkeletonController;
-import net.citizensnpcs.nms.v1_20_R3.entity.HorseZombieController;
-import net.citizensnpcs.nms.v1_20_R3.entity.HumanController;
-import net.citizensnpcs.nms.v1_20_R3.entity.IllusionerController;
-import net.citizensnpcs.nms.v1_20_R3.entity.IronGolemController;
-import net.citizensnpcs.nms.v1_20_R3.entity.LlamaController;
-import net.citizensnpcs.nms.v1_20_R3.entity.MagmaCubeController;
-import net.citizensnpcs.nms.v1_20_R3.entity.MushroomCowController;
-import net.citizensnpcs.nms.v1_20_R3.entity.OcelotController;
-import net.citizensnpcs.nms.v1_20_R3.entity.PandaController;
-import net.citizensnpcs.nms.v1_20_R3.entity.ParrotController;
-import net.citizensnpcs.nms.v1_20_R3.entity.PhantomController;
-import net.citizensnpcs.nms.v1_20_R3.entity.PigController;
-import net.citizensnpcs.nms.v1_20_R3.entity.PigZombieController;
-import net.citizensnpcs.nms.v1_20_R3.entity.PiglinBruteController;
-import net.citizensnpcs.nms.v1_20_R3.entity.PiglinController;
-import net.citizensnpcs.nms.v1_20_R3.entity.PillagerController;
-import net.citizensnpcs.nms.v1_20_R3.entity.PolarBearController;
-import net.citizensnpcs.nms.v1_20_R3.entity.PufferFishController;
-import net.citizensnpcs.nms.v1_20_R3.entity.RabbitController;
-import net.citizensnpcs.nms.v1_20_R3.entity.RavagerController;
-import net.citizensnpcs.nms.v1_20_R3.entity.SalmonController;
-import net.citizensnpcs.nms.v1_20_R3.entity.SheepController;
-import net.citizensnpcs.nms.v1_20_R3.entity.ShulkerController;
-import net.citizensnpcs.nms.v1_20_R3.entity.SilverfishController;
-import net.citizensnpcs.nms.v1_20_R3.entity.SkeletonController;
-import net.citizensnpcs.nms.v1_20_R3.entity.SkeletonStrayController;
-import net.citizensnpcs.nms.v1_20_R3.entity.SkeletonWitherController;
-import net.citizensnpcs.nms.v1_20_R3.entity.SlimeController;
-import net.citizensnpcs.nms.v1_20_R3.entity.SnifferController;
-import net.citizensnpcs.nms.v1_20_R3.entity.SnowmanController;
-import net.citizensnpcs.nms.v1_20_R3.entity.SpiderController;
-import net.citizensnpcs.nms.v1_20_R3.entity.SquidController;
-import net.citizensnpcs.nms.v1_20_R3.entity.StriderController;
-import net.citizensnpcs.nms.v1_20_R3.entity.TadpoleController;
-import net.citizensnpcs.nms.v1_20_R3.entity.TraderLlamaController;
-import net.citizensnpcs.nms.v1_20_R3.entity.TropicalFishController;
-import net.citizensnpcs.nms.v1_20_R3.entity.TurtleController;
-import net.citizensnpcs.nms.v1_20_R3.entity.VexController;
-import net.citizensnpcs.nms.v1_20_R3.entity.VillagerController;
-import net.citizensnpcs.nms.v1_20_R3.entity.VindicatorController;
-import net.citizensnpcs.nms.v1_20_R3.entity.WanderingTraderController;
-import net.citizensnpcs.nms.v1_20_R3.entity.WardenController;
-import net.citizensnpcs.nms.v1_20_R3.entity.WitchController;
-import net.citizensnpcs.nms.v1_20_R3.entity.WitherController;
-import net.citizensnpcs.nms.v1_20_R3.entity.WolfController;
-import net.citizensnpcs.nms.v1_20_R3.entity.ZoglinController;
-import net.citizensnpcs.nms.v1_20_R3.entity.ZombieController;
-import net.citizensnpcs.nms.v1_20_R3.entity.ZombieHuskController;
-import net.citizensnpcs.nms.v1_20_R3.entity.ZombieVillagerController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.AreaEffectCloudController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.BlockDisplayController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.BoatController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.ChestBoatController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.DragonFireballController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.EggController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.EnderCrystalController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.EnderPearlController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.EnderSignalController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.EvokerFangsController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.FallingBlockController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.FireworkController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.FishingHookController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.GlowItemFrameController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.InteractionController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.ItemController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.ItemDisplayController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.ItemFrameController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.LargeFireballController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.LeashController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.LlamaSpitController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.MarkerController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.MinecartChestController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.MinecartCommandController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.MinecartFurnaceController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.MinecartHopperController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.MinecartRideableController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.MinecartTNTController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.PaintingController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.ShulkerBulletController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.SmallFireballController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.SnowballController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.SpectralArrowController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.TNTPrimedController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.TextDisplayController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.ThrownExpBottleController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.ThrownPotionController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.ThrownTridentController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.TippedArrowController;
-import net.citizensnpcs.nms.v1_20_R3.entity.nonliving.WitherSkullController;
+import net.citizensnpcs.nms.v1_20_R4.entity.AllayController;
+import net.citizensnpcs.nms.v1_20_R4.entity.ArmadilloController;
+import net.citizensnpcs.nms.v1_20_R4.entity.ArmorStandController;
+import net.citizensnpcs.nms.v1_20_R4.entity.AxolotlController;
+import net.citizensnpcs.nms.v1_20_R4.entity.BatController;
+import net.citizensnpcs.nms.v1_20_R4.entity.BeeController;
+import net.citizensnpcs.nms.v1_20_R4.entity.BlazeController;
+import net.citizensnpcs.nms.v1_20_R4.entity.BoggedController;
+import net.citizensnpcs.nms.v1_20_R4.entity.BreezeController;
+import net.citizensnpcs.nms.v1_20_R4.entity.CamelController;
+import net.citizensnpcs.nms.v1_20_R4.entity.CatController;
+import net.citizensnpcs.nms.v1_20_R4.entity.CaveSpiderController;
+import net.citizensnpcs.nms.v1_20_R4.entity.ChickenController;
+import net.citizensnpcs.nms.v1_20_R4.entity.CodController;
+import net.citizensnpcs.nms.v1_20_R4.entity.CowController;
+import net.citizensnpcs.nms.v1_20_R4.entity.CreeperController;
+import net.citizensnpcs.nms.v1_20_R4.entity.DolphinController;
+import net.citizensnpcs.nms.v1_20_R4.entity.DrownedController;
+import net.citizensnpcs.nms.v1_20_R4.entity.EnderDragonController;
+import net.citizensnpcs.nms.v1_20_R4.entity.EndermanController;
+import net.citizensnpcs.nms.v1_20_R4.entity.EndermiteController;
+import net.citizensnpcs.nms.v1_20_R4.entity.EvokerController;
+import net.citizensnpcs.nms.v1_20_R4.entity.FoxController;
+import net.citizensnpcs.nms.v1_20_R4.entity.FrogController;
+import net.citizensnpcs.nms.v1_20_R4.entity.GhastController;
+import net.citizensnpcs.nms.v1_20_R4.entity.GiantController;
+import net.citizensnpcs.nms.v1_20_R4.entity.GlowSquidController;
+import net.citizensnpcs.nms.v1_20_R4.entity.GoatController;
+import net.citizensnpcs.nms.v1_20_R4.entity.GuardianController;
+import net.citizensnpcs.nms.v1_20_R4.entity.GuardianElderController;
+import net.citizensnpcs.nms.v1_20_R4.entity.HoglinController;
+import net.citizensnpcs.nms.v1_20_R4.entity.HorseController;
+import net.citizensnpcs.nms.v1_20_R4.entity.HorseDonkeyController;
+import net.citizensnpcs.nms.v1_20_R4.entity.HorseMuleController;
+import net.citizensnpcs.nms.v1_20_R4.entity.HorseSkeletonController;
+import net.citizensnpcs.nms.v1_20_R4.entity.HorseZombieController;
+import net.citizensnpcs.nms.v1_20_R4.entity.HumanController;
+import net.citizensnpcs.nms.v1_20_R4.entity.IllusionerController;
+import net.citizensnpcs.nms.v1_20_R4.entity.IronGolemController;
+import net.citizensnpcs.nms.v1_20_R4.entity.LlamaController;
+import net.citizensnpcs.nms.v1_20_R4.entity.MagmaCubeController;
+import net.citizensnpcs.nms.v1_20_R4.entity.MushroomCowController;
+import net.citizensnpcs.nms.v1_20_R4.entity.OcelotController;
+import net.citizensnpcs.nms.v1_20_R4.entity.PandaController;
+import net.citizensnpcs.nms.v1_20_R4.entity.ParrotController;
+import net.citizensnpcs.nms.v1_20_R4.entity.PhantomController;
+import net.citizensnpcs.nms.v1_20_R4.entity.PigController;
+import net.citizensnpcs.nms.v1_20_R4.entity.PigZombieController;
+import net.citizensnpcs.nms.v1_20_R4.entity.PiglinBruteController;
+import net.citizensnpcs.nms.v1_20_R4.entity.PiglinController;
+import net.citizensnpcs.nms.v1_20_R4.entity.PillagerController;
+import net.citizensnpcs.nms.v1_20_R4.entity.PolarBearController;
+import net.citizensnpcs.nms.v1_20_R4.entity.PufferFishController;
+import net.citizensnpcs.nms.v1_20_R4.entity.RabbitController;
+import net.citizensnpcs.nms.v1_20_R4.entity.RavagerController;
+import net.citizensnpcs.nms.v1_20_R4.entity.SalmonController;
+import net.citizensnpcs.nms.v1_20_R4.entity.SheepController;
+import net.citizensnpcs.nms.v1_20_R4.entity.ShulkerController;
+import net.citizensnpcs.nms.v1_20_R4.entity.SilverfishController;
+import net.citizensnpcs.nms.v1_20_R4.entity.SkeletonController;
+import net.citizensnpcs.nms.v1_20_R4.entity.SkeletonStrayController;
+import net.citizensnpcs.nms.v1_20_R4.entity.SkeletonWitherController;
+import net.citizensnpcs.nms.v1_20_R4.entity.SlimeController;
+import net.citizensnpcs.nms.v1_20_R4.entity.SnifferController;
+import net.citizensnpcs.nms.v1_20_R4.entity.SnowmanController;
+import net.citizensnpcs.nms.v1_20_R4.entity.SpiderController;
+import net.citizensnpcs.nms.v1_20_R4.entity.SquidController;
+import net.citizensnpcs.nms.v1_20_R4.entity.StriderController;
+import net.citizensnpcs.nms.v1_20_R4.entity.TadpoleController;
+import net.citizensnpcs.nms.v1_20_R4.entity.TraderLlamaController;
+import net.citizensnpcs.nms.v1_20_R4.entity.TropicalFishController;
+import net.citizensnpcs.nms.v1_20_R4.entity.TurtleController;
+import net.citizensnpcs.nms.v1_20_R4.entity.VexController;
+import net.citizensnpcs.nms.v1_20_R4.entity.VillagerController;
+import net.citizensnpcs.nms.v1_20_R4.entity.VindicatorController;
+import net.citizensnpcs.nms.v1_20_R4.entity.WanderingTraderController;
+import net.citizensnpcs.nms.v1_20_R4.entity.WardenController;
+import net.citizensnpcs.nms.v1_20_R4.entity.WitchController;
+import net.citizensnpcs.nms.v1_20_R4.entity.WitherController;
+import net.citizensnpcs.nms.v1_20_R4.entity.WolfController;
+import net.citizensnpcs.nms.v1_20_R4.entity.ZoglinController;
+import net.citizensnpcs.nms.v1_20_R4.entity.ZombieController;
+import net.citizensnpcs.nms.v1_20_R4.entity.ZombieHuskController;
+import net.citizensnpcs.nms.v1_20_R4.entity.ZombieVillagerController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.AreaEffectCloudController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.BlockDisplayController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.BoatController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.BreezeWindChargeController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.ChestBoatController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.DragonFireballController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.EggController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.EnderCrystalController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.EnderPearlController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.EvokerFangsController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.EyeOfEnderController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.FallingBlockController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.FireworkController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.FishingHookController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.GlowItemFrameController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.InteractionController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.ItemController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.ItemDisplayController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.ItemFrameController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.LargeFireballController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.LeashController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.LlamaSpitController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.MarkerController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.MinecartChestController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.MinecartCommandController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.MinecartFurnaceController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.MinecartHopperController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.MinecartRideableController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.MinecartTNTController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.OminousItemSpawnerController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.PaintingController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.ShulkerBulletController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.SmallFireballController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.SnowballController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.SpectralArrowController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.TNTPrimedController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.TextDisplayController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.ThrownExpBottleController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.ThrownPotionController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.ThrownTridentController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.TippedArrowController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.WindChargeController;
+import net.citizensnpcs.nms.v1_20_R4.entity.nonliving.WitherSkullController;
import net.citizensnpcs.npc.EntityControllers;
import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator;
import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator;
@@ -254,6 +259,7 @@ import net.citizensnpcs.util.NMSBridge;
import net.citizensnpcs.util.PlayerAnimation;
import net.citizensnpcs.util.Util;
import net.minecraft.core.BlockPos;
+import net.minecraft.core.Holder;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.network.Connection;
import net.minecraft.network.chat.Component;
@@ -346,10 +352,10 @@ import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.dimension.end.EndDragonFight;
import net.minecraft.world.level.material.FluidState;
-import net.minecraft.world.level.pathfinder.BlockPathTypes;
import net.minecraft.world.level.pathfinder.Node;
import net.minecraft.world.level.pathfinder.Path;
import net.minecraft.world.level.pathfinder.PathFinder;
+import net.minecraft.world.level.pathfinder.PathType;
import net.minecraft.world.level.portal.PortalInfo;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
@@ -373,22 +379,14 @@ public class NMSImpl implements NMSBridge {
int viewDistance = -1;
ChunkMap chunkMap = null;
- try {
- if (entity instanceof Player) {
- chunkMap = ((ServerChunkCache) getHandle(entity).level().getChunkSource()).chunkMap;
- viewDistance = (int) PLAYER_CHUNK_MAP_VIEW_DISTANCE_GETTER.invoke(chunkMap);
- PLAYER_CHUNK_MAP_VIEW_DISTANCE_SETTER.invoke(chunkMap, -1);
- }
- } catch (Throwable e) {
- e.printStackTrace();
+ if (entity instanceof Player) {
+ chunkMap = ((ServerChunkCache) getHandle(entity).level().getChunkSource()).chunkMap;
+ viewDistance = chunkMap.serverViewDistance;
+ chunkMap.serverViewDistance = -1;
}
boolean success = getHandle(entity).level().addFreshEntity(getHandle(entity), custom);
- try {
- if (chunkMap != null) {
- PLAYER_CHUNK_MAP_VIEW_DISTANCE_SETTER.invoke(chunkMap, viewDistance);
- }
- } catch (Throwable e) {
- e.printStackTrace();
+ if (chunkMap != null) {
+ chunkMap.serverViewDistance = viewDistance;
}
return success;
}
@@ -437,9 +435,14 @@ public class NMSImpl implements NMSBridge {
return;
}
float f = (float) (hasAttackDamage ? source.getAttributeValue(Attributes.ATTACK_DAMAGE) : 1f);
- int i = 0;
- f += EnchantmentHelper.getDamageBonus(source.getMainHandItem(), target.getMobType());
+ int i = source.isSprinting() ? 1 : 0;
+ f += EnchantmentHelper.getDamageBonus(source.getMainHandItem(), target.getType());
i += EnchantmentHelper.getKnockbackBonus(source);
+ /* boolean crit = source.fallDistance > 0 && !source.isSprinting() && !source.onGround() && !source.onClimbable()
+ && !source.isPassenger() && !source.isInWater() && !source.hasEffect(MobEffects.BLINDNESS);
+ if (crit) {
+ f *= 1.5F;
+ }*/
boolean flag = target.hurt(target.damageSources().mobAttack(source), f);
if (!flag)
return;
@@ -450,7 +453,7 @@ public class NMSImpl implements NMSBridge {
}
int fireAspectLevel = EnchantmentHelper.getFireAspect(source);
if (fireAspectLevel > 0) {
- target.setSecondsOnFire(fireAspectLevel * 4, false);
+ target.igniteForSeconds(fireAspectLevel * 4, false);
}
if (target instanceof ServerPlayer) {
ServerPlayer entityhuman = (ServerPlayer) target;
@@ -644,7 +647,8 @@ public class NMSImpl implements NMSBridge {
@Override
public CompoundTag getNBT(org.bukkit.inventory.ItemStack item) {
- return convertNBT(CraftItemStack.asNMSCopy(item).getTag());
+ throw new UnsupportedOperationException();
+ // return convertNBT(CraftItemStack.asNMSCopy(item));
}
@Override
@@ -711,7 +715,7 @@ public class NMSImpl implements NMSBridge {
@Override
public float getRidingHeightOffset(org.bukkit.entity.Entity entity, org.bukkit.entity.Entity mount) {
- return getHandle(entity).getMyRidingOffset(getHandle(mount));
+ return (float) getHandle(entity).getPassengerRidingPosition(getHandle(mount)).y;
}
@Override
@@ -774,13 +778,13 @@ public class NMSImpl implements NMSBridge {
// navigation won't execute, and calling entity.move doesn't
// entirely fix the problem.
final PathNavigation navigation = getNavigation(entity);
- final float oldWater = raw instanceof MobAI ? ((MobAI) raw).getPathfindingMalus(BlockPathTypes.WATER)
- : ((Mob) raw).getPathfindingMalus(BlockPathTypes.WATER);
+ final float oldWater = raw instanceof MobAI ? ((MobAI) raw).getPathfindingMalus(PathType.WATER)
+ : ((Mob) raw).getPathfindingMalus(PathType.WATER);
if (params.avoidWater() && oldWater >= 0) {
if (raw instanceof MobAI) {
- ((MobAI) raw).setPathfindingMalus(BlockPathTypes.WATER, oldWater + 1F);
+ ((MobAI) raw).setPathfindingMalus(PathType.WATER, oldWater + 1F);
} else {
- ((Mob) raw).setPathfindingMalus(BlockPathTypes.WATER, oldWater + 1F);
+ ((Mob) raw).setPathfindingMalus(PathType.WATER, oldWater + 1F);
}
}
navigation.getNodeEvaluator().setCanOpenDoors(params.hasExaminer(DoorExaminer.class));
@@ -816,9 +820,9 @@ public class NMSImpl implements NMSBridge {
}
if (oldWater >= 0) {
if (raw instanceof MobAI) {
- ((MobAI) raw).setPathfindingMalus(BlockPathTypes.WATER, oldWater);
+ ((MobAI) raw).setPathfindingMalus(PathType.WATER, oldWater);
} else {
- ((Mob) raw).setPathfindingMalus(BlockPathTypes.WATER, oldWater);
+ ((Mob) raw).setPathfindingMalus(PathType.WATER, oldWater);
}
}
navigation.stop();
@@ -833,7 +837,7 @@ public class NMSImpl implements NMSBridge {
size = (EntityDimensions) SIZE_FIELD_GETTER.invoke(handle);
if (handle instanceof AbstractHorse) {
SIZE_FIELD_SETTER.invoke(handle,
- new EntityDimensions(Math.min(0.99F, size.width), size.height, false));
+ EntityDimensions.fixed(Math.min(0.99F, size.width()), size.height()));
}
} catch (Throwable e) {
e.printStackTrace();
@@ -923,7 +927,7 @@ public class NMSImpl implements NMSBridge {
public void linkTextInteraction(org.bukkit.entity.Player player, org.bukkit.entity.Entity entity,
org.bukkit.entity.Entity mount, double offset) {
Interaction handle = (Interaction) getHandle(entity);
- offset += handle.getMyRidingOffset(getHandle(mount));
+ offset += handle.getPassengerRidingPosition(getHandle(mount)).y;
sendPacket(player,
new ClientboundBundlePacket(List.of(
new ClientboundSetEntityDataPacket(entity.getEntityId(),
@@ -965,87 +969,93 @@ public class NMSImpl implements NMSBridge {
}
private void loadEntityTypes() {
+
EntityControllers.setEntityControllerForType(EntityType.ALLAY, AllayController.class);
EntityControllers.setEntityControllerForType(EntityType.AREA_EFFECT_CLOUD, AreaEffectCloudController.class);
- EntityControllers.setEntityControllerForType(EntityType.ARROW, TippedArrowController.class);
+ EntityControllers.setEntityControllerForType(EntityType.ARMADILLO, ArmadilloController.class);
EntityControllers.setEntityControllerForType(EntityType.ARMOR_STAND, ArmorStandController.class);
+ EntityControllers.setEntityControllerForType(EntityType.ARROW, TippedArrowController.class);
EntityControllers.setEntityControllerForType(EntityType.AXOLOTL, AxolotlController.class);
EntityControllers.setEntityControllerForType(EntityType.BAT, BatController.class);
EntityControllers.setEntityControllerForType(EntityType.BEE, BeeController.class);
EntityControllers.setEntityControllerForType(EntityType.BLAZE, BlazeController.class);
+ EntityControllers.setEntityControllerForType(EntityType.BLOCK_DISPLAY, BlockDisplayController.class);
EntityControllers.setEntityControllerForType(EntityType.BOAT, BoatController.class);
- EntityControllers.setEntityControllerForType(EntityType.CAT, CatController.class);
+ EntityControllers.setEntityControllerForType(EntityType.BOGGED, BoggedController.class);
+ EntityControllers.setEntityControllerForType(EntityType.BREEZE, BreezeController.class);
+ EntityControllers.setEntityControllerForType(EntityType.BREEZE_WIND_CHARGE, BreezeWindChargeController.class);
EntityControllers.setEntityControllerForType(EntityType.CAMEL, CamelController.class);
+ EntityControllers.setEntityControllerForType(EntityType.CAT, CatController.class);
EntityControllers.setEntityControllerForType(EntityType.CAVE_SPIDER, CaveSpiderController.class);
EntityControllers.setEntityControllerForType(EntityType.CHEST_BOAT, ChestBoatController.class);
+ EntityControllers.setEntityControllerForType(EntityType.CHEST_MINECART, MinecartChestController.class);
EntityControllers.setEntityControllerForType(EntityType.CHICKEN, ChickenController.class);
EntityControllers.setEntityControllerForType(EntityType.COD, CodController.class);
+ EntityControllers.setEntityControllerForType(EntityType.COMMAND_BLOCK_MINECART,
+ MinecartCommandController.class);
EntityControllers.setEntityControllerForType(EntityType.COW, CowController.class);
EntityControllers.setEntityControllerForType(EntityType.CREEPER, CreeperController.class);
EntityControllers.setEntityControllerForType(EntityType.DOLPHIN, DolphinController.class);
+ EntityControllers.setEntityControllerForType(EntityType.DONKEY, HorseDonkeyController.class);
EntityControllers.setEntityControllerForType(EntityType.DRAGON_FIREBALL, DragonFireballController.class);
- EntityControllers.setEntityControllerForType(EntityType.DROPPED_ITEM, ItemController.class);
EntityControllers.setEntityControllerForType(EntityType.DROWNED, DrownedController.class);
EntityControllers.setEntityControllerForType(EntityType.EGG, EggController.class);
EntityControllers.setEntityControllerForType(EntityType.ELDER_GUARDIAN, GuardianElderController.class);
- EntityControllers.setEntityControllerForType(EntityType.ENDER_CRYSTAL, EnderCrystalController.class);
+ EntityControllers.setEntityControllerForType(EntityType.END_CRYSTAL, EnderCrystalController.class);
EntityControllers.setEntityControllerForType(EntityType.ENDER_DRAGON, EnderDragonController.class);
EntityControllers.setEntityControllerForType(EntityType.ENDER_PEARL, EnderPearlController.class);
- EntityControllers.setEntityControllerForType(EntityType.ENDER_SIGNAL, EnderSignalController.class);
EntityControllers.setEntityControllerForType(EntityType.ENDERMAN, EndermanController.class);
EntityControllers.setEntityControllerForType(EntityType.ENDERMITE, EndermiteController.class);
EntityControllers.setEntityControllerForType(EntityType.EVOKER, EvokerController.class);
EntityControllers.setEntityControllerForType(EntityType.EVOKER_FANGS, EvokerFangsController.class);
+ EntityControllers.setEntityControllerForType(EntityType.EXPERIENCE_BOTTLE, ThrownExpBottleController.class);
+ EntityControllers.setEntityControllerForType(EntityType.EYE_OF_ENDER, EyeOfEnderController.class);
EntityControllers.setEntityControllerForType(EntityType.FALLING_BLOCK, FallingBlockController.class);
- EntityControllers.setEntityControllerForType(EntityType.FIREWORK, FireworkController.class);
EntityControllers.setEntityControllerForType(EntityType.FIREBALL, LargeFireballController.class);
- EntityControllers.setEntityControllerForType(EntityType.FISHING_HOOK, FishingHookController.class);
+ EntityControllers.setEntityControllerForType(EntityType.FIREWORK_ROCKET, FireworkController.class);
+ EntityControllers.setEntityControllerForType(EntityType.FISHING_BOBBER, FishingHookController.class);
EntityControllers.setEntityControllerForType(EntityType.FOX, FoxController.class);
EntityControllers.setEntityControllerForType(EntityType.FROG, FrogController.class);
- EntityControllers.setEntityControllerForType(EntityType.TADPOLE, TadpoleController.class);
+ EntityControllers.setEntityControllerForType(EntityType.FURNACE_MINECART, MinecartFurnaceController.class);
EntityControllers.setEntityControllerForType(EntityType.GHAST, GhastController.class);
EntityControllers.setEntityControllerForType(EntityType.GIANT, GiantController.class);
+ EntityControllers.setEntityControllerForType(EntityType.GLOW_ITEM_FRAME, GlowItemFrameController.class);
+ EntityControllers.setEntityControllerForType(EntityType.GLOW_SQUID, GlowSquidController.class);
EntityControllers.setEntityControllerForType(EntityType.GOAT, GoatController.class);
EntityControllers.setEntityControllerForType(EntityType.GUARDIAN, GuardianController.class);
+ EntityControllers.setEntityControllerForType(EntityType.HOGLIN, HoglinController.class);
+ EntityControllers.setEntityControllerForType(EntityType.HOPPER_MINECART, MinecartHopperController.class);
EntityControllers.setEntityControllerForType(EntityType.HORSE, HorseController.class);
- EntityControllers.setEntityControllerForType(EntityType.DONKEY, HorseDonkeyController.class);
- EntityControllers.setEntityControllerForType(EntityType.MULE, HorseMuleController.class);
- EntityControllers.setEntityControllerForType(EntityType.SKELETON_HORSE, HorseSkeletonController.class);
- EntityControllers.setEntityControllerForType(EntityType.ZOMBIE_HORSE, HorseZombieController.class);
EntityControllers.setEntityControllerForType(EntityType.HUSK, ZombieHuskController.class);
- EntityControllers.setEntityControllerForType(EntityType.IRON_GOLEM, IronGolemController.class);
EntityControllers.setEntityControllerForType(EntityType.ILLUSIONER, IllusionerController.class);
+ EntityControllers.setEntityControllerForType(EntityType.INTERACTION, InteractionController.class);
+ EntityControllers.setEntityControllerForType(EntityType.IRON_GOLEM, IronGolemController.class);
+ EntityControllers.setEntityControllerForType(EntityType.ITEM, ItemController.class);
+ EntityControllers.setEntityControllerForType(EntityType.ITEM_DISPLAY, ItemDisplayController.class);
EntityControllers.setEntityControllerForType(EntityType.ITEM_FRAME, ItemFrameController.class);
- EntityControllers.setEntityControllerForType(EntityType.GLOW_ITEM_FRAME, GlowItemFrameController.class);
- EntityControllers.setEntityControllerForType(EntityType.LEASH_HITCH, LeashController.class);
+ EntityControllers.setEntityControllerForType(EntityType.OMINOUS_ITEM_SPAWNER,
+ OminousItemSpawnerController.class);
+ EntityControllers.setEntityControllerForType(EntityType.LEASH_KNOT, LeashController.class);
EntityControllers.setEntityControllerForType(EntityType.LLAMA, LlamaController.class);
EntityControllers.setEntityControllerForType(EntityType.LLAMA_SPIT, LlamaSpitController.class);
- EntityControllers.setEntityControllerForType(EntityType.TRADER_LLAMA, TraderLlamaController.class);
- EntityControllers.setEntityControllerForType(EntityType.WANDERING_TRADER, WanderingTraderController.class);
- EntityControllers.setEntityControllerForType(EntityType.MARKER, MarkerController.class);
EntityControllers.setEntityControllerForType(EntityType.MAGMA_CUBE, MagmaCubeController.class);
+ EntityControllers.setEntityControllerForType(EntityType.MARKER, MarkerController.class);
EntityControllers.setEntityControllerForType(EntityType.MINECART, MinecartRideableController.class);
- EntityControllers.setEntityControllerForType(EntityType.MINECART_CHEST, MinecartChestController.class);
- EntityControllers.setEntityControllerForType(EntityType.MINECART_COMMAND, MinecartCommandController.class);
- EntityControllers.setEntityControllerForType(EntityType.MINECART_FURNACE, MinecartFurnaceController.class);
- EntityControllers.setEntityControllerForType(EntityType.MINECART_HOPPER, MinecartHopperController.class);
- EntityControllers.setEntityControllerForType(EntityType.MINECART_TNT, MinecartTNTController.class);
- EntityControllers.setEntityControllerForType(EntityType.MUSHROOM_COW, MushroomCowController.class);
- EntityControllers.setEntityControllerForType(EntityType.SPLASH_POTION, ThrownPotionController.class);
+ EntityControllers.setEntityControllerForType(EntityType.MOOSHROOM, MushroomCowController.class);
+ EntityControllers.setEntityControllerForType(EntityType.MULE, HorseMuleController.class);
EntityControllers.setEntityControllerForType(EntityType.OCELOT, OcelotController.class);
- EntityControllers.setEntityControllerForType(EntityType.PANDA, PandaController.class);
EntityControllers.setEntityControllerForType(EntityType.PAINTING, PaintingController.class);
+ EntityControllers.setEntityControllerForType(EntityType.PANDA, PandaController.class);
EntityControllers.setEntityControllerForType(EntityType.PARROT, ParrotController.class);
EntityControllers.setEntityControllerForType(EntityType.PHANTOM, PhantomController.class);
- EntityControllers.setEntityControllerForType(EntityType.PILLAGER, PillagerController.class);
EntityControllers.setEntityControllerForType(EntityType.PIG, PigController.class);
EntityControllers.setEntityControllerForType(EntityType.PIGLIN, PiglinController.class);
EntityControllers.setEntityControllerForType(EntityType.PIGLIN_BRUTE, PiglinBruteController.class);
- EntityControllers.setEntityControllerForType(EntityType.HOGLIN, HoglinController.class);
- EntityControllers.setEntityControllerForType(EntityType.ZOMBIFIED_PIGLIN, PigZombieController.class);
- EntityControllers.setEntityControllerForType(EntityType.ZOGLIN, ZoglinController.class);
- EntityControllers.setEntityControllerForType(EntityType.POLAR_BEAR, PolarBearController.class);
+ EntityControllers.setEntityControllerForType(EntityType.PILLAGER, PillagerController.class);
EntityControllers.setEntityControllerForType(EntityType.PLAYER, HumanController.class);
+ EntityControllers.setEntityControllerForType(EntityType.POLAR_BEAR, PolarBearController.class);
+ EntityControllers.setEntityControllerForType(EntityType.POTION, ThrownPotionController.class);
+ EntityControllers.setEntityControllerForType(EntityType.POTION, ThrownPotionController.class);
EntityControllers.setEntityControllerForType(EntityType.PUFFERFISH, PufferFishController.class);
EntityControllers.setEntityControllerForType(EntityType.RABBIT, RabbitController.class);
EntityControllers.setEntityControllerForType(EntityType.RAVAGER, RavagerController.class);
@@ -1055,39 +1065,42 @@ public class NMSImpl implements NMSBridge {
EntityControllers.setEntityControllerForType(EntityType.SHULKER_BULLET, ShulkerBulletController.class);
EntityControllers.setEntityControllerForType(EntityType.SILVERFISH, SilverfishController.class);
EntityControllers.setEntityControllerForType(EntityType.SKELETON, SkeletonController.class);
- EntityControllers.setEntityControllerForType(EntityType.STRAY, SkeletonStrayController.class);
- EntityControllers.setEntityControllerForType(EntityType.STRIDER, StriderController.class);
+ EntityControllers.setEntityControllerForType(EntityType.SKELETON_HORSE, HorseSkeletonController.class);
EntityControllers.setEntityControllerForType(EntityType.SLIME, SlimeController.class);
EntityControllers.setEntityControllerForType(EntityType.SMALL_FIREBALL, SmallFireballController.class);
+ EntityControllers.setEntityControllerForType(EntityType.SNIFFER, SnifferController.class);
+ EntityControllers.setEntityControllerForType(EntityType.SNOW_GOLEM, SnowmanController.class);
EntityControllers.setEntityControllerForType(EntityType.SNOWBALL, SnowballController.class);
- EntityControllers.setEntityControllerForType(EntityType.SNOWMAN, SnowmanController.class);
EntityControllers.setEntityControllerForType(EntityType.SPECTRAL_ARROW, SpectralArrowController.class);
- EntityControllers.setEntityControllerForType(EntityType.SPIDER, SpiderController.class);
- EntityControllers.setEntityControllerForType(EntityType.SPLASH_POTION, ThrownPotionController.class);
- EntityControllers.setEntityControllerForType(EntityType.SQUID, SquidController.class);
- EntityControllers.setEntityControllerForType(EntityType.GLOW_SQUID, GlowSquidController.class);
EntityControllers.setEntityControllerForType(EntityType.SPECTRAL_ARROW, TippedArrowController.class);
- EntityControllers.setEntityControllerForType(EntityType.THROWN_EXP_BOTTLE, ThrownExpBottleController.class);
+ EntityControllers.setEntityControllerForType(EntityType.SPIDER, SpiderController.class);
+ EntityControllers.setEntityControllerForType(EntityType.SQUID, SquidController.class);
+ EntityControllers.setEntityControllerForType(EntityType.STRAY, SkeletonStrayController.class);
+ EntityControllers.setEntityControllerForType(EntityType.STRIDER, StriderController.class);
+ EntityControllers.setEntityControllerForType(EntityType.TADPOLE, TadpoleController.class);
+ EntityControllers.setEntityControllerForType(EntityType.TEXT_DISPLAY, TextDisplayController.class);
+ EntityControllers.setEntityControllerForType(EntityType.TNT, TNTPrimedController.class);
+ EntityControllers.setEntityControllerForType(EntityType.TNT_MINECART, MinecartTNTController.class);
+ EntityControllers.setEntityControllerForType(EntityType.TRADER_LLAMA, TraderLlamaController.class);
EntityControllers.setEntityControllerForType(EntityType.TRIDENT, ThrownTridentController.class);
EntityControllers.setEntityControllerForType(EntityType.TROPICAL_FISH, TropicalFishController.class);
EntityControllers.setEntityControllerForType(EntityType.TURTLE, TurtleController.class);
- EntityControllers.setEntityControllerForType(EntityType.PRIMED_TNT, TNTPrimedController.class);
EntityControllers.setEntityControllerForType(EntityType.VEX, VexController.class);
EntityControllers.setEntityControllerForType(EntityType.VILLAGER, VillagerController.class);
EntityControllers.setEntityControllerForType(EntityType.VINDICATOR, VindicatorController.class);
+ EntityControllers.setEntityControllerForType(EntityType.WANDERING_TRADER, WanderingTraderController.class);
EntityControllers.setEntityControllerForType(EntityType.WARDEN, WardenController.class);
- EntityControllers.setEntityControllerForType(EntityType.WOLF, WolfController.class);
+ EntityControllers.setEntityControllerForType(EntityType.WIND_CHARGE, WindChargeController.class);
EntityControllers.setEntityControllerForType(EntityType.WITCH, WitchController.class);
EntityControllers.setEntityControllerForType(EntityType.WITHER, WitherController.class);
- EntityControllers.setEntityControllerForType(EntityType.WITHER_SKULL, WitherSkullController.class);
EntityControllers.setEntityControllerForType(EntityType.WITHER_SKELETON, SkeletonWitherController.class);
+ EntityControllers.setEntityControllerForType(EntityType.WITHER_SKULL, WitherSkullController.class);
+ EntityControllers.setEntityControllerForType(EntityType.WOLF, WolfController.class);
+ EntityControllers.setEntityControllerForType(EntityType.ZOGLIN, ZoglinController.class);
EntityControllers.setEntityControllerForType(EntityType.ZOMBIE, ZombieController.class);
+ EntityControllers.setEntityControllerForType(EntityType.ZOMBIE_HORSE, HorseZombieController.class);
EntityControllers.setEntityControllerForType(EntityType.ZOMBIE_VILLAGER, ZombieVillagerController.class);
- EntityControllers.setEntityControllerForType(EntityType.SNIFFER, SnifferController.class);
- EntityControllers.setEntityControllerForType(EntityType.BLOCK_DISPLAY, BlockDisplayController.class);
- EntityControllers.setEntityControllerForType(EntityType.TEXT_DISPLAY, TextDisplayController.class);
- EntityControllers.setEntityControllerForType(EntityType.ITEM_DISPLAY, ItemDisplayController.class);
- EntityControllers.setEntityControllerForType(EntityType.INTERACTION, InteractionController.class);
+ EntityControllers.setEntityControllerForType(EntityType.ZOMBIFIED_PIGLIN, PigZombieController.class);
}
@Override
@@ -1305,9 +1318,9 @@ public class NMSImpl implements NMSBridge {
while ((search = search.getSuperclass()) != null && Entity.class.isAssignableFrom(search)) {
net.minecraft.world.entity.EntityType> type = ENTITY_REGISTRY.findType(search);
ResourceLocation key = ENTITY_REGISTRY.getKey(type);
- if (key == null || type == null) {
+ if (key == null || type == null)
continue;
- }
+
CITIZENS_ENTITY_TYPES.put(clazz, type);
int code = ENTITY_REGISTRY.getId(type);
ENTITY_REGISTRY.put(code, key, type);
@@ -1491,7 +1504,7 @@ public class NMSImpl implements NMSBridge {
@Override
public void setDimensions(org.bukkit.entity.Entity entity, EntityDim desired) {
- setSize(getHandle(entity), new EntityDimensions(desired.width, desired.height, true));
+ setSize(getHandle(entity), EntityDimensions.fixed(desired.width, desired.height));
}
@Override
@@ -1670,7 +1683,10 @@ public class NMSImpl implements NMSBridge {
@Override
public void setStepHeight(org.bukkit.entity.Entity entity, float height) {
- getHandle(entity).setMaxUpStep(height);
+ Entity handle = getHandle(entity);
+ if (!(handle instanceof LivingEntity))
+ return;
+ ((LivingEntity) handle).getAttribute(Attributes.STEP_HEIGHT).setBaseValue(height);
}
@Override
@@ -2011,10 +2027,10 @@ public class NMSImpl implements NMSBridge {
e.printStackTrace();
return;
}
- float oldw = size.width;
- float oldl = size.height;
+ float oldw = size.width();
+ float oldl = size.height();
cb.accept(datawatcherobject);
- if (oldw != size.width || size.height != oldl) {
+ if (oldw != size.width() || size.height() != oldl) {
living.setPos(living.getX() - 0.01, living.getY(), living.getZ() - 0.01);
living.setPos(living.getX() + 0.01, living.getY(), living.getZ() + 0.01);
}
@@ -2399,13 +2415,13 @@ public class NMSImpl implements NMSBridge {
}
}
- public static void setAttribute(LivingEntity entity, Attribute attribute, double value) {
+ public static void setAttribute(LivingEntity entity, Holder attribute, double value) {
AttributeInstance attr = entity.getAttribute(attribute);
if (attr == null) {
try {
AttributeSupplier provider = (AttributeSupplier) ATTRIBUTE_SUPPLIER.invoke(entity.getAttributes());
- Map all = Maps
- .newHashMap((Map) ATTRIBUTE_PROVIDER_MAP.invoke(provider));
+ Map, AttributeInstance> all = Maps.newHashMap(
+ (Map, AttributeInstance>) ATTRIBUTE_PROVIDER_MAP.invoke(provider));
all.put(attribute, new AttributeInstance(attribute, att -> {
throw new UnsupportedOperationException(
"Tried to change value for default attribute instance FOLLOW_RANGE");
@@ -2467,18 +2483,18 @@ public class NMSImpl implements NMSBridge {
Pose entitypose = entity.getPose();
EntityDimensions entitysize1 = entity.getDimensions(entitypose);
SIZE_FIELD_SETTER.invoke(entity, entitysize1);
- HEAD_HEIGHT.invoke(entity, HEAD_HEIGHT_METHOD.invoke(entity, entitypose, entitysize1));
- if (entitysize1.width < entitysize.width && false /* TODO: PREVIOUS CITIZENS ADDITION ?reason */) {
- double d0 = entitysize1.width / 2.0D;
+ HEAD_HEIGHT.invoke(entity, entity.getType().getDimensions().eyeHeight());
+ if (entitysize1.width() < entitysize.width() && false /* TODO: PREVIOUS CITIZENS ADDITION ?reason */) {
+ double d0 = entitysize1.width() / 2.0D;
entity.setBoundingBox(new AABB(entity.getX() - d0, entity.getY(), entity.getZ() - d0,
- entity.getX() + d0, entity.getY() + entitysize1.height, entity.getZ() + d0));
+ entity.getX() + d0, entity.getY() + entitysize1.height(), entity.getZ() + d0));
} else {
AABB axisalignedbb = entity.getBoundingBox();
entity.setBoundingBox(new AABB(axisalignedbb.minX, axisalignedbb.minY, axisalignedbb.minZ,
- axisalignedbb.minX + entitysize1.width, axisalignedbb.minY + entitysize1.height,
- axisalignedbb.minZ + entitysize1.width));
- if (entitysize1.width > entitysize.width && !justCreated && !entity.level().isClientSide) {
- float f = entitysize.width - entitysize1.width;
+ axisalignedbb.minX + entitysize1.width(), axisalignedbb.minY + entitysize1.height(),
+ axisalignedbb.minZ + entitysize1.width()));
+ if (entitysize1.width() > entitysize.width() && !justCreated && !entity.level().isClientSide) {
+ float f = entitysize.width() - entitysize1.width();
entity.move(MoverType.SELF, new Vec3(f, 0.0D, f));
}
}
@@ -2490,8 +2506,7 @@ public class NMSImpl implements NMSBridge {
public static void setSize(Entity entity, EntityDimensions size) {
try {
SIZE_FIELD_SETTER.invoke(entity, size);
- HEAD_HEIGHT.invoke(entity,
- HEAD_HEIGHT_METHOD.invoke(entity, entity.getPose(), entity.getDimensions(entity.getPose())));
+ HEAD_HEIGHT.invoke(entity, entity.getType().getDimensions().eyeHeight());
} catch (Throwable e) {
e.printStackTrace();
}
@@ -2584,7 +2599,7 @@ public class NMSImpl implements NMSBridge {
public static final MethodHandle ENDERDRAGON_CHECK_WALLS = NMS.getFirstMethodHandleWithReturnType(EnderDragon.class,
true, boolean.class, AABB.class);
public static final MethodHandle ENDERDRAGON_HURT = NMS.getMethodHandle(EnderDragon.class, "c", true, List.class);
- public static final MethodHandle ENDERDRAGON_KNOCKBACK = NMS.getMethodHandle(EnderDragon.class, "a", true,
+ public static final MethodHandle ENDERDRAGON_KNOCKBACK = NMS.getMethodHandle(EnderDragon.class, "b", true,
List.class);
private static EntityDataAccessor ENDERMAN_CREEPY = null;
private static final MethodHandle ENTITY_FISH_NUM_IN_SCHOOL = NMS.getFirstSetter(AbstractSchoolingFish.class,
@@ -2603,12 +2618,10 @@ public class NMSImpl implements NMSBridge {
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, "bi");
- private static final MethodHandle HEAD_HEIGHT_METHOD = NMS.getFirstMethodHandle(Entity.class, true, Pose.class,
- EntityDimensions.class);
+ private static final MethodHandle HEAD_HEIGHT = NMS.getSetter(Entity.class, "bg");
private static EntityDataAccessor INTERACTION_HEIGHT = null;
private static EntityDataAccessor INTERACTION_WIDTH = null;
- private static final MethodHandle JUMP_FIELD = NMS.getGetter(LivingEntity.class, "bj");
+ private static final MethodHandle JUMP_FIELD = NMS.getGetter(LivingEntity.class, "bn");
private static final MethodHandle LOOK_CONTROL_SETTER = NMS.getFirstSetter(Mob.class, LookControl.class);
private static final MethodHandle MOVE_CONTROLLER_OPERATION = NMS.getSetter(MoveControl.class, "k");
private static final MethodHandle NAVIGATION_CREATE_PATHFINDER = NMS
@@ -2617,20 +2630,16 @@ public class NMSImpl implements NMSBridge {
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);
- private static final Location PACKET_CACHE_LOCATION = new Location(null, 0, 0, 0);
- private static final MethodHandle PLAYER_CHUNK_MAP_VIEW_DISTANCE_GETTER = NMS.getFirstGetter(ChunkMap.class,
- int.class);
- private static final MethodHandle PLAYER_CHUNK_MAP_VIEW_DISTANCE_SETTER = NMS.getFirstSetter(ChunkMap.class,
- int.class);
+
private static final MethodHandle PLAYER_INFO_ENTRIES_LIST = NMS
.getFirstFinalSetter(ClientboundPlayerInfoUpdatePacket.class, List.class);
private static final MethodHandle PLAYERINFO_ENTRIES = PLAYER_INFO_ENTRIES_LIST;
- private static final MethodHandle PORTAL_ENTRANCE_POS_GETTER = NMS.getGetter(Entity.class, "ax");
- private static final MethodHandle PORTAL_ENTRANCE_POS_SETTER = NMS.getSetter(Entity.class, "ax");
+ private static final MethodHandle PORTAL_ENTRANCE_POS_GETTER = NMS.getGetter(Entity.class, "ay");
+ private static final MethodHandle PORTAL_ENTRANCE_POS_SETTER = NMS.getSetter(Entity.class, "ay");
private static final MethodHandle POSITION_CODEC_GETTER = NMS.getFirstGetter(ServerEntity.class,
VecDeltaCodec.class);
- private static final MethodHandle PUFFERFISH_DEFLATE = NMS.getSetter(Pufferfish.class, "bU");
- private static final MethodHandle PUFFERFISH_INFLATE = NMS.getSetter(Pufferfish.class, "bT");
+ private static final MethodHandle PUFFERFISH_DEFLATE = NMS.getSetter(Pufferfish.class, "bZ");
+ private static final MethodHandle PUFFERFISH_INFLATE = NMS.getSetter(Pufferfish.class, "bY");
public static EntityDataAccessor RABBIT_TYPE_DATAWATCHER = null;
private static final Random RANDOM = Util.getFastRandom();
private static final MethodHandle SERVER_ENTITY_GETTER = NMS.getFirstGetter(TrackedEntity.class,
@@ -2647,35 +2656,29 @@ public class NMSImpl implements NMSBridge {
ENTITY_REGISTRY_SETTER.invoke(ENTITY_REGISTRY);
} catch (Throwable e) {
Messaging.logTr(Messages.ERROR_GETTING_ID_MAPPING, e.getMessage());
- e.printStackTrace();
}
try {
// Middle one
- ENDERMAN_CREEPY = (EntityDataAccessor) NMS.getField(EnderMan.class, "bV").get(null);
+ ENDERMAN_CREEPY = (EntityDataAccessor) NMS.getField(EnderMan.class, "ca").get(null);
} catch (Exception e) {
- e.printStackTrace();
}
try {
RABBIT_TYPE_DATAWATCHER = (EntityDataAccessor) NMS
.getFirstStaticGetter(Rabbit.class, EntityDataAccessor.class).invoke();
} catch (Throwable e) {
- e.printStackTrace();
}
try {
INTERACTION_HEIGHT = (EntityDataAccessor) NMS.getGetter(Interaction.class, "d").invoke();
} catch (Throwable e) {
- e.printStackTrace();
}
try {
INTERACTION_WIDTH = (EntityDataAccessor) NMS.getGetter(Interaction.class, "c").invoke();
} catch (Throwable e) {
- e.printStackTrace();
}
try {
- DATA_POSE = (EntityDataAccessor) NMS.getGetter(Entity.class, "as").invoke();
- DATA_NAME_VISIBLE = (EntityDataAccessor) NMS.getGetter(Entity.class, "aV").invoke();
+ DATA_POSE = (EntityDataAccessor) NMS.getGetter(Entity.class, "at").invoke();
+ DATA_NAME_VISIBLE = (EntityDataAccessor) NMS.getGetter(Entity.class, "aT").invoke();
} catch (Throwable e) {
- e.printStackTrace();
}
}
}
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/PitchableLookControl.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/PitchableLookControl.java
similarity index 94%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/PitchableLookControl.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/PitchableLookControl.java
index f97c8484b..a91ceacf9 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/PitchableLookControl.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/PitchableLookControl.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import java.util.function.Supplier;
diff --git a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/PlayerAnimationImpl.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/PlayerAnimationImpl.java
similarity index 98%
rename from v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/PlayerAnimationImpl.java
rename to v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/PlayerAnimationImpl.java
index 92815b308..d8816356f 100644
--- a/v1_20_R3/src/main/java/net/citizensnpcs/nms/v1_20_R3/util/PlayerAnimationImpl.java
+++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/PlayerAnimationImpl.java
@@ -1,4 +1,4 @@
-package net.citizensnpcs.nms.v1_20_R3.util;
+package net.citizensnpcs.nms.v1_20_R4.util;
import java.util.Map;
diff --git a/v1_8_R3/pom.xml b/v1_8_R3/pom.xml
index fbe987ca0..9e3a0935b 100644
--- a/v1_8_R3/pom.xml
+++ b/v1_8_R3/pom.xml
@@ -6,7 +6,7 @@
net.citizensnpcs
citizens-parent
- 2.0.33-SNAPSHOT
+ 2.0.34-SNAPSHOT
citizens-v1_8_R3