diff --git a/src/main/java/net/mcreator/target/entity/DroneEntity.java b/src/main/java/net/mcreator/target/entity/DroneEntity.java index 37ae6d536..a3ebf2e3b 100644 --- a/src/main/java/net/mcreator/target/entity/DroneEntity.java +++ b/src/main/java/net/mcreator/target/entity/DroneEntity.java @@ -2,6 +2,7 @@ package net.mcreator.target.entity; import net.mcreator.target.init.TargetModItems; +import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -51,7 +52,10 @@ public class DroneEntity extends PathfinderMob implements GeoEntity { private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); private boolean swinging; private boolean lastloop; + private boolean linked = false; private long lastSwing; + + public String animationprocedure = "empty"; public DroneEntity(PlayMessages.SpawnEntity packet, Level world) { @@ -61,7 +65,7 @@ public class DroneEntity extends PathfinderMob implements GeoEntity { public DroneEntity(EntityType type, Level world) { super(type, world); xpReward = 0; - setNoAi(true); + setNoAi(false); setPersistenceRequired(); this.moveControl = new FlyingMoveControl(this, 10, true); } @@ -125,11 +129,41 @@ public class DroneEntity extends PathfinderMob implements GeoEntity { ItemStack stack = sourceentity.getMainHandItem(); if (stack.getItem() == TargetModItems.MONITOR.get()) { - stack.getOrCreateTag().putString("link", this.getStringUUID()); - Monitor.link(stack,true); - sourceentity.displayClientMessage(Component.literal("LINKED!"), true); - if (sourceentity instanceof ServerPlayer serverPlayer) { - serverPlayer.level().playSound(null, serverPlayer.getOnPos(), Objects.requireNonNull(ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.arrow.hit_player"))), SoundSource.PLAYERS, 0.5F, 1); + if (!sourceentity.isCrouching()) { + if (!linked) { + + if (stack.getOrCreateTag().getBoolean("linked")) { + sourceentity.displayClientMessage(Component.translatable("des.target.monitor.monitor_already_linked").withStyle(ChatFormatting.RED), true); + return InteractionResult.sidedSuccess(this.level().isClientSide()); + } + + stack.getOrCreateTag().putString("link", this.getStringUUID()); + this.getPersistentData().putString("controller", sourceentity.getStringUUID()); + linked = true; + Monitor.link(stack,true); + sourceentity.displayClientMessage(Component.translatable("des.target.monitor.linked").withStyle(ChatFormatting.GREEN), true); + if (sourceentity instanceof ServerPlayer serverPlayer) { + serverPlayer.level().playSound(null, serverPlayer.getOnPos(), Objects.requireNonNull(ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.arrow.hit_player"))), SoundSource.PLAYERS, 0.5F, 1); + } + } else { + sourceentity.displayClientMessage(Component.translatable("des.target.monitor.already_linked").withStyle(ChatFormatting.RED), true); + } + } else { + if (linked) { + if (!stack.getOrCreateTag().getString("link").equals(this.getStringUUID())) { + sourceentity.displayClientMessage(Component.translatable("des.target.monitor.already_linked").withStyle(ChatFormatting.RED), true); + return InteractionResult.sidedSuccess(this.level().isClientSide()); + } + + stack.getOrCreateTag().putString("link", "none"); + this.getPersistentData().putString("controller", "none"); + linked = false; + Monitor.link(stack,false); + sourceentity.displayClientMessage(Component.translatable("des.target.monitor.unlinked").withStyle(ChatFormatting.RED), true); + if (sourceentity instanceof ServerPlayer serverPlayer) { + serverPlayer.level().playSound(null, serverPlayer.getOnPos(), Objects.requireNonNull(ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.arrow.hit_player"))), SoundSource.PLAYERS, 0.5F, 1); + } + } } } @@ -174,7 +208,7 @@ public class DroneEntity extends PathfinderMob implements GeoEntity { private PlayState movementPredicate(AnimationState event) { if (this.animationprocedure.equals("empty")) { - if (!this.onGround()) { + if (linked) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.drone.fly")); } return event.setAndContinue(RawAnimation.begin().thenLoop("animation.drone.idle")); diff --git a/src/main/java/net/mcreator/target/init/PropertyRegistry.java b/src/main/java/net/mcreator/target/init/PropertyRegistry.java new file mode 100644 index 000000000..bc444b0b8 --- /dev/null +++ b/src/main/java/net/mcreator/target/init/PropertyRegistry.java @@ -0,0 +1,18 @@ +package net.mcreator.target.init; + +import net.minecraft.client.renderer.item.ItemProperties; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.mcreator.target.tools.ItemNBTTool; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) +public class PropertyRegistry { + @SubscribeEvent + public static void propertyOverrideRegistry(FMLClientSetupEvent event) { + event.enqueueWork(() -> ItemProperties.register(TargetModItems.MONITOR.get(), new ResourceLocation("target", "monitor_linked"), + (itemStack, clientWorld, livingEntity, seed) -> ItemNBTTool.getBoolean(itemStack, "linked", false) ? 1.0F : 0.0F)); + } +} \ No newline at end of file diff --git a/src/main/java/net/mcreator/target/init/TargetModEntities.java b/src/main/java/net/mcreator/target/init/TargetModEntities.java index b6ec62eae..22af698df 100644 --- a/src/main/java/net/mcreator/target/init/TargetModEntities.java +++ b/src/main/java/net/mcreator/target/init/TargetModEntities.java @@ -70,6 +70,6 @@ public class TargetModEntities { event.put(CLAYMORE.get(), ClaymoreEntity.createAttributes().build()); event.put(TARGET.get(), TargetEntity.createAttributes().build()); event.put(MK_42.get(), Mk42Entity.createAttributes().build()); - event.put(DRONE.get(), Mk42Entity.createAttributes().build()); + event.put(DRONE.get(), DroneEntity.createAttributes().build()); } } diff --git a/src/main/java/net/mcreator/target/item/Monitor.java b/src/main/java/net/mcreator/target/item/Monitor.java index 290f930ea..ae64e40fe 100644 --- a/src/main/java/net/mcreator/target/item/Monitor.java +++ b/src/main/java/net/mcreator/target/item/Monitor.java @@ -1,7 +1,10 @@ package net.mcreator.target.item; import net.mcreator.target.tools.ItemNBTTool; +import net.mcreator.target.tools.TooltipTool; +import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; @@ -14,16 +17,15 @@ public class Monitor extends Item { public Monitor() { super(new Properties().stacksTo(1).rarity(Rarity.COMMON)); } - public static final String NBT_LINKED = "LINKED"; + public static final String LINKED = "linked"; public static void link(ItemStack itemstack, Boolean link) { - if (link) { - ItemNBTTool.setBoolean(itemstack, NBT_LINKED, true); - } + ItemNBTTool.setBoolean(itemstack, LINKED, link); } @Override - public void appendHoverText(ItemStack itemstack, Level world, List list, TooltipFlag flag) { - super.appendHoverText(itemstack, world, list, flag); + public void appendHoverText(ItemStack stack, Level world, List list, TooltipFlag flag) { + Player player = Minecraft.getInstance().player; + TooltipTool.addMonitorTips(list, stack, player); } } diff --git a/src/main/java/net/mcreator/target/tools/TooltipTool.java b/src/main/java/net/mcreator/target/tools/TooltipTool.java index 3123f93a3..f960a5f30 100644 --- a/src/main/java/net/mcreator/target/tools/TooltipTool.java +++ b/src/main/java/net/mcreator/target/tools/TooltipTool.java @@ -3,6 +3,7 @@ package net.mcreator.target.tools; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.capabilities.ForgeCapabilities; @@ -114,4 +115,11 @@ public class TooltipTool { e -> tooltip.add(Component.literal(e.getEnergyStored() + " / " + e.getMaxEnergyStored() + " FE").withStyle(ChatFormatting.GRAY)) ); } + + public static void addMonitorTips(List tooltip, ItemStack stack, Player player) { + tooltip.add(Component.literal("")); + + + tooltip.add(Component.literal(player.position().distanceTo(e) + " M").withStyle(ChatFormatting.GRAY)); + } } diff --git a/src/main/resources/assets/target/lang/en_us.json b/src/main/resources/assets/target/lang/en_us.json index 99a44c725..d23cce694 100644 --- a/src/main/resources/assets/target/lang/en_us.json +++ b/src/main/resources/assets/target/lang/en_us.json @@ -126,6 +126,7 @@ "curios.identifier.dog_tag": "Dog Tag", "item.target.shield_cell": "Cell", "item.target.mk42_spawn_egg": "MK-42 Spawn Egg", + "item.target.monitor": "Monitor", "attribute.target.spread": "Spread", @@ -194,6 +195,7 @@ "entity.target.claymore": "Claymore", "entity.target.senpai": "Senpai", "entity.target.mk_42": "5''/54 Mk42", + "entity.target.drone": "Drone", "key.categories.target": "TARGET", "key.target.reload": "Reload", @@ -230,5 +232,10 @@ "commands.ammo.set": "Set %s ammo to %s for %s players", "commands.ammo.add": "Added %s ammo of amount %s for %s players", "commands.pvp_mode.on": "Enabled PVP Mode", - "commands.pvp_mode.off": "Disabled PVP Mode" + "commands.pvp_mode.off": "Disabled PVP Mode", + + "des.target.monitor.linked": "Connect!", + "des.target.monitor.monitor_already_linked": "This monitor has been connected!", + "des.target.monitor.already_linked": "This device has been connected!", + "des.target.monitor.unlinked": "Disconnect!" } \ No newline at end of file diff --git a/src/main/resources/assets/target/lang/zh_cn.json b/src/main/resources/assets/target/lang/zh_cn.json index e526f41fd..e6e52596a 100644 --- a/src/main/resources/assets/target/lang/zh_cn.json +++ b/src/main/resources/assets/target/lang/zh_cn.json @@ -126,6 +126,7 @@ "curios.identifier.dog_tag": "狗牌", "item.target.shield_cell": "电池", "item.target.mk42_spawn_egg": "MK-42刷怪蛋", + "item.target.monitor": "遥控器", "attribute.target.spread": "散布", @@ -194,6 +195,7 @@ "entity.target.claymore": "阔剑地雷", "entity.target.senpai": "野兽先辈", "entity.target.mk_42": "5''/54 Mk42", + "entity.target.drone": "无人机", "key.categories.target": "TARGET", "key.target.reload": "装填子弹", @@ -230,5 +232,10 @@ "commands.ammo.set": "为%3$s位玩家的%1$s弹药数量设置为%2$s", "commands.ammo.add": "为%3$s位玩家添加了%2$s发%1$s弹药", "commands.pvp_mode.on": "已启用PVP模式", - "commands.pvp_mode.off": "已禁用PVP模式" + "commands.pvp_mode.off": "已禁用PVP模式", + + "des.target.monitor.linked": "连接成功!", + "des.target.monitor.monitor_already_linked": "这个遥控器已连接到一个设备!", + "des.target.monitor.already_linked": "这个设备已被连接!", + "des.target.monitor.unlinked": "断开连接!" } \ No newline at end of file diff --git a/src/main/resources/data/target/recipes/monitor_clear.json b/src/main/resources/data/target/recipes/monitor_clear.json new file mode 100644 index 000000000..e83fc48c5 --- /dev/null +++ b/src/main/resources/data/target/recipes/monitor_clear.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "target:monitor" + } + ], + "result": { + "item": "target:monitor", + "count": 1 + } +} \ No newline at end of file