diff --git a/src/main/java/net/mcreator/target/event/GunEventHandler.java b/src/main/java/net/mcreator/target/event/GunEventHandler.java new file mode 100644 index 000000000..29c395783 --- /dev/null +++ b/src/main/java/net/mcreator/target/event/GunEventHandler.java @@ -0,0 +1,139 @@ +package net.mcreator.target.event; + +import net.mcreator.target.init.TargetModAttributes; +import net.mcreator.target.init.TargetModTags; +import net.mcreator.target.procedures.BulletFireNormalProcedure; +import net.mcreator.target.tools.ItemNBTTool; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber +public class GunEventHandler { + + @SubscribeEvent + public static void onPlayerTick(TickEvent.PlayerTickEvent event) { + Player player = event.player; + + if (player == null) { + return; + } + + if (event.phase == TickEvent.Phase.END) { + handleGunsDev(player); + handleGunFire(player); + } + } + + private static void handleGunsDev(Player player) { + double[] recoilTimer = {0}; + double totalTime = 20; + int sleepTime = 2; + double recoilDuration = totalTime / sleepTime; + + Runnable recoilRunnable = () -> { + while (recoilTimer[0] < recoilDuration) { + if (player == null) { + return; + } + + ItemStack stack = player.getMainHandItem(); + + double basic = stack.getOrCreateTag().getDouble("dev"); + + double sprint = player.isSprinting() ? 0.5 * basic : 0; + double sneaking = player.isShiftKeyDown() ? (-0.25) * basic : 0; + double prone = player.getPersistentData().getDouble("prone") > 0 ? (-0.5) * basic : 0; + double jump = player.onGround() ? 0 : 1.5 * basic; + double fire = stack.getOrCreateTag().getDouble("fireanim") > 0 ? 0.5 * basic : 0; + double ride = player.isPassenger() ? (-0.5) * basic : 0; + + double walk; + if (player.getPersistentData().getDouble("qian") == 1 || player.getPersistentData().getDouble("tui") == 1 || + player.getPersistentData().getDouble("mover") == 1 || player.getPersistentData().getDouble("movel") == 1) { + walk = 0.2 * basic; + } else { + walk = 0; + } + + double zoom; + if (player.getPersistentData().getDouble("zoom_time") > 4) { + if (stack.is(TargetModTags.Items.SNIPER_RIFLE)) { + zoom = 0.0001; + } else if (stack.is(TargetModTags.Items.SHOTGUN)) { + zoom = 0.9; + } else { + zoom = 0.0001; + } + } else { + zoom = 1; + } + + double index = zoom * (basic + walk + sprint + sneaking + prone + jump + fire + ride); + + if (player.getAttributeBaseValue(TargetModAttributes.SPREAD.get()) < index) { + player.getAttribute(TargetModAttributes.SPREAD.get()) + .setBaseValue(player.getAttributeBaseValue(TargetModAttributes.SPREAD.get()) + 0.0125 * Math.pow(index - player.getAttributeBaseValue(TargetModAttributes.SPREAD.get()), 2)); + } else { + player.getAttribute(TargetModAttributes.SPREAD.get()) + .setBaseValue(player.getAttributeBaseValue(TargetModAttributes.SPREAD.get()) - 0.0125 * Math.pow(index - player.getAttributeBaseValue(TargetModAttributes.SPREAD.get()), 2)); + } + + recoilTimer[0]++; + + try { + Thread.sleep(sleepTime); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }; + + Thread recoilThread = new Thread(recoilRunnable); + recoilThread.start(); + } + + private static void handleGunFire(Player player) { + ItemStack stack = player.getMainHandItem(); + if (stack.is(TargetModTags.Items.NORMAL_MAG_GUN) + && player.getPersistentData().getDouble("firing") == 1 + && stack.getOrCreateTag().getDouble("reloading") == 0 + && stack.getOrCreateTag().getDouble("ammo") > 0 + && !player.getCooldowns().isOnCooldown(stack.getItem()) + && stack.getOrCreateTag().getDouble("firemode") != 1) { + + if (stack.getOrCreateTag().getDouble("firemode") == 0) { + player.getPersistentData().putDouble("firing", 0); + } + + if (stack.getOrCreateTag().getDouble("animindex") == 1) { + stack.getOrCreateTag().putDouble("animindex", 0); + } else { + stack.getOrCreateTag().putDouble("animindex", 1); + } + + if (stack.getOrCreateTag().getDouble("ammo") == 1) { + stack.getOrCreateTag().putDouble("gj", 1); + } + + stack.getOrCreateTag().putDouble("ammo", (stack.getOrCreateTag().getDouble("ammo") - 1)); + stack.getOrCreateTag().putDouble("firecooldown", 7); + stack.getOrCreateTag().putDouble("fireanim", 2); + stack.getOrCreateTag().putDouble("empty", 1); + + // TODO 补齐rpm数据 + int cooldown = (int) Math.ceil(20 * 60 / ItemNBTTool.getDouble(stack, "rpm", 60)); + player.getCooldowns().addCooldown(stack.getItem(), cooldown); + + for (int index0 = 0; index0 < (int) stack.getOrCreateTag().getDouble("projectileamount"); index0++) { + BulletFireNormalProcedure.execute(player); + } + } + + + } + + +} diff --git a/src/main/java/net/mcreator/target/event/PlayerEventHandler.java b/src/main/java/net/mcreator/target/event/PlayerEventHandler.java index 6605ca4fd..9354b7c24 100644 --- a/src/main/java/net/mcreator/target/event/PlayerEventHandler.java +++ b/src/main/java/net/mcreator/target/event/PlayerEventHandler.java @@ -1,6 +1,5 @@ package net.mcreator.target.event; -import net.mcreator.target.init.TargetModAttributes; import net.mcreator.target.init.TargetModItems; import net.mcreator.target.init.TargetModTags; import net.mcreator.target.network.TargetModVariables; @@ -61,7 +60,6 @@ public class PlayerEventHandler { handleSpecialWeaponAmmo(player); handleChangeFireRate(player); handleDistantRange(player); - handleGunsDev(player); } } @@ -317,72 +315,4 @@ public class PlayerEventHandler { } } } - - private static void handleGunsDev(Player player) { - double[] recoilTimer = {0}; - double totalTime = 20; - int sleepTime = 2; - double recoilDuration = totalTime / sleepTime; - - Runnable recoilRunnable = () -> { - while (recoilTimer[0] < recoilDuration) { - if (player == null) { - return; - } - - ItemStack stack = player.getMainHandItem(); - - double basic = stack.getOrCreateTag().getDouble("dev"); - - double sprint = player.isSprinting() ? 0.5 * basic : 0; - double sneaking = player.isShiftKeyDown() ? (-0.25) * basic : 0; - double prone = player.getPersistentData().getDouble("prone") > 0 ? (-0.5) * basic : 0; - double jump = player.onGround() ? 0 : 1.5 * basic; - double fire = stack.getOrCreateTag().getDouble("fireanim") > 0 ? 0.5 * basic : 0; - double ride = player.isPassenger() ? (-0.5) * basic : 0; - - double walk; - if (player.getPersistentData().getDouble("qian") == 1 || player.getPersistentData().getDouble("tui") == 1 || - player.getPersistentData().getDouble("mover") == 1 || player.getPersistentData().getDouble("movel") == 1) { - walk = 0.2 * basic; - } else { - walk = 0; - } - - double zoom; - if (player.getPersistentData().getDouble("zoom_time") > 4) { - if (stack.is(TargetModTags.Items.SNIPER_RIFLE)) { - zoom = 0.0001; - } else if (stack.is(TargetModTags.Items.SHOTGUN)) { - zoom = 0.9; - } else { - zoom = 0.0001; - } - } else { - zoom = 1; - } - - double index = zoom * (basic + walk + sprint + sneaking + prone + jump + fire + ride); - - if (player.getAttributeBaseValue(TargetModAttributes.SPREAD.get()) < index) { - player.getAttribute(TargetModAttributes.SPREAD.get()) - .setBaseValue(player.getAttributeBaseValue(TargetModAttributes.SPREAD.get()) + 0.0125 * Math.pow(index - player.getAttributeBaseValue(TargetModAttributes.SPREAD.get()), 2)); - } else { - player.getAttribute(TargetModAttributes.SPREAD.get()) - .setBaseValue(player.getAttributeBaseValue(TargetModAttributes.SPREAD.get()) - 0.0125 * Math.pow(index - player.getAttributeBaseValue(TargetModAttributes.SPREAD.get()), 2)); - } - - recoilTimer[0]++; - - try { - Thread.sleep(sleepTime); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }; - - Thread recoilThread = new Thread(recoilRunnable); - recoilThread.start(); - } } diff --git a/src/main/java/net/mcreator/target/procedures/NormalMagGunFire.java b/src/main/java/net/mcreator/target/procedures/NormalMagGunFire.java index 41dc18923..b27ebe5c7 100644 --- a/src/main/java/net/mcreator/target/procedures/NormalMagGunFire.java +++ b/src/main/java/net/mcreator/target/procedures/NormalMagGunFire.java @@ -60,11 +60,13 @@ public class NormalMagGunFire { usehand.getOrCreateTag().putDouble("firecooldown", 7); usehand.getOrCreateTag().putDouble("fireanim", 2); usehand.getOrCreateTag().putDouble("empty", 1); - if (entity instanceof Player _player) - _player.getCooldowns().addCooldown(usehand.getItem(), 2); - for (int index0 = 0; index0 < (int) usehand.getOrCreateTag().getDouble("projectileamount"); index0++) { - BulletFireNormalProcedure.execute(entity); - } + + // TODO 修改后面的音效播放方法,使其成为通用方法 +// if (entity instanceof Player _player) +// _player.getCooldowns().addCooldown(usehand.getItem(), 2); +// for (int index0 = 0; index0 < (int) usehand.getOrCreateTag().getDouble("projectileamount"); index0++) { +// BulletFireNormalProcedure.execute(entity); +// } if (usehand.getItem() == TargetModItems.AK_47.get()) { { if (!entity.level().isClientSide() && entity.getServer() != null) { diff --git a/src/main/resources/data/target/guns/m_4.json b/src/main/resources/data/target/guns/m_4.json index 33dc7f914..0e1db0944 100644 --- a/src/main/resources/data/target/guns/m_4.json +++ b/src/main/resources/data/target/guns/m_4.json @@ -8,5 +8,6 @@ "headshot": 2, "velocity": 45, "mag": 30, - "projectileamount": 1 + "projectileamount": 1, + "rpm": 800 } \ No newline at end of file