2024/11/01

Fix some BUG and Add new Item to break lead rope
This commit is contained in:
叁玖领域 2024-11-01 00:13:27 +08:00
parent f0d078e770
commit 107ef3dc7d
30 changed files with 320 additions and 14 deletions

View File

@ -1,4 +1,5 @@
// 1.21.3 2024-10-27T23:14:21.0486567 Item Models: leashedplayer
// 1.21.3 2024-10-31T23:28:04.7117269 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

View File

@ -1,2 +1,2 @@
// 1.21.3 2024-10-27T23:14:21.0349914 Tags for minecraft:item mod id leashedplayer
// 1.21.3 2024-10-31T20:50:40.9982605 Tags for minecraft:item mod id leashedplayer
36c1cccc1dfa448620c4e9cbc4a7d73986ff9e47 data/minecraft/tags/item/arrows.json

View File

@ -1,2 +1,2 @@
// 1.21.3 2024-10-27T23:14:21.0486567 Languages: en_us for mod: leashedplayer
4dc2ca922a540c7133a4a6867dfcd8bfec5a1db4 assets/leashedplayer/lang/en_us.json
// 1.21.3 2024-10-31T23:28:04.7137271 Languages: en_us for mod: leashedplayer
05969780f698fcb4d6b63800dcdb76e4b0cad090 assets/leashedplayer/lang/en_us.json

View File

@ -1,2 +1,2 @@
// 1.21.3 2024-10-27T23:14:21.047502 Languages: zh_cn for mod: leashedplayer
35bc6c3001138c5306d1ee9d55ef3dfbfd417e08 assets/leashedplayer/lang/zh_cn.json
// 1.21.3 2024-10-31T23:28:04.710726 Languages: zh_cn for mod: leashedplayer
98ca8da6ea1688abc5d4beda986cfe0406255f1c assets/leashedplayer/lang/zh_cn.json

View File

@ -1,6 +1,8 @@
// 1.21.3 2024-10-28T12:36:36.0959778 LeashedPlayer Recipes
// 1.21.3 2024-10-31T23:50:18.2165227 LeashedPlayer Recipes
13ebe9a580731296eb10c05d1844657d58e07cc1 data/leashedplayer/advancement/recipes/misc/amethyst_shears.json
1b45d1ad8dc73f1787c97777ad13d9771c9e0ad1 data/leashedplayer/advancement/recipes/misc/leash_rope_arrow.json
a26d63c2360b32df0b636a5dec96dd919139e022 data/leashedplayer/advancement/recipes/misc/spectral_leash_rope_arrow.json
af1f65626735f1001426e0984217139e15649725 data/leashedplayer/recipe/amethyst_shears.json
db45be6e2bbddc49e60a6c1b12e2ef44afad30d8 data/leashedplayer/recipe/leash_rope_arrow.json
db37bd69a700eaae69bff48c77ed49ca55fb9bf1 data/leashedplayer/recipe/spectral_leash_rope_arrow.json
935d8732ca65dd73e4668a197cda60480053fbcd data/minecraft/advancement/recipes/misc/leash_rope_arrow_shape.json

View File

@ -1,4 +1,4 @@
// 1.21.3 2024-10-27T23:14:21.0497079 Advancements
// 1.21.3 2024-10-31T23:28:04.7147278 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

View File

@ -1,2 +1,2 @@
// 1.21.3 2024-10-27T23:14:21.0467812 Languages: zh_tw for mod: leashedplayer
c6df14a1f53a3e892ebc6b396b552ff27f1a7580 assets/leashedplayer/lang/zh_tw.json
// 1.21.3 2024-10-31T23:28:04.7097257 Languages: zh_tw for mod: leashedplayer
be94545852f60710429320d1e25f77d633940f36 assets/leashedplayer/lang/zh_tw.json

View File

@ -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",

View File

@ -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": "拴绳光灵箭",

View File

@ -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": "拴繩光靈箭",

View File

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "leashedplayer:item/amethyst_shears"
}
}

View File

@ -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
}

View File

@ -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"
]
}
}

View File

