尝试修改无人机相关方法

This commit is contained in:
17146 2025-06-28 00:16:14 +08:00 committed by Light_Quanta
parent 8b6f6708c6
commit cf9917465a
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
3 changed files with 104 additions and 5 deletions

View file

@ -0,0 +1,70 @@
package com.atsuishio.superbwarfare.event;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModKeyMappings;
import com.atsuishio.superbwarfare.item.Monitor;
import com.atsuishio.superbwarfare.tools.DronesTool;
import com.mojang.blaze3d.platform.InputConstants;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.client.event.ClientTickEvent;
import net.neoforged.neoforge.client.event.InputEvent;
import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent;
import java.util.UUID;
/**
* Code based on @Mafuyu404's <a href="https://github.com/Mafuyu404/DiligentStalker">DiligentStalker</a>
*/
//@net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = Mod.MODID, value = Dist.CLIENT)
public class DroneEventHandler {
@SubscribeEvent
public static void onClientTick(ClientTickEvent.Post event) {
if (Minecraft.getInstance().screen != null) return;
var player = Minecraft.getInstance().player;
UUID entityUUID = Monitor.getDroneUUID(player);
if (entityUUID != null) {
ClientLevel level = player.clientLevel;
level.entitiesForRendering().forEach(entity -> {
if (entity.getUUID().equals(entityUUID)) {
DronesTool.connect(player, entity);
}
});
}
if (!DronesTool.hasInstanceOf(player)) return;
DronesTool instance = DronesTool.getInstanceOf(player);
Entity stalker = instance.getDrone();
// TODO 调整角度
}
@SubscribeEvent
public static void onInteract(PlayerInteractEvent.EntityInteract event) {
if (event.getSide().isClient()) {
var player = event.getEntity();
if (player.isShiftKeyDown()) return;
if (event.getItemStack().is(ModItems.MONITOR.get())) {
DronesTool.connect(player, event.getTarget());
event.setCanceled(true);
}
}
}
@SubscribeEvent
public static void onInputKey(InputEvent.Key event) {
if (Minecraft.getInstance().screen != null) return;
Player player = Minecraft.getInstance().player;
if (!DronesTool.hasInstanceOf(player)) return;
if (event.getAction() == InputConstants.PRESS) {
if (event.getKey() == ModKeyMappings.DISMOUNT.getKey().getValue()) {
if (DronesTool.hasInstanceOf(player)) {
DronesTool.getInstanceOf(player).disconnect();
}
}
}
}
}

View file

@ -2,6 +2,7 @@ package com.atsuishio.superbwarfare.item;
import com.atsuishio.superbwarfare.entity.vehicle.DroneEntity;
import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.network.message.receive.ResetCameraTypeMessage;
import com.atsuishio.superbwarfare.tools.EntityFindUtil;
import com.atsuishio.superbwarfare.tools.FormatTool;
@ -29,15 +30,18 @@ import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;
import net.neoforged.neoforge.network.PacketDistributor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class Monitor extends Item {
public static final String LINKED = "Linked";
public static final String LINKED_DRONE = "LinkedDrone";
public static final String DRONE_UUID = "DroneUUID";
public Monitor() {
super(new Properties().stacksTo(1));
@ -69,24 +73,24 @@ public class Monitor extends Item {
@Override
@ParametersAreNonnullByDefault
public @NotNull InteractionResultHolder<ItemStack> use(Level world, Player player, InteractionHand hand) {
public @NotNull InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand hand) {
ItemStack stack = player.getMainHandItem();
var tag = NBTTool.getTag(stack);
if (!tag.getBoolean(LINKED)) {
return super.use(world, player, hand);
return super.use(level, player, hand);
}
if (tag.getBoolean("Using")) {
tag.putBoolean("Using", false);
if (world.isClientSide) {
if (level.isClientSide) {
if (ClientEventHandler.lastCameraType != null) {
Minecraft.getInstance().options.setCameraType(ClientEventHandler.lastCameraType);
}
}
} else {
tag.putBoolean("Using", true);
if (world.isClientSide) {
if (level.isClientSide) {
ClientEventHandler.lastCameraType = Minecraft.getInstance().options.getCameraType();
Minecraft.getInstance().options.setCameraType(CameraType.THIRD_PERSON_BACK);
}
@ -96,7 +100,15 @@ public class Monitor extends Item {
DroneEntity drone = EntityFindUtil.findDrone(player.level(), tag.getString(LINKED_DRONE));
this.resetDroneData(drone);
return super.use(world, player, hand);
return super.use(level, player, hand);
// ItemStack stack = player.getItemInHand(hand);
// if (!player.isShiftKeyDown()) {
// CompoundTag tag = stack.getOrCreateTag();
// if (DronesTool.hasInstanceOf(player)) return InteractionResultHolder.fail(stack);
// if (!tag.contains(DRONE_UUID)) return InteractionResultHolder.fail(stack);
// player.startUsingItem(hand);
// }
// return InteractionResultHolder.fail(stack);
}
@Override
@ -186,4 +198,16 @@ public class Monitor extends Item {
}
}
}
@Nullable
public static UUID getDroneUUID(Player player) {
if (player == null) return null;
if (player.getMainHandItem().is(ModItems.MONITOR.get())) {
var tag = NBTTool.getTag(player.getMainHandItem());
if (tag.contains(DRONE_UUID)) {
return tag.getUUID(DRONE_UUID);
}
}
return null;
}
}

View file

@ -1,5 +1,7 @@
package com.atsuishio.superbwarfare.tools;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
@ -44,12 +46,15 @@ public class DronesTool {
public static DronesTool connect(Player player, Entity stalker) {
if (player == null || stalker == null) return null;
// 这边可能需要修改一下逻辑不知道原代码部分是否允许1玩家对n无人机
if (hasInstanceOf(player) || hasInstanceOf(stalker)) return null;
if (player.level().isClientSide) {
// TODO 向客户端发送连接的网络包
}
player.displayClientMessage(Component.translatable("tips.superbwarfare.monitor.linked").withStyle(ChatFormatting.GREEN), true);
INSTANCE_MAP.put(player.getUUID(), stalker.getId());
DRONE_TO_PLAYER.put(stalker.getId(), player.getUUID());