192 lines
7.3 KiB
Java
192 lines
7.3 KiB
Java
package com.atsuishio.superbwarfare.event;
|
|
|
|
import com.atsuishio.superbwarfare.Mod;
|
|
import com.atsuishio.superbwarfare.config.common.GameplayConfig;
|
|
import com.atsuishio.superbwarfare.config.server.MiscConfig;
|
|
import com.atsuishio.superbwarfare.data.gun.GunData;
|
|
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.network.message.receive.SimulationDistanceMessage;
|
|
import com.atsuishio.superbwarfare.tools.InventoryTool;
|
|
import com.atsuishio.superbwarfare.tools.NBTTool;
|
|
import net.minecraft.resources.ResourceLocation;
|
|
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.ai.attributes.AttributeModifier;
|
|
import net.minecraft.world.entity.ai.attributes.Attributes;
|
|
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 {
|
|
|
|
public static final ResourceLocation TACTICAL_SPRINT = Mod.loc("tactical_sprint");
|
|
|
|
@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.getItem() instanceof GunItem) {
|
|
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.getItem() instanceof GunItem) {
|
|
handleSpecialWeaponAmmo(player);
|
|
}
|
|
|
|
if (!player.level().isClientSide) {
|
|
handleTacticalAttribute(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.getItem() instanceof GunItem) {
|
|
var data = GunData.from(stack);
|
|
|
|
if (!InventoryTool.hasCreativeAmmoBox(player)) {
|
|
data.reload(player);
|
|
} 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 = MiscConfig.DEFAULT_ARMOR_LEVEL.get();
|
|
if (armor.is(ModTags.Items.MILITARY_ARMOR)) {
|
|
armorLevel = MiscConfig.MILITARY_ARMOR_LEVEL.get();
|
|
} else if (armor.is(ModTags.Items.MILITARY_ARMOR_HEAVY)) {
|
|
armorLevel = MiscConfig.HEAVY_MILITARY_ARMOR_LEVEL.get();
|
|
}
|
|
|
|
if (armorPlate >= armorLevel * MiscConfig.ARMOR_PONT_PER_LEVEL.get()) 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 * MiscConfig.ARMOR_PONT_PER_LEVEL.get());
|
|
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 * MiscConfig.ARMOR_PONT_PER_LEVEL.get()) - armorPlate) / MiscConfig.ARMOR_PONT_PER_LEVEL.get()); index0++) {
|
|
stack.finishUsingItem(player.level(), player);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
NBTTool.saveTag(armor, tag);
|
|
}
|
|
|
|
public static void handleTacticalAttribute(Player player) {
|
|
if (player == null) {
|
|
return;
|
|
}
|
|
var attr = player.getAttribute(Attributes.MOVEMENT_SPEED);
|
|
if (attr == null) return;
|
|
|
|
if (attr.getModifier(TACTICAL_SPRINT) != null) {
|
|
attr.removeModifier(TACTICAL_SPRINT);
|
|
}
|
|
|
|
if (MiscConfig.ALLOW_TACTICAL_SPRINT.get() && player.getData(ModAttachments.PLAYER_VARIABLE).tacticalSprint) {
|
|
player.setSprinting(true);
|
|
attr.addTransientModifier(new AttributeModifier(TACTICAL_SPRINT, 0.25, AttributeModifier.Operation.ADD_MULTIPLIED_BASE));
|
|
}
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public static void onAnvilUpdate(AnvilUpdateEvent event) {
|
|
ItemStack left = event.getLeft();
|
|
ItemStack right = event.getRight();
|
|
|
|
if (left.getItem() instanceof GunItem && 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);
|
|
}
|
|
}
|
|
}
|