@ -0,0 +1,16 @@
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"key": {
"#": "minecraft:amethyst_shard",
"%": "minecraft:stick"
},
"pattern": [
"#%",
"%#"
],
"result": {
"count": 1,
"id": "leashedplayer:amethyst_shears"
}
}

View File

@ -4,6 +4,7 @@ import com.r3944realms.leashedplayer.client.renders.LeashRendererUtil;
import com.r3944realms.leashedplayer.client.renders.entities.LeashRopeArrowRenderer;
import com.r3944realms.leashedplayer.client.renders.entities.SpectralLeashRopeArrowRenderer;
import com.r3944realms.leashedplayer.content.entities.ModEntityRegister;
import com.r3944realms.leashedplayer.content.items.ModCreativeTab;
import com.r3944realms.leashedplayer.content.items.ModItemRegister;
import com.r3944realms.leashedplayer.content.items.type.ILeashRopeArrow;
import com.r3944realms.leashedplayer.modInterface.IPlayerRenderStateExtension;
@ -11,6 +12,7 @@ import net.minecraft.client.renderer.entity.state.PlayerRenderState;
import net.minecraft.client.renderer.item.ItemProperties;
import net.minecraft.core.component.DataComponents;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.component.ChargedProjectiles;
import net.neoforged.api.distmarker.Dist;
@ -18,7 +20,6 @@ import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
import net.neoforged.neoforge.client.event.EntityRenderersEvent;
import net.neoforged.neoforge.client.event.RenderLivingEvent;
import net.neoforged.neoforge.client.event.RenderPlayerEvent;

View File

@ -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());
}
}

View File

@ -30,6 +30,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<Potion> potionRegistryLookup = CommonHooks.resolveLookup(Registries.POTION);
if(potionRegistryLookup != null) {
potionRegistryLookup.listElements()

View File

@ -1,14 +1,18 @@
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.Rarity;
import net.minecraft.world.item.ShearsItem;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredRegister;
@ -25,7 +29,9 @@ public class ModItemRegister {
);
public static final Supplier<Item> SPECTRAL_LEASH_ROPE_ARROW = ModItemRegister.register("spectral_leash_rope_arrow",
() -> new SpectralLeashRopeArrowItem(new Item.Properties().stacksTo(16)));
public static final Supplier<Item> AMETHYST_SHEARS = ModItemRegister.register("amethyst_shears",
() -> new LeadBreakerItem(new Item.Properties().durability(100).component(DataComponents.TOOL, ShearsItem.createToolProperties())
.stacksTo(1).setId(ResourceKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID, "amethyst_shears")))));
public static final Supplier<Item> FABRIC = ModItemRegister.register("fabric",
() -> new TestItem(new Item.Properties().stacksTo(1)
.setId(ResourceKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID, "fabric")))));

View File

@ -0,0 +1,67 @@
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() {
HolderGetter<Block> holdergetter = BuiltInRegistries.acquireBootstrapRegistrationLookup(BuiltInRegistries.BLOCK);
return new Tool(
List.of(
Tool.Rule.minesAndDrops(HolderSet.direct(Blocks.COBWEB.builtInRegistryHolder()), 18.0F),
Tool.Rule.overrideSpeed(holdergetter.getOrThrow(BlockTags.LEAVES), 25.0F),
Tool.Rule.overrideSpeed(holdergetter.getOrThrow(BlockTags.WOOL), 8.0F),
Tool.Rule.overrideSpeed(HolderSet.direct(Blocks.VINE.builtInRegistryHolder(), Blocks.GLOW_LICHEN.builtInRegistryHolder()), 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;
}
}

View File

@ -0,0 +1,78 @@
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.InteractionResult;
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;
}
}

View File

@ -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

View File

