From 860ecc63ae3371da67d0e1b3154cf6932e8f27ae Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Sat, 29 Mar 2025 05:54:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0Perk=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superbwarfare/client/ClickHandler.java | 15 +- .../superbwarfare/client/TooltipTool.java | 26 +- .../client/overlay/CrossHairOverlay.java | 38 +- .../client/overlay/HandsomeFrameOverlay.java | 7 +- .../tooltip/ClientBocekImageTooltip.java | 45 +- .../client/tooltip/ClientGunImageTooltip.java | 426 +++++++++--------- .../tooltip/ClientShotgunImageTooltip.java | 42 +- .../event/ClientEventHandler.java | 73 ++- .../superbwarfare/event/GunEventHandler.java | 159 +++---- .../event/LivingEventHandler.java | 299 ++++++------ .../event/ReloadEventHandler.java | 56 +-- .../superbwarfare/item/gun/GunItem.java | 23 +- .../item/gun/handgun/Glock17Item.java | 5 +- .../item/gun/handgun/Glock18Item.java | 6 +- .../item/gun/handgun/M1911Item.java | 5 +- .../item/gun/handgun/Mp443Item.java | 5 +- .../item/gun/handgun/Trachelium.java | 5 +- .../item/gun/heavy/Ntw20Item.java | 5 +- .../item/gun/launcher/JavelinItem.java | 5 +- .../item/gun/launcher/M79Item.java | 6 +- .../item/gun/launcher/RpgItem.java | 6 +- .../item/gun/launcher/SecondaryCataclysm.java | 6 +- .../item/gun/machinegun/DevotionItem.java | 6 +- .../item/gun/machinegun/M60Item.java | 6 +- .../item/gun/machinegun/RpkItem.java | 6 +- .../item/gun/rifle/AK12Item.java | 5 +- .../item/gun/rifle/AK47Item.java | 5 +- .../item/gun/rifle/Hk416Item.java | 5 +- .../superbwarfare/item/gun/rifle/M4Item.java | 7 +- .../item/gun/rifle/MarlinItem.java | 5 +- .../item/gun/rifle/Mk14Item.java | 5 +- .../item/gun/rifle/Qbz95Item.java | 5 +- .../superbwarfare/item/gun/rifle/SksItem.java | 5 +- .../item/gun/shotgun/Aa12Item.java | 6 +- .../item/gun/shotgun/HomemadeShotgunItem.java | 5 +- .../item/gun/shotgun/M870Item.java | 5 +- .../item/gun/smg/VectorItem.java | 5 +- .../item/gun/sniper/HuntingRifleItem.java | 5 +- .../item/gun/sniper/K98Item.java | 5 +- .../item/gun/sniper/M98bItem.java | 5 +- .../item/gun/sniper/MosinNagantItem.java | 5 +- .../item/gun/sniper/SentinelItem.java | 5 +- .../item/gun/sniper/SvdItem.java | 5 +- .../item/gun/special/BocekItem.java | 18 +- .../item/gun/special/TaserItem.java | 44 +- .../menu/ReforgingTableMenu.java | 309 ++++++------- .../network/message/send/ShootMessage.java | 21 +- .../superbwarfare/perk/PerkHelper.java | 255 +++++++++++ 48 files changed, 1128 insertions(+), 893 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/perk/PerkHelper.java diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java index ef131393c..795d6770e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java @@ -10,7 +10,6 @@ import com.atsuishio.superbwarfare.entity.vehicle.base.WeaponVehicleEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.*; import com.atsuishio.superbwarfare.item.gun.GunItem; -import com.atsuishio.superbwarfare.network.ModVariables; import com.atsuishio.superbwarfare.network.message.send.DoubleJumpMessage; import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; @@ -30,11 +29,11 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.client.settings.KeyConflictContext; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.InputEvent; +import net.neoforged.neoforge.client.settings.KeyConflictContext; import net.neoforged.neoforge.network.PacketDistributor; import org.lwjgl.glfw.GLFW; @@ -202,9 +201,12 @@ public class ClickHandler { if (key == Minecraft.getInstance().options.keyJump.getKey().getValue()) { handleDoubleJump(player); } - if (key == ModKeyMappings.CONFIG.getKey().getValue() && ModKeyMappings.CONFIG.getKeyModifier().isActive(KeyConflictContext.IN_GAME)) { - handleConfigScreen(player); - } + + // TODO do we need cloth config? +// if (key == ModKeyMappings.CONFIG.getKey().getValue() && ModKeyMappings.CONFIG.getKeyModifier().isActive(KeyConflictContext.IN_GAME)) { +// handleConfigScreen(player); +// } + if (key == ModKeyMappings.RELOAD.getKey().getValue()) { PacketDistributor.sendToServer(new ReloadMessage(0)); } @@ -222,7 +224,8 @@ public class ClickHandler { PacketDistributor.sendToServer(new EditModeMessage(0)); } - if (player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).edit) { + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null && cap.edit) { if (!(stack.getItem() instanceof GunItem gunItem)) return; if (ModKeyMappings.EDIT_GRIP.getKeyModifier().isActive(KeyConflictContext.IN_GAME)) { if (key == ModKeyMappings.EDIT_GRIP.getKey().getValue() && gunItem.hasCustomGrip(stack)) { diff --git a/src/main/java/com/atsuishio/superbwarfare/client/TooltipTool.java b/src/main/java/com/atsuishio/superbwarfare/client/TooltipTool.java index 160522c11..73d88c118 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/TooltipTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/TooltipTool.java @@ -1,5 +1,9 @@ package com.atsuishio.superbwarfare.client; +import com.atsuishio.superbwarfare.init.ModPerks; +import com.atsuishio.superbwarfare.perk.AmmoPerk; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; @@ -19,26 +23,24 @@ public class TooltipTool { tooltip.add(Component.translatable("des.superbwarfare.developing").withStyle(ChatFormatting.LIGHT_PURPLE).withStyle(ChatFormatting.BOLD)); } - // TODO perk public static double perkDamage(ItemStack stack) { -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// if (perk instanceof AmmoPerk ammoPerk) { -// return ammoPerk.damageRate; -// } + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk) { + return ammoPerk.damageRate; + } return 1; } public static boolean heBullet(ItemStack stack) { -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// return perk == ModPerks.HE_BULLET.get(); - return false; + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + return perk == ModPerks.HE_BULLET.get(); } public static int heBulletLevel(ItemStack stack) { -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// if (perk == ModPerks.HE_BULLET.get()) { -// return PerkHelper.getItemPerkLevel(perk, stack); -// } + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk == ModPerks.HE_BULLET.get()) { + return PerkHelper.getItemPerkLevel(perk, stack); + } return 0; } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java index f2eb75ae8..bff46aff7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java @@ -3,9 +3,14 @@ package com.atsuishio.superbwarfare.client.overlay; import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.capability.ModCapabilities; import com.atsuishio.superbwarfare.config.client.DisplayConfig; +import com.atsuishio.superbwarfare.entity.vehicle.Ah6Entity; +import com.atsuishio.superbwarfare.entity.vehicle.base.ArmedVehicleEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.perk.AmmoPerk; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.NBTTool; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; @@ -53,9 +58,8 @@ public class CrossHairOverlay { var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); if (cap != null && cap.edit) return; - // todo ban hand -// if (!player.getMainHandItem().is(ModTags.Items.GUN) || (player.getVehicle() instanceof ArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player))) -// return; + if (!player.getMainHandItem().is(ModTags.Items.GUN) || (player.getVehicle() instanceof ArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player))) + return; GuiGraphics guiGraphics = event.getGuiGraphics(); @@ -65,8 +69,7 @@ public class CrossHairOverlay { float moveX = 0; float moveY = 0; - // TODO perk -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); if (DisplayConfig.FLOAT_CROSS_HAIR.get() && player.getVehicle() == null) { moveX = (float) (-6 * ClientEventHandler.turnRot[1] - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosX); @@ -91,11 +94,11 @@ public class CrossHairOverlay { preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0) { if (stack.is(ModTags.Items.SHOTGUN)) { -// if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { -// normalCrossHair(guiGraphics, w, h, spread, moveX, moveY); -// } else { - shotgunCrossHair(guiGraphics, finPosX, finPosY, finLength); -// } + if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { + normalCrossHair(guiGraphics, w, h, spread, moveX, moveY); + } else { + shotgunCrossHair(guiGraphics, finPosX, finPosY, finLength); + } } else { normalCrossHair(guiGraphics, w, h, spread, moveX, moveY); } @@ -107,11 +110,11 @@ public class CrossHairOverlay { preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0 || ClientEventHandler.pullPos > 0) { if (ClientEventHandler.zoomTime < 0.1) { -// if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { -// normalCrossHair(guiGraphics, w, h, spread, moveX, moveY); -// } else { - shotgunCrossHair(guiGraphics, finPosX, finPosY, finLength); -// } + if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { + normalCrossHair(guiGraphics, w, h, spread, moveX, moveY); + } else { + shotgunCrossHair(guiGraphics, finPosX, finPosY, finLength); + } } else { normalCrossHair(guiGraphics, w, h, spread, moveX, moveY); } @@ -120,10 +123,7 @@ public class CrossHairOverlay { } // 在开启伤害指示器时才进行渲染 - if (DisplayConfig.KILL_INDICATION.get() - // TODO ah6 -// && !(player.getVehicle() instanceof Ah6Entity ah6Entity && ah6Entity.getFirstPassenger() == player) - ) { + if (DisplayConfig.KILL_INDICATION.get() && !(player.getVehicle() instanceof Ah6Entity ah6Entity && ah6Entity.getFirstPassenger() == player)) { renderKillIndicator(guiGraphics, w, h, moveX, moveY); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/HandsomeFrameOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/HandsomeFrameOverlay.java index c73f6a2b5..401934ade 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/HandsomeFrameOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/HandsomeFrameOverlay.java @@ -5,7 +5,9 @@ import com.atsuishio.superbwarfare.capability.ModCapabilities; import com.atsuishio.superbwarfare.client.RenderHelper; import com.atsuishio.superbwarfare.entity.vehicle.base.ArmedVehicleEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.SeekTool; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; @@ -48,9 +50,8 @@ public class HandsomeFrameOverlay { if (stack.getItem() instanceof GunItem && Minecraft.getInstance().options.getCameraType().isFirstPerson()) { - // TODO intelligent chip perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.INTELLIGENT_CHIP.get(), stack); - int level = 0; + + int level = PerkHelper.getItemPerkLevel(ModPerks.INTELLIGENT_CHIP.get(), stack); if (level == 0) return; RenderSystem.disableDepthTest(); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientBocekImageTooltip.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientBocekImageTooltip.java index b031da55f..6fbc6a271 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientBocekImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientBocekImageTooltip.java @@ -1,6 +1,13 @@ package com.atsuishio.superbwarfare.client.tooltip; +import com.atsuishio.superbwarfare.client.TooltipTool; import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent; +import com.atsuishio.superbwarfare.perk.AmmoPerk; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; +import com.atsuishio.superbwarfare.tools.FormatTool; +import com.atsuishio.superbwarfare.tools.GunsTool; +import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; public class ClientBocekImageTooltip extends ClientGunImageTooltip { @@ -13,26 +20,24 @@ public class ClientBocekImageTooltip extends ClientGunImageTooltip { protected Component getDamageComponent() { boolean slug = false; - // TODO perk -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { -// slug = true; -// } -// -// double total = GunsTool.getGunDoubleTag(stack, "Damage", 0) * TooltipTool.perkDamage(stack); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { + slug = true; + } -// if (slug) { -// return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) -// .append(Component.literal("").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(FormatTool.format1D(total) + (TooltipTool.heBullet(stack) ? " + " + -// FormatTool.format1D(0.8 * total * (1 + 0.1 * TooltipTool.heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)); -// } else { -// return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) -// .append(Component.literal("").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(FormatTool.format1D(total * 0.1, " * 10")).withStyle(ChatFormatting.GREEN)) -// .append(Component.literal(" / ").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(FormatTool.format1D(total)).withStyle(ChatFormatting.GREEN)); -// } - return Component.literal(""); + double total = GunsTool.getGunDoubleTag(stack, "Damage", 0) * TooltipTool.perkDamage(stack); + + if (slug) { + return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(FormatTool.format1D(total) + (TooltipTool.heBullet(stack) ? " + " + + FormatTool.format1D(0.8 * total * (1 + 0.1 * TooltipTool.heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)); + } else { + return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(FormatTool.format1D(total * 0.1, " * 10")).withStyle(ChatFormatting.GREEN)) + .append(Component.literal(" / ").withStyle(ChatFormatting.RESET)) + .append(Component.literal(FormatTool.format1D(total)).withStyle(ChatFormatting.GREEN)); + } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientGunImageTooltip.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientGunImageTooltip.java index 9f75ec22f..553476eab 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientGunImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientGunImageTooltip.java @@ -1,17 +1,26 @@ package com.atsuishio.superbwarfare.client.tooltip; +import com.atsuishio.superbwarfare.client.TooltipTool; import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent; import com.atsuishio.superbwarfare.init.ModKeyMappings; +import com.atsuishio.superbwarfare.init.ModPerks; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.AmmoPerk; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; +import com.atsuishio.superbwarfare.tools.FormatTool; +import com.atsuishio.superbwarfare.tools.GunsTool; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; -// TODO perk相关信息渲染 public class ClientGunImageTooltip implements ClientTooltipComponent { protected final int width; @@ -53,20 +62,18 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { } protected boolean shouldRenderBypassAndHeadshotTooltip() { -// return GunsTool.getGunDoubleTag(stack, "BypassesArmor", 0) > 0 || GunsTool.getGunDoubleTag(stack, "Headshot", 0) > 0; - return false; + return GunsTool.getGunDoubleTag(stack, "BypassesArmor", 0) > 0 || GunsTool.getGunDoubleTag(stack, "Headshot", 0) > 0; } protected boolean shouldRenderEditTooltip() { -// if (this.stack.getItem() instanceof GunItem gunItem) { -// return gunItem.isCustomizable(stack); -// } + if (this.stack.getItem() instanceof GunItem gunItem) { + return gunItem.isCustomizable(stack); + } return false; } protected boolean shouldRenderPerks() { -// return PerkHelper.getPerkByType(stack, Perk.Type.AMMO) != null || PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE) != null || PerkHelper.getPerkByType(stack, Perk.Type.FUNCTIONAL) != null; - return false; + return PerkHelper.getPerkByType(stack, Perk.Type.AMMO) != null || PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE) != null || PerkHelper.getPerkByType(stack, Perk.Type.FUNCTIONAL) != null; } /** @@ -82,24 +89,23 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { * 获取武器伤害的文本组件 */ protected Component getDamageComponent() { -// double damage = GunsTool.getGunDoubleTag(stack, "Damage", 0) * TooltipTool.perkDamage(stack); -// return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) -// .append(Component.literal("").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(FormatTool.format1D(damage) + (TooltipTool.heBullet(stack) ? " + " -// + FormatTool.format1D(0.8 * damage * (1 + 0.1 * TooltipTool.heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)); - return Component.literal(""); + double damage = GunsTool.getGunDoubleTag(stack, "Damage", 0) * TooltipTool.perkDamage(stack); + return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(FormatTool.format1D(damage) + (TooltipTool.heBullet(stack) ? " + " + + FormatTool.format1D(0.8 * damage * (1 + 0.1 * TooltipTool.heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)); } /** * 获取武器射速的文本组件 */ protected Component getRpmComponent() { -// if (this.stack.getItem() instanceof GunItem gunItem && gunItem.isAutoWeapon(this.stack)) { -// return Component.translatable("des.superbwarfare.guns.rpm").withStyle(ChatFormatting.GRAY) -// .append(Component.literal("").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(FormatTool.format0D(GunsTool.getGunIntTag(stack, "RPM", 0))) -// .withStyle(ChatFormatting.GREEN)); -// } + if (this.stack.getItem() instanceof GunItem gunItem && gunItem.isAutoWeapon(this.stack)) { + return Component.translatable("des.superbwarfare.guns.rpm").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(FormatTool.format0D(GunsTool.getGunIntTag(stack, "RPM", 0))) + .withStyle(ChatFormatting.GREEN)); + } return Component.literal(""); } @@ -116,39 +122,37 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { * 获取武器等级文本组件 */ protected Component getLevelComponent() { -// int level = GunsTool.getGunIntTag(stack, "Level", 0); -// double rate = GunsTool.getGunDoubleTag(stack, "Exp", 0) / (20 * Math.pow(level, 2) + 160 * level + 20); + int level = GunsTool.getGunIntTag(stack, "Level", 0); + double rate = GunsTool.getGunDoubleTag(stack, "Exp", 0) / (20 * Math.pow(level, 2) + 160 * level + 20); ChatFormatting formatting; -// if (level < 10) { -// formatting = ChatFormatting.WHITE; -// } else if (level < 20) { -// formatting = ChatFormatting.AQUA; -// } else if (level < 30) { -// formatting = ChatFormatting.LIGHT_PURPLE; -// } else if (level < 40) { -// formatting = ChatFormatting.GOLD; -// } else { -// formatting = ChatFormatting.RED; -// } + if (level < 10) { + formatting = ChatFormatting.WHITE; + } else if (level < 20) { + formatting = ChatFormatting.AQUA; + } else if (level < 30) { + formatting = ChatFormatting.LIGHT_PURPLE; + } else if (level < 40) { + formatting = ChatFormatting.GOLD; + } else { + formatting = ChatFormatting.RED; + } -// return Component.translatable("des.superbwarfare.guns.level").withStyle(ChatFormatting.GRAY) -// .append(Component.literal("").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(level + "").withStyle(formatting).withStyle(ChatFormatting.BOLD)) -// .append(Component.literal("").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(" (" + FormatTool.DECIMAL_FORMAT_2ZZZ.format(rate * 100) + "%)").withStyle(ChatFormatting.GRAY)); - return Component.literal(""); + return Component.translatable("des.superbwarfare.guns.level").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(level + "").withStyle(formatting).withStyle(ChatFormatting.BOLD)) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(" (" + FormatTool.DECIMAL_FORMAT_2ZZZ.format(rate * 100) + "%)").withStyle(ChatFormatting.GRAY)); } /** * 获取武器强化点数文本组件 */ protected Component getUpgradePointComponent() { -// int upgradePoint = Mth.floor(GunsTool.getGunDoubleTag(stack, "UpgradePoint", 0)); -// return Component.translatable("des.superbwarfare.guns.upgrade_point").withStyle(ChatFormatting.GRAY) -// .append(Component.literal("").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(String.valueOf(upgradePoint)).withStyle(ChatFormatting.WHITE).withStyle(ChatFormatting.BOLD)); - return Component.literal(""); + int upgradePoint = Mth.floor(GunsTool.getGunDoubleTag(stack, "UpgradePoint", 0)); + return Component.translatable("des.superbwarfare.guns.upgrade_point").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(String.valueOf(upgradePoint)).withStyle(ChatFormatting.WHITE).withStyle(ChatFormatting.BOLD)); } /** @@ -165,29 +169,27 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { */ protected Component getBypassComponent() { double perkBypassArmorRate = 0; -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// -// if (perk instanceof AmmoPerk ammoPerk) { -// int level = PerkHelper.getItemPerkLevel(perk, stack); -// perkBypassArmorRate = ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0); -// } -// double bypassRate = Math.max(GunsTool.getGunDoubleTag(stack, "BypassesArmor", 0) + perkBypassArmorRate, 0); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// return Component.translatable("des.superbwarfare.guns.bypass").withStyle(ChatFormatting.GRAY) -// .append(Component.literal("").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(FormatTool.format2D(bypassRate * 100, "%")).withStyle(ChatFormatting.GOLD)); - return Component.literal(""); + if (perk instanceof AmmoPerk ammoPerk) { + int level = PerkHelper.getItemPerkLevel(perk, stack); + perkBypassArmorRate = ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0); + } + double bypassRate = Math.max(GunsTool.getGunDoubleTag(stack, "BypassesArmor", 0) + perkBypassArmorRate, 0); + + return Component.translatable("des.superbwarfare.guns.bypass").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(FormatTool.format2D(bypassRate * 100, "%")).withStyle(ChatFormatting.GOLD)); } /** * 获取武器爆头倍率文本组件 */ protected Component getHeadshotComponent() { -// double headshot = GunsTool.getGunDoubleTag(stack, "Headshot", 0); -// return Component.translatable("des.superbwarfare.guns.headshot").withStyle(ChatFormatting.GRAY) -// .append(Component.literal("").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(FormatTool.format1D(headshot, "x")).withStyle(ChatFormatting.AQUA)); - return Component.literal(""); + double headshot = GunsTool.getGunDoubleTag(stack, "Headshot", 0); + return Component.translatable("des.superbwarfare.guns.headshot").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(FormatTool.format1D(headshot, "x")).withStyle(ChatFormatting.AQUA)); } /** @@ -213,55 +215,55 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { int xOffset = -20; -// Perk ammoPerk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// if (ammoPerk != null && PerkHelper.getPerkItem(ammoPerk).isPresent()) { -// xOffset += 20; -// -// var ammoItem = PerkHelper.getPerkItem(ammoPerk).get().get(); -// ItemStack perkStack = ammoItem.getDefaultInstance(); -// -// CompoundTag ammoTag = PerkHelper.getPerkTag(stack, Perk.Type.AMMO); -// if (!ammoTag.isEmpty()) { -// int level = PerkHelper.getItemPerkLevel(ammoPerk, stack); -// perkStack.setCount(level); -// } -// guiGraphics.renderItem(perkStack, x + xOffset, y + 2); -// guiGraphics.renderItemDecorations(font, perkStack, x + xOffset, y + 2); -// } -// -// Perk funcPerk = PerkHelper.getPerkByType(stack, Perk.Type.FUNCTIONAL); -// if (funcPerk != null && PerkHelper.getPerkItem(funcPerk).isPresent()) { -// xOffset += 20; -// -// var funcItem = PerkHelper.getPerkItem(funcPerk).get().get(); -// ItemStack perkStack = funcItem.getDefaultInstance(); -// -// CompoundTag funcTag = PerkHelper.getPerkTag(stack, Perk.Type.FUNCTIONAL); -// if (!funcTag.isEmpty()) { -// int level = PerkHelper.getItemPerkLevel(funcPerk, stack); -// perkStack.setCount(level); -// } -// -// guiGraphics.renderItem(perkStack, x + xOffset, y + 2); -// guiGraphics.renderItemDecorations(font, perkStack, x + xOffset, y + 2); -// } -// -// Perk damagePerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); -// if (damagePerk != null && PerkHelper.getPerkItem(damagePerk).isPresent()) { -// xOffset += 20; -// -// var damageItem = PerkHelper.getPerkItem(damagePerk).get().get(); -// ItemStack perkStack = damageItem.getDefaultInstance(); -// -// CompoundTag damageTag = PerkHelper.getPerkTag(stack, Perk.Type.DAMAGE); -// if (!damageTag.isEmpty()) { -// int level = PerkHelper.getItemPerkLevel(damagePerk, stack); -// perkStack.setCount(level); -// } -// -// guiGraphics.renderItem(perkStack, x + xOffset, y + 2); -// guiGraphics.renderItemDecorations(font, perkStack, x + xOffset, y + 2); -// } + Perk ammoPerk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (ammoPerk != null && PerkHelper.getPerkItem(ammoPerk).isPresent()) { + xOffset += 20; + + var ammoItem = PerkHelper.getPerkItem(ammoPerk).get().get(); + ItemStack perkStack = ammoItem.getDefaultInstance(); + + CompoundTag ammoTag = PerkHelper.getPerkTag(stack, Perk.Type.AMMO); + if (!ammoTag.isEmpty()) { + int level = PerkHelper.getItemPerkLevel(ammoPerk, stack); + perkStack.setCount(level); + } + guiGraphics.renderItem(perkStack, x + xOffset, y + 2); + guiGraphics.renderItemDecorations(font, perkStack, x + xOffset, y + 2); + } + + Perk funcPerk = PerkHelper.getPerkByType(stack, Perk.Type.FUNCTIONAL); + if (funcPerk != null && PerkHelper.getPerkItem(funcPerk).isPresent()) { + xOffset += 20; + + var funcItem = PerkHelper.getPerkItem(funcPerk).get().get(); + ItemStack perkStack = funcItem.getDefaultInstance(); + + CompoundTag funcTag = PerkHelper.getPerkTag(stack, Perk.Type.FUNCTIONAL); + if (!funcTag.isEmpty()) { + int level = PerkHelper.getItemPerkLevel(funcPerk, stack); + perkStack.setCount(level); + } + + guiGraphics.renderItem(perkStack, x + xOffset, y + 2); + guiGraphics.renderItemDecorations(font, perkStack, x + xOffset, y + 2); + } + + Perk damagePerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); + if (damagePerk != null && PerkHelper.getPerkItem(damagePerk).isPresent()) { + xOffset += 20; + + var damageItem = PerkHelper.getPerkItem(damagePerk).get().get(); + ItemStack perkStack = damageItem.getDefaultInstance(); + + CompoundTag damageTag = PerkHelper.getPerkTag(stack, Perk.Type.DAMAGE); + if (!damageTag.isEmpty()) { + int level = PerkHelper.getItemPerkLevel(damagePerk, stack); + perkStack.setCount(level); + } + + guiGraphics.renderItem(perkStack, x + xOffset, y + 2); + guiGraphics.renderItemDecorations(font, perkStack, x + xOffset, y + 2); + } guiGraphics.pose().popPose(); } @@ -276,71 +278,71 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { int yOffset = -5; -// Perk ammoPerk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// if (ammoPerk != null && PerkHelper.getPerkItem(ammoPerk).isPresent()) { -// yOffset += 25; -// var ammoItem = PerkHelper.getPerkItem(ammoPerk).get().get(); -// guiGraphics.renderItem(ammoItem.getDefaultInstance(), x, y + 4 + yOffset); -// -// CompoundTag ammoTag = PerkHelper.getPerkTag(stack, Perk.Type.AMMO); -// if (!ammoTag.isEmpty()) { -// var ids = ammoTag.getString("id").split(":"); -// if (ids.length > 1) { -// String id = ids[1]; -// var ammoComponent = Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.YELLOW) -// .append(Component.literal(" ").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(" Lvl. " + ammoTag.getInt("level")).withStyle(ChatFormatting.WHITE)); -// var ammoDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY); -// -// guiGraphics.drawString(font, ammoComponent, x + 20, y + yOffset + 2, 0xFFFFFF); -// guiGraphics.drawString(font, ammoDesComponent, x + 20, y + yOffset + 12, 0xFFFFFF); -// } -// } -// } -// -// Perk funcPerk = PerkHelper.getPerkByType(stack, Perk.Type.FUNCTIONAL); -// if (funcPerk != null && PerkHelper.getPerkItem(funcPerk).isPresent()) { -// yOffset += 25; -// var funcItem = PerkHelper.getPerkItem(funcPerk).get().get(); -// guiGraphics.renderItem(funcItem.getDefaultInstance(), x, y + 4 + yOffset); -// -// CompoundTag funcTag = PerkHelper.getPerkTag(stack, Perk.Type.FUNCTIONAL); -// if (!funcTag.isEmpty()) { -// var ids = funcTag.getString("id").split(":"); -// if (ids.length > 1) { -// String id = ids[1]; -// var funcComponent = Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.GREEN) -// .append(Component.literal(" ").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(" Lvl. " + funcTag.getInt("level")).withStyle(ChatFormatting.WHITE)); -// var funcDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY); -// -// guiGraphics.drawString(font, funcComponent, x + 20, y + yOffset + 2, 0xFFFFFF); -// guiGraphics.drawString(font, funcDesComponent, x + 20, y + yOffset + 12, 0xFFFFFF); -// } -// } -// } -// -// Perk damagePerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); -// if (damagePerk != null && PerkHelper.getPerkItem(damagePerk).isPresent()) { -// yOffset += 25; -// var damageItem = PerkHelper.getPerkItem(damagePerk).get().get(); -// guiGraphics.renderItem(damageItem.getDefaultInstance(), x, y + 4 + yOffset); -// -// CompoundTag damageTag = PerkHelper.getPerkTag(stack, Perk.Type.DAMAGE); -// if (!damageTag.isEmpty()) { -// var ids = damageTag.getString("id").split(":"); -// if (ids.length > 1) { -// String id = ids[1]; -// var damageComponent = Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.RED) -// .append(Component.literal(" ").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(" Lvl. " + damageTag.getInt("level")).withStyle(ChatFormatting.WHITE)); -// var damageDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY); -// -// guiGraphics.drawString(font, damageComponent, x + 20, y + yOffset + 2, 0xFFFFFF); -// guiGraphics.drawString(font, damageDesComponent, x + 20, y + yOffset + 12, 0xFFFFFF); -// } -// } -// } + Perk ammoPerk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (ammoPerk != null && PerkHelper.getPerkItem(ammoPerk).isPresent()) { + yOffset += 25; + var ammoItem = PerkHelper.getPerkItem(ammoPerk).get().get(); + guiGraphics.renderItem(ammoItem.getDefaultInstance(), x, y + 4 + yOffset); + + CompoundTag ammoTag = PerkHelper.getPerkTag(stack, Perk.Type.AMMO); + if (!ammoTag.isEmpty()) { + var ids = ammoTag.getString("id").split(":"); + if (ids.length > 1) { + String id = ids[1]; + var ammoComponent = Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.YELLOW) + .append(Component.literal(" ").withStyle(ChatFormatting.RESET)) + .append(Component.literal(" Lvl. " + ammoTag.getInt("level")).withStyle(ChatFormatting.WHITE)); + var ammoDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY); + + guiGraphics.drawString(font, ammoComponent, x + 20, y + yOffset + 2, 0xFFFFFF); + guiGraphics.drawString(font, ammoDesComponent, x + 20, y + yOffset + 12, 0xFFFFFF); + } + } + } + + Perk funcPerk = PerkHelper.getPerkByType(stack, Perk.Type.FUNCTIONAL); + if (funcPerk != null && PerkHelper.getPerkItem(funcPerk).isPresent()) { + yOffset += 25; + var funcItem = PerkHelper.getPerkItem(funcPerk).get().get(); + guiGraphics.renderItem(funcItem.getDefaultInstance(), x, y + 4 + yOffset); + + CompoundTag funcTag = PerkHelper.getPerkTag(stack, Perk.Type.FUNCTIONAL); + if (!funcTag.isEmpty()) { + var ids = funcTag.getString("id").split(":"); + if (ids.length > 1) { + String id = ids[1]; + var funcComponent = Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.GREEN) + .append(Component.literal(" ").withStyle(ChatFormatting.RESET)) + .append(Component.literal(" Lvl. " + funcTag.getInt("level")).withStyle(ChatFormatting.WHITE)); + var funcDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY); + + guiGraphics.drawString(font, funcComponent, x + 20, y + yOffset + 2, 0xFFFFFF); + guiGraphics.drawString(font, funcDesComponent, x + 20, y + yOffset + 12, 0xFFFFFF); + } + } + } + + Perk damagePerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); + if (damagePerk != null && PerkHelper.getPerkItem(damagePerk).isPresent()) { + yOffset += 25; + var damageItem = PerkHelper.getPerkItem(damagePerk).get().get(); + guiGraphics.renderItem(damageItem.getDefaultInstance(), x, y + 4 + yOffset); + + CompoundTag damageTag = PerkHelper.getPerkTag(stack, Perk.Type.DAMAGE); + if (!damageTag.isEmpty()) { + var ids = damageTag.getString("id").split(":"); + if (ids.length > 1) { + String id = ids[1]; + var damageComponent = Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.RED) + .append(Component.literal(" ").withStyle(ChatFormatting.RESET)) + .append(Component.literal(" Lvl. " + damageTag.getInt("level")).withStyle(ChatFormatting.WHITE)); + var damageDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY); + + guiGraphics.drawString(font, damageComponent, x + 20, y + yOffset + 2, 0xFFFFFF); + guiGraphics.drawString(font, damageDesComponent, x + 20, y + yOffset + 12, 0xFFFFFF); + } + } + } guiGraphics.pose().popPose(); } @@ -363,35 +365,35 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { int width = 0; -// CompoundTag ammoTag = PerkHelper.getPerkTag(stack, Perk.Type.AMMO); -// if (!ammoTag.isEmpty()) { -// var ids = ammoTag.getString("id").split(":"); -// if (ids.length > 1) { -// String id = ids[1]; -// var ammoDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY); -// width = Math.max(width, font.width(ammoDesComponent)); -// } -// } -// -// CompoundTag funcTag = PerkHelper.getPerkTag(stack, Perk.Type.FUNCTIONAL); -// if (!funcTag.isEmpty()) { -// var ids = funcTag.getString("id").split(":"); -// if (ids.length > 1) { -// String id = ids[1]; -// var funcDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY); -// width = Math.max(width, font.width(funcDesComponent)); -// } -// } -// -// CompoundTag damageTag = PerkHelper.getPerkTag(stack, Perk.Type.DAMAGE); -// if (!damageTag.isEmpty()) { -// var ids = damageTag.getString("id").split(":"); -// if (ids.length > 1) { -// String id = ids[1]; -// var damageDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY); -// width = Math.max(width, font.width(damageDesComponent)); -// } -// } + CompoundTag ammoTag = PerkHelper.getPerkTag(stack, Perk.Type.AMMO); + if (!ammoTag.isEmpty()) { + var ids = ammoTag.getString("id").split(":"); + if (ids.length > 1) { + String id = ids[1]; + var ammoDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY); + width = Math.max(width, font.width(ammoDesComponent)); + } + } + + CompoundTag funcTag = PerkHelper.getPerkTag(stack, Perk.Type.FUNCTIONAL); + if (!funcTag.isEmpty()) { + var ids = funcTag.getString("id").split(":"); + if (ids.length > 1) { + String id = ids[1]; + var funcDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY); + width = Math.max(width, font.width(funcDesComponent)); + } + } + + CompoundTag damageTag = PerkHelper.getPerkTag(stack, Perk.Type.DAMAGE); + if (!damageTag.isEmpty()) { + var ids = damageTag.getString("id").split(":"); + if (ids.length > 1) { + String id = ids[1]; + var damageDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY); + width = Math.max(width, font.width(damageDesComponent)); + } + } return width + 25; } @@ -407,15 +409,15 @@ public class ClientGunImageTooltip implements ClientTooltipComponent { height += 16; } else { height += 16; -// if (PerkHelper.getPerkByType(stack, Perk.Type.AMMO) != null) { -// height += 25; -// } -// if (PerkHelper.getPerkByType(stack, Perk.Type.FUNCTIONAL) != null) { -// height += 25; -// } -// if (PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE) != null) { -// height += 25; -// } + if (PerkHelper.getPerkByType(stack, Perk.Type.AMMO) != null) { + height += 25; + } + if (PerkHelper.getPerkByType(stack, Perk.Type.FUNCTIONAL) != null) { + height += 25; + } + if (PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE) != null) { + height += 25; + } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientShotgunImageTooltip.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientShotgunImageTooltip.java index 028079adc..0e16f1fca 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientShotgunImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientShotgunImageTooltip.java @@ -1,6 +1,13 @@ package com.atsuishio.superbwarfare.client.tooltip; +import com.atsuishio.superbwarfare.client.TooltipTool; import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent; +import com.atsuishio.superbwarfare.perk.AmmoPerk; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; +import com.atsuishio.superbwarfare.tools.FormatTool; +import com.atsuishio.superbwarfare.tools.GunsTool; +import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; public class ClientShotgunImageTooltip extends ClientGunImageTooltip { @@ -13,25 +20,22 @@ public class ClientShotgunImageTooltip extends ClientGunImageTooltip { protected Component getDamageComponent() { boolean slug = false; - // TODO perk -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { -// slug = true; -// } -// -// if (slug) { -// double damage = GunsTool.getGunDoubleTag(stack, "Damage", 0) * GunsTool.getGunIntTag(stack, "ProjectileAmount", 1) * TooltipTool.perkDamage(stack); -// return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) -// .append(Component.literal("").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(FormatTool.format1D(damage) + (TooltipTool.heBullet(stack) ? " + " + -// FormatTool.format1D(0.8 * damage * (1 + 0.1 * TooltipTool.heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)); -// } else { -// double damage = GunsTool.getGunDoubleTag(stack, "Damage", 0) * TooltipTool.perkDamage(stack); -// return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) -// .append(Component.literal("").withStyle(ChatFormatting.RESET)) -// .append(Component.literal(FormatTool.format1D(damage) + " * " + FormatTool.format0D(GunsTool.getGunIntTag(stack, "ProjectileAmount", 1))).withStyle(ChatFormatting.GREEN)); -// } + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { + slug = true; + } - return Component.literal(""); + if (slug) { + double damage = GunsTool.getGunDoubleTag(stack, "Damage", 0) * GunsTool.getGunIntTag(stack, "ProjectileAmount", 1) * TooltipTool.perkDamage(stack); + return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(FormatTool.format1D(damage) + (TooltipTool.heBullet(stack) ? " + " + + FormatTool.format1D(0.8 * damage * (1 + 0.1 * TooltipTool.heBulletLevel(stack))) : "")).withStyle(ChatFormatting.GREEN)); + } else { + double damage = GunsTool.getGunDoubleTag(stack, "Damage", 0) * TooltipTool.perkDamage(stack); + return Component.translatable("des.superbwarfare.guns.damage").withStyle(ChatFormatting.GRAY) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(FormatTool.format1D(damage) + " * " + FormatTool.format0D(GunsTool.getGunIntTag(stack, "ProjectileAmount", 1))).withStyle(ChatFormatting.GREEN)); + } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 836a1af28..921f6a06b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -14,6 +14,9 @@ import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.network.message.send.LaserShootMessage; import com.atsuishio.superbwarfare.network.message.send.ShootMessage; import com.atsuishio.superbwarfare.network.message.send.VehicleMovementMessage; +import com.atsuishio.superbwarfare.perk.AmmoPerk; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.*; import com.atsuishio.superbwarfare.tools.animation.AnimationCurves; import net.minecraft.client.CameraType; @@ -391,8 +394,7 @@ public class ClientEventHandler { return; } - // TODO perk -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); int mode = GunsTool.getGunIntTag(stack, "FireMode"); // 精准度 @@ -411,15 +413,13 @@ public class ClientEventHandler { if (stack.is(ModTags.Items.SNIPER_RIFLE) || stack.is(ModTags.Items.HEAVY_WEAPON)) { zoomSpread = 1 - (0.995 * zoomTime); } else if (stack.is(ModTags.Items.SHOTGUN)) { -// if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { -// zoomSpread = 1 - (0.85 * zoomTime); -// } else { -// zoomSpread = 1 - (0.25 * zoomTime); -// } -// } else if (stack.is(ModItems.MINIGUN.get())) { -// zoomSpread = 1 - (0.25 * zoomTime); - zoomSpread = 1 - (0.9 * zoomTime); - // TODO perk + if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { + zoomSpread = 1 - (0.85 * zoomTime); + } else { + zoomSpread = 1 - (0.25 * zoomTime); + } + } else if (stack.is(ModItems.MINIGUN.get())) { + zoomSpread = 1 - (0.25 * zoomTime); } else { zoomSpread = 1 - (0.9 * zoomTime); } @@ -444,9 +444,8 @@ public class ClientEventHandler { } if (GunsTool.getPerkIntTag(stack, "DesperadoTimePost") > 0) { - // TODO perk -// int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.DESPERADO.get(), stack); -// rpm *= (int) (1.285 + 0.015 * perkLevel); + int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.DESPERADO.get(), stack); + rpm *= (int) (1.285 + 0.015 * perkLevel); } double rps = (double) rpm / 60; @@ -570,9 +569,8 @@ public class ClientEventHandler { } if (stack.is(ModItems.DEVOTION.get())) { - // TODO perk -// int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.TURBO_CHARGER.get(), stack); -// customRpm = Math.min(customRpm + 15 + ((perkLevel > 0 ? 5 : 0) + 3 * perkLevel), 500); + int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.TURBO_CHARGER.get(), stack); + customRpm = Math.min(customRpm + 15 + ((perkLevel > 0 ? 5 : 0) + 3 * perkLevel), 500); } if (stack.getItem() == ModItems.SENTINEL.get()) { @@ -599,15 +597,14 @@ public class ClientEventHandler { var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); if (cap != null && cap.rifleAmmo > 0 || InventoryTool.hasCreativeAmmoBox(player)) { - // TODO perk -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); float pitch = tag.getDouble("heat") <= 40 ? 1 : (float) (1 - 0.025 * Math.abs(40 - tag.getDouble("heat"))); player.playSound(ModSounds.MINIGUN_FIRE_1P.get(), 1f, pitch); -// if (perk == ModPerks.BEAST_BULLET.get()) { -// player.playSound(ModSounds.HENG.get(), 1f, 1f); -// } + if (perk == ModPerks.BEAST_BULLET.get()) { + player.playSound(ModSounds.HENG.get(), 1f, 1f); + } double shooterHeight = player.getEyePosition().distanceTo((Vec3.atLowerCornerOf(player.level().clip(new ClipContext(player.getEyePosition(), player.getEyePosition().add(new Vec3(0, -1, 0).scale(10)), ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, player)).getBlockPos()))); @@ -682,12 +679,11 @@ public class ClientEventHandler { } } - // TODO perk -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// if (perk == ModPerks.BEAST_BULLET.get()) { -// player.playSound(ModSounds.HENG.get(), 1f, 1f); -// } + if (perk == ModPerks.BEAST_BULLET.get()) { + player.playSound(ModSounds.HENG.get(), 1f, 1f); + } int barrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL); @@ -1403,18 +1399,17 @@ public class ClientEventHandler { && cap != null && !cap.edit) { if (!player.isShiftKeyDown()) { - // TODO perk -// int intelligentChipLevel = PerkHelper.getItemPerkLevel(ModPerks.INTELLIGENT_CHIP.get(), stack); -// -// if (intelligentChipLevel > 0) { -// if (ClientEventHandler.entity == null || !entity.isAlive()) { -// ClientEventHandler.entity = SeekTool.seekLivingEntity(player, player.level(), 32 + 8 * (intelligentChipLevel - 1), 16 / zoomFov); -// } -// if (entity != null && entity.isAlive()) { -// Vec3 toVec = getVec3(event, player); -// look(player, toVec); -// } -// } + int intelligentChipLevel = PerkHelper.getItemPerkLevel(ModPerks.INTELLIGENT_CHIP.get(), stack); + + if (intelligentChipLevel > 0) { + if (ClientEventHandler.entity == null || !entity.isAlive()) { + ClientEventHandler.entity = SeekTool.seekLivingEntity(player, player.level(), 32 + 8 * (intelligentChipLevel - 1), 16 / zoomFov); + } + if (entity != null && entity.isAlive()) { + Vec3 toVec = getVec3(event, player); + look(player, toVec); + } + } } else { entity = null; } diff --git a/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java index 82dddd503..44da46ed3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/GunEventHandler.java @@ -6,16 +6,22 @@ import com.atsuishio.superbwarfare.capability.player.PlayerVariable; import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity; import com.atsuishio.superbwarfare.event.events.ReloadEvent; import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.*; +import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ClipContext; @@ -27,6 +33,7 @@ import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.tick.PlayerTickEvent; import java.text.DecimalFormat; +import java.util.ArrayList; import static com.atsuishio.superbwarfare.tools.NBTTool.saveTag; @@ -107,12 +114,11 @@ public class GunEventHandler { } } - // TODO perk -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// -// if (perk == ModPerks.BEAST_BULLET.get()) { -// player.playSound(ModSounds.HENG.get(), 4f, 1f); -// } + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + + if (perk == ModPerks.BEAST_BULLET.get()) { + player.playSound(ModSounds.HENG.get(), 4f, 1f); + } float soundRadius = (float) (GunsTool.getGunDoubleTag(stack, "SoundRadius") * GunsTool.getGunDoubleTag(stack, "CustomSoundRadius", 1)); @@ -181,104 +187,101 @@ public class GunEventHandler { var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); boolean zoom = cap != null && cap.zoom; - // TODO perk -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// -// if (perk != null && perk.descriptionId.equals("butterfly_bullet")) { -// if (handleButterflyBullet(perk, stack, player)) return; -// } + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + + if (perk != null && perk.descriptionId.equals("butterfly_bullet")) { + if (handleButterflyBullet(perk, stack, player)) return; + } ProjectileEntity projectile = new ProjectileEntity(player.level()) .shooter(player) -// .damage(perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? projectileAmount * damage : damage) + .damage(perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? projectileAmount * damage : damage) .damage(damage) .headShot(headshot) .zoom(zoom); -// if (perk instanceof AmmoPerk ammoPerk) { -// int level = PerkHelper.getItemPerkLevel(perk, stack); -// -// bypassArmorRate += ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0); -// projectile.setRGB(ammoPerk.rgb); -// -// if (!ammoPerk.mobEffects.get().isEmpty()) { -// int amplifier; -// if (perk.descriptionId.equals("blade_bullet")) { -// amplifier = level / 3; -// } else if (perk.descriptionId.equals("bread_bullet")) { -// amplifier = 1; -// } else { -// amplifier = level - 1; -// } -// -// ArrayList mobEffectInstances = new ArrayList<>(); -// for (MobEffect effect : ammoPerk.mobEffects.get()) { -// mobEffectInstances.add(new MobEffectInstance(effect, 70 + 30 * level, amplifier)); -// } -// projectile.effect(mobEffectInstances); -// } -// -// if (perk.descriptionId.equals("bread_bullet")) { -// projectile.knockback(level * 0.3f); -// projectile.forceKnockback(); -// } -// } + if (perk instanceof AmmoPerk ammoPerk) { + int level = PerkHelper.getItemPerkLevel(perk, stack); + + bypassArmorRate += ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0); + projectile.setRGB(ammoPerk.rgb); + + if (!ammoPerk.mobEffects.get().isEmpty()) { + int amplifier; + if (perk.descriptionId.equals("blade_bullet")) { + amplifier = level / 3; + } else if (perk.descriptionId.equals("bread_bullet")) { + amplifier = 1; + } else { + amplifier = level - 1; + } + + ArrayList mobEffectInstances = new ArrayList<>(); + for (MobEffect effect : ammoPerk.mobEffects.get()) { + mobEffectInstances.add(new MobEffectInstance(Holder.direct(effect), 70 + 30 * level, amplifier)); + } + projectile.effect(mobEffectInstances); + } + + if (perk.descriptionId.equals("bread_bullet")) { + projectile.knockback(level * 0.3f); + projectile.forceKnockback(); + } + } bypassArmorRate = Math.max(bypassArmorRate, 0); projectile.bypassArmorRate(bypassArmorRate); -// if (perk == ModPerks.SILVER_BULLET.get()) { -// int level = PerkHelper.getItemPerkLevel(perk, stack); -// projectile.undeadMultiple(1.0f + 0.5f * level); -// } else if (perk == ModPerks.BEAST_BULLET.get()) { -// projectile.beast(); -// } else if (perk == ModPerks.JHP_BULLET.get()) { -// int level = PerkHelper.getItemPerkLevel(perk, stack); -// projectile.jhpBullet(level); -// } else if (perk == ModPerks.HE_BULLET.get()) { -// int level = PerkHelper.getItemPerkLevel(perk, stack); -// projectile.heBullet(level); -// } else if (perk == ModPerks.INCENDIARY_BULLET.get()) { -// int level = PerkHelper.getItemPerkLevel(perk, stack); -// projectile.fireBullet(level, stack.is(ModTags.Items.SHOTGUN)); -// } -// -// var dmgPerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); -// if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { -// int level = PerkHelper.getItemPerkLevel(dmgPerk, stack); -// projectile.monsterMultiple(0.1f + 0.1f * level); -// } + if (perk == ModPerks.SILVER_BULLET.get()) { + int level = PerkHelper.getItemPerkLevel(perk, stack); + projectile.undeadMultiple(1.0f + 0.5f * level); + } else if (perk == ModPerks.BEAST_BULLET.get()) { + projectile.beast(); + } else if (perk == ModPerks.JHP_BULLET.get()) { + int level = PerkHelper.getItemPerkLevel(perk, stack); + projectile.jhpBullet(level); + } else if (perk == ModPerks.HE_BULLET.get()) { + int level = PerkHelper.getItemPerkLevel(perk, stack); + projectile.heBullet(level); + } else if (perk == ModPerks.INCENDIARY_BULLET.get()) { + int level = PerkHelper.getItemPerkLevel(perk, stack); + projectile.fireBullet(level, stack.is(ModTags.Items.SHOTGUN)); + } + + var dmgPerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); + if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { + int level = PerkHelper.getItemPerkLevel(dmgPerk, stack); + projectile.monsterMultiple(0.1f + 0.1f * level); + } 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, player.getLookAngle().x, player.getLookAngle().y + 0.001f, player.getLookAngle().z, -// TODO perk incendiary bullet -// stack.is(ModTags.Items.SHOTGUN) && perk == ModPerks.INCENDIARY_BULLET.get() ? 4.5f : velocity, - velocity, - (float) spared); + projectile.shoot(player, player.getLookAngle().x, player.getLookAngle().y + 0.001f, player.getLookAngle().z, stack.is(ModTags.Items.SHOTGUN) && perk == ModPerks.INCENDIARY_BULLET.get() ? 4.5f : velocity, (float) spared); player.level().addFreshEntity(projectile); } } public static double perkDamage(ItemStack stack) { -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// if (perk instanceof AmmoPerk ammoPerk) { -// return ammoPerk.damageRate; -// } + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk) { + return ammoPerk.damageRate; + } return 1; } public static double perkSpeed(ItemStack stack) { -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// if (perk instanceof AmmoPerk ammoPerk) { -// return ammoPerk.speedRate; -// } + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk) { + return ammoPerk.speedRate; + } return 1; } + // TODO 这还有联动的必要吗( @SuppressWarnings("ConstantValue") private static boolean handleButterflyBullet(Perk perk, ItemStack heldItem, Player player) { + return true; // int perkLevel = PerkHelper.getItemPerkLevel(perk, heldItem); - +// // var entityType = CompatHolder.VRC_RAIN_SHOWER_BUTTERFLY; // if (entityType != null) { // Projectile projectile = entityType.create(player.level()); @@ -304,8 +307,8 @@ public class GunEventHandler { // player.level().addFreshEntity(projectile); // return true; // } - - return false; +// +// return false; } /** diff --git a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java index 9ea77ffac..9906b696f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java @@ -16,6 +16,10 @@ import com.atsuishio.superbwarfare.event.events.PreKillEvent; import com.atsuishio.superbwarfare.init.*; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.network.message.receive.ClientIndicatorMessage; +import com.atsuishio.superbwarfare.network.message.receive.PlayerGunKillMessage; +import com.atsuishio.superbwarfare.perk.AmmoPerk; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.*; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -129,19 +133,19 @@ public class LivingEventHandler { ItemStack stack = sourceEntity instanceof LivingEntity living ? living.getMainHandItem() : ItemStack.EMPTY; - // TODO perk - // var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); // 距离衰减 if (DamageTypeTool.isGunDamage(source)) { double distance = entity.position().distanceTo(sourceEntity.position()); if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) { -// if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { -// damage = reduceDamageByDistance(amount, distance, 0.015, 30); -// } else { + if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { + damage = reduceDamageByDistance(amount, distance, 0.015, 30); + } else { damage = reduceDamageByDistance(amount, distance, 0.05, 15); -// } + } } else if (stack.is(ModTags.Items.USE_SNIPER_AMMO)) { damage = reduceDamageByDistance(amount, distance, 0.001, 150); } else if (stack.is(ModTags.Items.USE_HEAVY_AMMO)) { @@ -208,10 +212,7 @@ public class LivingEventHandler { // 先处理发射器类武器或高爆弹的爆炸伤害 if (source.is(ModDamageTypes.PROJECTILE_BOOM)) { - if (stack.is(ModTags.Items.LAUNCHER) - // TODO perk -// || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), stack) > 0 - ) { + if (stack.is(ModTags.Items.LAUNCHER) || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), stack) > 0) { GunsTool.setGunDoubleTag(stack, "Exp", GunsTool.getGunDoubleTag(stack, "Exp", 0) + amount); } } @@ -234,10 +235,7 @@ public class LivingEventHandler { // 先处理发射器类武器或高爆弹的爆炸伤害 if (source.is(ModDamageTypes.PROJECTILE_BOOM)) { - if (stack.is(ModTags.Items.LAUNCHER) - // TODO perk -// || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), stack) > 0 - ) { + if (stack.is(ModTags.Items.LAUNCHER) || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), stack) > 0) { GunsTool.setGunDoubleTag(stack, "Exp", GunsTool.getGunDoubleTag(stack, "Exp", 0) + amount); } } @@ -299,9 +297,13 @@ public class LivingEventHandler { if (!sourceEntity.level().isClientSide() && sourceEntity instanceof ServerPlayer player) { // TODO pre kill event -// if (NeoForge.EVENT_BUS.post(new PreKillEvent.Indicator(player, source, event.getEntity()))) { -// return; -// } + if (false +// NeoForge.EVENT_BUS.post( +// new PreKillEvent.Indicator(player, source, event.getEntity()) +// ) + ) { + return; + } SoundTool.playLocalSound(player, ModSounds.TARGET_DOWN.get(), 3f, 1f); PacketDistributor.sendToPlayer(player, new ClientIndicatorMessage(2, 8)); @@ -416,15 +418,15 @@ public class LivingEventHandler { } NBTTool.saveTag(newStack, newTag); - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.KILLING_TALLY.get(), newStack); -// if (level != 0) { -// GunsTool.setPerkIntTag(newStack, "KillingTally", 0); -// } -// -// if (player.level() instanceof ServerLevel) { + int level = PerkHelper.getItemPerkLevel(ModPerks.KILLING_TALLY.get(), newStack); + if (level != 0) { + GunsTool.setPerkIntTag(newStack, "KillingTally", 0); + } + + if (player.level() instanceof ServerLevel) { + // TODO draw client msg // ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new DrawClientMessage(true)); -// } + } var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); if (cap != null) { @@ -468,10 +470,9 @@ public class LivingEventHandler { if (attacker != null && MiscConfig.SEND_KILL_FEEDBACK.get()) { if (DamageTypeTool.isHeadshotDamage(source)) { - // TODO player gun kill msg -// ModUtils.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerGunKillMessage(attacker.getId(), entity.getId(), true, damageTypeResourceKey)); + PacketDistributor.sendToAllPlayers(new PlayerGunKillMessage(attacker.getId(), entity.getId(), true, damageTypeResourceKey)); } else { -// ModUtils.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerGunKillMessage(attacker.getId(), entity.getId(), false, damageTypeResourceKey)); + PacketDistributor.sendToAllPlayers(new PlayerGunKillMessage(attacker.getId(), entity.getId(), false, damageTypeResourceKey)); } } } @@ -514,15 +515,14 @@ public class LivingEventHandler { } if (source.getDirectEntity() instanceof ProjectileEntity projectile) { - // TODO perk -// if (PerkHelper.getItemPerkLevel(ModPerks.FOURTH_TIMES_CHARM.get(), stack) > 0) { -// float bypassArmorRate = projectile.getBypassArmorRate(); -// if (bypassArmorRate >= 1.0f && source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE)) { -// handleFourthTimesCharm(stack); -// } else if (source.is(ModDamageTypes.GUN_FIRE_HEADSHOT)) { -// handleFourthTimesCharm(stack); -// } -// } + if (PerkHelper.getItemPerkLevel(ModPerks.FOURTH_TIMES_CHARM.get(), stack) > 0) { + float bypassArmorRate = projectile.getBypassArmorRate(); + if (bypassArmorRate >= 1.0f && source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE)) { + handleFourthTimesCharm(stack); + } else if (source.is(ModDamageTypes.GUN_FIRE_HEADSHOT)) { + handleFourthTimesCharm(stack); + } + } if (!projectile.isZoom()) { handleFieldDoctor(stack, event, attacker); @@ -569,91 +569,83 @@ public class LivingEventHandler { } private static void handleClipPerks(ItemStack stack) { - // TODO perk -// int healClipLevel = PerkHelper.getItemPerkLevel(ModPerks.HEAL_CLIP.get(), stack); -// if (healClipLevel != 0) { -// GunsTool.setPerkIntTag(stack, "HealClipTime", 80 + healClipLevel * 20); -// } -// -// int killClipLevel = PerkHelper.getItemPerkLevel(ModPerks.KILL_CLIP.get(), stack); -// if (killClipLevel != 0) { -// GunsTool.setPerkIntTag(stack, "KillClipReloadTime", 80); -// } + int healClipLevel = PerkHelper.getItemPerkLevel(ModPerks.HEAL_CLIP.get(), stack); + if (healClipLevel != 0) { + GunsTool.setPerkIntTag(stack, "HealClipTime", 80 + healClipLevel * 20); + } + + int killClipLevel = PerkHelper.getItemPerkLevel(ModPerks.KILL_CLIP.get(), stack); + if (killClipLevel != 0) { + GunsTool.setPerkIntTag(stack, "KillClipReloadTime", 80); + } } private static void handleKillClipDamage(ItemStack stack, LivingIncomingDamageEvent event) { - // TODO perk -// if (GunsTool.getPerkIntTag(stack, "KillClipTime") > 0) { -// int level = PerkHelper.getItemPerkLevel(ModPerks.KILL_CLIP.get(), stack); -// if (level == 0) { -// return; -// } -// -// event.setAmount(event.getAmount() * (1.2f + 0.05f * level)); -// } + if (GunsTool.getPerkIntTag(stack, "KillClipTime") > 0) { + int level = PerkHelper.getItemPerkLevel(ModPerks.KILL_CLIP.get(), stack); + if (level == 0) { + return; + } + + event.setAmount(event.getAmount() * (1.2f + 0.05f * level)); + } } private static void handleGutshotStraightDamage(ItemStack stack, LivingIncomingDamageEvent event) { - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.GUTSHOT_STRAIGHT.get(), stack); -// if (level == 0) { -// return; -// } + int level = PerkHelper.getItemPerkLevel(ModPerks.GUTSHOT_STRAIGHT.get(), stack); + if (level == 0) { + return; + } -// event.setAmount(event.getAmount() * (1.15f + 0.05f * level)); + event.setAmount(event.getAmount() * (1.15f + 0.05f * level)); } private static void handleKillingTallyDamage(ItemStack stack, LivingIncomingDamageEvent event) { - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.KILLING_TALLY.get(), stack); -// if (level == 0) { -// return; -// } -// -// int killTally = GunsTool.getPerkIntTag(stack, "KillingTally"); -// if (killTally == 0) { -// return; -// } -// -// event.setAmount(event.getAmount() * (1.0f + (0.1f * level) * killTally)); + int level = PerkHelper.getItemPerkLevel(ModPerks.KILLING_TALLY.get(), stack); + if (level == 0) { + return; + } + + int killTally = GunsTool.getPerkIntTag(stack, "KillingTally"); + if (killTally == 0) { + return; + } + + event.setAmount(event.getAmount() * (1.0f + (0.1f * level) * killTally)); } private static void handleKillingTallyAddCount(ItemStack stack) { - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.KILLING_TALLY.get(), stack); -// if (level != 0) { -// GunsTool.setPerkIntTag(stack, "KillingTally", Math.min(3, GunsTool.getPerkIntTag(stack, "KillingTally") + 1)); -// } + int level = PerkHelper.getItemPerkLevel(ModPerks.KILLING_TALLY.get(), stack); + if (level != 0) { + GunsTool.setPerkIntTag(stack, "KillingTally", Math.min(3, GunsTool.getPerkIntTag(stack, "KillingTally") + 1)); + } } private static void handleFourthTimesCharm(ItemStack stack) { - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.FOURTH_TIMES_CHARM.get(), stack); -// if (level == 0) { -// return; -// } -// -// int fourthTimesCharmTick = GunsTool.getPerkIntTag(stack, "FourthTimesCharmTick"); -// if (fourthTimesCharmTick <= 0) { -// GunsTool.setPerkIntTag(stack, "FourthTimesCharmTick", 40 + 10 * level); -// GunsTool.setPerkIntTag(stack, "FourthTimesCharmCount", 1); -// } else { -// int count = GunsTool.getPerkIntTag(stack, "FourthTimesCharmCount"); -// if (count < 4) { -// GunsTool.setPerkIntTag(stack, "FourthTimesCharmCount", Math.min(4, count + 1)); -// } -// } + int level = PerkHelper.getItemPerkLevel(ModPerks.FOURTH_TIMES_CHARM.get(), stack); + if (level == 0) { + return; + } + + int fourthTimesCharmTick = GunsTool.getPerkIntTag(stack, "FourthTimesCharmTick"); + if (fourthTimesCharmTick <= 0) { + GunsTool.setPerkIntTag(stack, "FourthTimesCharmTick", 40 + 10 * level); + GunsTool.setPerkIntTag(stack, "FourthTimesCharmCount", 1); + } else { + int count = GunsTool.getPerkIntTag(stack, "FourthTimesCharmCount"); + if (count < 4) { + GunsTool.setPerkIntTag(stack, "FourthTimesCharmCount", Math.min(4, count + 1)); + } + } } private static void handleSubsistence(ItemStack stack, Player player) { - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.SUBSISTENCE.get(), stack); -// if (level == 0) { -// return; -// } -// -// float rate = level * 0.1f + (stack.is(ModTags.Items.SMG) || stack.is(ModTags.Items.RIFLE) ? 0.07f : 0f); - float rate = 1; + int level = PerkHelper.getItemPerkLevel(ModPerks.SUBSISTENCE.get(), stack); + if (level == 0) { + return; + } + + float rate = level * 0.1f + (stack.is(ModTags.Items.SMG) || stack.is(ModTags.Items.RIFLE) ? 0.07f : 0f); var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); if (cap == null) return; @@ -687,48 +679,44 @@ public class LivingEventHandler { private static void handleFieldDoctor(ItemStack stack, LivingIncomingDamageEvent event, Player player) { - // TODO perk - // int level = PerkHelper.getItemPerkLevel(ModPerks.FIELD_DOCTOR.get(), stack); - // if (level == 0) { - // return; - // } - // - // if (event.getEntity().isAlliedTo(player)) { - // event.getEntity().heal(event.getAmount() * Math.min(1.0f, 0.25f + 0.05f * level)); - // event.setCanceled(true); - // } + int level = PerkHelper.getItemPerkLevel(ModPerks.FIELD_DOCTOR.get(), stack); + if (level == 0) { + return; + } + + if (event.getEntity().isAlliedTo(player)) { + event.getEntity().heal(event.getAmount() * Math.min(1.0f, 0.25f + 0.05f * level)); + event.setCanceled(true); + } } private static void handleHeadSeekerTime(ItemStack stack) { - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.HEAD_SEEKER.get(), stack); -// if (level == 0) { -// return; -// } -// -// GunsTool.setPerkIntTag(stack, "HeadSeeker", 11 + level * 2); + int level = PerkHelper.getItemPerkLevel(ModPerks.HEAD_SEEKER.get(), stack); + if (level == 0) { + return; + } + + GunsTool.setPerkIntTag(stack, "HeadSeeker", 11 + level * 2); } private static void handleHeadSeekerDamage(ItemStack stack, LivingIncomingDamageEvent event) { - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.HEAD_SEEKER.get(), stack); -// if (level == 0) { -// return; -// } -// -// if (GunsTool.getPerkIntTag(stack, "HeadSeeker") > 0) { -// event.setAmount(event.getAmount() * (1.095f + 0.0225f * level)); -// } + int level = PerkHelper.getItemPerkLevel(ModPerks.HEAD_SEEKER.get(), stack); + if (level == 0) { + return; + } + + if (GunsTool.getPerkIntTag(stack, "HeadSeeker") > 0) { + event.setAmount(event.getAmount() * (1.095f + 0.0225f * level)); + } } private static void handleDesperado(ItemStack stack) { - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.DESPERADO.get(), stack); -// if (level == 0) { -// return; -// } -// -// GunsTool.setPerkIntTag(stack, "DesperadoTime", 90 + level * 10); + int level = PerkHelper.getItemPerkLevel(ModPerks.DESPERADO.get(), stack); + if (level == 0) { + return; + } + + GunsTool.setPerkIntTag(stack, "DesperadoTime", 90 + level * 10); } /** @@ -793,17 +781,16 @@ public class LivingEventHandler { return; } - // TODO perk -// if (stack.is(ModTags.Items.GUN) && PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), stack) > 0 && (DamageTypeTool.isGunDamage(source) || DamageTypeTool.isExplosionDamage(source))) { -// var drops = event.getDrops(); -// drops.forEach(itemEntity -> { -// ItemStack item = itemEntity.getItem(); -// if (!player.addItem(item)) { -// player.drop(item, false); -// } -// }); -// event.setCanceled(true); -// } + if (stack.is(ModTags.Items.GUN) && PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), stack) > 0 && (DamageTypeTool.isGunDamage(source) || DamageTypeTool.isExplosionDamage(source))) { + var drops = event.getDrops(); + drops.forEach(itemEntity -> { + ItemStack item = itemEntity.getItem(); + if (!player.addItem(item)) { + player.drop(item, false); + } + }); + event.setCanceled(true); + } } @SubscribeEvent @@ -820,13 +807,12 @@ public class LivingEventHandler { ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return; - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), stack); -// if (level > 0) { -// player.giveExperiencePoints((int) (event.getDroppedExperience() * (0.8f + 0.2f * level))); -// -// event.setCanceled(true); -// } + int level = PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), stack); + if (level > 0) { + player.giveExperiencePoints((int) (event.getDroppedExperience() * (0.8f + 0.2f * level))); + + event.setCanceled(true); + } } public static void handlePlayerBeamReset(Player player) { @@ -838,9 +824,8 @@ public class LivingEventHandler { private static void handleVorpalWeaponDamage(ItemStack stack, LivingIncomingDamageEvent event) { var entity = event.getEntity(); - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.VORPAL_WEAPON.get(), stack); - int level = 0; + + int level = PerkHelper.getItemPerkLevel(ModPerks.VORPAL_WEAPON.get(), stack); if (level <= 0) return; if (entity.getHealth() < 100.0f) return; diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ReloadEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ReloadEventHandler.java index 4e4eb383c..0bf0ca2cf 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ReloadEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ReloadEventHandler.java @@ -1,13 +1,17 @@ package com.atsuishio.superbwarfare.event; import com.atsuishio.superbwarfare.event.events.ReloadEvent; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; 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 java.util.List; + @EventBusSubscriber public class ReloadEventHandler { @@ -61,17 +65,16 @@ public class ReloadEventHandler { return; } - // TODO perk -// int healClipLevel = PerkHelper.getItemPerkLevel(ModPerks.HEAL_CLIP.get(), stack); -// if (healClipLevel == 0) { -// healClipLevel = 1; -// } -// -// player.heal(12.0f * (0.8f + 0.2f * healClipLevel)); -// List 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))); + int healClipLevel = PerkHelper.getItemPerkLevel(ModPerks.HEAL_CLIP.get(), stack); + if (healClipLevel == 0) { + healClipLevel = 1; + } + + player.heal(12.0f * (0.8f + 0.2f * healClipLevel)); + List 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) { @@ -89,19 +92,17 @@ public class ReloadEventHandler { return; } - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.KILL_CLIP.get(), stack); -// GunsTool.setPerkIntTag(stack, "KillClipTime", 90 + 10 * level); + int level = PerkHelper.getItemPerkLevel(ModPerks.KILL_CLIP.get(), stack); + GunsTool.setPerkIntTag(stack, "KillClipTime", 90 + 10 * level); } private static void handleKillingTallyPre(ItemStack stack) { - // TODO perk -// int level = PerkHelper.getItemPerkLevel(ModPerks.KILLING_TALLY.get(), stack); -// if (level == 0) { -// return; -// } -// -// GunsTool.setPerkIntTag(stack, "KillingTally", 0); + int level = PerkHelper.getItemPerkLevel(ModPerks.KILLING_TALLY.get(), stack); + if (level == 0) { + return; + } + + GunsTool.setPerkIntTag(stack, "KillingTally", 0); } private static void handleDesperadoPre(ItemStack stack) { @@ -115,12 +116,11 @@ public class ReloadEventHandler { } private static void handleDesperadoPost(ItemStack stack) { - // TODO perk -// if (!GunsTool.getPerkBooleanTag(stack, "Desperado")) { -// return; -// } -// -// int level = PerkHelper.getItemPerkLevel(ModPerks.DESPERADO.get(), stack); -// GunsTool.setPerkIntTag(stack, "DesperadoTimePost", 110 + level * 10); + if (!GunsTool.getPerkBooleanTag(stack, "Desperado")) { + return; + } + + int level = PerkHelper.getItemPerkLevel(ModPerks.DESPERADO.get(), stack); + GunsTool.setPerkIntTag(stack, "DesperadoTimePost", 110 + level * 10); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java index 93724566c..52b3c9377 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java @@ -5,9 +5,11 @@ import com.atsuishio.superbwarfare.capability.ModCapabilities; import com.atsuishio.superbwarfare.client.PoseTool; import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent; import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.CustomRendererItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.AmmoType; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; @@ -180,17 +182,16 @@ public abstract class GunItem extends Item implements CustomRendererItem { reducePerkTagCoolDown(stack, "HealClipTime", "KillClipReloadTime", "KillClipTime", "FourthTimesCharmTick", "HeadSeeker", "DesperadoTime", "DesperadoTimePost"); - // TODO perk -// if (PerkHelper.getItemPerkLevel(ModPerks.FOURTH_TIMES_CHARM.get(), stack) > 0) { -// int count = GunsTool.getPerkIntTag(stack, "FourthTimesCharmCount"); -// if (count >= 4) { -// GunsTool.setPerkIntTag(stack, "FourthTimesCharmTick", 0); -// GunsTool.setPerkIntTag(stack, "FourthTimesCharmCount", 0); -// -// int mag = GunsTool.getGunIntTag(stack, "Magazine", 0) + GunsTool.getGunIntTag(stack, "CustomMagazine", 0); -// GunsTool.setGunIntTag(stack, "Ammo", Math.min(mag, GunsTool.getGunIntTag(stack, "Ammo", 0) + 2)); -// } -// } + if (PerkHelper.getItemPerkLevel(ModPerks.FOURTH_TIMES_CHARM.get(), stack) > 0) { + int count = GunsTool.getPerkIntTag(stack, "FourthTimesCharmCount"); + if (count >= 4) { + GunsTool.setPerkIntTag(stack, "FourthTimesCharmTick", 0); + GunsTool.setPerkIntTag(stack, "FourthTimesCharmCount", 0); + + int mag = GunsTool.getGunIntTag(stack, "Magazine", 0) + GunsTool.getGunIntTag(stack, "CustomMagazine", 0); + GunsTool.setGunIntTag(stack, "Ammo", Math.min(mag, GunsTool.getGunIntTag(stack, "Ammo", 0) + 2)); + } + } } private void handleGunAttachment(ItemStack stack) { diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock17Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock17Item.java index 4f193ad6f..aad5b0340 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock17Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock17Item.java @@ -8,6 +8,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -118,9 +119,7 @@ public class Glock17Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // TODO perk -// return PerkHelper.HANDGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.HANDGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock18Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock18Item.java index 5ed7e7dd5..0137fba8f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock18Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock18Item.java @@ -4,10 +4,12 @@ import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.client.renderer.item.Glock18ItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -120,9 +122,7 @@ public class Glock18Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.HANDGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get(); + return PerkHelper.HANDGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get(); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/M1911Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/M1911Item.java index 52389aa1c..6a36151c9 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/M1911Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/M1911Item.java @@ -8,6 +8,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -121,9 +122,7 @@ public class M1911Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.HANDGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.HANDGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Mp443Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Mp443Item.java index 5c282b47d..b9e1ff0ce 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Mp443Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Mp443Item.java @@ -8,6 +8,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -118,9 +119,7 @@ public class Mp443Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.HANDGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.HANDGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Trachelium.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Trachelium.java index f725ba0c9..704e485ba 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Trachelium.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Trachelium.java @@ -10,6 +10,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.ChatFormatting; @@ -293,9 +294,7 @@ public class Trachelium extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.HANDGUN_PERKS.test(perk); + return PerkHelper.HANDGUN_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/heavy/Ntw20Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/heavy/Ntw20Item.java index fe449e96c..73bac03a5 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/heavy/Ntw20Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/heavy/Ntw20Item.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -166,9 +167,7 @@ public class Ntw20Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java index 2dc71d009..9bd0f3335 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java @@ -11,6 +11,7 @@ import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.*; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -221,9 +222,7 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.LAUNCHER_PERKS.test(perk); + return PerkHelper.LAUNCHER_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java index fb0be5042..4b02f4c72 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java @@ -6,11 +6,13 @@ import com.atsuishio.superbwarfare.client.renderer.item.M79ItemRenderer; import com.atsuishio.superbwarfare.client.tooltip.component.LauncherImageComponent; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -142,9 +144,7 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.LAUNCHER_PERKS.test(perk) || perk == ModPerks.MICRO_MISSILE.get(); + return PerkHelper.LAUNCHER_PERKS.test(perk) || perk == ModPerks.MICRO_MISSILE.get(); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java index c3274bafb..fa4e1c1dd 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java @@ -6,11 +6,13 @@ import com.atsuishio.superbwarfare.client.renderer.item.RpgItemRenderer; import com.atsuishio.superbwarfare.client.tooltip.component.LauncherImageComponent; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -156,9 +158,7 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.LAUNCHER_PERKS.test(perk) || perk == ModPerks.MICRO_MISSILE.get(); + return PerkHelper.LAUNCHER_PERKS.test(perk) || perk == ModPerks.MICRO_MISSILE.get(); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java index 7ccd067eb..b32d39a3f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java @@ -6,10 +6,12 @@ import com.atsuishio.superbwarfare.client.renderer.item.SecondaryCataclysmRender import com.atsuishio.superbwarfare.client.tooltip.component.SecondaryCataclysmImageComponent; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -221,9 +223,7 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.LAUNCHER_PERKS.test(perk) || perk == ModPerks.MICRO_MISSILE.get(); + return PerkHelper.LAUNCHER_PERKS.test(perk) || perk == ModPerks.MICRO_MISSILE.get(); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/DevotionItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/DevotionItem.java index 822173aa1..465a832f0 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/DevotionItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/DevotionItem.java @@ -4,10 +4,12 @@ import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.client.renderer.item.DevotionItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -103,9 +105,7 @@ public class DevotionItem extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.MACHINE_GUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get() || perk == ModPerks.TURBO_CHARGER.get(); + return PerkHelper.MACHINE_GUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get() || perk == ModPerks.TURBO_CHARGER.get(); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java index faa5084b2..f846b04f0 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java @@ -4,10 +4,12 @@ import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.client.renderer.item.M60ItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -134,9 +136,7 @@ public class M60Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.MACHINE_GUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get(); + return PerkHelper.MACHINE_GUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get(); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/RpkItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/RpkItem.java index 4dcf7fe7e..2cf730dbe 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/RpkItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/RpkItem.java @@ -4,10 +4,12 @@ import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.client.renderer.item.RpkItemRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -103,9 +105,7 @@ public class RpkItem extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.MACHINE_GUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get(); + return PerkHelper.MACHINE_GUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get(); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK12Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK12Item.java index aba48d814..d426b5a0d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK12Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK12Item.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -175,9 +176,7 @@ public class AK12Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK47Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK47Item.java index 2a636def7..88c2cfe10 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK47Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK47Item.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -185,9 +186,7 @@ public class AK47Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Hk416Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Hk416Item.java index 5e210f171..06ff65d44 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Hk416Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Hk416Item.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -185,9 +186,7 @@ public class Hk416Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/M4Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/M4Item.java index 3bf173968..584ac69d1 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/M4Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/M4Item.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -27,6 +28,7 @@ import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; +import javax.annotation.ParametersAreNonnullByDefault; import java.util.Set; public class M4Item extends GunItem implements GeoItem { @@ -146,6 +148,7 @@ public class M4Item extends GunItem implements GeoItem { } @Override + @ParametersAreNonnullByDefault public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { super.inventoryTick(stack, world, entity, slot, selected); @@ -184,9 +187,7 @@ public class M4Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/MarlinItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/MarlinItem.java index cbcb847f9..350d84868 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/MarlinItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/MarlinItem.java @@ -8,6 +8,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -139,9 +140,7 @@ public class MarlinItem extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Mk14Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Mk14Item.java index af2b4c123..1d30a2c8b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Mk14Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Mk14Item.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -183,9 +184,7 @@ public class Mk14Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Qbz95Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Qbz95Item.java index 703922732..e251cb92a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Qbz95Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Qbz95Item.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -187,9 +188,7 @@ public class Qbz95Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/SksItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/SksItem.java index 42dd96583..31b1c84d1 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/SksItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/SksItem.java @@ -8,6 +8,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -119,9 +120,7 @@ public class SksItem extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/Aa12Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/Aa12Item.java index 6cf350e99..9d51c8ba3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/Aa12Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/Aa12Item.java @@ -5,10 +5,12 @@ import com.atsuishio.superbwarfare.client.renderer.item.Aa12ItemRenderer; import com.atsuishio.superbwarfare.client.tooltip.component.ShotgunImageComponent; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -131,9 +133,7 @@ public class Aa12Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.SHOTGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get(); + return PerkHelper.SHOTGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get(); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java index 661323261..5299692e3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -107,9 +108,7 @@ public class HomemadeShotgunItem extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.SHOTGUN_PERKS.test(perk); + return PerkHelper.SHOTGUN_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/M870Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/M870Item.java index e6cc13b60..352708f91 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/M870Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/M870Item.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -141,9 +142,7 @@ public class M870Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.SHOTGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.SHOTGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/smg/VectorItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/smg/VectorItem.java index a15969303..e8118a28f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/smg/VectorItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/smg/VectorItem.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -164,9 +165,7 @@ public class VectorItem extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - // TODO perk -// return PerkHelper.SMG_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); - return false; + return PerkHelper.SMG_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/HuntingRifleItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/HuntingRifleItem.java index a3c5330bf..1844a03e0 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/HuntingRifleItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/HuntingRifleItem.java @@ -8,6 +8,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -98,9 +99,7 @@ public class HuntingRifleItem extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk); + return PerkHelper.SNIPER_RIFLE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/K98Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/K98Item.java index 4ac46eb6c..a5bbd13d7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/K98Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/K98Item.java @@ -8,6 +8,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -143,9 +144,7 @@ public class K98Item extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - // TODO perk -// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk); - return false; + return PerkHelper.SNIPER_RIFLE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/M98bItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/M98bItem.java index 27b98025d..0a31e8438 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/M98bItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/M98bItem.java @@ -8,6 +8,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -120,9 +121,7 @@ public class M98bItem extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/MosinNagantItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/MosinNagantItem.java index 5827338b1..21e4f870b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/MosinNagantItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/MosinNagantItem.java @@ -8,6 +8,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -143,9 +144,7 @@ public class MosinNagantItem extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk); + return PerkHelper.SNIPER_RIFLE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java index a46c13256..92a2d1573 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -184,9 +185,7 @@ public class SentinelItem extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // TODO perk -// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SvdItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SvdItem.java index 334ee56eb..63e90f18f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SvdItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SvdItem.java @@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.client.Minecraft; @@ -147,9 +148,7 @@ public class SvdItem extends GunItem implements GeoItem { @Override public boolean canApplyPerk(Perk perk) { - return false; - // todo perk -// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java index f5c1e2596..2aebd37b5 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java @@ -12,6 +12,7 @@ import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.InventoryTool; import com.atsuishio.superbwarfare.tools.SoundTool; @@ -165,8 +166,7 @@ public class BocekItem extends GunItem implements GeoItem, SpecialFireWeapon { ItemStack stack = player.getMainHandItem(); - // TODO perk -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); if (player instanceof ServerPlayer serverPlayer) { SoundTool.stopSound(serverPlayer, ModSounds.BOCEK_PULL_1P.getId(), SoundSource.PLAYERS); @@ -193,13 +193,13 @@ public class BocekItem extends GunItem implements GeoItem, SpecialFireWeapon { player.playSound(ModSounds.BOCEK_SHATTER_CAP_FIRE_3P.get(), 2, 1); } -// if (perk == ModPerks.BEAST_BULLET.get()) { -// player.playSound(ModSounds.HENG.get(), 4f, 1f); -// -// if (player instanceof ServerPlayer serverPlayer) { -// SoundTool.playLocalSound(serverPlayer, ModSounds.HENG.get(), 4f, 1f); -// } -// } + if (perk == ModPerks.BEAST_BULLET.get()) { + player.playSound(ModSounds.HENG.get(), 4f, 1f); + + if (player instanceof ServerPlayer serverPlayer) { + SoundTool.playLocalSound(serverPlayer, ModSounds.HENG.get(), 4f, 1f); + } + } player.getCooldowns().addCooldown(stack.getItem(), 7); GunsTool.setGunIntTag(stack, "ArrowEmpty", 7); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java index c1abc5be2..a82b2f587 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java @@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.capability.ModCapabilities; import com.atsuishio.superbwarfare.client.renderer.item.TaserItemRenderer; import com.atsuishio.superbwarfare.client.tooltip.component.EnergyImageComponent; +import com.atsuishio.superbwarfare.entity.projectile.TaserBulletEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModPerks; @@ -12,6 +13,7 @@ import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.NBTTool; import com.atsuishio.superbwarfare.tools.SoundTool; @@ -37,6 +39,7 @@ import software.bernie.geckolib.animation.*; import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; +import javax.annotation.ParametersAreNonnullByDefault; import java.util.Optional; import java.util.Set; import java.util.function.Supplier; @@ -145,6 +148,7 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon { } @Override + @ParametersAreNonnullByDefault public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { super.inventoryTick(stack, world, entity, slot, selected); @@ -152,13 +156,12 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon { GunsTool.setGunIntTag(stack, "MaxAmmo", getAmmoCount(player)); } - // TODO perk -// int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.REGENERATION.get(), stack); + int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.REGENERATION.get(), stack); var stackStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); -// if (stackStorage != null) { -// stackStorage.receiveEnergy(perkLevel, false); -// } + if (stackStorage != null) { + stackStorage.receiveEnergy(perkLevel, false); + } if (entity instanceof Player player) { for (var cell : player.getInventory().items) { @@ -231,9 +234,7 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon { ItemStack stack = player.getMainHandItem(); if (GunsTool.getGunBooleanTag(stack, "Reloading")) return; - // TODO perk -// int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), stack); - int perkLevel = 0; + int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), stack); var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); var hasEnoughEnergy = energyStorage != null && energyStorage.getEnergyStored() >= 400 + 100 * perkLevel; @@ -249,27 +250,24 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon { boolean zoom = cap != null && cap.zoom; double spread = GunsTool.getGunDoubleTag(stack, "Spread"); - // TODO perk -// int volt = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), stack); -// int wireLength = PerkHelper.getItemPerkLevel(ModPerks.LONGER_WIRE.get(), stack); - int volt = 0; - int wireLength = 0; + int volt = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), stack); + int wireLength = PerkHelper.getItemPerkLevel(ModPerks.LONGER_WIRE.get(), stack); SoundTool.playLocalSound(serverPlayer, ModSounds.TASER_FIRE_1P.get(), 1, 1); serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.TASER_FIRE_3P.get(), SoundSource.PLAYERS, 1, 1); var level = serverPlayer.level(); - // TODO taser bullet -// TaserBulletEntity taserBulletProjectile = new TaserBulletEntity(player, level, -// (float) GunsTool.getGunDoubleTag(stack, "Damage", 0), volt, wireLength); -// -// taserBulletProjectile.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ()); -// taserBulletProjectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) GunsTool.getGunDoubleTag(stack, "Velocity", 0), -// (float) (zoom ? 0.1 : spread)); -// level.addFreshEntity(taserBulletProjectile); -// -// ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShootClientMessage(10)); + TaserBulletEntity taserBulletProjectile = new TaserBulletEntity(player, level, + (float) GunsTool.getGunDoubleTag(stack, "Damage", 0), volt, wireLength); + + taserBulletProjectile.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ()); + taserBulletProjectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) GunsTool.getGunDoubleTag(stack, "Velocity", 0), + (float) (zoom ? 0.1 : spread)); + level.addFreshEntity(taserBulletProjectile); + + // TODO shoot client msg +// PacketDistributor.sendToPlayer(serverPlayer, new ShootClientMessage(10)); } GunsTool.setGunIntTag(stack, "Ammo", GunsTool.getGunIntTag(stack, "Ammo", 0) - 1); diff --git a/src/main/java/com/atsuishio/superbwarfare/menu/ReforgingTableMenu.java b/src/main/java/com/atsuishio/superbwarfare/menu/ReforgingTableMenu.java index cef6eb17b..4068b80c9 100644 --- a/src/main/java/com/atsuishio/superbwarfare/menu/ReforgingTableMenu.java +++ b/src/main/java/com/atsuishio/superbwarfare/menu/ReforgingTableMenu.java @@ -4,7 +4,10 @@ import com.atsuishio.superbwarfare.init.ModBlocks; import com.atsuishio.superbwarfare.init.ModMenuTypes; import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.item.PerkItem; +import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; +import com.atsuishio.superbwarfare.tools.GunsTool; import net.minecraft.util.Mth; import net.minecraft.world.Container; import net.minecraft.world.SimpleContainer; @@ -161,10 +164,9 @@ public class ReforgingTableMenu extends AbstractContainerMenu { ItemStack itemstack = this.container.getItem(i); if (itemstack.getItem() instanceof PerkItem perkItem) { - // TODO PerkHelper -// if (!copy.isEmpty() && PerkHelper.getItemPerkLevel(perkItem.getPerk(), copy) > 0) { -// continue; -// } + if (!copy.isEmpty() && PerkHelper.getItemPerkLevel(perkItem.getPerk(), copy) > 0) { + continue; + } } if (!itemstack.isEmpty()) { @@ -200,70 +202,69 @@ public class ReforgingTableMenu extends AbstractContainerMenu { } public void handleUpgradePoint(ItemStack stack) { - // TODO GunItem GunsTool -// if (!(stack.getItem() instanceof GunItem)) { -// return; -// } -// -// double oldPoint = GunsTool.getGunDoubleTag(stack, "UpgradePoint", 0); -// int point = (int) oldPoint; -// int newPoint = this.upgradePoint.get(); -// int delta = newPoint - point; -// -// if (delta != 0) { -// GunsTool.setGunDoubleTag(stack, "UpgradePoint", oldPoint + delta); -// } + if (!(stack.getItem() instanceof GunItem)) { + return; + } + + double oldPoint = GunsTool.getGunDoubleTag(stack, "UpgradePoint", 0); + int point = (int) oldPoint; + int newPoint = this.upgradePoint.get(); + int delta = newPoint - point; + + if (delta != 0) { + GunsTool.setGunDoubleTag(stack, "UpgradePoint", oldPoint + delta); + } } /** * 根据输入槽的枪械和Perk槽中的物品与等级,生成重铸后的武器,并放入输出槽中 */ public void generateResult() { -// ItemStack gun = this.container.getItem(INPUT_SLOT); -// if (!(gun.getItem() instanceof GunItem gunItem)) { -// return; -// } -// -// ItemStack ammo = this.container.getItem(AMMO_PERK_SLOT); -// ItemStack func = this.container.getItem(FUNC_PERK_SLOT); -// ItemStack damage = this.container.getItem(DAMAGE_PERK_SLOT); -// if (ammo.isEmpty() && func.isEmpty() && damage.isEmpty()) { -// return; -// } -// -// ItemStack result = gun.copy(); -// -// if (!ammo.isEmpty() && ammo.getItem() instanceof PerkItem perkItem) { -// if (gunItem.canApplyPerk(perkItem.getPerk())) { -// PerkHelper.setPerk(result, perkItem.getPerk(), this.ammoPerkLevel.get()); -// this.container.setItem(AMMO_PERK_SLOT, ItemStack.EMPTY); -// } -// } -// -// if (!func.isEmpty() && func.getItem() instanceof PerkItem perkItem) { -// if (gunItem.canApplyPerk(perkItem.getPerk())) { -// PerkHelper.setPerk(result, perkItem.getPerk(), this.funcPerkLevel.get()); -// this.container.setItem(FUNC_PERK_SLOT, ItemStack.EMPTY); -// } -// } -// -// if (!damage.isEmpty() && damage.getItem() instanceof PerkItem perkItem) { -// if (gunItem.canApplyPerk(perkItem.getPerk())) { -// PerkHelper.setPerk(result, perkItem.getPerk(), this.damagePerkLevel.get()); -// this.container.setItem(DAMAGE_PERK_SLOT, ItemStack.EMPTY); -// } -// } + ItemStack gun = this.container.getItem(INPUT_SLOT); + if (!(gun.getItem() instanceof GunItem gunItem)) { + return; + } -// handleUpgradePoint(result); -// -// this.ammoPerkLevel.set(0); -// this.funcPerkLevel.set(0); -// this.damagePerkLevel.set(0); -// this.upgradePoint.set(0); -// -// this.container.setItem(INPUT_SLOT, ItemStack.EMPTY); -// this.container.setItem(RESULT_SLOT, result); -// this.container.setChanged(); + ItemStack ammo = this.container.getItem(AMMO_PERK_SLOT); + ItemStack func = this.container.getItem(FUNC_PERK_SLOT); + ItemStack damage = this.container.getItem(DAMAGE_PERK_SLOT); + if (ammo.isEmpty() && func.isEmpty() && damage.isEmpty()) { + return; + } + + ItemStack result = gun.copy(); + + if (!ammo.isEmpty() && ammo.getItem() instanceof PerkItem perkItem) { + if (gunItem.canApplyPerk(perkItem.getPerk())) { + PerkHelper.setPerk(result, perkItem.getPerk(), this.ammoPerkLevel.get()); + this.container.setItem(AMMO_PERK_SLOT, ItemStack.EMPTY); + } + } + + if (!func.isEmpty() && func.getItem() instanceof PerkItem perkItem) { + if (gunItem.canApplyPerk(perkItem.getPerk())) { + PerkHelper.setPerk(result, perkItem.getPerk(), this.funcPerkLevel.get()); + this.container.setItem(FUNC_PERK_SLOT, ItemStack.EMPTY); + } + } + + if (!damage.isEmpty() && damage.getItem() instanceof PerkItem perkItem) { + if (gunItem.canApplyPerk(perkItem.getPerk())) { + PerkHelper.setPerk(result, perkItem.getPerk(), this.damagePerkLevel.get()); + this.container.setItem(DAMAGE_PERK_SLOT, ItemStack.EMPTY); + } + } + + handleUpgradePoint(result); + + this.ammoPerkLevel.set(0); + this.funcPerkLevel.set(0); + this.damagePerkLevel.set(0); + this.upgradePoint.set(0); + + this.container.setItem(INPUT_SLOT, ItemStack.EMPTY); + this.container.setItem(RESULT_SLOT, result); + this.container.setChanged(); } /** @@ -272,33 +273,33 @@ public class ReforgingTableMenu extends AbstractContainerMenu { * @param perk Perk物品 */ private void onTakePerk(ItemStack perk) { -// ItemStack gun = this.container.getItem(INPUT_SLOT); -// if (!(gun.getItem() instanceof GunItem)) { -// return; -// } -// -// if (perk.getItem() instanceof PerkItem perkItem) { -// switch (perkItem.getPerk().type) { -// case AMMO -> this.ammoPerkLevel.set(0); -// case FUNCTIONAL -> this.funcPerkLevel.set(0); -// case DAMAGE -> this.damagePerkLevel.set(0); -// } -// -// int level = PerkHelper.getItemPerkLevel(perkItem.getPerk(), gun); -// -// if (level <= 0) { -// this.upgradePoint.set((int) GunsTool.getGunDoubleTag(gun, "UpgradePoint", 0)); -// return; -// } -// -// ItemStack output = gun.copy(); -// PerkHelper.removePerkByType(output, perkItem.getPerk().type); -// GunsTool.setGunDoubleTag(output, "UpgradePoint", Math.min(MAX_UPGRADE_POINT, level - 1 + GunsTool.getGunDoubleTag(output, "UpgradePoint", 0))); -// this.upgradePoint.set((int) GunsTool.getGunDoubleTag(output, "UpgradePoint", 0)); -// -// this.container.setItem(INPUT_SLOT, output); -// this.container.setChanged(); -// } + ItemStack gun = this.container.getItem(INPUT_SLOT); + if (!(gun.getItem() instanceof GunItem)) { + return; + } + + if (perk.getItem() instanceof PerkItem perkItem) { + switch (perkItem.getPerk().type) { + case AMMO -> this.ammoPerkLevel.set(0); + case FUNCTIONAL -> this.funcPerkLevel.set(0); + case DAMAGE -> this.damagePerkLevel.set(0); + } + + int level = PerkHelper.getItemPerkLevel(perkItem.getPerk(), gun); + + if (level <= 0) { + this.upgradePoint.set((int) GunsTool.getGunDoubleTag(gun, "UpgradePoint", 0)); + return; + } + + ItemStack output = gun.copy(); + PerkHelper.removePerkByType(output, perkItem.getPerk().type); + GunsTool.setGunDoubleTag(output, "UpgradePoint", Math.min(MAX_UPGRADE_POINT, level - 1 + GunsTool.getGunDoubleTag(output, "UpgradePoint", 0))); + this.upgradePoint.set((int) GunsTool.getGunDoubleTag(output, "UpgradePoint", 0)); + + this.container.setItem(INPUT_SLOT, output); + this.container.setChanged(); + } } /** @@ -324,33 +325,33 @@ public class ReforgingTableMenu extends AbstractContainerMenu { * @param stack 输入的枪械 */ private void onPlaceGun(ItemStack stack) { -// if (!(stack.getItem() instanceof GunItem)) { -// return; -// } -// -// int point = (int) GunsTool.getGunDoubleTag(stack, "UpgradePoint", 0); -// this.upgradePoint.set(Mth.clamp(point, 0, MAX_UPGRADE_POINT)); -// -// var ammoPerk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); -// if (ammoPerk != null) { -// this.ammoPerkLevel.set(PerkHelper.getItemPerkLevel(ammoPerk, stack)); -// var ammoPerkItem = PerkHelper.getPerkItem(ammoPerk); -// ammoPerkItem.ifPresent(registryObject -> this.container.setItem(AMMO_PERK_SLOT, registryObject.get().getDefaultInstance())); -// } -// -// var funcPerk = PerkHelper.getPerkByType(stack, Perk.Type.FUNCTIONAL); -// if (funcPerk != null) { -// this.funcPerkLevel.set(PerkHelper.getItemPerkLevel(funcPerk, stack)); -// var funcPerkItem = PerkHelper.getPerkItem(funcPerk); -// funcPerkItem.ifPresent(registryObject -> this.container.setItem(FUNC_PERK_SLOT, registryObject.get().getDefaultInstance())); -// } -// -// var damagePerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); -// if (damagePerk != null) { -// this.damagePerkLevel.set(PerkHelper.getItemPerkLevel(damagePerk, stack)); -// var damagePerkItem = PerkHelper.getPerkItem(damagePerk); -// damagePerkItem.ifPresent(registryObject -> this.container.setItem(DAMAGE_PERK_SLOT, registryObject.get().getDefaultInstance())); -// } + if (!(stack.getItem() instanceof GunItem)) { + return; + } + + int point = (int) GunsTool.getGunDoubleTag(stack, "UpgradePoint", 0); + this.upgradePoint.set(Mth.clamp(point, 0, MAX_UPGRADE_POINT)); + + var ammoPerk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + if (ammoPerk != null) { + this.ammoPerkLevel.set(PerkHelper.getItemPerkLevel(ammoPerk, stack)); + var ammoPerkItem = PerkHelper.getPerkItem(ammoPerk); + ammoPerkItem.ifPresent(registryObject -> this.container.setItem(AMMO_PERK_SLOT, registryObject.get().getDefaultInstance())); + } + + var funcPerk = PerkHelper.getPerkByType(stack, Perk.Type.FUNCTIONAL); + if (funcPerk != null) { + this.funcPerkLevel.set(PerkHelper.getItemPerkLevel(funcPerk, stack)); + var funcPerkItem = PerkHelper.getPerkItem(funcPerk); + funcPerkItem.ifPresent(registryObject -> this.container.setItem(FUNC_PERK_SLOT, registryObject.get().getDefaultInstance())); + } + + var damagePerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); + if (damagePerk != null) { + this.damagePerkLevel.set(PerkHelper.getItemPerkLevel(damagePerk, stack)); + var damagePerkItem = PerkHelper.getPerkItem(damagePerk); + damagePerkItem.ifPresent(registryObject -> this.container.setItem(DAMAGE_PERK_SLOT, registryObject.get().getDefaultInstance())); + } this.container.setChanged(); this.broadcastChanges(); @@ -362,30 +363,30 @@ public class ReforgingTableMenu extends AbstractContainerMenu { * @param pStack 输入的枪械 */ private void onTakeGun(ItemStack pStack) { -// if (!(pStack.getItem() instanceof GunItem)) { -// return; -// } -// -// var ammoPerk = PerkHelper.getPerkByType(pStack, Perk.Type.AMMO); -// if (ammoPerk != null) { -// if (this.container.getItem(AMMO_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == ammoPerk) { -// this.container.setItem(AMMO_PERK_SLOT, ItemStack.EMPTY); -// } -// } -// -// var funcPerk = PerkHelper.getPerkByType(pStack, Perk.Type.FUNCTIONAL); -// if (funcPerk != null) { -// if (this.container.getItem(FUNC_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == funcPerk) { -// this.container.setItem(FUNC_PERK_SLOT, ItemStack.EMPTY); -// } -// } -// -// var damagePerk = PerkHelper.getPerkByType(pStack, Perk.Type.DAMAGE); -// if (damagePerk != null) { -// if (this.container.getItem(DAMAGE_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == damagePerk) { -// this.container.setItem(DAMAGE_PERK_SLOT, ItemStack.EMPTY); -// } -// } + if (!(pStack.getItem() instanceof GunItem)) { + return; + } + + var ammoPerk = PerkHelper.getPerkByType(pStack, Perk.Type.AMMO); + if (ammoPerk != null) { + if (this.container.getItem(AMMO_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == ammoPerk) { + this.container.setItem(AMMO_PERK_SLOT, ItemStack.EMPTY); + } + } + + var funcPerk = PerkHelper.getPerkByType(pStack, Perk.Type.FUNCTIONAL); + if (funcPerk != null) { + if (this.container.getItem(FUNC_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == funcPerk) { + this.container.setItem(FUNC_PERK_SLOT, ItemStack.EMPTY); + } + } + + var damagePerk = PerkHelper.getPerkByType(pStack, Perk.Type.DAMAGE); + if (damagePerk != null) { + if (this.container.getItem(DAMAGE_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == damagePerk) { + this.container.setItem(DAMAGE_PERK_SLOT, ItemStack.EMPTY); + } + } this.upgradePoint.set(0); this.ammoPerkLevel.set(0); @@ -425,17 +426,17 @@ public class ReforgingTableMenu extends AbstractContainerMenu { } public boolean mayPlace(@NotNull ItemStack pStack) { -// if (pStack.getItem() instanceof GunItem) { -// ItemStack ammoPerk = this.container.getItem(AMMO_PERK_SLOT); -// ItemStack funcPerk = this.container.getItem(FUNC_PERK_SLOT); -// ItemStack damagePerk = this.container.getItem(DAMAGE_PERK_SLOT); -// -// boolean flag1 = ammoPerk.isEmpty(); -// boolean flag2 = funcPerk.isEmpty(); -// boolean flag3 = damagePerk.isEmpty(); -// -// return flag1 && flag2 && flag3 && this.container.getItem(RESULT_SLOT).isEmpty() && this.container.getItem(INPUT_SLOT).isEmpty(); -// } + if (pStack.getItem() instanceof GunItem) { + ItemStack ammoPerk = this.container.getItem(AMMO_PERK_SLOT); + ItemStack funcPerk = this.container.getItem(FUNC_PERK_SLOT); + ItemStack damagePerk = this.container.getItem(DAMAGE_PERK_SLOT); + + boolean flag1 = ammoPerk.isEmpty(); + boolean flag2 = funcPerk.isEmpty(); + boolean flag3 = damagePerk.isEmpty(); + + return flag1 && flag2 && flag3 && this.container.getItem(RESULT_SLOT).isEmpty() && this.container.getItem(INPUT_SLOT).isEmpty(); + } return false; } @@ -471,9 +472,11 @@ public class ReforgingTableMenu extends AbstractContainerMenu { case DAMAGE -> DAMAGE_PERK_SLOT; }; - return pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == type; -// && !container.getItem(INPUT_SLOT).isEmpty() && container.getItem(INPUT_SLOT).getItem() instanceof GunItem gunItem -// && gunItem.canApplyPerk(perkItem.getPerk()) && container.getItem(slot).isEmpty(); + return pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == type + && !container.getItem(INPUT_SLOT).isEmpty() + && container.getItem(INPUT_SLOT).getItem() instanceof GunItem gunItem + && gunItem.canApplyPerk(perkItem.getPerk()) + && container.getItem(slot).isEmpty(); } public int getMaxStackSize() { diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/ShootMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/ShootMessage.java index 11f2d519e..084b2b980 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/send/ShootMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/ShootMessage.java @@ -4,8 +4,12 @@ import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.capability.ModCapabilities; import com.atsuishio.superbwarfare.event.GunEventHandler; import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.perk.AmmoPerk; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.tools.*; import io.netty.buffer.ByteBuf; import net.minecraft.core.particles.ParticleTypes; @@ -79,13 +83,9 @@ public record ShootMessage(double spread) implements CustomPacketPayload { } } -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); - for (int index0 = 0; index0 < ( - // todo perk -// perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount - projectileAmount - ); index0++) { + for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) { GunEventHandler.gunShoot(player, spared); } @@ -106,8 +106,7 @@ public record ShootMessage(double spread) implements CustomPacketPayload { } } - // TODO perk -// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); float pitch = tag.getDouble("heat") <= 40 ? 1 : (float) (1 - 0.025 * Math.abs(40 - tag.getDouble("heat"))); if (!player.level().isClientSide() && player instanceof ServerPlayer) { @@ -117,9 +116,9 @@ public record ShootMessage(double spread) implements CustomPacketPayload { player.playSound(ModSounds.MINIGUN_FAR.get(), soundRadius * 0.5f, pitch); player.playSound(ModSounds.MINIGUN_VERYFAR.get(), soundRadius, pitch); -// if (perk == ModPerks.BEAST_BULLET.get()) { -// player.playSound(ModSounds.HENG.get(), 4f, pitch); -// } + if (perk == ModPerks.BEAST_BULLET.get()) { + player.playSound(ModSounds.HENG.get(), 4f, pitch); + } } GunEventHandler.gunShoot(player, spared); diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/PerkHelper.java b/src/main/java/com/atsuishio/superbwarfare/perk/PerkHelper.java new file mode 100644 index 000000000..813bd67ff --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/perk/PerkHelper.java @@ -0,0 +1,255 @@ +package com.atsuishio.superbwarfare.perk; + +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; +import com.atsuishio.superbwarfare.item.PerkItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.registries.DeferredHolder; + +import javax.annotation.Nullable; +import java.util.Optional; +import java.util.function.Predicate; + +public class PerkHelper { + + private static final String TAG_PERK_ID = "id"; + private static final String TAG_PERK_LEVEL = "level"; + private static final String TAG_PERK = "Perks"; + + /** + * 把一个Perk封装成nbt进行存储 + */ + public static CompoundTag makePerk(@Nullable ResourceLocation pId, int pLevel) { + CompoundTag compoundtag = new CompoundTag(); + compoundtag.putString(TAG_PERK_ID, String.valueOf(pId)); + compoundtag.putShort(TAG_PERK_LEVEL, (short) pLevel); + return compoundtag; + } + + public static CompoundTag setPerkLevel(CompoundTag pCompound, int pLevel) { + pCompound.putShort(TAG_PERK_LEVEL, (short) pLevel); + return pCompound; + } + + public static int getPerkLevel(CompoundTag pCompound) { + return Mth.clamp(pCompound.getInt(TAG_PERK_LEVEL), 0, 255); + } + + @Nullable + public static ResourceLocation getPerkId(CompoundTag pCompoundTag) { + return ResourceLocation.tryParse(pCompoundTag.getString(TAG_PERK_ID)); + } + + @Nullable + public static ResourceLocation getPerkId(Perk perk) { + return switch (perk.type) { + case AMMO -> ModPerks.AMMO_PERKS.getEntries().stream() + .filter(p -> p.get().descriptionId.equals(perk.descriptionId)) + .findFirst() + .map(p -> ResourceLocation.tryParse(p.value().descriptionId)) + .orElse(null); + case FUNCTIONAL -> ModPerks.FUNC_PERKS.getEntries().stream() + .filter(p -> p.get().descriptionId.equals(perk.descriptionId)) + .findFirst() + .map(p -> ResourceLocation.tryParse(p.value().descriptionId)) + .orElse(null); + case DAMAGE -> ModPerks.DAMAGE_PERKS.getEntries().stream() + .filter(p -> p.get().descriptionId.equals(perk.descriptionId)) + .findFirst() + .map(p -> ResourceLocation.tryParse(p.value().descriptionId)) + .orElse(null); + }; + } + + public static int getItemPerkLevel(Perk perk, ItemStack stack) { + if (stack.isEmpty()) { + return 0; + } + + var tag = NBTTool.getTag(stack); + + var tagPerk = tag.getCompound(TAG_PERK); + if (!tagPerk.contains(perk.type.getName())) { + return 0; + } + + var pt = tagPerk.getCompound(perk.type.getName()); + ResourceLocation id = getPerkId(perk); + if (id == null) { + return 0; + } + + if (!pt.getString(TAG_PERK_ID).equals(makeId(id))) { + return 0; + } + + return getPerkLevel(getPerkTag(stack, perk.type)); + } + + public static CompoundTag getPerkTag(ItemStack stack, Perk.Type type) { + var tag = NBTTool.getTag(stack); + + var tagPerk = tag.getCompound(TAG_PERK); + if (!tagPerk.contains(type.getName())) return new CompoundTag(); + return tagPerk.getCompound(type.getName()); + } + + public static void setPerk(ItemStack stack, Perk perk, int level) { + var tag = NBTTool.getTag(stack); + + var perkTag = tag.getCompound(TAG_PERK); + if (perkTag.isEmpty()) { + perkTag = new CompoundTag(); + } + + perkTag.put(perk.type.getName(), makePerk(getPerkId(perk), level)); + tag.put(TAG_PERK, perkTag); + NBTTool.saveTag(stack, tag); + } + + public static void setPerk(ItemStack stack, Perk perk) { + setPerk(stack, perk, 1); + } + + @Nullable + public static Perk getPerkByType(ItemStack stack, Perk.Type type) { + var tag = NBTTool.getTag(stack); + + var tagPerk = tag.getCompound(TAG_PERK); + if (!tagPerk.contains(type.getName())) { + return null; + } + + return switch (type) { + case AMMO -> ModPerks.AMMO_PERKS.getEntries().stream() + .filter(p -> makeId(p.getId()).equals(tagPerk.getCompound(type.getName()).getString(TAG_PERK_ID))) + .findFirst() + .map(DeferredHolder::value) + .orElse(null); + case FUNCTIONAL -> ModPerks.FUNC_PERKS.getEntries().stream() + .filter(p -> makeId(p.getId()).equals(tagPerk.getCompound(type.getName()).getString(TAG_PERK_ID))) + .findFirst() + .map(DeferredHolder::value) + .orElse(null); + case DAMAGE -> ModPerks.DAMAGE_PERKS.getEntries().stream() + .filter(p -> makeId(p.getId()).equals(tagPerk.getCompound(type.getName()).getString(TAG_PERK_ID))) + .findFirst() + .map(DeferredHolder::value) + .orElse(null); + }; + } + + public static void removePerkByType(ItemStack stack, Perk.Type type) { + var tag = NBTTool.getTag(stack); + + var tagPerk = tag.getCompound(TAG_PERK); + if (!tagPerk.contains(type.getName())) { + return; + } + + tagPerk.remove(type.getName()); + tag.put(TAG_PERK, tagPerk); + } + + public static Optional> getPerkItem(Perk perk) { + return ModItems.PERKS.getEntries().stream().filter(p -> { + if (p.get() instanceof PerkItem perkItem) { + return perkItem.getPerk() == perk; + } + return false; + }).findFirst(); + } + + public static String makeId(ResourceLocation resourceLocation) { + return resourceLocation.getNamespace() + ":" + resourceLocation.getPath(); + } + + public static final Predicate SHOTGUN_PERKS = perk -> switch (perk.type) { + case AMMO -> !perk.descriptionId.equals("butterfly_bullet") && perk != ModPerks.MICRO_MISSILE.get() + && perk != ModPerks.LONGER_WIRE.get(); + case FUNCTIONAL -> perk == ModPerks.SUBSISTENCE.get() + || perk == ModPerks.POWERFUL_ATTRACTION.get() + || perk == ModPerks.HEAL_CLIP.get() + || perk == ModPerks.FIELD_DOCTOR.get() + || perk == ModPerks.INTELLIGENT_CHIP.get(); + case DAMAGE -> perk == ModPerks.GUTSHOT_STRAIGHT.get() + || perk == ModPerks.MONSTER_HUNTER.get() + || perk == ModPerks.KILL_CLIP.get() + || perk == ModPerks.VORPAL_WEAPON.get(); + }; + + public static final Predicate RIFLE_PERKS = perk -> switch (perk.type) { + case AMMO -> perk != ModPerks.MICRO_MISSILE.get() && perk != ModPerks.LONGER_WIRE.get(); + case FUNCTIONAL -> perk == ModPerks.HEAL_CLIP.get() || perk == ModPerks.FIELD_DOCTOR.get() || + perk == ModPerks.FOURTH_TIMES_CHARM.get() || perk == ModPerks.SUBSISTENCE.get() || + perk == ModPerks.POWERFUL_ATTRACTION.get() || perk == ModPerks.INTELLIGENT_CHIP.get(); + case DAMAGE -> + perk == ModPerks.KILL_CLIP.get() || perk == ModPerks.GUTSHOT_STRAIGHT.get() || perk == ModPerks.MONSTER_HUNTER.get() || + perk == ModPerks.HEAD_SEEKER.get() || perk == ModPerks.DESPERADO.get() || perk == ModPerks.VORPAL_WEAPON.get(); + }; + + public static final Predicate HANDGUN_PERKS = perk -> switch (perk.type) { + case AMMO -> !perk.descriptionId.equals("butterfly_bullet") && perk != ModPerks.MICRO_MISSILE.get() + && perk != ModPerks.LONGER_WIRE.get(); + case FUNCTIONAL -> perk == ModPerks.HEAL_CLIP.get() + || perk == ModPerks.FIELD_DOCTOR.get() + || perk == ModPerks.SUBSISTENCE.get() + || perk == ModPerks.POWERFUL_ATTRACTION.get() + || perk == ModPerks.INTELLIGENT_CHIP.get(); + case DAMAGE -> perk == ModPerks.KILL_CLIP.get() + || perk == ModPerks.GUTSHOT_STRAIGHT.get() + || perk == ModPerks.MONSTER_HUNTER.get() + || perk == ModPerks.VORPAL_WEAPON.get(); + }; + + public static final Predicate SNIPER_RIFLE_PERKS = perk -> switch (perk.type) { + case AMMO -> !perk.descriptionId.equals("butterfly_bullet") && perk != ModPerks.MICRO_MISSILE.get() + && perk != ModPerks.LONGER_WIRE.get(); + case FUNCTIONAL -> perk == ModPerks.HEAL_CLIP.get() + || perk == ModPerks.FOURTH_TIMES_CHARM.get() + || perk == ModPerks.POWERFUL_ATTRACTION.get() + || perk == ModPerks.INTELLIGENT_CHIP.get(); + + case DAMAGE -> perk == ModPerks.KILL_CLIP.get() + || perk == ModPerks.MONSTER_HUNTER.get() + || perk == ModPerks.VORPAL_WEAPON.get(); + }; + + public static final Predicate SMG_PERKS = perk -> switch (perk.type) { + case AMMO -> perk != ModPerks.MICRO_MISSILE.get() && perk != ModPerks.LONGER_WIRE.get(); + case FUNCTIONAL -> perk == ModPerks.HEAL_CLIP.get() + || perk == ModPerks.FOURTH_TIMES_CHARM.get() + || perk == ModPerks.SUBSISTENCE.get() + || perk == ModPerks.POWERFUL_ATTRACTION.get() + || perk == ModPerks.INTELLIGENT_CHIP.get(); + case DAMAGE -> perk == ModPerks.KILL_CLIP.get() + || perk == ModPerks.GUTSHOT_STRAIGHT.get() + || perk == ModPerks.MONSTER_HUNTER.get() + || perk == ModPerks.HEAD_SEEKER.get() + || perk == ModPerks.DESPERADO.get() + || perk == ModPerks.VORPAL_WEAPON.get(); + }; + + public static final Predicate MACHINE_GUN_PERKS = perk -> switch (perk.type) { + case AMMO -> perk != ModPerks.MICRO_MISSILE.get() && perk != ModPerks.LONGER_WIRE.get(); + case FUNCTIONAL -> perk == ModPerks.FOURTH_TIMES_CHARM.get() + || perk == ModPerks.SUBSISTENCE.get() + || perk == ModPerks.POWERFUL_ATTRACTION.get() + || perk == ModPerks.INTELLIGENT_CHIP.get(); + case DAMAGE -> perk == ModPerks.MONSTER_HUNTER.get() + || perk == ModPerks.KILLING_TALLY.get() + || perk == ModPerks.VORPAL_WEAPON.get(); + }; + + public static final Predicate MAGAZINE_PERKS = perk -> false; + + public static final Predicate LAUNCHER_PERKS = perk -> perk == ModPerks.MONSTER_HUNTER.get() + || perk == ModPerks.POWERFUL_ATTRACTION.get() + || perk == ModPerks.INTELLIGENT_CHIP.get() + || perk == ModPerks.VORPAL_WEAPON.get(); +}