实现Perk相关功能

This commit is contained in:
Light_Quanta 2025-03-29 05:54:48 +08:00
parent 9439922828
commit 860ecc63ae
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
48 changed files with 1128 additions and 893 deletions

View file

@ -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)) {

View file

@ -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;
}
}

View file

@ -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 {
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 {
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);
}

View file

@ -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();

View file

@ -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));
}
}
}

View file

@ -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;
}
}
}

View file

@ -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));
}
}
}

View file

@ -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;
}

View file

@ -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<MobEffectInstance> 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<MobEffectInstance> 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;
}
/**

View file

@ -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;

View file

@ -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<Player> players = player.level().getEntitiesOfClass(Player.class, player.getBoundingBox().inflate(5))
// .stream().filter(p -> p.isAlliedTo(player)).toList();
// int finalHealClipLevel = healClipLevel;
// players.forEach(p -> p.heal(6.0f * (0.8f + 0.2f * finalHealClipLevel)));
int healClipLevel = PerkHelper.getItemPerkLevel(ModPerks.HEAL_CLIP.get(), stack);
if (healClipLevel == 0) {
healClipLevel = 1;
}
player.heal(12.0f * (0.8f + 0.2f * healClipLevel));
List<Player> players = player.level().getEntitiesOfClass(Player.class, player.getBoundingBox().inflate(5))
.stream().filter(p -> p.isAlliedTo(player)).toList();
int finalHealClipLevel = healClipLevel;
players.forEach(p -> p.heal(6.0f * (0.8f + 0.2f * finalHealClipLevel)));
}
private static void handleKillClipPre(ItemStack stack) {
@ -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);
}
}

View file

@ -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) {

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -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);

View file

@ -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() {

View file

@ -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);

View file

@ -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<DeferredHolder<Item, ? extends Item>> 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<Perk> 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<Perk> 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<Perk> 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<Perk> 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<Perk> 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<Perk> 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<Perk> MAGAZINE_PERKS = perk -> false;
public static final Predicate<Perk> LAUNCHER_PERKS = perk -> perk == ModPerks.MONSTER_HUNTER.get()
|| perk == ModPerks.POWERFUL_ATTRACTION.get()
|| perk == ModPerks.INTELLIGENT_CHIP.get()
|| perk == ModPerks.VORPAL_WEAPON.get();
}