@ -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),
// LEAD_ROPE_POTTERY_SHERD(ModItemRegister.LEAD_ROPE_POTTERY_SHERD, ModPartEnum.ITEM, "Lead Rope Pottery Sherd", "拴绳纹样陶片", "拴繩紋樣陶片", true),
//ITEM_DESC
DESC_ITEM_LEASH_ROPE_ARROW(LeashRopeArrowItem.descKey, ModPartEnum.DESCRIPTION, "Arrows with ropes attached?","带有拴绳的箭矢?", "帶有拴繩的箭矢?", false),
//PAINTING
@ -74,6 +76,7 @@ public enum ModLangKeyValue {
FOLLOW_ARROW(ModAdvancementKey.FOLLOW_LEASH_ARROW.getNameKey(), ModPartEnum.NAME, "Launch!!!", "启航!!!" , "啓航!!!",false),
FOLLOW_WOLF(ModAdvancementKey.DOG_RUNNING_PLAYER.getNameKey(), ModPartEnum.NAME, "It's Walking human time.", "遛“人”时间", "遛“人”時間",false),
NO_LEASH(ModAdvancementKey.NO_LEASH.getNameKey(), ModPartEnum.NAME, "Don't tie me up", "勿拴我", "請恁勿拴唔", false),
TERMINATOR(ModAdvancementKey.LEASH_TERMINATOR.getNameKey(), ModPartEnum.NAME, "The Lead Terminator", "拴绳终结者","拴繩終結者", false),
//ADV_DESC
LEASH_START_DESC(ModAdvancementKey.LEASH_START.getDescKey(), ModPartEnum.DESCRIPTION, "Journey to becoming a Leash Expert", "拴绳大师之路", "拴繩大師之路", false),
LEASH_LR_ARROW_DESC(ModAdvancementKey.LEASH_ARROW.getDescKey(), ModPartEnum.DESCRIPTION, "Maybe you can using it to shoot some mob?", "也许可以用它来发射生物?", "也許可以用它發射生物?", false),
@ -82,6 +85,7 @@ public enum ModLangKeyValue {
LEASH_PLAYER_DESC(ModAdvancementKey.LEASHED_FRIEND.getDescKey(),ModPartEnum.DESCRIPTION, "Be Bond by player with lead", "被玩家用拴绳链接", "被玩家用拴繩鏈接", false),
FOLLOW_ARROW_DESC(ModAdvancementKey.FOLLOW_LEASH_ARROW.getDescKey(), ModPartEnum.DESCRIPTION, "Mc, what are you talking about in physics?", "抱歉,我的世界不存在物理学" , "抱歉,麦块不講物理學",false),
FOLLOW_WOLF_DESC(ModAdvancementKey.DOG_RUNNING_PLAYER.getDescKey(), ModPartEnum.DESCRIPTION, "In the park where dogs are not allowed to be walked, the dog decided to walk the human instead", "公园不能遛狗,于是狗站起来遛人", "公園裏不許遛狗,於是狗站起來遛人",false),
TERMINATOR_DESC(ModAdvancementKey.LEASH_TERMINATOR.getDescKey(), ModPartEnum.DESCRIPTION, "I am Lead Terminator!", "我來终结拴绳者!", "吾將終結拴繩!", false),
NO_LEASH_DESC(ModAdvancementKey.NO_LEASH.getDescKey(), ModPartEnum.NAME, "You cannot be leashed by ANY", "你不会被任何东西拴住", "恁不會被任何拴住", false),
//MOB_EFFECT
NO_LEASH_EFFECT(ModEffectRegister.getEffectKey(ModEffectRegister.NO_LEASH_EFFECT.get()), ModPartEnum.NAME, "No Leash", "禁拴", "禁拴", false),

View File

@ -123,6 +123,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()),

View File

@ -38,6 +38,13 @@ public class ModRecipeProvider extends RecipeProvider {
.unlockedBy("has_lead",has(Items.LEAD))
.unlockedBy("has_glowstone_dust",has(Items.GLOWSTONE_DUST))
.save(this.output,"leash_rope_arrow_shape");
this.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(this.output);
}
public static class Runner extends RecipeProvider.Runner {

View File

@ -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;
@ -60,7 +61,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();
}
}

View File

@ -0,0 +1,25 @@
package com.r3944realms.leashedplayer.utils;
import java.util.function.Supplier;
public class Lazy<T> implements Supplier<T> {
private final Supplier<T> delegate;
private T value;
public Lazy(Supplier<T> delegate) {
this.delegate = delegate;
}
@Override
public T get() {
if (this.value == null) {
this.value = this.delegate.get();
}
return this.value;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 B