修复无人机视角重置问题

This commit is contained in:
17146 2025-01-23 17:07:17 +08:00
parent 48439a2d6c
commit 076255440d
9 changed files with 74 additions and 26 deletions

View file

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

View file

@ -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,17 +552,8 @@ 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));

View file

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

View file

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

View file

@ -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<NetworkEvent.Context> 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));
}
}
}

View file

@ -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<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT,
() -> () -> ClientPacketHandler.handleResetCameraType(ctx)));
ctx.get().setPacketHandled(true);
}
}

View file

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

View file

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

View file

@ -18,7 +18,7 @@
}
},
"result": {
"item": "superbwarfare:c4_mine",
"item": "superbwarfare:c4_bomb",
"count": 1
}
}