diff --git a/plugins/fancynpcs/implementation_1_19_4/src/main/java/de/oliver/fancynpcs/v1_19_4/attributes/WolfAttributes.java b/plugins/fancynpcs/implementation_1_19_4/src/main/java/de/oliver/fancynpcs/v1_19_4/attributes/WolfAttributes.java index 2233fcbf..46646352 100644 --- a/plugins/fancynpcs/implementation_1_19_4/src/main/java/de/oliver/fancynpcs/v1_19_4/attributes/WolfAttributes.java +++ b/plugins/fancynpcs/implementation_1_19_4/src/main/java/de/oliver/fancynpcs/v1_19_4/attributes/WolfAttributes.java @@ -4,6 +4,8 @@ import de.oliver.fancynpcs.api.Npc; import de.oliver.fancynpcs.api.NpcAttribute; import de.oliver.fancynpcs.v1_19_4.ReflectionHelper; import net.minecraft.world.entity.animal.Wolf; +import org.apache.commons.io.IOExceptionList; +import net.minecraft.world.item.DyeColor; import org.bukkit.entity.EntityType; import java.util.ArrayList; @@ -28,6 +30,13 @@ public class WolfAttributes { WolfAttributes::setAngry )); + attributes.add(new NpcAttribute( + "color", + List.of("RED", "BLUE", "YELLOW", "GREEN", "PURPLE", "ORANGE", "LIME", "MAGENTA", "BROWN", "WHITE", "GRAY", "LIGHT_GRAY", "LIGHT_BLUE", "BLACK", "CYAN", "PINK", "NONE"), + List.of(EntityType.WOLF), + WolfAttributes::setColor + )); + return attributes; } @@ -47,4 +56,24 @@ public class WolfAttributes { wolf.setRemainingPersistentAngerTime(angry ? 100 : 0); } + + private static void setColor(Npc npc, String value) { + Wolf wolf = ReflectionHelper.getEntity(npc); + + if (value.equalsIgnoreCase("none") || value.isEmpty()) { + // Reset to no collar + wolf.setTame(false); + return; + } + + try { + DyeColor color = DyeColor.valueOf(value.toUpperCase()); + if (!wolf.isTame()){ + wolf.setTame(true); + } + wolf.setCollarColor(color); + } catch (IllegalArgumentException e) { + System.out.println("Invalid wolf collar color: " + value); + } + } } diff --git a/plugins/fancynpcs/implementation_1_20_1/src/main/java/de/oliver/fancynpcs/v1_20_1/attributes/WolfAttributes.java b/plugins/fancynpcs/implementation_1_20_1/src/main/java/de/oliver/fancynpcs/v1_20_1/attributes/WolfAttributes.java index 4f76761c..2ab91044 100644 --- a/plugins/fancynpcs/implementation_1_20_1/src/main/java/de/oliver/fancynpcs/v1_20_1/attributes/WolfAttributes.java +++ b/plugins/fancynpcs/implementation_1_20_1/src/main/java/de/oliver/fancynpcs/v1_20_1/attributes/WolfAttributes.java @@ -4,6 +4,7 @@ import de.oliver.fancynpcs.api.Npc; import de.oliver.fancynpcs.api.NpcAttribute; import de.oliver.fancynpcs.v1_20_1.ReflectionHelper; import net.minecraft.world.entity.animal.Wolf; +import net.minecraft.world.item.DyeColor; import org.bukkit.entity.EntityType; import java.util.ArrayList; @@ -28,6 +29,13 @@ public class WolfAttributes { WolfAttributes::setAngry )); + attributes.add(new NpcAttribute( + "color", + List.of("RED", "BLUE", "YELLOW", "GREEN", "PURPLE", "ORANGE", "LIME", "MAGENTA", "BROWN", "WHITE", "GRAY", "LIGHT_GRAY", "LIGHT_BLUE", "BLACK", "CYAN", "PINK", "NONE"), + List.of(EntityType.WOLF), + WolfAttributes::setColor + )); + return attributes; } @@ -47,4 +55,24 @@ public class WolfAttributes { wolf.setRemainingPersistentAngerTime(angry ? 100 : 0); } + + private static void setColor(Npc npc, String value) { + Wolf wolf = ReflectionHelper.getEntity(npc); + + if (value.equalsIgnoreCase("none") || value.isEmpty()) { + // Reset to no collar + wolf.setTame(false); + return; + } + + try { + DyeColor color = DyeColor.valueOf(value.toUpperCase()); + if (!wolf.isTame()){ + wolf.setTame(true); + } + wolf.setCollarColor(color); + } catch (IllegalArgumentException e) { + System.out.println("Invalid wolf collar color: " + value); + } + } } diff --git a/plugins/fancynpcs/implementation_1_20_2/src/main/java/de/oliver/fancynpcs/v1_20_2/attributes/WolfAttributes.java b/plugins/fancynpcs/implementation_1_20_2/src/main/java/de/oliver/fancynpcs/v1_20_2/attributes/WolfAttributes.java index 7c158e89..7621cd8f 100644 --- a/plugins/fancynpcs/implementation_1_20_2/src/main/java/de/oliver/fancynpcs/v1_20_2/attributes/WolfAttributes.java +++ b/plugins/fancynpcs/implementation_1_20_2/src/main/java/de/oliver/fancynpcs/v1_20_2/attributes/WolfAttributes.java @@ -4,6 +4,7 @@ import de.oliver.fancynpcs.api.Npc; import de.oliver.fancynpcs.api.NpcAttribute; import de.oliver.fancynpcs.v1_20_2.ReflectionHelper; import net.minecraft.world.entity.animal.Wolf; +import net.minecraft.world.item.DyeColor; import org.bukkit.entity.EntityType; import java.util.ArrayList; @@ -28,6 +29,13 @@ public class WolfAttributes { WolfAttributes::setAngry )); + attributes.add(new NpcAttribute( + "color", + List.of("RED", "BLUE", "YELLOW", "GREEN", "PURPLE", "ORANGE", "LIME", "MAGENTA", "BROWN", "WHITE", "GRAY", "LIGHT_GRAY", "LIGHT_BLUE", "BLACK", "CYAN", "PINK", "NONE"), + List.of(EntityType.WOLF), + WolfAttributes::setColor + )); + return attributes; } @@ -47,4 +55,24 @@ public class WolfAttributes { wolf.setRemainingPersistentAngerTime(angry ? 100 : 0); } + + private static void setColor(Npc npc, String value) { + Wolf wolf = ReflectionHelper.getEntity(npc); + + if (value.equalsIgnoreCase("none") || value.isEmpty()) { + // Reset to no collar + wolf.setTame(false); + return; + } + + try { + DyeColor color = DyeColor.valueOf(value.toUpperCase()); + if (!wolf.isTame()){ + wolf.setTame(true); + } + wolf.setCollarColor(color); + } catch (IllegalArgumentException e) { + System.out.println("Invalid wolf collar color: " + value); + } + } } diff --git a/plugins/fancynpcs/implementation_1_20_4/src/main/java/de/oliver/fancynpcs/v1_20_4/attributes/WolfAttributes.java b/plugins/fancynpcs/implementation_1_20_4/src/main/java/de/oliver/fancynpcs/v1_20_4/attributes/WolfAttributes.java index 5de9df0c..146a2f12 100644 --- a/plugins/fancynpcs/implementation_1_20_4/src/main/java/de/oliver/fancynpcs/v1_20_4/attributes/WolfAttributes.java +++ b/plugins/fancynpcs/implementation_1_20_4/src/main/java/de/oliver/fancynpcs/v1_20_4/attributes/WolfAttributes.java @@ -4,6 +4,7 @@ import de.oliver.fancynpcs.api.Npc; import de.oliver.fancynpcs.api.NpcAttribute; import de.oliver.fancynpcs.v1_20_4.ReflectionHelper; import net.minecraft.world.entity.animal.Wolf; +import net.minecraft.world.item.DyeColor; import org.bukkit.entity.EntityType; import java.util.ArrayList; @@ -28,6 +29,13 @@ public class WolfAttributes { WolfAttributes::setAngry )); + attributes.add(new NpcAttribute( + "color", + List.of("RED", "BLUE", "YELLOW", "GREEN", "PURPLE", "ORANGE", "LIME", "MAGENTA", "BROWN", "WHITE", "GRAY", "LIGHT_GRAY", "LIGHT_BLUE", "BLACK", "CYAN", "PINK", "NONE"), + List.of(EntityType.WOLF), + WolfAttributes::setColor + )); + return attributes; } @@ -47,4 +55,24 @@ public class WolfAttributes { wolf.setRemainingPersistentAngerTime(angry ? 100 : 0); } + + private static void setColor(Npc npc, String value) { + Wolf wolf = ReflectionHelper.getEntity(npc); + + if (value.equalsIgnoreCase("none") || value.isEmpty()) { + // Reset to no collar + wolf.setTame(false); + return; + } + + try { + DyeColor color = DyeColor.valueOf(value.toUpperCase()); + if (!wolf.isTame()){ + wolf.setTame(true); + } + wolf.setCollarColor(color); + } catch (IllegalArgumentException e) { + System.out.println("Invalid wolf collar color: " + value); + } + } } diff --git a/plugins/fancynpcs/implementation_1_20_6/src/main/java/de/oliver/fancynpcs/v1_20_6/attributes/WolfAttributes.java b/plugins/fancynpcs/implementation_1_20_6/src/main/java/de/oliver/fancynpcs/v1_20_6/attributes/WolfAttributes.java index 48e8d805..f400e3f8 100644 --- a/plugins/fancynpcs/implementation_1_20_6/src/main/java/de/oliver/fancynpcs/v1_20_6/attributes/WolfAttributes.java +++ b/plugins/fancynpcs/implementation_1_20_6/src/main/java/de/oliver/fancynpcs/v1_20_6/attributes/WolfAttributes.java @@ -9,6 +9,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.animal.WolfVariant; +import net.minecraft.world.item.DyeColor; import org.bukkit.entity.EntityType; import java.util.ArrayList; @@ -40,6 +41,13 @@ public class WolfAttributes { WolfAttributes::setVariant )); + attributes.add(new NpcAttribute( + "color", + List.of("RED", "BLUE", "YELLOW", "GREEN", "PURPLE", "ORANGE", "LIME", "MAGENTA", "BROWN", "WHITE", "GRAY", "LIGHT_GRAY", "LIGHT_BLUE", "BLACK", "CYAN", "PINK", "NONE"), + List.of(EntityType.WOLF), + WolfAttributes::setColor + )); + return attributes; } @@ -78,4 +86,24 @@ public class WolfAttributes { } } + private static void setColor(Npc npc, String value) { + Wolf wolf = ReflectionHelper.getEntity(npc); + + if (value.equalsIgnoreCase("none") || value.isEmpty()) { + // Reset to no collar + wolf.setTame(false, false); + return; + } + + try { + DyeColor color = DyeColor.valueOf(value.toUpperCase()); + if (!wolf.isTame()){ + wolf.setTame(true, false); + } + wolf.setCollarColor(color); + } catch (IllegalArgumentException e) { + System.out.println("Invalid wolf collar color: " + value); + } + } + } diff --git a/plugins/fancynpcs/implementation_1_21_1/src/main/java/de/oliver/fancynpcs/v1_21_1/attributes/WolfAttributes.java b/plugins/fancynpcs/implementation_1_21_1/src/main/java/de/oliver/fancynpcs/v1_21_1/attributes/WolfAttributes.java index e36e1017..9f745a9e 100644 --- a/plugins/fancynpcs/implementation_1_21_1/src/main/java/de/oliver/fancynpcs/v1_21_1/attributes/WolfAttributes.java +++ b/plugins/fancynpcs/implementation_1_21_1/src/main/java/de/oliver/fancynpcs/v1_21_1/attributes/WolfAttributes.java @@ -10,6 +10,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.animal.WolfVariant; +import net.minecraft.world.item.DyeColor; import org.bukkit.entity.EntityType; import java.util.ArrayList; @@ -41,6 +42,13 @@ public class WolfAttributes { WolfAttributes::setVariant )); + attributes.add(new NpcAttribute( + "color", + List.of("RED", "BLUE", "YELLOW", "GREEN", "PURPLE", "ORANGE", "LIME", "MAGENTA", "BROWN", "WHITE", "GRAY", "LIGHT_GRAY", "LIGHT_BLUE", "BLACK", "CYAN", "PINK", "NONE"), + List.of(EntityType.WOLF), + WolfAttributes::setColor + )); + return attributes; } @@ -91,4 +99,24 @@ public class WolfAttributes { } ); } + + private static void setColor(Npc npc, String value) { + Wolf wolf = ReflectionHelper.getEntity(npc); + + if (value.equalsIgnoreCase("none") || value.isEmpty()) { + // Reset to no collar + wolf.setTame(false, false); + return; + } + + try { + DyeColor color = DyeColor.valueOf(value.toUpperCase()); + if (!wolf.isTame()){ + wolf.setTame(true, false); + } + wolf.setCollarColor(color); + } catch (IllegalArgumentException e) { + System.out.println("Invalid wolf collar color: " + value); + } + } } diff --git a/plugins/fancynpcs/implementation_1_21_3/src/main/java/de/oliver/fancynpcs/v1_21_3/attributes/WolfAttributes.java b/plugins/fancynpcs/implementation_1_21_3/src/main/java/de/oliver/fancynpcs/v1_21_3/attributes/WolfAttributes.java index dceaf442..51587644 100644 --- a/plugins/fancynpcs/implementation_1_21_3/src/main/java/de/oliver/fancynpcs/v1_21_3/attributes/WolfAttributes.java +++ b/plugins/fancynpcs/implementation_1_21_3/src/main/java/de/oliver/fancynpcs/v1_21_3/attributes/WolfAttributes.java @@ -3,6 +3,7 @@ package de.oliver.fancynpcs.v1_21_3.attributes; import de.oliver.fancynpcs.api.Npc; import de.oliver.fancynpcs.api.NpcAttribute; import de.oliver.fancynpcs.v1_21_3.ReflectionHelper; +import net.minecraft.world.item.DyeColor; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; @@ -40,6 +41,13 @@ public class WolfAttributes { WolfAttributes::setVariant )); + attributes.add(new NpcAttribute( + "color", + List.of("RED", "BLUE", "YELLOW", "GREEN", "PURPLE", "ORANGE", "LIME", "MAGENTA", "BROWN", "WHITE", "GRAY", "LIGHT_GRAY", "LIGHT_BLUE", "BLACK", "CYAN", "PINK", "NONE"), + List.of(EntityType.WOLF), + WolfAttributes::setColor + )); + return attributes; } @@ -86,4 +94,24 @@ public class WolfAttributes { () -> System.out.println("Wolf variant not registered: " + variantLocation) ); } + + private static void setColor(Npc npc, String value) { + Wolf wolf = ReflectionHelper.getEntity(npc); + + if (value.equalsIgnoreCase("none") || value.isEmpty()) { + // Reset to no collar + wolf.setTame(false, false); + return; + } + + try { + DyeColor color = DyeColor.valueOf(value.toUpperCase()); + if (!wolf.isTame()){ + wolf.setTame(true, false); + } + wolf.setCollarColor(color); + } catch (IllegalArgumentException e) { + System.out.println("Invalid wolf collar color: " + value); + } + } } diff --git a/plugins/fancynpcs/implementation_1_21_4/src/main/java/de/oliver/fancynpcs/v1_21_4/attributes/WolfAttributes.java b/plugins/fancynpcs/implementation_1_21_4/src/main/java/de/oliver/fancynpcs/v1_21_4/attributes/WolfAttributes.java index 3a55d83f..7c41bc26 100644 --- a/plugins/fancynpcs/implementation_1_21_4/src/main/java/de/oliver/fancynpcs/v1_21_4/attributes/WolfAttributes.java +++ b/plugins/fancynpcs/implementation_1_21_4/src/main/java/de/oliver/fancynpcs/v1_21_4/attributes/WolfAttributes.java @@ -7,9 +7,11 @@ import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Relative; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.animal.WolfVariant; import org.bukkit.entity.EntityType; +import net.minecraft.world.item.DyeColor; import java.util.ArrayList; import java.util.List; @@ -40,6 +42,13 @@ public class WolfAttributes { WolfAttributes::setVariant )); + attributes.add(new NpcAttribute( + "color", + List.of("RED", "BLUE", "YELLOW", "GREEN", "PURPLE", "ORANGE", "LIME", "MAGENTA", "BROWN", "WHITE", "GRAY", "LIGHT_GRAY", "LIGHT_BLUE", "BLACK", "CYAN", "PINK", "NONE"), + List.of(EntityType.WOLF), + WolfAttributes::setColor + )); + return attributes; } @@ -86,4 +95,22 @@ public class WolfAttributes { () -> System.out.println("Wolf variant not registered: " + variantLocation) ); } + + public static void setColor(Npc npc, String value) { + Wolf wolf = ReflectionHelper.getEntity(npc); // NMS Wolf + + if (value.equalsIgnoreCase("none") || value.isEmpty()) { + // Untame to remove collar + wolf.setTame(false, false); + return; + } + + try { + DyeColor color = DyeColor.valueOf(value.toUpperCase()); // NMS enum + wolf.setTame(true, false); // Wolves need to be tamed for collar color to show + wolf.setCollarColor(color); + } catch (IllegalArgumentException e) { + System.out.println("Invalid color for wolf collar: " + value); + } + } } diff --git a/plugins/fancynpcs/implementation_1_21_5/src/main/java/de/oliver/fancynpcs/v1_21_5/attributes/WolfAttributes.java b/plugins/fancynpcs/implementation_1_21_5/src/main/java/de/oliver/fancynpcs/v1_21_5/attributes/WolfAttributes.java index 81808f98..fdd04d25 100644 --- a/plugins/fancynpcs/implementation_1_21_5/src/main/java/de/oliver/fancynpcs/v1_21_5/attributes/WolfAttributes.java +++ b/plugins/fancynpcs/implementation_1_21_5/src/main/java/de/oliver/fancynpcs/v1_21_5/attributes/WolfAttributes.java @@ -5,9 +5,10 @@ import de.oliver.fancynpcs.api.NpcAttribute; import de.oliver.fancynpcs.v1_21_5.ReflectionHelper; import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; +import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; import net.minecraft.data.registries.VanillaRegistries; -import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.DyeColor; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.animal.wolf.Wolf; import net.minecraft.world.entity.animal.wolf.WolfVariant; @@ -45,6 +46,13 @@ public class WolfAttributes { WolfAttributes::setVariant )); + attributes.add(new NpcAttribute( + "color", + List.of("RED", "BLUE", "YELLOW", "GREEN", "PURPLE", "ORANGE", "LIME", "MAGENTA", "BROWN", "WHITE", "GRAY", "LIGHT_GRAY", "LIGHT_BLUE", "BLACK", "CYAN", "PINK", "NONE"), + List.of(EntityType.WOLF), + WolfAttributes::setColor + )); + return attributes; } @@ -68,14 +76,49 @@ public class WolfAttributes { private static void setVariant(Npc npc, String value) { Wolf wolf = ReflectionHelper.getEntity(npc); - Holder variant = getWolfVariantRegistry() - .get(ResourceKey.create( - Registries.WOLF_VARIANT, - ResourceLocation.withDefaultNamespace(value.toLowerCase()) - )) - .orElseThrow(); + Registry registry = wolf.level().registryAccess().lookupOrThrow(Registries.WOLF_VARIANT); - wolf.setVariant(variant); + ResourceLocation variantLocation = ResourceLocation.tryParse("minecraft:" + value.toLowerCase()); + if (variantLocation == null) { + System.out.println("Invalid variant name: " + value); + return; + } + + WolfVariant variant = registry.getOptional(variantLocation).orElse(null); + if (variant == null) { + System.out.println("Wolf variant not found: " + variantLocation); + return; + } + + // Get the ResourceKey from the registry + registry.getResourceKey(variant).ifPresentOrElse( + key -> { + // Get the holder from the registry — this is properly bound + Holder holder = registry.wrapAsHolder(variant); + wolf.setVariant(holder); + }, + () -> System.out.println("Wolf variant not registered: " + variantLocation) + ); + } + + private static void setColor(Npc npc, String value) { + Wolf wolf = ReflectionHelper.getEntity(npc); + + if (value.equalsIgnoreCase("none") || value.isEmpty()) { + // Reset to no collar + wolf.setTame(false, false); + return; + } + + try { + DyeColor color = DyeColor.valueOf(value.toUpperCase()); + if (!wolf.isTame()){ + wolf.setTame(true, false); + } + wolf.setCollarColor(color); + } catch (IllegalArgumentException e) { + System.out.println("Invalid wolf collar color: " + value); + } } private static HolderLookup.RegistryLookup getWolfVariantRegistry() {