diff --git a/src/main/java/net/mcreator/target/client/ClickHandler.java b/src/main/java/net/mcreator/target/client/ClickHandler.java index 5b8ebae8d..a456bf25c 100644 --- a/src/main/java/net/mcreator/target/client/ClickHandler.java +++ b/src/main/java/net/mcreator/target/client/ClickHandler.java @@ -2,15 +2,31 @@ package net.mcreator.target.client; import com.mojang.blaze3d.platform.InputConstants; import net.mcreator.target.TargetMod; +import net.mcreator.target.init.TargetModKeyMappings; import net.mcreator.target.init.TargetModMobEffects; import net.mcreator.target.init.TargetModTags; +import net.mcreator.target.item.gun.GunItem; +import net.mcreator.target.network.TargetModVariables; import net.mcreator.target.network.message.FireMessage; import net.mcreator.target.network.message.SensitivityMessage; +import net.mcreator.target.network.message.ZoomMessage; +import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.client.settings.KeyConflictContext; +import net.minecraftforge.client.settings.KeyModifier; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import org.lwjgl.glfw.GLFW; @@ -27,7 +43,7 @@ public class ClickHandler { } @SubscribeEvent - public static void onKeyReleased(InputEvent.MouseButton.Pre event) { + public static void onButtonReleased(InputEvent.MouseButton.Pre event) { if (notInGame()) return; if (event.getAction() != InputConstants.RELEASE) return; @@ -38,10 +54,18 @@ public class ClickHandler { if (button == GLFW.GLFW_MOUSE_BUTTON_LEFT) { TargetMod.PACKET_HANDLER.sendToServer(new FireMessage(1)); } + if (button == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { + if (Minecraft.getInstance().player.hasEffect(TargetModMobEffects.SHOCK.get())) { + event.setCanceled(true); + } + if (player.getMainHandItem().is(TargetModTags.Items.GUN)) { + TargetMod.PACKET_HANDLER.sendToServer(new ZoomMessage(1)); + } + } } @SubscribeEvent - public static void onKeyPressed(InputEvent.MouseButton.Pre event) { + public static void onButtonPressed(InputEvent.MouseButton.Pre event) { if (notInGame()) return; if (event.getAction() != InputConstants.PRESS) return; @@ -65,6 +89,12 @@ public class ClickHandler { if (Minecraft.getInstance().player.hasEffect(TargetModMobEffects.SHOCK.get())) { event.setCanceled(true); } + if (player.getMainHandItem().is(TargetModTags.Items.GUN)) { + if (!TargetModKeyMappings.INTERACT.isDown()) { + event.setCanceled(true); + } + TargetMod.PACKET_HANDLER.sendToServer(new ZoomMessage(0)); + } } if (button == GLFW.GLFW_MOUSE_BUTTON_MIDDLE) { @@ -100,25 +130,10 @@ public class ClickHandler { } @SubscribeEvent - public static void onSensitivityKeyPressed(InputEvent.Key event) { - Player player = Minecraft.getInstance().player; - if (player == null) return; - - ItemStack stack = player.getMainHandItem(); - int button = event.getKey(); - + public static void onKeyPressed(InputEvent.Key event) { if (notInGame()) return; if (event.getAction() != InputConstants.PRESS) return; setKeyState(event.getKey(), 1); - - if (stack.is(TargetModTags.Items.GUN)){ - if (button == GLFW.GLFW_KEY_PAGE_UP) { - TargetMod.PACKET_HANDLER.sendToServer(new SensitivityMessage(true)); - } - if (button == GLFW.GLFW_KEY_PAGE_DOWN) { - TargetMod.PACKET_HANDLER.sendToServer(new SensitivityMessage(false)); - } - } } @SubscribeEvent diff --git a/src/main/java/net/mcreator/target/event/ClientEventHandler.java b/src/main/java/net/mcreator/target/event/ClientEventHandler.java index 3409517f5..cfbb895f3 100644 --- a/src/main/java/net/mcreator/target/event/ClientEventHandler.java +++ b/src/main/java/net/mcreator/target/event/ClientEventHandler.java @@ -9,7 +9,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/net/mcreator/target/event/PlayerEventHandler.java b/src/main/java/net/mcreator/target/event/PlayerEventHandler.java index 7d85271ba..af834f680 100644 --- a/src/main/java/net/mcreator/target/event/PlayerEventHandler.java +++ b/src/main/java/net/mcreator/target/event/PlayerEventHandler.java @@ -6,6 +6,7 @@ import net.mcreator.target.init.TargetModSounds; import net.mcreator.target.init.TargetModTags; import net.mcreator.target.network.TargetModVariables; import net.mcreator.target.tools.SoundTool; +import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -25,6 +26,14 @@ import net.minecraftforge.fml.common.Mod; @Mod.EventBusSubscriber public class PlayerEventHandler { + private static boolean notInGame() { + Minecraft mc = Minecraft.getInstance(); + if (mc.player == null) return true; + if (mc.getOverlay() != null) return true; + if (mc.screen != null) return true; + if (!mc.mouseHandler.isMouseGrabbed()) return true; + return !mc.isWindowActive(); + } @SubscribeEvent public static void onPlayerRespawned(PlayerEvent.PlayerRespawnEvent event) { @@ -54,6 +63,7 @@ public class PlayerEventHandler { } if (event.phase == TickEvent.Phase.END) { + handlePlayerCancelZoom(player); handlePlayerProne(player); handlePlayerSprint(player); handleWeaponLevel(player); @@ -68,6 +78,22 @@ public class PlayerEventHandler { } } + /** + * 玩家不在游戏内时取消瞄准 + */ + private static void handlePlayerCancelZoom(Player player) { + if (notInGame()) { + player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.zoom = false; + capability.syncPlayerVariables(player); + }); + player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.zooming = false; + capability.syncPlayerVariables(player); + }); + player.getPersistentData().putDouble("zoom_animation_time", 0); + } + } /** * 判断玩家是否趴下 diff --git a/src/main/java/net/mcreator/target/init/TargetModKeyMappings.java b/src/main/java/net/mcreator/target/init/TargetModKeyMappings.java index af68baaa3..ba8681fdb 100644 --- a/src/main/java/net/mcreator/target/init/TargetModKeyMappings.java +++ b/src/main/java/net/mcreator/target/init/TargetModKeyMappings.java @@ -1,13 +1,17 @@ package net.mcreator.target.init; -import com.mojang.blaze3d.platform.InputConstants; import net.mcreator.target.TargetMod; import net.mcreator.target.network.message.DoubleJumpMessage; import net.mcreator.target.network.message.FireModeMessage; import net.mcreator.target.network.message.ReloadMessage; -import net.mcreator.target.network.message.ZoomMessage; +import net.mcreator.target.network.message.SensitivityMessage; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; +import net.minecraft.client.player.Input; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RegisterKeyMappingsEvent; import net.minecraftforge.event.TickEvent; @@ -61,33 +65,52 @@ public class TargetModKeyMappings { } }; - public static final KeyMapping ZOOM = new KeyMapping("key.target.zoom", InputConstants.Type.MOUSE, GLFW.GLFW_MOUSE_BUTTON_RIGHT, "key.categories.target") { + public static final KeyMapping SENSITIVITY_INCREASE = new KeyMapping("key.target.sensitivity_increase", GLFW.GLFW_KEY_PAGE_UP, "key.categories.target") { private boolean isDownOld = false; @Override public void setDown(boolean isDown) { super.setDown(isDown); - if (isDownOld != isDown && isDown && Minecraft.getInstance().player != null) { - TargetMod.PACKET_HANDLER.sendToServer(new ZoomMessage(0, 0)); - ZoomMessage.pressAction(Minecraft.getInstance().player, 0); - ZOOM_LAST_PRESS = System.currentTimeMillis(); - } else if (isDownOld != isDown && Minecraft.getInstance().player != null) { - int dt = (int) (System.currentTimeMillis() - ZOOM_LAST_PRESS); - TargetMod.PACKET_HANDLER.sendToServer(new ZoomMessage(1, dt)); - ZoomMessage.pressAction(Minecraft.getInstance().player, 1); + if (isDownOld != isDown && isDown) { + TargetMod.PACKET_HANDLER.sendToServer(new SensitivityMessage(true)); } isDownOld = isDown; } }; - private static long ZOOM_LAST_PRESS = 0; + public static final KeyMapping SENSITIVITY_REDUCE = new KeyMapping("key.target.sensitivity_reduce", GLFW.GLFW_KEY_PAGE_DOWN, "key.categories.target") { + private boolean isDownOld = false; + + @Override + public void setDown(boolean isDown) { + super.setDown(isDown); + if (isDownOld != isDown && isDown) { + TargetMod.PACKET_HANDLER.sendToServer(new SensitivityMessage(false)); + } + isDownOld = isDown; + } + }; + + public static final KeyMapping INTERACT = new KeyMapping("key.target.interact", GLFW.GLFW_KEY_X, "key.categories.target") { + private boolean isDownOld = false; + + @Override + public void setDown(boolean isDown) { + super.setDown(isDown); + if (isDownOld != isDown && isDown) { + } + isDownOld = isDown; + } + }; @SubscribeEvent public static void registerKeyMappings(RegisterKeyMappingsEvent event) { event.register(RELOAD); event.register(DOUBLE_JUMP); event.register(FIRE_MODE); - event.register(ZOOM); + event.register(SENSITIVITY_INCREASE); + event.register(SENSITIVITY_REDUCE); + event.register(INTERACT); } @Mod.EventBusSubscriber({Dist.CLIENT}) @@ -98,7 +121,9 @@ public class TargetModKeyMappings { RELOAD.consumeClick(); DOUBLE_JUMP.consumeClick(); FIRE_MODE.consumeClick(); - ZOOM.consumeClick(); + SENSITIVITY_INCREASE.consumeClick(); + SENSITIVITY_REDUCE.consumeClick(); + INTERACT.consumeClick(); } } } diff --git a/src/main/java/net/mcreator/target/network/message/ZoomMessage.java b/src/main/java/net/mcreator/target/network/message/ZoomMessage.java index 4049ccaca..46fb757a5 100644 --- a/src/main/java/net/mcreator/target/network/message/ZoomMessage.java +++ b/src/main/java/net/mcreator/target/network/message/ZoomMessage.java @@ -10,21 +10,17 @@ import java.util.function.Supplier; public class ZoomMessage { private final int type; - private final int pressedMs; - public ZoomMessage(int type, int pressedMs) { + public ZoomMessage(int type) { this.type = type; - this.pressedMs = pressedMs; } public ZoomMessage(FriendlyByteBuf buffer) { this.type = buffer.readInt(); - this.pressedMs = buffer.readInt(); } public static void buffer(ZoomMessage message, FriendlyByteBuf buffer) { buffer.writeInt(message.type); - buffer.writeInt(message.pressedMs); } public static void handler(ZoomMessage message, Supplier contextSupplier) { diff --git a/src/main/resources/assets/target/lang/en_us.json b/src/main/resources/assets/target/lang/en_us.json index 7d5aab82e..39976244b 100644 --- a/src/main/resources/assets/target/lang/en_us.json +++ b/src/main/resources/assets/target/lang/en_us.json @@ -190,7 +190,9 @@ "key.target.reload": "Reload", "key.target.double_jump": "Double Jump", "key.target.fire_mode": "Fire Mode", - "key.target.zoom": "Zoom", + "key.target.sensitivity_increase": "Increase Sensitivity", + "key.target.sensitivity_reduce": "Reduce Sensitivity", + "key.target.interact": "Can RightClick Interact While Hold", "effect.target.shock": "Shock", "item.minecraft.potion.effect.target_shock": "Potion of Shock", diff --git a/src/main/resources/assets/target/lang/zh_cn.json b/src/main/resources/assets/target/lang/zh_cn.json index ca995e621..1dc34bbd5 100644 --- a/src/main/resources/assets/target/lang/zh_cn.json +++ b/src/main/resources/assets/target/lang/zh_cn.json @@ -190,7 +190,9 @@ "key.target.reload": "装填子弹", "key.target.double_jump": "二段跳", "key.target.fire_mode": "开火模式", - "key.target.zoom": "缩放", + "key.target.sensitivity_increase": "增加灵敏度", + "key.target.sensitivity_reduce": "减少灵敏度", + "key.target.interact": "持枪时按住后可右键交互", "effect.target.shock": "电击", "item.minecraft.potion.effect.target_shock": "电击药水",