修改武器发射逻辑

This commit is contained in:
17146 2024-05-10 12:55:48 +08:00
parent 95b8fd3b59
commit 3ada31cdea
2 changed files with 63 additions and 64 deletions

View file

@ -3,7 +3,6 @@ package net.mcreator.target.event;
import net.mcreator.target.TargetMod; import net.mcreator.target.TargetMod;
import net.mcreator.target.entity.ProjectileEntity; import net.mcreator.target.entity.ProjectileEntity;
import net.mcreator.target.init.TargetModAttributes; import net.mcreator.target.init.TargetModAttributes;
import net.mcreator.target.init.TargetModItems;
import net.mcreator.target.init.TargetModTags; import net.mcreator.target.init.TargetModTags;
import net.mcreator.target.network.TargetModVariables; import net.mcreator.target.network.TargetModVariables;
import net.mcreator.target.tools.ItemNBTTool; import net.mcreator.target.tools.ItemNBTTool;
@ -20,13 +19,8 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Mod.EventBusSubscriber @Mod.EventBusSubscriber
public class GunEventHandler { public class GunEventHandler {
private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
@SubscribeEvent @SubscribeEvent
public static void onPlayerTick(TickEvent.PlayerTickEvent event) { public static void onPlayerTick(TickEvent.PlayerTickEvent event) {
@ -112,43 +106,64 @@ public class GunEventHandler {
private static void handleGunFire(Player player) { private static void handleGunFire(Player player) {
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();
if (stack.is(TargetModTags.Items.NORMAL_MAG_GUN) if (stack.is(TargetModTags.Items.NORMAL_MAG_GUN)) {
&& player.getPersistentData().getDouble("firing") == 1 double mode = stack.getOrCreateTag().getDouble("firemode");
&& stack.getOrCreateTag().getDouble("reloading") == 0
&& stack.getOrCreateTag().getDouble("ammo") > 0
&& !stack.getOrCreateTag().getBoolean("shootCooldown")
&& stack.getOrCreateTag().getDouble("firemode") != 1) {
if (stack.getOrCreateTag().getDouble("firemode") == 0) { if (player.getPersistentData().getDouble("firing") == 1
player.getPersistentData().putDouble("firing", 0); && stack.getOrCreateTag().getDouble("reloading") == 0
} && stack.getOrCreateTag().getDouble("ammo") > 0
&& !stack.getOrCreateTag().getBoolean("shootCooldown")
&& mode != 1
&& !player.getCooldowns().isOnCooldown(stack.getItem())) {
if (stack.getOrCreateTag().getDouble("animindex") == 1) { if (stack.getOrCreateTag().getDouble("firemode") == 0) {
stack.getOrCreateTag().putDouble("animindex", 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);
double tick = (20 * 60 / ItemNBTTool.getDouble(stack, "rpm", 60));
if (mode == 0) {
player.getCooldowns().addCooldown(stack.getItem(), (int) tick);
for (int index0 = 0; index0 < (int) stack.getOrCreateTag().getDouble("projectileamount"); index0++) {
gunShoot(player);
}
playGunSounds(player);
} else {
double tickCount = player.getPersistentData().getDouble("target_tick_count");
++tickCount;
if (tickCount >= tick) {
player.getCooldowns().addCooldown(stack.getItem(), (int) tickCount);
}
while (tickCount >= tick) {
tickCount -= tick;
for (int index0 = 0; index0 < (int) stack.getOrCreateTag().getDouble("projectileamount"); index0++) {
gunShoot(player);
}
}
playGunSounds(player);
player.getPersistentData().putDouble("target_tick_count", tickCount);
}
} else { } else {
stack.getOrCreateTag().putDouble("animindex", 1); player.getPersistentData().putDouble("target_tick_count", 0);
} }
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);
int cooldown = (int) Math.ceil(1000 * 60 / ItemNBTTool.getDouble(stack, "rpm", 60));
for (int index0 = 0; index0 < (int) stack.getOrCreateTag().getDouble("projectileamount"); index0++) {
gunShoot(player);
}
playGunSounds(player);
stack.getOrCreateTag().putBoolean("shootCooldown", true);
// 使用线程池来处理发射不保证能用
Runnable reset = () -> stack.getOrCreateTag().putBoolean("shootCooldown", false);
scheduler.schedule(reset, cooldown, TimeUnit.MILLISECONDS);
} }
} }
@ -204,38 +219,21 @@ public class GunEventHandler {
player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> {
capability.recoil = 0.1; capability.recoil = 0.1;
capability.syncPlayerVariables(player);
});
player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> {
capability.firing = 1; capability.firing = 1;
capability.syncPlayerVariables(player); capability.syncPlayerVariables(player);
}); });
if (!player.level().isClientSide()) { if (!player.level().isClientSide()) {
float damage;
float headshot = (float) heldItem.getOrCreateTag().getDouble("headshot"); float headshot = (float) heldItem.getOrCreateTag().getDouble("headshot");
float velocity = 4 * (float) heldItem.getOrCreateTag().getDouble("speed"); float damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("adddamage"))
* (float) heldItem.getOrCreateTag().getDouble("damageadd");
if (heldItem.getItem() == TargetModItems.BOCEK.get()) { ProjectileEntity projectile = new ProjectileEntity(player.level(), player, damage, headshot);
damage = 0.2f * (float) heldItem.getOrCreateTag().getDouble("speed") * (float) heldItem.getOrCreateTag().getDouble("damageadd"); 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"),
ProjectileEntity projectile = new ProjectileEntity(player.level(), player, damage, headshot); (float) player.getAttributeBaseValue(TargetModAttributes.SPREAD.get()));
player.level().addFreshEntity(projectile);
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);
}
} }
} }

View file

@ -2,6 +2,7 @@ package net.mcreator.target.item.gun;
import com.google.common.collect.HashMultimap; import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import net.mcreator.target.TargetMod;
import net.mcreator.target.client.renderer.item.AK47ItemRenderer; import net.mcreator.target.client.renderer.item.AK47ItemRenderer;
import net.mcreator.target.init.TargetModItems; import net.mcreator.target.init.TargetModItems;
import net.mcreator.target.item.AnimatedItem; import net.mcreator.target.item.AnimatedItem;
@ -155,7 +156,7 @@ public class AK47Item extends GunItem implements GeoItem, AnimatedItem {
if (slot == EquipmentSlot.MAINHAND) { if (slot == EquipmentSlot.MAINHAND) {
map = HashMultimap.create(map); map = HashMultimap.create(map);
map.put(Attributes.MOVEMENT_SPEED, map.put(Attributes.MOVEMENT_SPEED,
new AttributeModifier(uuid, "henghengaaa", -0.04f, AttributeModifier.Operation.MULTIPLY_BASE)); new AttributeModifier(uuid, TargetMod.ATTRIBUTE_MODIFIER, -0.04f, AttributeModifier.Operation.MULTIPLY_BASE));
} }
return map; return map;
} }