superb-warfare/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java
2025-04-11 15:21:22 +08:00

196 lines
8.3 KiB
Java

package com.atsuishio.superbwarfare.event;
import com.atsuishio.superbwarfare.config.common.GameplayConfig;
import com.atsuishio.superbwarfare.init.ModAttachments;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModTags;
import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.network.message.receive.SimulationDistanceMessage;
import com.atsuishio.superbwarfare.tools.AmmoType;
import com.atsuishio.superbwarfare.tools.GunsTool;
import com.atsuishio.superbwarfare.tools.InventoryTool;
import com.atsuishio.superbwarfare.tools.NBTTool;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.event.AnvilUpdateEvent;
import net.neoforged.neoforge.event.entity.player.PlayerEvent;
import net.neoforged.neoforge.event.tick.PlayerTickEvent;
import net.neoforged.neoforge.network.PacketDistributor;
@EventBusSubscriber
public class PlayerEventHandler {
@SubscribeEvent
public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) {
Player player = event.getEntity();
ItemStack mainStack = player.getMainHandItem();
var tag = NBTTool.getTag(mainStack);
if (mainStack.is(ModItems.MONITOR.get()) && tag.getBoolean("Using")) {
tag.putBoolean("Using", false);
NBTTool.saveTag(mainStack, tag);
}
for (ItemStack stack : player.getInventory().items) {
if (stack.getItem() instanceof GunItem) {
var data = GunData.from(stack);
data.draw.set(true);
data.save();
}
}
handleSimulationDistance(player);
}
@SubscribeEvent
public static void onPlayerRespawned(PlayerEvent.PlayerRespawnEvent event) {
Player player = event.getEntity();
handleRespawnReload(player);
handleRespawnAutoArmor(player);
for (ItemStack stack : player.getInventory().items) {
if (stack.is(ModTags.Items.GUN)) {
var data = GunData.from(stack);
data.draw.set(true);
data.save();
}
}
}
@SubscribeEvent
public static void onPlayerTick(PlayerTickEvent.Post event) {
Player player = event.getEntity();
ItemStack stack = player.getMainHandItem();
if (stack.is(ModTags.Items.GUN)) {
handleSpecialWeaponAmmo(player);
}
}
private static void handleSpecialWeaponAmmo(Player player) {
ItemStack stack = player.getMainHandItem();
var data = GunData.from(stack);
if ((stack.is(ModItems.RPG.get()) || stack.is(ModItems.BOCEK.get())) && data.ammo.get() == 1) {
data.isEmpty.set(false);
}
}
private static void handleSimulationDistance(Player player) {
if (player.level() instanceof ServerLevel serverLevel && player instanceof ServerPlayer serverPlayer) {
var distance = serverLevel.getChunkSource().chunkMap.serverViewDistance;
PacketDistributor.sendToPlayer(serverPlayer, new SimulationDistanceMessage(distance));
}
}
private static void handleRespawnReload(Player player) {
if (!GameplayConfig.RESPAWN_RELOAD.get()) return;
for (ItemStack stack : player.getInventory().items) {
if (stack.is(ModTags.Items.GUN)) {
var data = GunData.from(stack);
if (!InventoryTool.hasCreativeAmmoBox(player)) {
var cap = player.getData(ModAttachments.PLAYER_VARIABLE);
if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO) && cap.shotgunAmmo > 0) {
GunsTool.reload(player, stack, data, AmmoType.SHOTGUN);
}
if (stack.is(ModTags.Items.USE_SNIPER_AMMO) && cap.sniperAmmo > 0) {
GunsTool.reload(player, stack, data, AmmoType.SNIPER);
}
if (stack.is(ModTags.Items.USE_HANDGUN_AMMO) && cap.handgunAmmo > 0) {
GunsTool.reload(player, stack, data, AmmoType.HANDGUN);
}
if (stack.is(ModTags.Items.USE_RIFLE_AMMO) && cap.rifleAmmo > 0) {
GunsTool.reload(player, stack, data, AmmoType.RIFLE);
}
if (stack.is(ModTags.Items.USE_HEAVY_AMMO) && cap.heavyAmmo > 0) {
GunsTool.reload(player, stack, data, AmmoType.HEAVY);
}
if (stack.getItem() == ModItems.TASER.get() && data.maxAmmo.get() > 0 && data.ammo.get() == 0) {
data.ammo.set(1);
player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.TASER_ELECTRODE.get(), 1, player.inventoryMenu.getCraftSlots());
}
if (stack.getItem() == ModItems.M_79.get() && data.maxAmmo.get() > 0 && data.ammo.get() == 0) {
data.ammo.set(1);
player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.GRENADE_40MM.get(), 1, player.inventoryMenu.getCraftSlots());
}
if (stack.getItem() == ModItems.RPG.get() && data.maxAmmo.get() > 0 && data.ammo.get() == 0) {
data.ammo.set(1);
player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.ROCKET.get(), 1, player.inventoryMenu.getCraftSlots());
}
if (stack.getItem() == ModItems.JAVELIN.get() && data.maxAmmo.get() > 0 && data.ammo.get() == 0) {
data.ammo.set(1);
player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == ModItems.JAVELIN_MISSILE.get(), 1, player.inventoryMenu.getCraftSlots());
}
} else {
data.ammo.set(data.magazine());
}
data.holdOpen.set(false);
data.save();
}
}
}
private static void handleRespawnAutoArmor(Player player) {
if (!GameplayConfig.RESPAWN_AUTO_ARMOR.get()) return;
ItemStack armor = player.getItemBySlot(EquipmentSlot.CHEST);
if (armor == ItemStack.EMPTY) return;
var tag = NBTTool.getTag(armor);
double armorPlate = tag.getDouble("ArmorPlate");
int armorLevel = 1;
if (armor.is(ModTags.Items.MILITARY_ARMOR)) {
armorLevel = 2;
} else if (armor.is(ModTags.Items.MILITARY_ARMOR_HEAVY)) {
armorLevel = 3;
}
if (armorPlate >= armorLevel * 15) return;
for (var stack : player.getInventory().items) {
if (stack.is(ModItems.ARMOR_PLATE.get())) {
var stackTag = NBTTool.getTag(stack);
if (stackTag.getBoolean("Infinite")) {
tag.putDouble("ArmorPlate", armorLevel * 15);
if (player instanceof ServerPlayer serverPlayer) {
serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARMOR_EQUIP_IRON.value(), SoundSource.PLAYERS, 0.5f, 1);
}
} else {
for (int index0 = 0; index0 < Math.ceil(((armorLevel * 15) - armorPlate) / 15); index0++) {
stack.finishUsingItem(player.level(), player);
}
}
}
}
}
@SubscribeEvent
public static void onAnvilUpdate(AnvilUpdateEvent event) {
ItemStack left = event.getLeft();
ItemStack right = event.getRight();
if (left.is(ModTags.Items.GUN) && right.getItem() == ModItems.SHORTCUT_PACK.get()) {
ItemStack output = left.copy();
var data = GunData.from(output);
data.upgradePoint.set(data.upgradePoint.get() + 1);
data.save();
event.setOutput(output);
event.setCost(10);
event.setMaterialCost(1);
}
}
}