diff --git a/src/generated/resources/.cache/0aef4464247e697f9a7226f384437b478152c21c b/src/generated/resources/.cache/0aef4464247e697f9a7226f384437b478152c21c index ffc6767..eeb5ef8 100644 --- a/src/generated/resources/.cache/0aef4464247e697f9a7226f384437b478152c21c +++ b/src/generated/resources/.cache/0aef4464247e697f9a7226f384437b478152c21c @@ -1,4 +1,5 @@ -// 1.21 2024-10-23T13:15:06.1102778 Item Models: leashedplayer +// 1.21 2024-11-01T00:08:54.8327658 Item Models: leashedplayer +766c487fbf0c59e9045eeaf81daf583eb679b0e1 assets/leashedplayer/models/item/amethyst_shears.json 5846df9d85726428905701120ef34c9324c20faf assets/leashedplayer/models/item/bow_lra_pulling_0.json 845a7316b86e26f88c6932d4ef2656126503727a assets/leashedplayer/models/item/bow_lra_pulling_1.json 5bd1f9f28b91005c587f1c38fb77cd19b59495e3 assets/leashedplayer/models/item/bow_lra_pulling_2.json diff --git a/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff b/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff index eaa23cd..3700a7a 100644 --- a/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff +++ b/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff @@ -1,2 +1,2 @@ -// 1.21 2024-10-23T14:43:16.8619078 Languages: en_us for mod: leashedplayer -4dc2ca922a540c7133a4a6867dfcd8bfec5a1db4 assets/leashedplayer/lang/en_us.json +// 1.21 2024-11-01T00:08:54.8337656 Languages: en_us for mod: leashedplayer +05969780f698fcb4d6b63800dcdb76e4b0cad090 assets/leashedplayer/lang/en_us.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index 045e4a7..3c6d1e4 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,5 +1,7 @@ -// 1.21 2024-10-23T13:15:06.1092763 Recipes +// 1.21 2024-11-01T00:08:54.8297675 Recipes +13ebe9a580731296eb10c05d1844657d58e07cc1 data/leashedplayer/advancement/recipes/misc/amethyst_shears.json 1b45d1ad8dc73f1787c97777ad13d9771c9e0ad1 data/leashedplayer/advancement/recipes/misc/leash_rope_arrow.json +04bd2d8a0c7288776da2119eb9a9f9cf694be1b6 data/leashedplayer/recipe/amethyst_shears.json 974d74538b3e172946f2e169036b453b6eb6bc0a data/leashedplayer/recipe/leash_rope_arrow.json c0e05f359296d3e28573fa1b205ac44736376622 data/minecraft/advancement/recipes/misc/spectral_leash_rope_arrow_with_glowstone_dust.json 131fcbef603bfde7204d8e1ad15e4544696926bf data/minecraft/advancement/recipes/misc/spectral_leash_rope_arrow_with_leash_rope_arrow.json diff --git a/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb b/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb index 97fa50f..061446e 100644 --- a/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb +++ b/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb @@ -1,2 +1,2 @@ -// 1.21 2024-10-23T14:43:16.860909 Languages: zh_cn for mod: leashedplayer -35bc6c3001138c5306d1ee9d55ef3dfbfd417e08 assets/leashedplayer/lang/zh_cn.json +// 1.21 2024-11-01T00:08:54.8287566 Languages: zh_cn for mod: leashedplayer +98ca8da6ea1688abc5d4beda986cfe0406255f1c assets/leashedplayer/lang/zh_cn.json diff --git a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 index 907f395..4f9bfce 100644 --- a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 +++ b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 @@ -1,4 +1,4 @@ -// 1.21 2024-10-23T14:19:10.2054361 Advancements +// 1.21 2024-11-01T00:08:54.8347648 Advancements 4d97adba079f1966090a52443bb439319f550680 data/leashedplayer/advancement/advancement_leash_arrow.json f16184b81ea35a0fbd8f2c49b085a96c32818c69 data/leashedplayer/advancement/dog_running_player.json bce12ed339b3b0fded263ba039f7a4e6fcfb84ca data/leashedplayer/advancement/follow_arrow.json @@ -6,4 +6,5 @@ bce12ed339b3b0fded263ba039f7a4e6fcfb84ca data/leashedplayer/advancement/follow_a 25f6b476b194a27c0fe0e75d74ac3a7ff4054789 data/leashedplayer/advancement/leashed_self.json a69a455855fb6dd8a8ac131a55099de5de45d7c4 data/leashedplayer/advancement/leash_arrow.json 133f844ffafd37b9ba57cafa96350f035cac57f9 data/leashedplayer/advancement/leash_start.json +2d8bce7fd078f9cc6b73b77f2fbab30e6cc197f4 data/leashedplayer/advancement/leash_terminator.json 4b0bcf6b372f52e954edcef37a6b04435ec2b4e8 data/leashedplayer/advancement/no_leash.json diff --git a/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d b/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d index 7d99a80..49b0828 100644 --- a/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d +++ b/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d @@ -1,2 +1,2 @@ -// 1.21 2024-10-23T14:43:16.8589078 Languages: zh_tw for mod: leashedplayer -c6df14a1f53a3e892ebc6b396b552ff27f1a7580 assets/leashedplayer/lang/zh_tw.json +// 1.21 2024-11-01T00:08:54.8266358 Languages: zh_tw for mod: leashedplayer +be94545852f60710429320d1e25f77d633940f36 assets/leashedplayer/lang/zh_tw.json diff --git a/src/generated/resources/assets/leashedplayer/lang/en_us.json b/src/generated/resources/assets/leashedplayer/lang/en_us.json index c15def4..6a9d06f 100644 --- a/src/generated/resources/assets/leashedplayer/lang/en_us.json +++ b/src/generated/resources/assets/leashedplayer/lang/en_us.json @@ -9,6 +9,8 @@ "advancement.leashedplayer.leash_arrow.desc": "Maybe you can using it to shoot some mob?", "advancement.leashedplayer.leash_start": "The Power of Traction", "advancement.leashedplayer.leash_start.desc": "Journey to becoming a Leash Expert", + "advancement.leashedplayer.leash_terminator": "The Lead Terminator", + "advancement.leashedplayer.leash_terminator.desc": "I am Lead Terminator!", "advancement.leashedplayer.leashed_friend": "Be bound by Rope", "advancement.leashedplayer.leashed_friend.desc": "Be Bond by player with lead", "advancement.leashedplayer.leashed_self": "Stable Connection", @@ -28,6 +30,7 @@ "gamerule.LP.TeleportWithLeashedPlayers": "Teleport leashed player with player holder", "gamerule.LP.TeleportWithLeashedPlayers.description": "Holder will teleport with their leashed players ", "item.leash_rope_arrow.description": "Arrows with ropes attached?", + "item.leashedplayer.amethyst_shears": "Amethyst Shears", "item.leashedplayer.fabric": "Fabric", "item.leashedplayer.leash_rope_arrow": "Leash Rope Arrow", "item.leashedplayer.spectral_leash_rope_arrow": "Spectral Leash Rope Arrow", diff --git a/src/generated/resources/assets/leashedplayer/lang/zh_cn.json b/src/generated/resources/assets/leashedplayer/lang/zh_cn.json index 22ed54e..91a4f97 100644 --- a/src/generated/resources/assets/leashedplayer/lang/zh_cn.json +++ b/src/generated/resources/assets/leashedplayer/lang/zh_cn.json @@ -9,6 +9,8 @@ "advancement.leashedplayer.leash_arrow.desc": "也许可以用它来发射生物?", "advancement.leashedplayer.leash_start": "牵引之力", "advancement.leashedplayer.leash_start.desc": "拴绳大师之路", + "advancement.leashedplayer.leash_terminator": "拴绳终结者", + "advancement.leashedplayer.leash_terminator.desc": "我來终结拴绳者!", "advancement.leashedplayer.leashed_friend": "拴绳链接", "advancement.leashedplayer.leashed_friend.desc": "被玩家用拴绳链接", "advancement.leashedplayer.leashed_self": "稳固联结", @@ -28,6 +30,7 @@ "gamerule.LP.TeleportWithLeashedPlayers": "被拴玩家随玩家持有者传送", "gamerule.LP.TeleportWithLeashedPlayers.description": "传送时将被拴玩家与持有者一起传送", "item.leash_rope_arrow.description": "带有拴绳的箭矢?", + "item.leashedplayer.amethyst_shears": "紫水晶剪刀", "item.leashedplayer.fabric": "Fabric", "item.leashedplayer.leash_rope_arrow": "拴绳箭", "item.leashedplayer.spectral_leash_rope_arrow": "拴绳光灵箭", diff --git a/src/generated/resources/assets/leashedplayer/lang/zh_tw.json b/src/generated/resources/assets/leashedplayer/lang/zh_tw.json index 8495ddc..d9617f4 100644 --- a/src/generated/resources/assets/leashedplayer/lang/zh_tw.json +++ b/src/generated/resources/assets/leashedplayer/lang/zh_tw.json @@ -9,6 +9,8 @@ "advancement.leashedplayer.leash_arrow.desc": "也許可以用它發射生物?", "advancement.leashedplayer.leash_start": "牽引之力", "advancement.leashedplayer.leash_start.desc": "拴繩大師之路", + "advancement.leashedplayer.leash_terminator": "拴繩終結者", + "advancement.leashedplayer.leash_terminator.desc": "吾將終結拴繩!", "advancement.leashedplayer.leashed_friend": "拴繩鏈接", "advancement.leashedplayer.leashed_friend.desc": "被玩家用拴繩鏈接", "advancement.leashedplayer.leashed_self": "穩固聯結", @@ -28,6 +30,7 @@ "gamerule.LP.TeleportWithLeashedPlayers": "被拴玩家随玩家持有者傳送", "gamerule.LP.TeleportWithLeashedPlayers.description": "將被拴玩家將隨持有者一起傳送", "item.leash_rope_arrow.description": "帶有拴繩的箭矢?", + "item.leashedplayer.amethyst_shears": "紫水晶剪刀", "item.leashedplayer.fabric": "Fabric", "item.leashedplayer.leash_rope_arrow": "拴繩箭", "item.leashedplayer.spectral_leash_rope_arrow": "拴繩光靈箭", diff --git a/src/generated/resources/assets/leashedplayer/models/item/amethyst_shears.json b/src/generated/resources/assets/leashedplayer/models/item/amethyst_shears.json new file mode 100644 index 0000000..1691725 --- /dev/null +++ b/src/generated/resources/assets/leashedplayer/models/item/amethyst_shears.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "leashedplayer:item/amethyst_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/leashedplayer/advancement/leash_terminator.json b/src/generated/resources/data/leashedplayer/advancement/leash_terminator.json new file mode 100644 index 0000000..2538212 --- /dev/null +++ b/src/generated/resources/data/leashedplayer/advancement/leash_terminator.json @@ -0,0 +1,34 @@ +{ + "parent": "leashedplayer:leash_start", + "criteria": { + "has_amethyst_shears": { + "conditions": { + "items": [ + { + "items": "leashedplayer:amethyst_shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": { + "translate": "advancement.leashedplayer.leash_terminator.desc" + }, + "hidden": true, + "icon": { + "count": 1, + "id": "leashedplayer:amethyst_shears" + }, + "title": { + "translate": "advancement.leashedplayer.leash_terminator" + } + }, + "requirements": [ + [ + "has_amethyst_shears" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/leashedplayer/advancement/recipes/misc/amethyst_shears.json b/src/generated/resources/data/leashedplayer/advancement/recipes/misc/amethyst_shears.json new file mode 100644 index 0000000..d85cecd --- /dev/null +++ b/src/generated/resources/data/leashedplayer/advancement/recipes/misc/amethyst_shears.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_amethyst_shard": { + "conditions": { + "items": [ + { + "items": "minecraft:amethyst_shard" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "leashedplayer:amethyst_shears" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_amethyst_shard" + ] + ], + "rewards": { + "recipes": [ + "leashedplayer:amethyst_shears" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/leashedplayer/recipe/amethyst_shears.json b/src/generated/resources/data/leashedplayer/recipe/amethyst_shears.json new file mode 100644 index 0000000..c4f9929 --- /dev/null +++ b/src/generated/resources/data/leashedplayer/recipe/amethyst_shears.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "minecraft:amethyst_shard" + }, + "%": { + "item": "minecraft:stick" + } + }, + "pattern": [ + "#%", + "%#" + ], + "result": { + "count": 1, + "id": "leashedplayer:amethyst_shears" + } +} \ No newline at end of file diff --git a/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java b/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java index 70d0ea0..6d3b436 100644 --- a/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java +++ b/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java @@ -8,6 +8,7 @@ import com.r3944realms.leashedplayer.content.effects.ModEffectRegister; import com.r3944realms.leashedplayer.content.effects.ModPotionRegister; import com.r3944realms.leashedplayer.content.entities.LeashRopeArrow; import com.r3944realms.leashedplayer.content.items.ModItemRegister; +import com.r3944realms.leashedplayer.content.misc.LeadBreakItemBehavior; import com.r3944realms.leashedplayer.modInterface.PlayerLeashable; import net.minecraft.commands.CommandSourceStack; import net.minecraft.world.effect.MobEffectInstance; @@ -73,6 +74,7 @@ public class CommonEventHandler { public static void onCommonSetup(FMLCommonSetupEvent event) { DispenserBlock.registerProjectileBehavior(ModItemRegister.LEASH_ROPE_ARROW.get()); DispenserBlock.registerProjectileBehavior(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW.get()); + DispenserBlock.registerBehavior(ModItemRegister.AMETHYST_SHEARS.get(), new LeadBreakItemBehavior()); } } diff --git a/src/main/java/com/r3944realms/leashedplayer/content/gamerules/Server/DisablePlayerMoveCheck.java b/src/main/java/com/r3944realms/leashedplayer/content/gamerules/Server/DisablePlayerMoveCheck.java index c7b2bfe..ec9c546 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/gamerules/Server/DisablePlayerMoveCheck.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/gamerules/Server/DisablePlayerMoveCheck.java @@ -12,7 +12,7 @@ import static com.r3944realms.leashedplayer.content.gamerules.Gamerules.GAMERULE @EventBusSubscriber(modid = LeashedPlayer.MOD_ID, bus = EventBusSubscriber.Bus.MOD) public class DisablePlayerMoveCheck { - public static final boolean DEFAULT_VALUE = true; + public static final boolean DEFAULT_VALUE = false; public static final String ID = Util.getGameruleName(DisablePlayerMoveCheck.class); public static final String DESCRIPTION_KEY = Gamerules.getDescriptionKey(DisablePlayerMoveCheck.class); public static final String NAME_KEY = Gamerules.getNameKey(DisablePlayerMoveCheck.class); diff --git a/src/main/java/com/r3944realms/leashedplayer/content/items/ModCreativeTab.java b/src/main/java/com/r3944realms/leashedplayer/content/items/ModCreativeTab.java index 6d54475..cf0b2cc 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/items/ModCreativeTab.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/items/ModCreativeTab.java @@ -31,6 +31,7 @@ public class ModCreativeTab { pOutput.accept(Items.CROSSBOW); pOutput.accept(ModItemRegister.LEASH_ROPE_ARROW.get()); pOutput.accept(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW.get()); + pOutput.accept(ModItemRegister.AMETHYST_SHEARS.get()); HolderLookup.RegistryLookup potionRegistryLookup = CommonHooks.resolveLookup(Registries.POTION); if(potionRegistryLookup != null) { potionRegistryLookup.listElements() diff --git a/src/main/java/com/r3944realms/leashedplayer/content/items/ModItemRegister.java b/src/main/java/com/r3944realms/leashedplayer/content/items/ModItemRegister.java index 375c5f3..700173f 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/items/ModItemRegister.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/items/ModItemRegister.java @@ -1,11 +1,17 @@ package com.r3944realms.leashedplayer.content.items; import com.r3944realms.leashedplayer.LeashedPlayer; +import com.r3944realms.leashedplayer.content.items.type.LeadBreakerItem; import com.r3944realms.leashedplayer.content.items.type.LeashRopeArrowItem; import com.r3944realms.leashedplayer.content.items.type.SpectralLeashRopeArrowItem; import com.r3944realms.leashedplayer.content.items.type.TestItem; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ShearsItem; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredRegister; @@ -26,6 +32,9 @@ public class ModItemRegister { public static final Supplier FABRIC = ModItemRegister.register("fabric", () -> new TestItem(new Item.Properties().stacksTo(1)) ); + public static final Supplier AMETHYST_SHEARS = ModItemRegister.register("amethyst_shears", + () -> new LeadBreakerItem(new Item.Properties().durability(100).component(DataComponents.TOOL, ShearsItem.createToolProperties()) + .stacksTo(1))); public static Supplier register(String name, Supplier supplier) { return register(name, supplier, true); diff --git a/src/main/java/com/r3944realms/leashedplayer/content/items/type/LeadBreakerItem.java b/src/main/java/com/r3944realms/leashedplayer/content/items/type/LeadBreakerItem.java new file mode 100644 index 0000000..be9259a --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/content/items/type/LeadBreakerItem.java @@ -0,0 +1,66 @@ +package com.r3944realms.leashedplayer.content.items.type; + +import com.r3944realms.leashedplayer.content.entities.LeashRopeArrow; +import com.r3944realms.leashedplayer.modInterface.PlayerLeashable; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Leashable; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ShearsItem; +import net.minecraft.world.item.component.Tool; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class LeadBreakerItem extends ShearsItem { + + public LeadBreakerItem(Properties properties) { + super(properties); + } + + public static Tool createToolProperties() { + return new Tool( + List.of( + Tool.Rule.minesAndDrops(List.of(Blocks.COBWEB), 18.0F), + Tool.Rule.overrideSpeed(BlockTags.LEAVES, 25.0F), + Tool.Rule.overrideSpeed(BlockTags.WOOL, 8.0F), + Tool.Rule.overrideSpeed(List.of(Blocks.VINE, Blocks.GLOW_LICHEN), 4.0F) + ), + 1.0F, + 1 + ); + } + @Override + public @NotNull InteractionResult interactLivingEntity(@NotNull ItemStack stack, @NotNull Player player, @NotNull LivingEntity entity, net.minecraft.world.@NotNull InteractionHand hand) { + if(!entity.level().isClientSide) { + if (entity instanceof PlayerLeashable playerLeashable) { + if (playerLeashable.isLeashed()){ + playerLeashable.dropLeash(true, !(playerLeashable.getLeashHolder() instanceof LeashRopeArrow)); + if (playerLeashable.getLeashHolder() instanceof LeashRopeArrow leashRopeArrow) { + leashRopeArrow.setOwner(null); + } + if (!player.isCreative()) stack.hurtAndBreak(1, player, LivingEntity.getSlotForHand(hand)); + return InteractionResult.SUCCESS; + } else return InteractionResult.PASS; + } else if (entity instanceof Leashable leashable) { + if (leashable.isLeashed()){ + leashable.dropLeash(true, !(leashable.getLeashHolder() instanceof LeashRopeArrow)); + if (leashable.getLeashHolder() instanceof LeashRopeArrow leashRopeArrow) { + leashRopeArrow.setOwner(null); + } + if (!player.isCreative()) stack.hurtAndBreak(1, player, LivingEntity.getSlotForHand(hand)); + return InteractionResult.SUCCESS; + } else return InteractionResult.PASS; + } + } + return InteractionResult.PASS; + } + +} diff --git a/src/main/java/com/r3944realms/leashedplayer/content/misc/LeadBreakItemBehavior.java b/src/main/java/com/r3944realms/leashedplayer/content/misc/LeadBreakItemBehavior.java new file mode 100644 index 0000000..4b45d87 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/content/misc/LeadBreakItemBehavior.java @@ -0,0 +1,77 @@ +package com.r3944realms.leashedplayer.content.misc; + +import com.r3944realms.leashedplayer.content.entities.LeashRopeArrow; +import com.r3944realms.leashedplayer.modInterface.PlayerLeashable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.Leashable; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.BeehiveBlock; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.entity.BeehiveBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.NotNull; + +public class LeadBreakItemBehavior extends OptionalDispenseItemBehavior { + @Override + protected @NotNull ItemStack execute(@NotNull BlockSource blockSource, @NotNull ItemStack item) { + ServerLevel serverLevel = blockSource.level(); + if(!serverLevel.isClientSide()) { + BlockPos blockPos = blockSource.pos().relative(blockSource.state().getValue(DispenserBlock.FACING)); + this.setSuccess(tryShearBeehive(serverLevel, blockPos) || tryShearLivingEntity(serverLevel, blockPos, item)); + if (this.isSuccess()) { + item.hurtAndBreak(1, serverLevel, null, p_348118_ -> { + }); + } + } + return item; + } + private static boolean tryShearBeehive(ServerLevel level, BlockPos pos) { + BlockState blockstate = level.getBlockState(pos); + if (blockstate.is(BlockTags.BEEHIVES, p_202454_ -> p_202454_.hasProperty(BeehiveBlock.HONEY_LEVEL) && p_202454_.getBlock() instanceof BeehiveBlock)) { + int i = blockstate.getValue(BeehiveBlock.HONEY_LEVEL); + if (i >= 5) { + level.playSound(null, pos, SoundEvents.BEEHIVE_SHEAR, SoundSource.BLOCKS, 1.0F, 1.0F); + BeehiveBlock.dropHoneycomb(level, pos); + ((BeehiveBlock)blockstate.getBlock()) + .releaseBeesAndResetHoneyLevel(level, blockstate, pos, null, BeehiveBlockEntity.BeeReleaseStatus.BEE_RELEASED); + level.gameEvent(null, GameEvent.SHEAR, pos); + return true; + } + } + + return false; + } + + private static boolean tryShearLivingEntity(ServerLevel level, BlockPos pos, ItemStack item) { + for (LivingEntity livingentity : level.getEntitiesOfClass(LivingEntity.class, new AABB(pos), EntitySelector.NO_SPECTATORS)) { + if (livingentity instanceof PlayerLeashable playerLeashable) { + if (playerLeashable.isLeashed()){ + playerLeashable.dropLeash(true, !(playerLeashable.getLeashHolder() instanceof LeashRopeArrow)); + if (playerLeashable.getLeashHolder() instanceof LeashRopeArrow leashRopeArrow) { + leashRopeArrow.setOwner(null); + } + return true; + } else return false; + } else if (livingentity instanceof Leashable leashable) { + if (leashable.isLeashed()) { + leashable.dropLeash(true, !(leashable.getLeashHolder() instanceof LeashRopeArrow)); + if (leashable.getLeashHolder() instanceof LeashRopeArrow leashRopeArrow) { + leashRopeArrow.setOwner(null); + } + return true; + } else return false; + } + } + return false; + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModAdvancementKey.java b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModAdvancementKey.java index 5261230..4d331d4 100644 --- a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModAdvancementKey.java +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModAdvancementKey.java @@ -15,6 +15,7 @@ public enum ModAdvancementKey { FOLLOW_LEASH_ARROW("follow_arrow", LEASH_ARROW), DOG_RUNNING_PLAYER("dog_running_player", LEASH_ARROW), NO_LEASH("no_leash", LEASH_START), + LEASH_TERMINATOR("leash_terminator", LEASH_START), ; private final String Name; @Nullable diff --git a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java index 4fb2e43..fcfb86e 100644 --- a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java @@ -29,6 +29,8 @@ public enum ModLangKeyValue { ITEM_LEASH_ROPE_ARROW(ModItemRegister.LEASH_ROPE_ARROW, ModPartEnum.ITEM, "Leash Rope Arrow", "拴绳箭", "拴繩箭", true), ITEM_SPECTRAL_LEASH_ROPE_ARROW(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW, ModPartEnum.ITEM, "Spectral Leash Rope Arrow", "拴绳光灵箭", "拴繩光靈箭", true), TEST_FABRIC_ITEM(ModItemRegister.FABRIC, ModPartEnum.ITEM, "Fabric", "Fabric", "Fabric", true), + AMETHYST_SHEARS(ModItemRegister.AMETHYST_SHEARS, ModPartEnum.ITEM, "Amethyst Shears", "紫水晶剪刀", "紫水晶剪刀", true), + //ITEM_DESC DESC_ITEM_LEASH_ROPE_ARROW(LeashRopeArrowItem.descKey, ModPartEnum.DESCRIPTION, "Arrows with ropes attached?","带有拴绳的箭矢?", "帶有拴繩的箭矢?", false), //PAINTING @@ -60,11 +62,15 @@ public enum ModLangKeyValue { CREATE_LEASH_FENCE_KNOT_ENTITY_IF_ABSENT(CreateLeashFenceKnotEntityIfAbsent.NAME_KEY, ModPartEnum.NAME, "Create Leash Fence Knot Entity if absent", "如果缺失则创建拴绳结", "如果缺失則創建拴繩結", false), KEEP_LEASH_NOT_DROP_TIME(KeepLeashNotDropTime.NAME_KEY, ModPartEnum.NAME, "Keep leash alive Time", "保持拴绳不掉落的时间", "保持其不掉落的時間", false), DISABLE_MOVE_CHECK(DisablePlayerMoveCheck.NAME_KEY, ModPartEnum.NAME, "Disable Player Move Check", "禁止检查玩家移动", "禁止檢查玩家移動", false), + TERMINATOR(ModAdvancementKey.LEASH_TERMINATOR.getNameKey(), ModPartEnum.NAME, "The Lead Terminator", "拴绳终结者","拴繩終結者", false), + //GAME_RULE_DESCRIPTION TELEPORT_WITH_LEASHED_DESCRIPTION(TeleportWithLeashedPlayers.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "Holder will teleport with their leashed players ", "传送时将被拴玩家与持有者一起传送", "將被拴玩家將隨持有者一起傳送" ,false), CREATE_LEASH_FENCE_KNOT_ENTITY_IF_ABSENT_DESCRIPTION(CreateLeashFenceKnotEntityIfAbsent.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "Create LeashKnot Entity if it's absent on fence", "如果在栅栏处缺失拴绳结,则创建它", "如果在柵欄処缺失拴繩結,則創建它", false), KEEP_LEASH_NOT_DROP_TIME_DESCRIPTION(KeepLeashNotDropTime.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION,"The time of Keep new leash which has far distance alive (Tick)", "当距离过远时,保持新建拴绳不掉落的时间 (刻)", "儅距離過遠時,保持其不掉落的時間(刻)", false), DISABLE_MOVE_CHECK_DESCRIPTION(DisablePlayerMoveCheck.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "Disable the player's movement Check And Correct it.", "禁止检查玩家移动并且纠正它","禁止檢查玩家移動並糾正他它", false), + TERMINATOR_DESC(ModAdvancementKey.LEASH_TERMINATOR.getDescKey(), ModPartEnum.DESCRIPTION, "I am Lead Terminator!", "我來终结拴绳者!", "吾將終結拴繩!", false), + //ADV_NAME LEASH_START(ModAdvancementKey.LEASH_START.getNameKey(), ModPartEnum.NAME, "The Power of Traction", "牵引之力", "牽引之力", false), LEASH_LR_ARROW(ModAdvancementKey.LEASH_ARROW.getNameKey(), ModPartEnum.NAME, "Arrow with a Tether?" , "拴绳之箭?", "拴繩之箭?", false), diff --git a/src/main/java/com/r3944realms/leashedplayer/datagen/generator/ModAdvancementGenerator.java b/src/main/java/com/r3944realms/leashedplayer/datagen/generator/ModAdvancementGenerator.java index 2d758fd..c5b8e64 100644 --- a/src/main/java/com/r3944realms/leashedplayer/datagen/generator/ModAdvancementGenerator.java +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/generator/ModAdvancementGenerator.java @@ -120,6 +120,18 @@ public class ModAdvancementGenerator implements AdvancementProvider.AdvancementG ) ) .parent(hasLeashRopeItem).save(saver, ModAdvancementKey.LEASHED_FRIEND.getNameWithNameSpace()); + AdvancementHolder lead_rope_terminator = Advancement.Builder.advancement().display( + ModItemRegister.AMETHYST_SHEARS.get(), + Component.translatable(ModAdvancementKey.LEASH_TERMINATOR.getNameKey()), + Component.translatable(ModAdvancementKey.LEASH_TERMINATOR.getDescKey()), + null, + AdvancementType.TASK, + true, + true, + true + ).addCriterion("has_amethyst_shears", InventoryChangeTrigger.TriggerInstance.hasItems(ModItemRegister.AMETHYST_SHEARS.get()) + ).parent(hasLeashRopeItem).save(saver, ModAdvancementKey.LEASH_TERMINATOR.getNameWithNameSpace()); + AdvancementHolder no_leash = Advancement.Builder.advancement().display( Items.BARRIER, Component.translatable(ModAdvancementKey.NO_LEASH.getNameKey()), diff --git a/src/main/java/com/r3944realms/leashedplayer/datagen/provider/ModRecipeProvider.java b/src/main/java/com/r3944realms/leashedplayer/datagen/provider/ModRecipeProvider.java index 0e0a75a..fa24a15 100644 --- a/src/main/java/com/r3944realms/leashedplayer/datagen/provider/ModRecipeProvider.java +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/provider/ModRecipeProvider.java @@ -37,6 +37,13 @@ public class ModRecipeProvider extends RecipeProvider { .unlockedBy("has_lead",has(Items.LEAD)) .unlockedBy("has_glowstone_dust",has(Items.GLOWSTONE_DUST)) .save(pRecipeOutput,"spectral_leash_rope_arrow_with_glowstone_dust"); + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItemRegister.AMETHYST_SHEARS.get(),1) + .pattern("#%") + .pattern("%#") + .define('#', Items.AMETHYST_SHARD) + .define('%', Items.STICK) + .unlockedBy("has_amethyst_shard",has(Items.AMETHYST_SHARD)) + .save(pRecipeOutput); } diff --git a/src/main/java/com/r3944realms/leashedplayer/mixin/server/MixinServerGamePacketListenerImpl.java b/src/main/java/com/r3944realms/leashedplayer/mixin/server/MixinServerGamePacketListenerImpl.java index 24ed41f..c979852 100644 --- a/src/main/java/com/r3944realms/leashedplayer/mixin/server/MixinServerGamePacketListenerImpl.java +++ b/src/main/java/com/r3944realms/leashedplayer/mixin/server/MixinServerGamePacketListenerImpl.java @@ -1,6 +1,7 @@ package com.r3944realms.leashedplayer.mixin.server; import com.r3944realms.leashedplayer.content.gamerules.GameruleRegistry; +import com.r3944realms.leashedplayer.content.gamerules.Server.DisablePlayerMoveCheck; import com.r3944realms.leashedplayer.content.gamerules.Server.TeleportWithLeashedPlayers; import com.r3944realms.leashedplayer.modInterface.PlayerLeashable; import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; @@ -57,7 +58,7 @@ public class MixinServerGamePacketListenerImpl { @SuppressWarnings("DiscouragedShift") @Inject(method = {"handleMovePlayer"}, at = @At(value = "INVOKE",target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;[Ljava/lang/Object;)V", ordinal = 0, shift = At.Shift.BEFORE), cancellable = true) private void handleMovePlayer(ServerboundMovePlayerPacket pPacket, CallbackInfo ci) { - if(GameruleRegistry.getGameruleBoolValue(this.player.serverLevel(), TeleportWithLeashedPlayers.ID)) + if(GameruleRegistry.getGameruleBoolValue(this.player.serverLevel(), DisablePlayerMoveCheck.ID)) ci.cancel(); } } diff --git a/src/main/resources/assets/leashedplayer/textures/item/amethyst_shears.png b/src/main/resources/assets/leashedplayer/textures/item/amethyst_shears.png new file mode 100644 index 0000000..eea8545 Binary files /dev/null and b/src/main/resources/assets/leashedplayer/textures/item/amethyst_shears.png differ