875 lines
38 KiB
Java
875 lines
38 KiB
Java
package net.mcreator.superbwarfare.event;
|
||
|
||
import net.mcreator.superbwarfare.ModUtils;
|
||
import net.mcreator.superbwarfare.entity.ProjectileEntity;
|
||
import net.mcreator.superbwarfare.event.modevent.ReloadEvent;
|
||
import net.mcreator.superbwarfare.init.*;
|
||
import net.mcreator.superbwarfare.network.ModVariables;
|
||
import net.mcreator.superbwarfare.network.message.ZoomMessage;
|
||
import net.mcreator.superbwarfare.tools.GunInfo;
|
||
import net.mcreator.superbwarfare.tools.GunsTool;
|
||
import net.mcreator.superbwarfare.tools.ParticleTool;
|
||
import net.mcreator.superbwarfare.tools.SoundTool;
|
||
import net.minecraft.core.particles.ParticleTypes;
|
||
import net.minecraft.nbt.CompoundTag;
|
||
import net.minecraft.resources.ResourceLocation;
|
||
import net.minecraft.server.level.ServerLevel;
|
||
import net.minecraft.server.level.ServerPlayer;
|
||
import net.minecraft.sounds.SoundEvent;
|
||
import net.minecraft.sounds.SoundSource;
|
||
import net.minecraft.world.InteractionHand;
|
||
import net.minecraft.world.entity.player.Player;
|
||
import net.minecraft.world.item.ItemStack;
|
||
import net.minecraft.world.item.enchantment.EnchantmentHelper;
|
||
import net.minecraftforge.common.MinecraftForge;
|
||
import net.minecraftforge.common.capabilities.ForgeCapabilities;
|
||
import net.minecraftforge.event.TickEvent;
|
||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||
import net.minecraftforge.fml.common.Mod;
|
||
import net.minecraftforge.registries.ForgeRegistries;
|
||
|
||
import java.util.List;
|
||
import java.util.concurrent.atomic.AtomicBoolean;
|
||
|
||
@Mod.EventBusSubscriber
|
||
public class GunEventHandler {
|
||
|
||
@SubscribeEvent
|
||
public static void onPlayerTick(TickEvent.PlayerTickEvent event) {
|
||
Player player = event.player;
|
||
if (player == null) {
|
||
return;
|
||
}
|
||
|
||
ItemStack stack = player.getMainHandItem();
|
||
|
||
if (event.phase == TickEvent.Phase.END && stack.is(ModTags.Items.GUN)) {
|
||
handleGunFire(player);
|
||
handleMiniGunFire(player);
|
||
handleGunReload(player);
|
||
handleGunSingleReload(player);
|
||
handleSentinelCharge(player);
|
||
}
|
||
}
|
||
|
||
@SubscribeEvent
|
||
public static void onPreReload(ReloadEvent.Pre event) {
|
||
Player player = event.player;
|
||
ItemStack stack = event.stack;
|
||
if (player == null || !stack.is(ModTags.Items.GUN)) {
|
||
return;
|
||
}
|
||
|
||
if (player.level().isClientSide) {
|
||
return;
|
||
}
|
||
|
||
System.out.println("Pre Reload: " + stack);
|
||
|
||
handleHealClipPre(stack);
|
||
handleKillClipPre(stack);
|
||
}
|
||
|
||
@SubscribeEvent
|
||
public static void onPostReload(ReloadEvent.Post event) {
|
||
Player player = event.player;
|
||
ItemStack stack = event.stack;
|
||
if (player == null || !stack.is(ModTags.Items.GUN)) {
|
||
return;
|
||
}
|
||
|
||
if (player.level().isClientSide) {
|
||
return;
|
||
}
|
||
|
||
System.out.println("Post Reload: " + stack);
|
||
System.out.println();
|
||
|
||
handleHealClipPost(player, stack);
|
||
handleKillClipPost(stack);
|
||
}
|
||
|
||
/**
|
||
* 通用的武器开火流程
|
||
*/
|
||
private static void handleGunFire(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
if (stack.is(ModTags.Items.NORMAL_GUN)) {
|
||
double mode = stack.getOrCreateTag().getInt("fire_mode");
|
||
|
||
int interval = stack.getOrCreateTag().getInt("fire_interval");
|
||
|
||
if (!player.getPersistentData().getBoolean("firing") && player.getMainHandItem().getItem() == ModItems.DEVOTION.get()) {
|
||
stack.getOrCreateTag().putDouble("fire_increase", 0);
|
||
}
|
||
|
||
if (stack.getOrCreateTag().getInt("ammo") == 0) {
|
||
stack.getOrCreateTag().putInt("burst_fire", 0);
|
||
}
|
||
|
||
if ((player.getPersistentData().getBoolean("firing") || stack.getOrCreateTag().getInt("burst_fire") > 0)
|
||
&& !(stack.getOrCreateTag().getBoolean("is_normal_reloading") || stack.getOrCreateTag().getBoolean("is_empty_reloading"))
|
||
&& !stack.getOrCreateTag().getBoolean("reloading")
|
||
&& !stack.getOrCreateTag().getBoolean("charging")
|
||
&& stack.getOrCreateTag().getInt("ammo") > 0
|
||
&& !player.getCooldowns().isOnCooldown(stack.getItem())
|
||
&& !stack.getOrCreateTag().getBoolean("need_bolt_action")) {
|
||
|
||
playGunSounds(player);
|
||
|
||
if (mode == 0) {
|
||
player.getPersistentData().putBoolean("firing", false);
|
||
}
|
||
|
||
int burst_cooldown = 0;
|
||
if (mode == 1) {
|
||
stack.getOrCreateTag().putInt("burst_fire", (stack.getOrCreateTag().getInt("burst_fire") - 1));
|
||
burst_cooldown = stack.getOrCreateTag().getInt("burst_fire") == 0 ? interval + 4 : 0;
|
||
}
|
||
|
||
if (stack.getOrCreateTag().getDouble("animindex") == 1) {
|
||
stack.getOrCreateTag().putDouble("animindex", 0);
|
||
} else {
|
||
stack.getOrCreateTag().putDouble("animindex", 1);
|
||
}
|
||
/*
|
||
空仓挂机
|
||
*/
|
||
if (stack.getOrCreateTag().getInt("ammo") == 1) {
|
||
stack.getOrCreateTag().putBoolean("HoldOpen", true);
|
||
}
|
||
|
||
/*
|
||
判断是否为栓动武器(bolt_action_time > 0),并在开火后给一个需要上膛的状态
|
||
*/
|
||
if (stack.getOrCreateTag().getDouble("bolt_action_time") > 0 && stack.getOrCreateTag().getInt("ammo") > 1) {
|
||
stack.getOrCreateTag().putBoolean("need_bolt_action", true);
|
||
}
|
||
|
||
stack.getOrCreateTag().putInt("ammo", (stack.getOrCreateTag().getInt("ammo") - 1));
|
||
stack.getOrCreateTag().putInt("fire_animation", interval);
|
||
player.getPersistentData().putInt("noRun_time", interval + 2);
|
||
stack.getOrCreateTag().putDouble("flash_time", 2);
|
||
|
||
stack.getOrCreateTag().putDouble("empty", 1);
|
||
|
||
if (stack.getItem() == ModItems.M_60.get()) {
|
||
stack.getOrCreateTag().putBoolean("bullet_chain", true);
|
||
}
|
||
|
||
if (stack.getItem() == ModItems.M_4.get() || player.getMainHandItem().getItem() == ModItems.HK_416.get()) {
|
||
if (stack.getOrCreateTag().getDouble("fire_sequence") == 1) {
|
||
stack.getOrCreateTag().putDouble("fire_sequence", 0);
|
||
} else {
|
||
stack.getOrCreateTag().putDouble("fire_sequence", 1);
|
||
}
|
||
}
|
||
|
||
if (stack.getItem() == ModItems.DEVOTION.get()) {
|
||
stack.getOrCreateTag().putDouble("fire_increase", stack.getOrCreateTag().getDouble("fire_increase") + 0.334);
|
||
}
|
||
|
||
if (stack.getItem() == ModItems.ABEKIRI.get()) {
|
||
stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(InteractionHand.MAIN_HAND));
|
||
if (player instanceof ServerPlayer serverPlayer && player.level() instanceof ServerLevel serverLevel) {
|
||
ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, player.getX() + 1.8 * player.getLookAngle().x, player.getY() + player.getBbHeight() - 0.1 + 1.8 * player.getLookAngle().y,
|
||
player.getZ() + 1.8 * player.getLookAngle().z, 30, 0.4, 0.4, 0.4, 0.005, true, serverPlayer);
|
||
}
|
||
}
|
||
|
||
if (stack.getItem() == ModItems.SENTINEL.get()) {
|
||
stack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
|
||
iEnergyStorage -> iEnergyStorage.extractEnergy(3000, false)
|
||
);
|
||
stack.getOrCreateTag().putDouble("chamber_rot", 20);
|
||
}
|
||
|
||
int zoom_add_cooldown = 0;
|
||
if (stack.getItem() == ModItems.MARLIN.get()) {
|
||
if ((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).zooming) {
|
||
zoom_add_cooldown = 5;
|
||
stack.getOrCreateTag().putDouble("marlin_animation_time", 15);
|
||
stack.getOrCreateTag().putBoolean("fastfiring", false);
|
||
} else {
|
||
stack.getOrCreateTag().putDouble("marlin_animation_time", 10);
|
||
stack.getOrCreateTag().putBoolean("fastfiring", true);
|
||
}
|
||
}
|
||
|
||
int cooldown = interval + (int) stack.getOrCreateTag().getDouble("fire_sequence") - (int) stack.getOrCreateTag().getDouble("fire_increase") + burst_cooldown + zoom_add_cooldown;
|
||
player.getCooldowns().addCooldown(stack.getItem(), cooldown);
|
||
|
||
for (int index0 = 0; index0 < (int) stack.getOrCreateTag().getDouble("projectile_amount"); index0++) {
|
||
gunShoot(player);
|
||
}
|
||
|
||
stack.getOrCreateTag().putBoolean("shoot", true);
|
||
|
||
}
|
||
|
||
/*
|
||
在开火动画的最后1tick,设置需要拉栓上膛的武器拉栓动画的倒计时为data里的拉栓时间
|
||
*/
|
||
if (stack.getOrCreateTag().getInt("fire_animation") == 1 && stack.getOrCreateTag().getBoolean("need_bolt_action")) {
|
||
stack.getOrCreateTag().putInt("bolt_action_anim", stack.getOrCreateTag().getInt("bolt_action_time"));
|
||
player.getCooldowns().addCooldown(stack.getItem(), stack.getOrCreateTag().getInt("bolt_action_time"));
|
||
playGunBoltSounds(player);
|
||
}
|
||
if (stack.getOrCreateTag().getInt("bolt_action_anim") > 0) {
|
||
stack.getOrCreateTag().putInt("bolt_action_anim", stack.getOrCreateTag().getInt("bolt_action_anim") - 1);
|
||
}
|
||
if (stack.getOrCreateTag().getInt("bolt_action_anim") == 1) {
|
||
stack.getOrCreateTag().putBoolean("need_bolt_action", false);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 加特林开火流程
|
||
*/
|
||
private static void handleMiniGunFire(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
if (stack.getItem() != ModItems.MINIGUN.get()) {
|
||
return;
|
||
}
|
||
|
||
var tag = stack.getOrCreateTag();
|
||
|
||
if ((player.getPersistentData().getBoolean("firing") || (player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).zoom) && !player.isSprinting()) {
|
||
if (tag.getDouble("minigun_rotation") < 10) {
|
||
tag.putDouble("minigun_rotation", (tag.getDouble("minigun_rotation") + 1));
|
||
}
|
||
if (!player.level().isClientSide() && player instanceof ServerPlayer serverPlayer) {
|
||
SoundTool.playLocalSound(serverPlayer, ModSounds.MINIGUN_ROT.get(), 2f, 1f);
|
||
}
|
||
} else if (tag.getDouble("minigun_rotation") > 0) {
|
||
tag.putDouble("minigun_rotation", (tag.getDouble("minigun_rotation") - 0.5));
|
||
}
|
||
|
||
if (tag.getDouble("overheat") == 0
|
||
&& (player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).rifleAmmo > 0
|
||
&& !(player.getCooldowns().isOnCooldown(stack.getItem())) && tag.getDouble("minigun_rotation") >= 10 && player.getPersistentData().getBoolean("firing")) {
|
||
tag.putDouble("heat", (tag.getDouble("heat") + 0.5));
|
||
if (tag.getDouble("heat") >= 50.5) {
|
||
tag.putDouble("overheat", 40);
|
||
player.getCooldowns().addCooldown(stack.getItem(), 40);
|
||
if (!player.level().isClientSide() && player instanceof ServerPlayer serverPlayer) {
|
||
SoundTool.playLocalSound(serverPlayer, ModSounds.MINIGUN_OVERHEAT.get(), 2f, 1f);
|
||
}
|
||
}
|
||
|
||
if (!player.level().isClientSide() && player instanceof ServerPlayer serverPlayer) {
|
||
if (tag.getDouble("heat") <= 40) {
|
||
SoundTool.playLocalSound(serverPlayer, ModSounds.MINIGUN_FIRE_1P.get(), 2f, 1f);
|
||
player.playSound(ModSounds.MINIGUN_FIRE_3P.get(), 4f, 1f);
|
||
player.playSound(ModSounds.MINIGUN_FAR.get(), 12f, 1f);
|
||
player.playSound(ModSounds.MINIGUN_VERYFAR.get(), 24f, 1f);
|
||
} else {
|
||
float pitch = (float) (1 - 0.025 * Math.abs(40 - tag.getDouble("heat")));
|
||
|
||
SoundTool.playLocalSound(serverPlayer, ModSounds.MINIGUN_FIRE_1P.get(), 2f, pitch);
|
||
player.playSound(ModSounds.MINIGUN_FIRE_3P.get(), 4f, pitch);
|
||
player.playSound(ModSounds.MINIGUN_FAR.get(), 12f, pitch);
|
||
player.playSound(ModSounds.MINIGUN_VERYFAR.get(), 24f, pitch);
|
||
}
|
||
}
|
||
|
||
stack.getOrCreateTag().putBoolean("shoot", true);
|
||
|
||
for (int index0 = 0; index0 < (int) stack.getOrCreateTag().getDouble("projectile_amount"); index0++) {
|
||
gunShoot(player);
|
||
}
|
||
|
||
player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> {
|
||
capability.rifleAmmo = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).rifleAmmo - 1;
|
||
capability.syncPlayerVariables(player);
|
||
});
|
||
|
||
tag.putInt("fire_animation", 2);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 根据武器的注册名来寻找音效并播放
|
||
*/
|
||
public static void playGunSounds(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
if (!stack.is(ModTags.Items.GUN)) {
|
||
return;
|
||
}
|
||
|
||
if (!player.level().isClientSide) {
|
||
String origin = stack.getItem().getDescriptionId();
|
||
String name = origin.substring(origin.lastIndexOf(".") + 1);
|
||
|
||
if (stack.getItem() == ModItems.SENTINEL.get()) {
|
||
AtomicBoolean charged = new AtomicBoolean(false);
|
||
|
||
stack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
|
||
e -> charged.set(e.getEnergyStored() > 0)
|
||
);
|
||
|
||
if (charged.get()) {
|
||
SoundEvent sound1p = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, "sentinel_charge_fire_1p"));
|
||
if (sound1p != null && player instanceof ServerPlayer serverPlayer) {
|
||
SoundTool.playLocalSound(serverPlayer, sound1p, 2f, 1f);
|
||
}
|
||
|
||
SoundEvent sound3p = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, "sentinel_charge_fire_3p"));
|
||
if (sound3p != null) {
|
||
player.level().playSound(null, player.getOnPos(), sound3p, SoundSource.PLAYERS, 4f, 1f);
|
||
}
|
||
|
||
SoundEvent soundFar = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, "sentinel_charge_far"));
|
||
if (soundFar != null) {
|
||
player.playSound(soundFar, 12f, 1f);
|
||
}
|
||
|
||
SoundEvent soundVeryFar = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, "sentinel_charge_veryfar"));
|
||
if (soundVeryFar != null) {
|
||
player.playSound(soundVeryFar, 24f, 1f);
|
||
}
|
||
|
||
return;
|
||
}
|
||
}
|
||
|
||
SoundEvent sound1p = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, name + "_fire_1p"));
|
||
if (sound1p != null && player instanceof ServerPlayer serverPlayer) {
|
||
SoundTool.playLocalSound(serverPlayer, sound1p, 2f, 1f);
|
||
}
|
||
|
||
SoundEvent sound3p = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, name + "_fire_3p"));
|
||
if (sound3p != null) {
|
||
player.level().playSound(null, player.getOnPos(), sound3p, SoundSource.PLAYERS, 4f, 1f);
|
||
}
|
||
|
||
SoundEvent soundFar = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, name + "_far"));
|
||
if (soundFar != null) {
|
||
player.playSound(soundFar, 12f, 1f);
|
||
}
|
||
|
||
SoundEvent soundVeryFar = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, name + "_veryfar"));
|
||
if (soundVeryFar != null) {
|
||
player.playSound(soundVeryFar, 24f, 1f);
|
||
}
|
||
}
|
||
}
|
||
|
||
public static void playGunBoltSounds(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
if (!stack.is(ModTags.Items.GUN)) {
|
||
return;
|
||
}
|
||
|
||
if (!player.level().isClientSide) {
|
||
String origin = stack.getItem().getDescriptionId();
|
||
String name = origin.substring(origin.lastIndexOf(".") + 1);
|
||
|
||
SoundEvent sound1p = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, name + "_bolt"));
|
||
if (sound1p != null && player instanceof ServerPlayer serverPlayer) {
|
||
SoundTool.playLocalSound(serverPlayer, sound1p, 2f, 1f);
|
||
}
|
||
}
|
||
}
|
||
|
||
public static void gunShoot(Player player) {
|
||
ItemStack heldItem = player.getMainHandItem();
|
||
|
||
if (!player.level().isClientSide()) {
|
||
float headshot = (float) heldItem.getOrCreateTag().getDouble("headshot");
|
||
int monster_multiple = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.MONSTER_HUNTER.get(), heldItem);
|
||
float damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("add_damage")) * (float) heldItem.getOrCreateTag().getDouble("damageadd");
|
||
|
||
ProjectileEntity projectile = new ProjectileEntity(player.level())
|
||
.shooter(player)
|
||
.damage(damage)
|
||
.headShot(headshot);
|
||
|
||
if (heldItem.getOrCreateTag().getBoolean("beast")) {
|
||
projectile.beast();
|
||
}
|
||
|
||
projectile.monster_multiple(monster_multiple);
|
||
|
||
projectile.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z);
|
||
projectile.shoot(player.getLookAngle().x, player.getLookAngle().y + 0.0005f, player.getLookAngle().z, 1 * (float) heldItem.getOrCreateTag().getDouble("velocity"),
|
||
(float) (heldItem.getOrCreateTag().getDouble("dev") * ZoomMessage.zoom_spread));
|
||
player.level().addFreshEntity(projectile);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 通用的武器换弹流程
|
||
*/
|
||
private static void handleGunReload(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
CompoundTag tag = stack.getOrCreateTag();
|
||
//启动换弹
|
||
if (tag.getBoolean("start_reload")) {
|
||
MinecraftForge.EVENT_BUS.post(new ReloadEvent.Pre(player, stack));
|
||
|
||
if (stack.is(ModTags.Items.OPEN_BOLT)) {
|
||
if (tag.getInt("ammo") == 0) {
|
||
tag.putInt("gun_reloading_time", (int) tag.getDouble("empty_reload_time"));
|
||
stack.getOrCreateTag().putBoolean("is_empty_reloading", true);
|
||
playGunEmptyReloadSounds(player);
|
||
} else {
|
||
tag.putInt("gun_reloading_time", (int) tag.getDouble("normal_reload_time"));
|
||
stack.getOrCreateTag().putBoolean("is_normal_reloading", true);
|
||
playGunNormalReloadSounds(player);
|
||
}
|
||
} else {
|
||
tag.putInt("gun_reloading_time", (int) tag.getDouble("empty_reload_time"));
|
||
stack.getOrCreateTag().putBoolean("is_empty_reloading", true);
|
||
playGunEmptyReloadSounds(player);
|
||
}
|
||
tag.putBoolean("start_reload", false);
|
||
}
|
||
|
||
if (tag.getInt("gun_reloading_time") > 0) {
|
||
tag.putInt("gun_reloading_time", tag.getInt("gun_reloading_time") - 1);
|
||
}
|
||
|
||
if (stack.getItem() == ModItems.RPG.get()) {
|
||
if (tag.getInt("gun_reloading_time") == 84) {
|
||
tag.putBoolean("empty", false);
|
||
}
|
||
if (tag.getInt("gun_reloading_time") == 7) {
|
||
tag.putBoolean("close_hammer", false);
|
||
}
|
||
}
|
||
|
||
if (stack.getItem() == ModItems.MK_14.get()) {
|
||
if (tag.getInt("gun_reloading_time") == 18) {
|
||
tag.putBoolean("HoldOpen", false);
|
||
}
|
||
}
|
||
|
||
if (stack.getItem() == ModItems.SKS.get()) {
|
||
if (tag.getInt("gun_reloading_time") == 14) {
|
||
tag.putBoolean("HoldOpen", false);
|
||
}
|
||
}
|
||
|
||
if (stack.getItem() == ModItems.M_60.get()) {
|
||
if (tag.getInt("gun_reloading_time") == 55) {
|
||
tag.putBoolean("bullet_chain", false);
|
||
}
|
||
}
|
||
|
||
if (tag.getInt("gun_reloading_time") == 1) {
|
||
if (stack.is(ModTags.Items.OPEN_BOLT)) {
|
||
if (tag.getInt("ammo") == 0) {
|
||
playGunEmptyReload(player);
|
||
} else {
|
||
playGunNormalReload(player);
|
||
}
|
||
} else {
|
||
playGunEmptyReload(player);
|
||
}
|
||
}
|
||
}
|
||
|
||
public static void playGunNormalReload(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
|
||
if (stack.is(ModTags.Items.SHOTGUN)) {
|
||
if (stack.getItem() == ModItems.ABEKIRI.get()) {
|
||
GunsTool.reload(player, GunInfo.Type.SHOTGUN);
|
||
} else {
|
||
GunsTool.reload(player, GunInfo.Type.SHOTGUN, true);
|
||
}
|
||
} else if (stack.is(ModTags.Items.SNIPER_RIFLE)) {
|
||
GunsTool.reload(player, GunInfo.Type.SNIPER, true);
|
||
} else if (stack.is(ModTags.Items.HANDGUN) || stack.is(ModTags.Items.SMG)) {
|
||
GunsTool.reload(player, GunInfo.Type.HANDGUN, true);
|
||
} else if (stack.is(ModTags.Items.RIFLE)) {
|
||
if (stack.getItem() == ModItems.M_60.get()) {
|
||
GunsTool.reload(player, GunInfo.Type.RIFLE);
|
||
} else {
|
||
GunsTool.reload(player, GunInfo.Type.RIFLE, true);
|
||
}
|
||
}
|
||
stack.getOrCreateTag().putBoolean("is_normal_reloading", false);
|
||
stack.getOrCreateTag().putBoolean("is_empty_reloading", false);
|
||
|
||
MinecraftForge.EVENT_BUS.post(new ReloadEvent.Post(player, stack));
|
||
}
|
||
|
||
public static void playGunEmptyReload(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
|
||
if (stack.is(ModTags.Items.SHOTGUN)) {
|
||
GunsTool.reload(player, GunInfo.Type.SHOTGUN);
|
||
} else if (stack.is(ModTags.Items.SNIPER_RIFLE)) {
|
||
GunsTool.reload(player, GunInfo.Type.SNIPER);
|
||
} else if (stack.is(ModTags.Items.HANDGUN) || stack.is(ModTags.Items.SMG)) {
|
||
GunsTool.reload(player, GunInfo.Type.HANDGUN);
|
||
} else if (stack.is(ModTags.Items.RIFLE)) {
|
||
GunsTool.reload(player, GunInfo.Type.RIFLE);
|
||
} else if (stack.getItem() == ModItems.TASER.get()) {
|
||
stack.getOrCreateTag().putInt("ammo", 1);
|
||
player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.TASER_ELECTRODE.get(), 1, player.inventoryMenu.getCraftSlots());
|
||
} else if (stack.getItem() == ModItems.M_79.get()) {
|
||
stack.getOrCreateTag().putInt("ammo", 1);
|
||
player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.GRENADE_40MM.get(), 1, player.inventoryMenu.getCraftSlots());
|
||
} else if (stack.getItem() == ModItems.RPG.get()) {
|
||
stack.getOrCreateTag().putInt("ammo", 1);
|
||
player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.ROCKET.get(), 1, player.inventoryMenu.getCraftSlots());
|
||
}
|
||
|
||
stack.getOrCreateTag().putBoolean("is_normal_reloading", false);
|
||
stack.getOrCreateTag().putBoolean("is_empty_reloading", false);
|
||
|
||
MinecraftForge.EVENT_BUS.post(new ReloadEvent.Post(player, stack));
|
||
}
|
||
|
||
public static void playGunEmptyReloadSounds(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
if (!stack.is(ModTags.Items.GUN)) {
|
||
return;
|
||
}
|
||
|
||
if (!player.level().isClientSide) {
|
||
String origin = stack.getItem().getDescriptionId();
|
||
String name = origin.substring(origin.lastIndexOf(".") + 1);
|
||
|
||
SoundEvent sound1p = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, name + "_reload_empty"));
|
||
if (sound1p != null && player instanceof ServerPlayer serverPlayer) {
|
||
SoundTool.playLocalSound(serverPlayer, sound1p, 10f, 1f);
|
||
}
|
||
}
|
||
}
|
||
|
||
public static void playGunNormalReloadSounds(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
if (!stack.is(ModTags.Items.GUN)) {
|
||
return;
|
||
}
|
||
|
||
if (!player.level().isClientSide) {
|
||
String origin = stack.getItem().getDescriptionId();
|
||
String name = origin.substring(origin.lastIndexOf(".") + 1);
|
||
|
||
SoundEvent sound1p = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, name + "_reload_normal"));
|
||
if (sound1p != null && player instanceof ServerPlayer serverPlayer) {
|
||
SoundTool.playLocalSound(serverPlayer, sound1p, 10f, 1f);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 单发装填类的武器换弹流程
|
||
*/
|
||
private static void handleGunSingleReload(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
CompoundTag tag = stack.getOrCreateTag();
|
||
|
||
// 换弹流程计时器
|
||
if (tag.getDouble("prepare") > 0) {
|
||
tag.putDouble("prepare", tag.getDouble("prepare") - 1);
|
||
}
|
||
if (tag.getDouble("prepare_load") > 0) {
|
||
tag.putDouble("prepare_load", tag.getDouble("prepare_load") - 1);
|
||
}
|
||
if (tag.getDouble("iterative") > 0) {
|
||
tag.putDouble("iterative", tag.getDouble("iterative") - 1);
|
||
}
|
||
if (tag.getDouble("finish") > 0) {
|
||
tag.putDouble("finish", tag.getDouble("finish") - 1);
|
||
}
|
||
|
||
// 一阶段
|
||
if (tag.getBoolean("start_single_reload")) {
|
||
MinecraftForge.EVENT_BUS.post(new ReloadEvent.Pre(player, stack));
|
||
|
||
// 此处判断空仓换弹的时候,是否在准备阶段就需要装填一发,如M870
|
||
if (tag.getDouble("prepare_load_time") != 0 && tag.getInt("ammo") == 0) {
|
||
playGunPrepareLoadReloadSounds(player);
|
||
tag.putInt("prepare_load", (int) tag.getDouble("prepare_load_time"));
|
||
player.getCooldowns().addCooldown(stack.getItem(), (int) tag.getDouble("prepare_load_time"));
|
||
|
||
} else {
|
||
playGunPrepareReloadSounds(player);
|
||
tag.putInt("prepare", (int) tag.getDouble("prepare_time"));
|
||
player.getCooldowns().addCooldown(stack.getItem(), (int) tag.getDouble("prepare_time"));
|
||
}
|
||
|
||
tag.putBoolean("force_stop", false);
|
||
tag.putBoolean("stop", false);
|
||
tag.putInt("reload_stage", 1);
|
||
tag.putBoolean("reloading", true);
|
||
tag.putBoolean("start_single_reload", false);
|
||
}
|
||
|
||
if (stack.getItem() == ModItems.M_870.get()) {
|
||
if (tag.getInt("prepare_load") == 10) {
|
||
singleLoad(player);
|
||
}
|
||
}
|
||
|
||
// 一阶段结束,检查备弹,如果有则二阶段启动,无则直接跳到三阶段
|
||
if ((tag.getDouble("prepare") == 1 || tag.getDouble("prepare_load") == 1)) {
|
||
|
||
// 检查备弹
|
||
var capability = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables());
|
||
if (stack.is(ModTags.Items.SHOTGUN) && capability.shotgunAmmo == 0) {
|
||
tag.putBoolean("force_stage3_start", true);
|
||
} else if (stack.is(ModTags.Items.SNIPER_RIFLE) && capability.sniperAmmo == 0) {
|
||
tag.putBoolean("force_stage3_start", true);
|
||
} else if ((stack.is(ModTags.Items.HANDGUN) || stack.is(ModTags.Items.SMG)) && capability.handgunAmmo == 0) {
|
||
tag.putBoolean("force_stage3_start", true);
|
||
} else if (stack.is(ModTags.Items.RIFLE) && capability.rifleAmmo == 0) {
|
||
tag.putBoolean("force_stage3_start", true);
|
||
} else {
|
||
tag.putInt("reload_stage", 2);
|
||
}
|
||
}
|
||
|
||
// 强制停止换弹,进入三阶段
|
||
if (tag.getBoolean("force_stop")) {
|
||
tag.putBoolean("stop", true);
|
||
}
|
||
|
||
// 二阶段
|
||
if ((tag.getDouble("prepare") == 0 || tag.getDouble("prepare_load") == 0)
|
||
&& tag.getInt("reload_stage") == 2
|
||
&& tag.getInt("iterative") == 0
|
||
&& !tag.getBoolean("stop")
|
||
&& tag.getInt("ammo") < (int) tag.getDouble("mag")) {
|
||
|
||
playGunLoopReloadSounds(player);
|
||
tag.putDouble("iterative", (int) tag.getDouble("iterative_time"));
|
||
player.getCooldowns().addCooldown(stack.getItem(), (int) tag.getDouble("iterative_time"));
|
||
// 动画播放nbt
|
||
if (tag.getDouble("load_index") == 1) {
|
||
tag.putDouble("load_index", 0);
|
||
} else {
|
||
tag.putDouble("load_index", 1);
|
||
}
|
||
}
|
||
|
||
// 装填
|
||
if (stack.getItem() == ModItems.M_870.get()) {
|
||
if (tag.getInt("iterative") == 3) {
|
||
singleLoad(player);
|
||
}
|
||
}
|
||
|
||
if (stack.getItem() == ModItems.MARLIN.get()) {
|
||
if (tag.getInt("iterative") == 3) {
|
||
singleLoad(player);
|
||
}
|
||
}
|
||
|
||
// 二阶段结束
|
||
if (tag.getInt("iterative") == 1) {
|
||
|
||
// 装满结束
|
||
if (tag.getInt("ammo") >= (int) tag.getDouble("mag")) {
|
||
tag.putInt("reload_stage", 3);
|
||
}
|
||
|
||
// 备弹耗尽结束
|
||
var capability = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables());
|
||
if (stack.is(ModTags.Items.SHOTGUN) && capability.shotgunAmmo == 0) {
|
||
tag.putInt("reload_stage", 3);
|
||
} else if (stack.is(ModTags.Items.SNIPER_RIFLE) && capability.sniperAmmo == 0) {
|
||
tag.putInt("reload_stage", 3);
|
||
} else if ((stack.is(ModTags.Items.HANDGUN) || stack.is(ModTags.Items.SMG)) && capability.handgunAmmo == 0) {
|
||
tag.putInt("reload_stage", 3);
|
||
} else if (stack.is(ModTags.Items.RIFLE) && capability.rifleAmmo == 0) {
|
||
tag.putInt("reload_stage", 3);
|
||
}
|
||
|
||
// 强制结束
|
||
if (tag.getBoolean("stop")) {
|
||
tag.putInt("reload_stage", 3);
|
||
tag.putBoolean("force_stop", false);
|
||
tag.putBoolean("stop", false);
|
||
}
|
||
}
|
||
|
||
// 三阶段
|
||
if ((tag.getInt("iterative") == 1 && tag.getInt("reload_stage") == 3) || tag.getBoolean("force_stage3_start")) {
|
||
tag.putBoolean("force_stage3_start", false);
|
||
tag.putDouble("finish", (int) tag.getDouble("finish_time"));
|
||
player.getCooldowns().addCooldown(stack.getItem(), (int) tag.getDouble("finish_time"));
|
||
playGunEndReloadSounds(player);
|
||
}
|
||
|
||
// 三阶段结束
|
||
if (tag.getInt("finish") == 1) {
|
||
tag.putInt("reload_stage", 0);
|
||
tag.putBoolean("reloading", false);
|
||
|
||
MinecraftForge.EVENT_BUS.post(new ReloadEvent.Post(player, stack));
|
||
}
|
||
}
|
||
|
||
public static void singleLoad(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
CompoundTag tag = stack.getOrCreateTag();
|
||
|
||
tag.putInt("ammo", tag.getInt("ammo") + 1);
|
||
|
||
if (stack.is(ModTags.Items.SHOTGUN)) {
|
||
player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> {
|
||
capability.shotgunAmmo = capability.shotgunAmmo - 1;
|
||
capability.syncPlayerVariables(player);
|
||
});
|
||
} else if (stack.is(ModTags.Items.SNIPER_RIFLE)) {
|
||
player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> {
|
||
capability.sniperAmmo = capability.sniperAmmo - 1;
|
||
capability.syncPlayerVariables(player);
|
||
});
|
||
} else if ((stack.is(ModTags.Items.HANDGUN) || stack.is(ModTags.Items.SMG))) {
|
||
player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> {
|
||
capability.handgunAmmo = capability.handgunAmmo - 1;
|
||
capability.syncPlayerVariables(player);
|
||
});
|
||
} else if (stack.is(ModTags.Items.RIFLE)) {
|
||
player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> {
|
||
capability.rifleAmmo = capability.rifleAmmo - 1;
|
||
capability.syncPlayerVariables(player);
|
||
});
|
||
}
|
||
}
|
||
|
||
public static void playGunPrepareReloadSounds(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
if (!stack.is(ModTags.Items.GUN)) {
|
||
return;
|
||
}
|
||
|
||
if (!player.level().isClientSide) {
|
||
String origin = stack.getItem().getDescriptionId();
|
||
String name = origin.substring(origin.lastIndexOf(".") + 1);
|
||
|
||
SoundEvent sound1p = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, name + "_prepare"));
|
||
if (sound1p != null && player instanceof ServerPlayer serverPlayer) {
|
||
SoundTool.playLocalSound(serverPlayer, sound1p, 10f, 1f);
|
||
}
|
||
}
|
||
}
|
||
|
||
public static void playGunPrepareLoadReloadSounds(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
if (!stack.is(ModTags.Items.GUN)) {
|
||
return;
|
||
}
|
||
|
||
if (!player.level().isClientSide) {
|
||
String origin = stack.getItem().getDescriptionId();
|
||
String name = origin.substring(origin.lastIndexOf(".") + 1);
|
||
|
||
SoundEvent sound1p = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, name + "_prepare_load"));
|
||
if (sound1p != null && player instanceof ServerPlayer serverPlayer) {
|
||
SoundTool.playLocalSound(serverPlayer, sound1p, 10f, 1f);
|
||
}
|
||
}
|
||
}
|
||
|
||
public static void playGunLoopReloadSounds(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
if (!stack.is(ModTags.Items.GUN)) {
|
||
return;
|
||
}
|
||
|
||
if (!player.level().isClientSide) {
|
||
String origin = stack.getItem().getDescriptionId();
|
||
String name = origin.substring(origin.lastIndexOf(".") + 1);
|
||
|
||
SoundEvent sound1p = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, name + "_loop"));
|
||
if (sound1p != null && player instanceof ServerPlayer serverPlayer) {
|
||
SoundTool.playLocalSound(serverPlayer, sound1p, 10f, 1f);
|
||
}
|
||
}
|
||
}
|
||
|
||
public static void playGunEndReloadSounds(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
if (!stack.is(ModTags.Items.GUN)) {
|
||
return;
|
||
}
|
||
|
||
if (!player.level().isClientSide) {
|
||
String origin = stack.getItem().getDescriptionId();
|
||
String name = origin.substring(origin.lastIndexOf(".") + 1);
|
||
|
||
SoundEvent sound1p = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, name + "_end"));
|
||
if (sound1p != null && player instanceof ServerPlayer serverPlayer) {
|
||
SoundTool.playLocalSound(serverPlayer, sound1p, 10f, 1f);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 哨兵充能
|
||
*/
|
||
private static void handleSentinelCharge(Player player) {
|
||
ItemStack stack = player.getMainHandItem();
|
||
CompoundTag tag = stack.getOrCreateTag();
|
||
//启动换弹
|
||
if (tag.getBoolean("start_sentinel_charge")) {
|
||
tag.putInt("sentinel_charge_time", 127);
|
||
stack.getOrCreateTag().putBoolean("sentinel_is_charging", true);
|
||
|
||
SoundEvent sound1p = ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(ModUtils.MODID, "sentinel_charge"));
|
||
if (sound1p != null && player instanceof ServerPlayer serverPlayer) {
|
||
SoundTool.playLocalSound(serverPlayer, sound1p, 2f, 1f);
|
||
}
|
||
|
||
tag.putBoolean("start_sentinel_charge", false);
|
||
}
|
||
|
||
if (tag.getInt("sentinel_charge_time") > 0) {
|
||
tag.putInt("sentinel_charge_time", tag.getInt("sentinel_charge_time") - 1);
|
||
}
|
||
|
||
if (tag.getInt("sentinel_charge_time") == 17) {
|
||
stack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
|
||
iEnergyStorage -> iEnergyStorage.receiveEnergy(24000, false)
|
||
);
|
||
|
||
player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.SHIELD_CELL.get(), 1, player.inventoryMenu.getCraftSlots());
|
||
}
|
||
|
||
if (tag.getInt("sentinel_charge_time") == 1) {
|
||
tag.putBoolean("sentinel_is_charging", false);
|
||
}
|
||
}
|
||
|
||
private static void handleHealClipPre(ItemStack stack) {
|
||
int time = stack.getOrCreateTag().getInt("HealClipTime");
|
||
if (time > 0) {
|
||
stack.getOrCreateTag().putInt("HealClipTime", 0);
|
||
}
|
||
}
|
||
|
||
private static void handleHealClipPost(Player player, ItemStack stack) {
|
||
int healClipLevel = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.HEAL_CLIP.get(), stack);
|
||
if (healClipLevel == 0) {
|
||
healClipLevel = 1;
|
||
}
|
||
|
||
player.heal(12.0f * (0.8f + 0.2f * healClipLevel));
|
||
List<Player> players = player.level().getEntitiesOfClass(Player.class, player.getBoundingBox().inflate(5))
|
||
.stream().filter(p -> p.isAlliedTo(player)).toList();
|
||
int finalHealClipLevel = healClipLevel;
|
||
players.forEach(p -> p.heal(6.0f * (0.8f + 0.2f * finalHealClipLevel)));
|
||
}
|
||
|
||
private static void handleKillClipPre(ItemStack stack) {
|
||
int time = stack.getOrCreateTag().getInt("KillClipReloadTime");
|
||
if (time > 0) {
|
||
stack.getOrCreateTag().putInt("KillClipReloadTime", 0);
|
||
}
|
||
}
|
||
|
||
private static void handleKillClipPost(ItemStack stack) {
|
||
int level = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.KILL_CLIP.get(), stack);
|
||
stack.getOrCreateTag().putInt("KillClipTime", 90 + 10 * level);
|
||
}
|
||
}
|