From e98139384a2f3aee52944886df05e3980d185207 Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Fri, 10 May 2024 01:29:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E6=94=B9=E4=BA=86?= =?UTF-8?q?=E6=AD=A6=E5=99=A8=E5=8F=91=E5=B0=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../target/event/GunEventHandler.java | 78 +++++++++++++++++-- 1 file changed, 70 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/mcreator/target/event/GunEventHandler.java b/src/main/java/net/mcreator/target/event/GunEventHandler.java index 8faf0541c..8c99acf53 100644 --- a/src/main/java/net/mcreator/target/event/GunEventHandler.java +++ b/src/main/java/net/mcreator/target/event/GunEventHandler.java @@ -1,9 +1,11 @@ package net.mcreator.target.event; import net.mcreator.target.TargetMod; +import net.mcreator.target.entity.ProjectileEntity; import net.mcreator.target.init.TargetModAttributes; +import net.mcreator.target.init.TargetModItems; import net.mcreator.target.init.TargetModTags; -import net.mcreator.target.procedures.BulletFireNormalProcedure; +import net.mcreator.target.network.TargetModVariables; import net.mcreator.target.tools.ItemNBTTool; import net.minecraft.core.Holder; import net.minecraft.network.protocol.game.ClientboundSoundPacket; @@ -18,8 +20,13 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.ForgeRegistries; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + @Mod.EventBusSubscriber public class GunEventHandler { + private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); @SubscribeEvent public static void onPlayerTick(TickEvent.PlayerTickEvent event) { @@ -109,7 +116,7 @@ public class GunEventHandler { && player.getPersistentData().getDouble("firing") == 1 && stack.getOrCreateTag().getDouble("reloading") == 0 && stack.getOrCreateTag().getDouble("ammo") > 0 - && !player.getCooldowns().isOnCooldown(stack.getItem()) + && !stack.getOrCreateTag().getBoolean("shootCooldown") && stack.getOrCreateTag().getDouble("firemode") != 1) { if (stack.getOrCreateTag().getDouble("firemode") == 0) { @@ -131,19 +138,23 @@ public class GunEventHandler { 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); + int cooldown = (int) Math.ceil(1000 * 60 / ItemNBTTool.getDouble(stack, "rpm", 60)); for (int index0 = 0; index0 < (int) stack.getOrCreateTag().getDouble("projectileamount"); index0++) { - BulletFireNormalProcedure.execute(player); + gunShoot(player); } - playGunSounds(player); + stack.getOrCreateTag().putBoolean("shootCooldown", true); + + // 使用线程池来处理发射,不保证能用 + Runnable reset = () -> stack.getOrCreateTag().putBoolean("shootCooldown", false); + scheduler.schedule(reset, cooldown, TimeUnit.MILLISECONDS); } } - + /** + * 根据武器的注册名来寻找音效并播放 + */ public static void playGunSounds(Player player) { ItemStack stack = player.getMainHandItem(); if (!stack.is(TargetModTags.Items.GUN)) { @@ -177,4 +188,55 @@ public class GunEventHandler { } } + public static void gunShoot(Player player) { + ItemStack heldItem = player.getMainHandItem(); + if (Math.random() < 0.5) { + player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.recoilhorizon = -1; + capability.syncPlayerVariables(player); + }); + } else { + player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.recoilhorizon = 1; + capability.syncPlayerVariables(player); + }); + } + + player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.recoil = 0.1; + capability.syncPlayerVariables(player); + }); + player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.firing = 1; + capability.syncPlayerVariables(player); + }); + + if (!player.level().isClientSide()) { + float damage; + float headshot = (float) heldItem.getOrCreateTag().getDouble("headshot"); + float velocity = 4 * (float) heldItem.getOrCreateTag().getDouble("speed"); + + if (heldItem.getItem() == TargetModItems.BOCEK.get()) { + + damage = 0.2f * (float) heldItem.getOrCreateTag().getDouble("speed") * (float) heldItem.getOrCreateTag().getDouble("damageadd"); + + ProjectileEntity projectile = new ProjectileEntity(player.level(), player, damage, headshot); + + projectile.setPos((player.getX() + (-0.5) * player.getLookAngle().x), (player.getEyeY() - 0.1 + (-0.5) * player.getLookAngle().y), (player.getZ() + (-0.5) * player.getLookAngle().z)); + projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, 1 * velocity, 2.5f); + player.level().addFreshEntity(projectile); + } else { + damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("adddamage")) + * (float) heldItem.getOrCreateTag().getDouble("damageadd"); + + ProjectileEntity projectile = new ProjectileEntity(player.level(), player, damage, headshot); + + projectile.setPos((player.getX() + (-0.5) * player.getLookAngle().x), (player.getEyeY() - 0.1 + (-0.5) * player.getLookAngle().y), (player.getZ() + (-0.5) * player.getLookAngle().z)); + projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, 1 * (float) heldItem.getOrCreateTag().getDouble("velocity"), + (float) player.getAttributeBaseValue(TargetModAttributes.SPREAD.get())); + player.level().addFreshEntity(projectile); + } + } + } + }