diff --git a/src/main/java/com/atsuishio/superbwarfare/ModUtils.java b/src/main/java/com/atsuishio/superbwarfare/ModUtils.java index d695d3b95..f85d93000 100644 --- a/src/main/java/com/atsuishio/superbwarfare/ModUtils.java +++ b/src/main/java/com/atsuishio/superbwarfare/ModUtils.java @@ -168,6 +168,7 @@ public class ModUtils { addNetworkMessage(AimVillagerMessage.class, AimVillagerMessage::encode, AimVillagerMessage::decode, AimVillagerMessage::handler); addNetworkMessage(ShowChargingRangeMessage.class, ShowChargingRangeMessage::encode, ShowChargingRangeMessage::decode, ShowChargingRangeMessage::handler); addNetworkMessage(MeleeAttackMessage.class, MeleeAttackMessage::encode, MeleeAttackMessage::decode, MeleeAttackMessage::handler); + addNetworkMessage(ResetCameraTypeMessage.class, ResetCameraTypeMessage::encode, ResetCameraTypeMessage::decode, ResetCameraTypeMessage::handler, Optional.of(NetworkDirection.PLAY_TO_CLIENT)); event.enqueueWork(() -> BrewingRecipeRegistry.addRecipe(Ingredient.of(PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)), Ingredient.of(Items.LIGHTNING_ROD), PotionUtils.setPotion(new ItemStack(Items.POTION), ModPotion.SHOCK.get()))); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/DroneEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/DroneEntity.java index f68271eb9..57cac6476 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/DroneEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/DroneEntity.java @@ -530,12 +530,18 @@ public class DroneEntity extends MobileVehicleEntity implements GeoEntity { }); } + Player controller = EntityFindUtil.findPlayer(this.level(), this.entityData.get(CONTROLLER)); + if (controller != null) { + if (controller.getMainHandItem().is(ModItems.MONITOR.get())) { + Monitor.disLink(controller.getMainHandItem(), controller); + } + } + if (this.entityData.get(KAMIKAZE_MODE) != 0) { kamikazeExplosion(this.entityData.get(KAMIKAZE_MODE)); } ItemStack stack = new ItemStack(ModItems.RGO_GRENADE.get(), this.entityData.get(AMMO)); - if (this.level() instanceof ServerLevel level) { ItemEntity itemEntity = new ItemEntity(level, this.getX(), this.getY(), this.getZ(), stack); itemEntity.setPickUpDelay(10); @@ -546,18 +552,9 @@ public class DroneEntity extends MobileVehicleEntity implements GeoEntity { level().explode(null, this.getX(), this.getY(), this.getZ(), 0, Level.ExplosionInteraction.NONE); } - Player controller = EntityFindUtil.findPlayer(this.level(), this.entityData.get(CONTROLLER)); - if (controller != null) { - if (controller.getMainHandItem().is(ModItems.MONITOR.get())) { - Monitor.disLink(controller.getMainHandItem(), controller); - this.discard(); - } - } - this.discard(); } - private void kamikazeExplosion(int mode) { Entity attacker = EntityFindUtil.findEntity(this.level(), this.entityData.get(LAST_ATTACKER_UUID)); CustomExplosion explosion = switch (mode) { diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 9173cc8c1..75d0b0311 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -153,6 +153,8 @@ public class ClientEventHandler { public static int dismountCountdown = 0; public static int aimVillagerCountdown = 0; + public static CameraType lastCameraType; + @SubscribeEvent public static void handleWeaponTurn(RenderHandEvent event) { LocalPlayer player = Minecraft.getInstance().player; diff --git a/src/main/java/com/atsuishio/superbwarfare/item/Monitor.java b/src/main/java/com/atsuishio/superbwarfare/item/Monitor.java index fbeaa6646..fbcd73ddb 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/Monitor.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/Monitor.java @@ -1,6 +1,9 @@ package com.atsuishio.superbwarfare.item; +import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.entity.DroneEntity; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.network.message.ResetCameraTypeMessage; import com.atsuishio.superbwarfare.tools.EntityFindUtil; import com.atsuishio.superbwarfare.tools.ItemNBTTool; import com.google.common.collect.ImmutableMultimap; @@ -9,6 +12,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.Entity; @@ -24,12 +28,13 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.network.PacketDistributor; import java.text.DecimalFormat; import java.util.List; public class Monitor extends Item { - private static CameraType lastCameraType; + public static final String LINKED = "Linked"; public static final String LINKED_DRONE = "LinkedDrone"; @@ -45,10 +50,8 @@ public class Monitor extends Item { public static void disLink(ItemStack itemstack, Player player) { ItemNBTTool.setBoolean(itemstack, LINKED, false); itemstack.getOrCreateTag().putString(LINKED_DRONE, "none"); - if (player.level().isClientSide) { - if (lastCameraType != null) { - Minecraft.getInstance().options.setCameraType(lastCameraType); - } + if (player instanceof ServerPlayer serverPlayer) { + ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ResetCameraTypeMessage(0)); } } @@ -74,14 +77,14 @@ public class Monitor extends Item { if (stack.getOrCreateTag().getBoolean("Using")) { stack.getOrCreateTag().putBoolean("Using", false); if (world.isClientSide) { - if (lastCameraType != null) { - Minecraft.getInstance().options.setCameraType(lastCameraType); + if (ClientEventHandler.lastCameraType != null) { + Minecraft.getInstance().options.setCameraType(ClientEventHandler.lastCameraType); } } } else { stack.getOrCreateTag().putBoolean("Using", true); if (world.isClientSide) { - lastCameraType = Minecraft.getInstance().options.getCameraType(); + ClientEventHandler.lastCameraType = Minecraft.getInstance().options.getCameraType(); Minecraft.getInstance().options.setCameraType(CameraType.THIRD_PERSON_BACK); } } @@ -121,7 +124,7 @@ public class Monitor extends Item { Vec3 droneVec = new Vec3(stack.getOrCreateTag().getDouble("PosX"), stack.getOrCreateTag().getDouble("PosY"), stack.getOrCreateTag().getDouble("PosZ")); - list.add(Component.translatable("des.superbwarfare.monitor",new DecimalFormat("##.#").format(player.position().distanceTo(droneVec)) + "m").withStyle(ChatFormatting.GRAY)); + list.add(Component.translatable("des.superbwarfare.monitor", new DecimalFormat("##.#").format(player.position().distanceTo(droneVec)) + "m").withStyle(ChatFormatting.GRAY)); list.add(Component.literal("X: " + new DecimalFormat("##.#").format(droneVec.x) + " Y: " + new DecimalFormat("##.#").format(droneVec.y) + " Z: " + new DecimalFormat("##.#").format(droneVec.z) @@ -142,8 +145,8 @@ public class Monitor extends Item { if (itemstack.getOrCreateTag().getBoolean("Using")) { itemstack.getOrCreateTag().putBoolean("Using", false); if (entity.level().isClientSide) { - if (lastCameraType != null) { - Minecraft.getInstance().options.setCameraType(lastCameraType); + if (ClientEventHandler.lastCameraType != null) { + Minecraft.getInstance().options.setCameraType(ClientEventHandler.lastCameraType); } } } @@ -152,8 +155,8 @@ public class Monitor extends Item { if (itemstack.getOrCreateTag().getBoolean("Using")) { itemstack.getOrCreateTag().putBoolean("Using", false); if (entity.level().isClientSide) { - if (lastCameraType != null) { - Minecraft.getInstance().options.setCameraType(lastCameraType); + if (ClientEventHandler.lastCameraType != null) { + Minecraft.getInstance().options.setCameraType(ClientEventHandler.lastCameraType); } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/network/ClientPacketHandler.java b/src/main/java/com/atsuishio/superbwarfare/network/ClientPacketHandler.java index f132599bc..04a803ba7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/ClientPacketHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/ClientPacketHandler.java @@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; import com.atsuishio.superbwarfare.client.overlay.DroneUIOverlay; import com.atsuishio.superbwarfare.client.screens.FuMO25ScreenHelper; import com.atsuishio.superbwarfare.config.client.KillMessageConfig; +import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.event.KillMessageHandler; import com.atsuishio.superbwarfare.menu.EnergyMenu; import com.atsuishio.superbwarfare.network.message.ClientIndicatorMessage; @@ -12,6 +13,7 @@ import com.atsuishio.superbwarfare.network.message.GunsDataMessage; import com.atsuishio.superbwarfare.network.message.RadarMenuOpenMessage; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.PlayerKillRecord; +import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceKey; import net.minecraft.world.damagesource.DamageType; @@ -21,6 +23,7 @@ import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.network.NetworkEvent; import java.util.List; +import java.util.Objects; import java.util.function.Supplier; public class ClientPacketHandler { @@ -74,4 +77,14 @@ public class ClientPacketHandler { FuMO25ScreenHelper.resetEntities(); FuMO25ScreenHelper.pos = null; } + + public static void handleResetCameraType(Supplier ctx) { + if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { + Minecraft minecraft = Minecraft.getInstance(); + Player player = minecraft.player; + if (player == null) return; + + Minecraft.getInstance().options.setCameraType(Objects.requireNonNullElse(ClientEventHandler.lastCameraType, CameraType.FIRST_PERSON)); + } + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/ResetCameraTypeMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/ResetCameraTypeMessage.java new file mode 100644 index 000000000..1115100f0 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/ResetCameraTypeMessage.java @@ -0,0 +1,32 @@ +package com.atsuishio.superbwarfare.network.message; + +import com.atsuishio.superbwarfare.network.ClientPacketHandler; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class ResetCameraTypeMessage { + + private final int type; + + public ResetCameraTypeMessage(int type) { + this.type = type; + } + + public static void encode(ResetCameraTypeMessage message, FriendlyByteBuf buffer) { + buffer.writeInt(message.type); + } + + public static ResetCameraTypeMessage decode(FriendlyByteBuf buffer) { + return new ResetCameraTypeMessage(buffer.readInt()); + } + + public static void handler(ResetCameraTypeMessage message, Supplier ctx) { + ctx.get().enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, + () -> () -> ClientPacketHandler.handleResetCameraType(ctx))); + ctx.get().setPacketHandled(true); + } +} diff --git a/src/main/resources/assets/superbwarfare/lang/en_us.json b/src/main/resources/assets/superbwarfare/lang/en_us.json index c87a9fb2d..dfcf46b34 100644 --- a/src/main/resources/assets/superbwarfare/lang/en_us.json +++ b/src/main/resources/assets/superbwarfare/lang/en_us.json @@ -387,7 +387,7 @@ "entity.superbwarfare.mortar": "Mortar", "entity.superbwarfare.target": "Target", "entity.superbwarfare.claymore": "Claymore", - "entity.superbwarfare.explosive": "C4", + "entity.superbwarfare.c4": "C4", "entity.superbwarfare.senpai": "Senpai", "entity.superbwarfare.mk_42": "5''/54 Mk42", "entity.superbwarfare.mle_1934": "138.6mm50 Mle1934 R1938", diff --git a/src/main/resources/assets/superbwarfare/lang/zh_cn.json b/src/main/resources/assets/superbwarfare/lang/zh_cn.json index 903487ce2..58c6d2d55 100644 --- a/src/main/resources/assets/superbwarfare/lang/zh_cn.json +++ b/src/main/resources/assets/superbwarfare/lang/zh_cn.json @@ -385,7 +385,7 @@ "entity.superbwarfare.mortar": "迫击炮", "entity.superbwarfare.target": "标靶", "entity.superbwarfare.claymore": "阔剑地雷", - "entity.superbwarfare.explosive": "C4", + "entity.superbwarfare.c4": "C4", "entity.superbwarfare.senpai": "野兽先辈", "entity.superbwarfare.mk_42": "5''/54 Mk42", "entity.superbwarfare.mle_1934": "138.6mm50 Mle1934 R1938", diff --git a/src/main/resources/data/superbwarfare/recipes/c4_crafting.json b/src/main/resources/data/superbwarfare/recipes/c4_crafting.json index 1dad23d28..7c7309d66 100644 --- a/src/main/resources/data/superbwarfare/recipes/c4_crafting.json +++ b/src/main/resources/data/superbwarfare/recipes/c4_crafting.json @@ -18,7 +18,7 @@ } }, "result": { - "item": "superbwarfare:c4_mine", + "item": "superbwarfare:c4_bomb", "count": 1 } } \ No newline at end of file