重写perk读写
This commit is contained in:
parent
4882c00db8
commit
e79812eff6
29 changed files with 469 additions and 575 deletions
|
@ -12,7 +12,6 @@ import com.atsuishio.superbwarfare.init.*;
|
|||
import com.atsuishio.superbwarfare.item.gun.GunItem;
|
||||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||
import com.atsuishio.superbwarfare.network.message.send.*;
|
||||
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
||||
import com.atsuishio.superbwarfare.tools.NBTTool;
|
||||
import com.atsuishio.superbwarfare.tools.SeekTool;
|
||||
import com.atsuishio.superbwarfare.tools.TraceTool;
|
||||
|
@ -20,7 +19,6 @@ import com.mojang.blaze3d.platform.InputConstants;
|
|||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
import net.minecraft.core.component.DataComponents;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.util.Mth;
|
||||
|
@ -124,14 +122,15 @@ public class ClickHandler {
|
|||
handleWeaponFirePress(player, stack);
|
||||
}
|
||||
|
||||
var data = GunData.from(stack);
|
||||
if (button == ModKeyMappings.HOLD_ZOOM.getKey().getValue()) {
|
||||
handleWeaponZoomPress(player, tag);
|
||||
handleWeaponZoomPress(player, data);
|
||||
switchZoom = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (button == ModKeyMappings.SWITCH_ZOOM.getKey().getValue()) {
|
||||
handleWeaponZoomPress(player, tag);
|
||||
handleWeaponZoomPress(player, data);
|
||||
switchZoom = !switchZoom;
|
||||
}
|
||||
}
|
||||
|
@ -267,14 +266,15 @@ public class ClickHandler {
|
|||
handleWeaponFirePress(player, stack);
|
||||
}
|
||||
|
||||
var data = GunData.from(stack);
|
||||
if (key == ModKeyMappings.HOLD_ZOOM.getKey().getValue()) {
|
||||
handleWeaponZoomPress(player, tag);
|
||||
handleWeaponZoomPress(player, data);
|
||||
switchZoom = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (key == ModKeyMappings.SWITCH_ZOOM.getKey().getValue()) {
|
||||
handleWeaponZoomPress(player, tag);
|
||||
handleWeaponZoomPress(player, data);
|
||||
switchZoom = !switchZoom;
|
||||
}
|
||||
}
|
||||
|
@ -365,7 +365,7 @@ public class ClickHandler {
|
|||
ClientEventHandler.customRpm = 0;
|
||||
}
|
||||
|
||||
public static void handleWeaponZoomPress(Player player, final CompoundTag tag) {
|
||||
public static void handleWeaponZoomPress(Player player, GunData data) {
|
||||
PacketDistributor.sendToServer(new ZoomMessage(0));
|
||||
|
||||
if (player.getVehicle() instanceof VehicleEntity pVehicle && player.getVehicle() instanceof WeaponVehicleEntity iVehicle && iVehicle.hasWeapon(pVehicle.getSeatIndex(player))) {
|
||||
|
@ -374,7 +374,7 @@ public class ClickHandler {
|
|||
}
|
||||
|
||||
ClientEventHandler.zoom = true;
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.INTELLIGENT_CHIP.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.INTELLIGENT_CHIP);
|
||||
if (level > 0) {
|
||||
if (ClientEventHandler.entity == null) {
|
||||
ClientEventHandler.entity = SeekTool.seekLivingEntity(player, player.level(), 32 + 8 * (level - 1), 20);
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
package com.atsuishio.superbwarfare.client;
|
||||
|
||||
import com.atsuishio.superbwarfare.init.ModPerks;
|
||||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||
import com.atsuishio.superbwarfare.perk.Perk;
|
||||
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
||||
import com.atsuishio.superbwarfare.tools.NBTTool;
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
import net.minecraft.network.chat.Component;
|
||||
|
@ -24,14 +23,14 @@ public class TooltipTool {
|
|||
}
|
||||
|
||||
public static boolean heBullet(ItemStack stack) {
|
||||
var perk = PerkHelper.getPerkByType(NBTTool.getTag(stack), Perk.Type.AMMO);
|
||||
return perk == ModPerks.HE_BULLET.get();
|
||||
var perkInstance = GunData.from(stack).perk.getInstance(Perk.Type.AMMO);
|
||||
return perkInstance != null && perkInstance.perk() == ModPerks.HE_BULLET.get();
|
||||
}
|
||||
|
||||
public static int heBulletLevel(ItemStack stack) {
|
||||
var perk = PerkHelper.getPerkByType(NBTTool.getTag(stack), Perk.Type.AMMO);
|
||||
if (perk == ModPerks.HE_BULLET.get()) {
|
||||
return PerkHelper.getItemPerkLevel(perk, NBTTool.getTag(stack));
|
||||
var perkInstance = GunData.from(stack).perk.getInstance(Perk.Type.AMMO);
|
||||
if (perkInstance != null && perkInstance.perk() == ModPerks.HE_BULLET.get()) {
|
||||
return perkInstance.level();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -8,9 +8,9 @@ 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.item.gun.data.GunData;
|
||||
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;
|
||||
|
@ -69,8 +69,8 @@ public class CrossHairOverlay {
|
|||
float moveX = 0;
|
||||
float moveY = 0;
|
||||
|
||||
final var tag = NBTTool.getTag(stack);
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
var data = GunData.from(stack);
|
||||
var perk = data.perk.get(Perk.Type.AMMO);
|
||||
|
||||
if (DisplayConfig.FLOAT_CROSS_HAIR.get() && player.getVehicle() == null) {
|
||||
moveX = (float) (-6 * ClientEventHandler.turnRot[1] - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosX);
|
||||
|
|
|
@ -7,8 +7,7 @@ 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.NBTTool;
|
||||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||
import com.atsuishio.superbwarfare.tools.SeekTool;
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
|
@ -50,9 +49,8 @@ public class HandsomeFrameOverlay {
|
|||
return;
|
||||
|
||||
if (stack.getItem() instanceof GunItem && Minecraft.getInstance().options.getCameraType().isFirstPerson()) {
|
||||
|
||||
final var tag = NBTTool.getTag(stack);
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.INTELLIGENT_CHIP.get(), tag);
|
||||
var data = GunData.from(stack);
|
||||
int level = data.perk.getLevel(ModPerks.INTELLIGENT_CHIP);
|
||||
if (level == 0) return;
|
||||
|
||||
RenderSystem.disableDepthTest();
|
||||
|
|
|
@ -4,7 +4,6 @@ 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 net.minecraft.ChatFormatting;
|
||||
import net.minecraft.network.chat.Component;
|
||||
|
@ -19,7 +18,7 @@ public class ClientBocekImageTooltip extends ClientGunImageTooltip {
|
|||
protected Component getDamageComponent() {
|
||||
boolean slug = false;
|
||||
|
||||
var perk = PerkHelper.getPerkByType(data, Perk.Type.AMMO);
|
||||
var perk = data.perk.get(Perk.Type.AMMO);
|
||||
if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
|
||||
slug = true;
|
||||
}
|
||||
|
|
|
@ -8,15 +8,12 @@ import com.atsuishio.superbwarfare.item.gun.GunItem;
|
|||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||
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.NBTTool;
|
||||
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;
|
||||
|
@ -76,9 +73,9 @@ public class ClientGunImageTooltip implements ClientTooltipComponent {
|
|||
}
|
||||
|
||||
protected boolean shouldRenderPerks() {
|
||||
return PerkHelper.getPerkByType(data, Perk.Type.AMMO) != null
|
||||
|| PerkHelper.getPerkByType(data, Perk.Type.DAMAGE) != null
|
||||
|| PerkHelper.getPerkByType(data, Perk.Type.FUNCTIONAL) != null;
|
||||
return data.perk.get(Perk.Type.AMMO) != null
|
||||
|| data.perk.get(Perk.Type.DAMAGE) != null
|
||||
|| data.perk.get(Perk.Type.FUNCTIONAL) != null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -174,10 +171,11 @@ public class ClientGunImageTooltip implements ClientTooltipComponent {
|
|||
*/
|
||||
protected Component getBypassComponent() {
|
||||
double perkBypassArmorRate = 0;
|
||||
var perk = PerkHelper.getPerkByType(data, Perk.Type.AMMO);
|
||||
var perk = data.perk.get(Perk.Type.AMMO);
|
||||
|
||||
if (perk instanceof AmmoPerk ammoPerk) {
|
||||
int level = PerkHelper.getItemPerkLevel(perk, data);
|
||||
var perkInstance = data.perk.getInstance(perk);
|
||||
int level = perkInstance == null ? 0 : perkInstance.level();
|
||||
perkBypassArmorRate = ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0);
|
||||
}
|
||||
double bypassRate = Math.max(data.bypassArmor() + perkBypassArmorRate, 0);
|
||||
|
@ -220,52 +218,17 @@ public class ClientGunImageTooltip implements ClientTooltipComponent {
|
|||
|
||||
int xOffset = -20;
|
||||
|
||||
Perk ammoPerk = PerkHelper.getPerkByType(data, Perk.Type.AMMO);
|
||||
if (ammoPerk != null && PerkHelper.getPerkItem(ammoPerk).isPresent()) {
|
||||
for (var type : Perk.Type.values()) {
|
||||
var perkInstance = data.perk.getInstance(type);
|
||||
if (perkInstance == null) continue;
|
||||
|
||||
xOffset += 20;
|
||||
|
||||
var ammoItem = PerkHelper.getPerkItem(ammoPerk).get().get();
|
||||
var ammoItem = perkInstance.perk().getItem().get();
|
||||
ItemStack perkStack = ammoItem.getDefaultInstance();
|
||||
|
||||
CompoundTag ammoTag = PerkHelper.getPerkTag(data, Perk.Type.AMMO);
|
||||
if (!ammoTag.isEmpty()) {
|
||||
int level = PerkHelper.getItemPerkLevel(ammoPerk, data);
|
||||
perkStack.setCount(level);
|
||||
}
|
||||
guiGraphics.renderItem(perkStack, x + xOffset, y + 2);
|
||||
guiGraphics.renderItemDecorations(font, perkStack, x + xOffset, y + 2);
|
||||
}
|
||||
|
||||
Perk funcPerk = PerkHelper.getPerkByType(data, 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(data, Perk.Type.FUNCTIONAL);
|
||||
if (!funcTag.isEmpty()) {
|
||||
int level = PerkHelper.getItemPerkLevel(funcPerk, data);
|
||||
perkStack.setCount(level);
|
||||
}
|
||||
|
||||
guiGraphics.renderItem(perkStack, x + xOffset, y + 2);
|
||||
guiGraphics.renderItemDecorations(font, perkStack, x + xOffset, y + 2);
|
||||
}
|
||||
|
||||
Perk damagePerk = PerkHelper.getPerkByType(data, 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(data, Perk.Type.DAMAGE);
|
||||
if (!damageTag.isEmpty()) {
|
||||
int level = PerkHelper.getItemPerkLevel(damagePerk, data);
|
||||
perkStack.setCount(level);
|
||||
}
|
||||
|
||||
int level = perkInstance.level();
|
||||
perkStack.setCount(level);
|
||||
guiGraphics.renderItem(perkStack, x + xOffset, y + 2);
|
||||
guiGraphics.renderItemDecorations(font, perkStack, x + xOffset, y + 2);
|
||||
}
|
||||
|
@ -283,70 +246,27 @@ public class ClientGunImageTooltip implements ClientTooltipComponent {
|
|||
|
||||
int yOffset = -5;
|
||||
|
||||
Perk ammoPerk = PerkHelper.getPerkByType(data, Perk.Type.AMMO);
|
||||
if (ammoPerk != null && PerkHelper.getPerkItem(ammoPerk).isPresent()) {
|
||||
for (var type : Perk.Type.values()) {
|
||||
var perkInstance = data.perk.getInstance(type);
|
||||
if (perkInstance == null) continue;
|
||||
|
||||
yOffset += 25;
|
||||
var ammoItem = PerkHelper.getPerkItem(ammoPerk).get().get();
|
||||
|
||||
var ammoItem = perkInstance.perk().getItem().get();
|
||||
guiGraphics.renderItem(ammoItem.getDefaultInstance(), x, y + 4 + yOffset);
|
||||
|
||||
CompoundTag ammoTag = PerkHelper.getPerkTag(data, 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);
|
||||
var ids = perkInstance.perk().descriptionId.split(":");
|
||||
if (ids.length <= 1) continue;
|
||||
|
||||
guiGraphics.drawString(font, ammoComponent, x + 20, y + yOffset + 2, 0xFFFFFF);
|
||||
guiGraphics.drawString(font, ammoDesComponent, x + 20, y + yOffset + 12, 0xFFFFFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
String id = ids[1];
|
||||
var component = Component.translatable("item.superbwarfare." + id).withStyle(type.getColor())
|
||||
.append(Component.literal(" ").withStyle(ChatFormatting.RESET))
|
||||
.append(Component.literal(" Lvl. " + perkInstance.level()).withStyle(ChatFormatting.WHITE));
|
||||
var descComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY);
|
||||
|
||||
Perk funcPerk = PerkHelper.getPerkByType(data, 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);
|
||||
guiGraphics.drawString(font, component, x + 20, y + yOffset + 2, 0xFFFFFF);
|
||||
guiGraphics.drawString(font, descComponent, x + 20, y + yOffset + 12, 0xFFFFFF);
|
||||
|
||||
CompoundTag funcTag = PerkHelper.getPerkTag(data, 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(data, 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(data, 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();
|
||||
|
@ -370,34 +290,16 @@ public class ClientGunImageTooltip implements ClientTooltipComponent {
|
|||
|
||||
int width = 0;
|
||||
|
||||
CompoundTag ammoTag = PerkHelper.getPerkTag(data, 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));
|
||||
}
|
||||
}
|
||||
for (var type : Perk.Type.values()) {
|
||||
var perkInstance = data.perk.getInstance(type);
|
||||
if (perkInstance == null) continue;
|
||||
|
||||
CompoundTag funcTag = PerkHelper.getPerkTag(data, 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));
|
||||
}
|
||||
}
|
||||
var ids = perkInstance.perk().descriptionId.split(":");
|
||||
if (ids.length <= 1) continue;
|
||||
|
||||
CompoundTag damageTag = PerkHelper.getPerkTag(data, 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));
|
||||
}
|
||||
String id = ids[1];
|
||||
var ammoDesComponent = Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY);
|
||||
width = Math.max(width, font.width(ammoDesComponent));
|
||||
}
|
||||
|
||||
return width + 25;
|
||||
|
@ -410,19 +312,13 @@ public class ClientGunImageTooltip implements ClientTooltipComponent {
|
|||
if (shouldRenderBypassAndHeadshotTooltip()) height += 10;
|
||||
if (shouldRenderEditTooltip()) height += 20;
|
||||
if (shouldRenderPerks()) {
|
||||
if (!Screen.hasShiftDown()) {
|
||||
height += 16;
|
||||
} else {
|
||||
height += 16;
|
||||
final var tag = NBTTool.getTag(stack);
|
||||
if (PerkHelper.getPerkByType(tag, Perk.Type.AMMO) != null) {
|
||||
height += 25;
|
||||
}
|
||||
if (PerkHelper.getPerkByType(tag, Perk.Type.FUNCTIONAL) != null) {
|
||||
height += 25;
|
||||
}
|
||||
if (PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE) != null) {
|
||||
height += 25;
|
||||
height += 16;
|
||||
|
||||
if (Screen.hasShiftDown()) {
|
||||
for (var type : Perk.Type.values()) {
|
||||
if (data.perk.has(type)) {
|
||||
height += 25;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
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.ModPerks;
|
||||
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
||||
import com.atsuishio.superbwarfare.tools.FormatTool;
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.network.chat.Component;
|
||||
|
@ -17,7 +15,8 @@ public class ClientLauncherImageTooltip extends ClientGunImageTooltip {
|
|||
@Override
|
||||
protected Component getDamageComponent() {
|
||||
double damage = data.damage();
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), data);
|
||||
var perkInstance = data.perk.getInstance(ModPerks.MICRO_MISSILE.get());
|
||||
int perkLevel = perkInstance == null ? 0 : perkInstance.level();
|
||||
if (perkLevel > 0) damage *= 1.1f + perkLevel * 0.1f;
|
||||
|
||||
double explosionDamage = data.explosionDamage();
|
||||
|
|
|
@ -2,7 +2,6 @@ package com.atsuishio.superbwarfare.client.tooltip;
|
|||
|
||||
import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent;
|
||||
import com.atsuishio.superbwarfare.init.ModPerks;
|
||||
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
||||
import com.atsuishio.superbwarfare.tools.FormatTool;
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.network.chat.Component;
|
||||
|
@ -16,7 +15,8 @@ public class ClientSecondaryCataclysmImageTooltip extends ClientEnergyImageToolt
|
|||
@Override
|
||||
protected Component getDamageComponent() {
|
||||
double damage = data.damage();
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), data);
|
||||
var perkInstance = data.perk.getInstance(ModPerks.MICRO_MISSILE.get());
|
||||
int perkLevel = perkInstance == null ? 0 : perkInstance.level();
|
||||
if (perkLevel > 0) damage *= 1.1f + perkLevel * 0.1f;
|
||||
|
||||
double explosionDamage = data.explosionDamage();
|
||||
|
|
|
@ -4,7 +4,6 @@ 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 net.minecraft.ChatFormatting;
|
||||
import net.minecraft.network.chat.Component;
|
||||
|
@ -19,7 +18,7 @@ public class ClientShotgunImageTooltip extends ClientGunImageTooltip {
|
|||
protected Component getDamageComponent() {
|
||||
boolean slug = false;
|
||||
|
||||
var perk = PerkHelper.getPerkByType(data, Perk.Type.AMMO);
|
||||
var perk = data.perk.get(Perk.Type.AMMO);
|
||||
if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
|
||||
slug = true;
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@ import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
|||
import com.atsuishio.superbwarfare.network.message.send.*;
|
||||
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;
|
||||
|
@ -396,7 +395,7 @@ public class ClientEventHandler {
|
|||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
var perk = data.perk.get(Perk.Type.AMMO);
|
||||
int mode = data.fireMode();
|
||||
|
||||
// 精准度
|
||||
|
@ -446,7 +445,7 @@ public class ClientEventHandler {
|
|||
}
|
||||
|
||||
if (GunsTool.getPerkIntTag(tag, "DesperadoTimePost") > 0) {
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.DESPERADO.get(), tag);
|
||||
int perkLevel = data.perk.getLevel(ModPerks.DESPERADO);
|
||||
rpm *= (int) (1.285 + 0.015 * perkLevel);
|
||||
}
|
||||
|
||||
|
@ -574,7 +573,7 @@ public class ClientEventHandler {
|
|||
}
|
||||
|
||||
if (stack.is(ModItems.DEVOTION.get())) {
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.TURBO_CHARGER.get(), tag);
|
||||
int perkLevel = data.perk.getLevel(ModPerks.TURBO_CHARGER);
|
||||
customRpm = Math.min(customRpm + 15 + ((perkLevel > 0 ? 5 : 0) + 3 * perkLevel), 500);
|
||||
}
|
||||
|
||||
|
@ -600,7 +599,7 @@ public class ClientEventHandler {
|
|||
} else if (stack.is(ModItems.MINIGUN.get())) {
|
||||
var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE);
|
||||
if (cap != null && cap.rifleAmmo > 0 || InventoryTool.hasCreativeAmmoBox(player)) {
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
var perk = data.perk.get(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);
|
||||
|
@ -680,14 +679,13 @@ public class ClientEventHandler {
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
var data = GunData.from(stack);
|
||||
var perk = data.perk.get(Perk.Type.AMMO);
|
||||
|
||||
if (perk == ModPerks.BEAST_BULLET.get()) {
|
||||
player.playSound(ModSounds.HENG.get(), 1f, 1f);
|
||||
}
|
||||
|
||||
var data = GunData.from(stack);
|
||||
int barrelType = data.attachment.get(AttachmentType.BARREL);
|
||||
|
||||
SoundEvent sound1p = BuiltInRegistries.SOUND_EVENT.get(Mod.loc(name + (barrelType == 2 ? "_fire_1p_s" : "_fire_1p")));
|
||||
|
@ -1420,7 +1418,7 @@ public class ClientEventHandler {
|
|||
&& cap != null
|
||||
&& !cap.edit) {
|
||||
if (!player.isShiftKeyDown()) {
|
||||
int intelligentChipLevel = PerkHelper.getItemPerkLevel(ModPerks.INTELLIGENT_CHIP.get(), tag);
|
||||
int intelligentChipLevel = data.perk.getLevel(ModPerks.INTELLIGENT_CHIP);
|
||||
|
||||
if (intelligentChipLevel > 0) {
|
||||
if (ClientEventHandler.entity == null || !entity.isAlive()) {
|
||||
|
|
|
@ -15,7 +15,6 @@ import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
|||
import com.atsuishio.superbwarfare.item.gun.data.ReloadState;
|
||||
import com.atsuishio.superbwarfare.perk.AmmoPerk;
|
||||
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.InventoryTool;
|
||||
|
@ -123,7 +122,7 @@ public class GunEventHandler {
|
|||
}
|
||||
}
|
||||
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
var perk = data.perk.get(Perk.Type.AMMO);
|
||||
if (perk == ModPerks.BEAST_BULLET.get()) {
|
||||
player.playSound(ModSounds.HENG.get(), 4f, 1f);
|
||||
}
|
||||
|
@ -186,12 +185,13 @@ public class GunEventHandler {
|
|||
if (!player.level().isClientSide()) {
|
||||
float headshot = (float) data.headshot();
|
||||
float damage = (float) data.damage();
|
||||
float velocity = (float) ((data.velocity() + GunsTool.getGunDoubleTag(tag, "CustomVelocity")) * perkSpeed(tag));
|
||||
float velocity = (float) ((data.velocity() + GunsTool.getGunDoubleTag(tag, "CustomVelocity")) * perkSpeed(data));
|
||||
int projectileAmount = data.projectileAmount();
|
||||
float bypassArmorRate = (float) data.bypassArmor();
|
||||
var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE);
|
||||
boolean zoom = cap != null && cap.zoom;
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
var perkInstance = data.perk.getInstance(Perk.Type.AMMO);
|
||||
var perk = perkInstance != null ? perkInstance.perk() : null;
|
||||
|
||||
if (perk != null && perk.descriptionId.equals("butterfly_bullet")) {
|
||||
if (handleButterflyBullet(perk, stack, player)) return;
|
||||
|
@ -205,7 +205,7 @@ public class GunEventHandler {
|
|||
.zoom(zoom);
|
||||
|
||||
if (perk instanceof AmmoPerk ammoPerk) {
|
||||
int level = PerkHelper.getItemPerkLevel(perk, tag);
|
||||
int level = data.perk.getLevel(perk);
|
||||
|
||||
bypassArmorRate += ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0);
|
||||
projectile.setRGB(ammoPerk.rgb);
|
||||
|
@ -237,24 +237,24 @@ public class GunEventHandler {
|
|||
projectile.bypassArmorRate(bypassArmorRate);
|
||||
|
||||
if (perk == ModPerks.SILVER_BULLET.get()) {
|
||||
int level = PerkHelper.getItemPerkLevel(perk, tag);
|
||||
int level = data.perk.getLevel(perk);
|
||||
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, tag);
|
||||
int level = data.perk.getLevel(perk);
|
||||
projectile.jhpBullet(level);
|
||||
} else if (perk == ModPerks.HE_BULLET.get()) {
|
||||
int level = PerkHelper.getItemPerkLevel(perk, tag);
|
||||
int level = data.perk.getLevel(perk);
|
||||
projectile.heBullet(level);
|
||||
} else if (perk == ModPerks.INCENDIARY_BULLET.get()) {
|
||||
int level = PerkHelper.getItemPerkLevel(perk, tag);
|
||||
int level = data.perk.getLevel(perk);
|
||||
projectile.fireBullet(level, stack.is(ModTags.Items.SHOTGUN));
|
||||
}
|
||||
|
||||
var dmgPerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE);
|
||||
var dmgPerk = data.perk.get(Perk.Type.DAMAGE);
|
||||
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
|
||||
int level = PerkHelper.getItemPerkLevel(dmgPerk, tag);
|
||||
int level = data.perk.getLevel(dmgPerk);
|
||||
projectile.monsterMultiple(0.1f + 0.1f * level);
|
||||
}
|
||||
|
||||
|
@ -264,8 +264,8 @@ public class GunEventHandler {
|
|||
}
|
||||
}
|
||||
|
||||
public static double perkSpeed(final CompoundTag tag) {
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
public static double perkSpeed(GunData data) {
|
||||
var perk = data.perk.get(Perk.Type.AMMO);
|
||||
if (perk instanceof AmmoPerk ammoPerk) {
|
||||
return ammoPerk.speedRate;
|
||||
}
|
||||
|
@ -275,7 +275,7 @@ public class GunEventHandler {
|
|||
// TODO 这还有联动的必要吗(
|
||||
private static boolean handleButterflyBullet(Perk perk, ItemStack heldItem, Player player) {
|
||||
return true;
|
||||
// int perkLevel = PerkHelper.getItemPerkLevel(perk, tag);
|
||||
// int perkLevel = data.perk.getLevel(perk);
|
||||
//
|
||||
// var entityType = CompatHolder.VRC_RAIN_SHOWER_BUTTERFLY;
|
||||
// if (entityType != null) {
|
||||
|
|
|
@ -24,7 +24,6 @@ import com.atsuishio.superbwarfare.network.message.receive.DrawClientMessage;
|
|||
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.network.chat.Component;
|
||||
import net.minecraft.network.protocol.game.ClientboundStopSoundPacket;
|
||||
|
@ -139,13 +138,15 @@ public class LivingEventHandler {
|
|||
ItemStack stack = sourceEntity instanceof LivingEntity living ? living.getMainHandItem() : ItemStack.EMPTY;
|
||||
|
||||
final var tag = NBTTool.getTag(stack);
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
|
||||
// 距离衰减
|
||||
if (DamageTypeTool.isGunDamage(source)) {
|
||||
if (DamageTypeTool.isGunDamage(source) && stack.getItem() instanceof GunItem) {
|
||||
double distance = entity.position().distanceTo(sourceEntity.position());
|
||||
var data = GunData.from(stack);
|
||||
|
||||
if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) {
|
||||
var perk = data.perk.get(Perk.Type.AMMO);
|
||||
|
||||
if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) {
|
||||
damage = reduceDamageByDistance(amount, distance, 0.015, 30);
|
||||
} else {
|
||||
|
@ -219,7 +220,7 @@ public class LivingEventHandler {
|
|||
|
||||
// 先处理发射器类武器或高爆弹的爆炸伤害
|
||||
if (source.is(ModDamageTypes.PROJECTILE_BOOM)) {
|
||||
if (stack.is(ModTags.Items.LAUNCHER) || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), tag) > 0) {
|
||||
if (stack.is(ModTags.Items.LAUNCHER) || data.perk.getLevel(ModPerks.HE_BULLET) > 0) {
|
||||
data.setExp(data.exp() + amount);
|
||||
}
|
||||
}
|
||||
|
@ -241,11 +242,10 @@ public class LivingEventHandler {
|
|||
|
||||
var data = GunData.from(stack);
|
||||
double amount = 20 + 2 * event.getEntity().getMaxHealth();
|
||||
final var tag = NBTTool.getTag(stack);
|
||||
|
||||
// 先处理发射器类武器或高爆弹的爆炸伤害
|
||||
if (source.is(ModDamageTypes.PROJECTILE_BOOM)) {
|
||||
if (stack.is(ModTags.Items.LAUNCHER) || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), tag) > 0) {
|
||||
if (stack.is(ModTags.Items.LAUNCHER) || data.perk.getLevel(ModPerks.HE_BULLET) > 0) {
|
||||
data.setExp(data.exp() + amount);
|
||||
}
|
||||
}
|
||||
|
@ -424,7 +424,7 @@ public class LivingEventHandler {
|
|||
newData.charge.reset();
|
||||
}
|
||||
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.KILLING_TALLY.get(), newTag);
|
||||
int level = newData.perk.getLevel(ModPerks.KILLING_TALLY);
|
||||
if (level != 0) {
|
||||
GunsTool.setPerkIntTag(newTag, "KillingTally", 0);
|
||||
}
|
||||
|
@ -498,9 +498,8 @@ public class LivingEventHandler {
|
|||
}
|
||||
|
||||
ItemStack stack = attacker.getMainHandItem();
|
||||
if (!stack.is(ModTags.Items.GUN)) {
|
||||
return;
|
||||
}
|
||||
if (!stack.is(ModTags.Items.GUN)) return;
|
||||
var data = GunData.from(stack);
|
||||
|
||||
if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) {
|
||||
handleKillClipDamage(stack, event);
|
||||
|
@ -520,8 +519,7 @@ public class LivingEventHandler {
|
|||
}
|
||||
|
||||
if (source.getDirectEntity() instanceof ProjectileEntity projectile) {
|
||||
final var tag = NBTTool.getTag(stack);
|
||||
if (PerkHelper.getItemPerkLevel(ModPerks.FOURTH_TIMES_CHARM.get(), tag) > 0) {
|
||||
if (data.perk.getLevel(ModPerks.FOURTH_TIMES_CHARM) > 0) {
|
||||
float bypassArmorRate = projectile.getBypassArmorRate();
|
||||
if (bypassArmorRate >= 1.0f && source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE)) {
|
||||
handleFourthTimesCharm(stack);
|
||||
|
@ -576,27 +574,25 @@ public class LivingEventHandler {
|
|||
|
||||
private static void handleClipPerks(ItemStack stack) {
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
int healClipLevel = PerkHelper.getItemPerkLevel(ModPerks.HEAL_CLIP.get(), tag);
|
||||
int healClipLevel = data.perk.getLevel(ModPerks.HEAL_CLIP);
|
||||
var tag = data.perk.getTag(ModPerks.HEAL_CLIP);
|
||||
if (healClipLevel != 0) {
|
||||
GunsTool.setPerkIntTag(tag, "HealClipTime", 80 + healClipLevel * 20);
|
||||
tag.putInt("HealClipTime", 80 + healClipLevel * 20);
|
||||
}
|
||||
|
||||
int killClipLevel = PerkHelper.getItemPerkLevel(ModPerks.KILL_CLIP.get(), tag);
|
||||
int killClipLevel = data.perk.getLevel(ModPerks.KILL_CLIP);
|
||||
if (killClipLevel != 0) {
|
||||
GunsTool.setPerkIntTag(tag, "KillClipReloadTime", 80);
|
||||
tag.putInt("KillClipReloadTime", 80);
|
||||
}
|
||||
data.save();
|
||||
}
|
||||
|
||||
private static void handleKillClipDamage(ItemStack stack, LivingIncomingDamageEvent event) {
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
if (GunsTool.getPerkIntTag(tag, "KillClipTime") > 0) {
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.KILL_CLIP.get(), tag);
|
||||
if (level == 0) {
|
||||
return;
|
||||
}
|
||||
final var tag = data.perk.getTag(ModPerks.KILL_CLIP);
|
||||
if (tag.getInt("KillClipTime") > 0) {
|
||||
int level = data.perk.getLevel(ModPerks.KILL_CLIP);
|
||||
if (level == 0) return;
|
||||
|
||||
event.setAmount(event.getAmount() * (1.2f + 0.05f * level));
|
||||
}
|
||||
|
@ -604,8 +600,7 @@ public class LivingEventHandler {
|
|||
|
||||
private static void handleGutshotStraightDamage(ItemStack stack, LivingIncomingDamageEvent event) {
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.GUTSHOT_STRAIGHT.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.GUTSHOT_STRAIGHT);
|
||||
if (level == 0) return;
|
||||
|
||||
event.setAmount(event.getAmount() * (1.15f + 0.05f * level));
|
||||
|
@ -614,10 +609,10 @@ public class LivingEventHandler {
|
|||
private static void handleKillingTallyDamage(ItemStack stack, LivingIncomingDamageEvent event) {
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.KILLING_TALLY.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.KILLING_TALLY);
|
||||
if (level == 0) return;
|
||||
|
||||
int killTally = GunsTool.getPerkIntTag(tag, "KillingTally");
|
||||
int killTally = data.perk.getTag(ModPerks.KILLING_TALLY).getInt("KillingTally");
|
||||
if (killTally == 0) {
|
||||
return;
|
||||
}
|
||||
|
@ -627,37 +622,37 @@ public class LivingEventHandler {
|
|||
|
||||
private static void handleKillingTallyAddCount(ItemStack stack) {
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.KILLING_TALLY.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.KILLING_TALLY);
|
||||
if (level != 0) {
|
||||
GunsTool.setPerkIntTag(tag, "KillingTally", Math.min(3, GunsTool.getPerkIntTag(tag, "KillingTally") + 1));
|
||||
var tag = data.perk.getTag(ModPerks.KILLING_TALLY);
|
||||
tag.putInt("KillingTally", Math.min(3, tag.getInt("KillingTally") + 1));
|
||||
data.save();
|
||||
}
|
||||
}
|
||||
|
||||
private static void handleFourthTimesCharm(ItemStack stack) {
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.FOURTH_TIMES_CHARM.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.FOURTH_TIMES_CHARM);
|
||||
if (level == 0) return;
|
||||
final var tag = data.perk.getTag(ModPerks.FOURTH_TIMES_CHARM);
|
||||
|
||||
int fourthTimesCharmTick = GunsTool.getPerkIntTag(tag, "FourthTimesCharmTick");
|
||||
int fourthTimesCharmTick = tag.getInt("FourthTimesCharmTick");
|
||||
if (fourthTimesCharmTick <= 0) {
|
||||
GunsTool.setPerkIntTag(tag, "FourthTimesCharmTick", 40 + 10 * level);
|
||||
GunsTool.setPerkIntTag(tag, "FourthTimesCharmCount", 1);
|
||||
tag.putInt("FourthTimesCharmTick", 40 + 10 * level);
|
||||
tag.putInt("FourthTimesCharmCount", 1);
|
||||
} else {
|
||||
int count = GunsTool.getPerkIntTag(tag, "FourthTimesCharmCount");
|
||||
int count = tag.getInt("FourthTimesCharmCount");
|
||||
if (count < 4) {
|
||||
GunsTool.setPerkIntTag(tag, "FourthTimesCharmCount", Math.min(4, count + 1));
|
||||
tag.putInt("FourthTimesCharmCount", Math.min(4, count + 1));
|
||||
}
|
||||
}
|
||||
|
||||
data.save();
|
||||
}
|
||||
|
||||
private static void handleSubsistence(ItemStack stack, Player player) {
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.SUBSISTENCE.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.SUBSISTENCE);
|
||||
if (level == 0) return;
|
||||
|
||||
float rate = level * 0.1f + (stack.is(ModTags.Items.SMG) || stack.is(ModTags.Items.RIFLE) ? 0.07f : 0f);
|
||||
|
@ -696,8 +691,7 @@ public class LivingEventHandler {
|
|||
|
||||
private static void handleFieldDoctor(ItemStack stack, LivingIncomingDamageEvent event, Player player) {
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.FIELD_DOCTOR.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.FIELD_DOCTOR);
|
||||
if (level == 0) return;
|
||||
|
||||
if (event.getEntity().isAlliedTo(player)) {
|
||||
|
@ -708,32 +702,31 @@ public class LivingEventHandler {
|
|||
|
||||
private static void handleHeadSeekerTime(ItemStack stack) {
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.HEAD_SEEKER.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.HEAD_SEEKER);
|
||||
if (level == 0) return;
|
||||
|
||||
GunsTool.setPerkIntTag(tag, "HeadSeeker", 11 + level * 2);
|
||||
data.perk.getTag(ModPerks.HEAD_SEEKER).putInt("HeadSeeker", 11 + level * 2);
|
||||
data.save();
|
||||
}
|
||||
|
||||
private static void handleHeadSeekerDamage(ItemStack stack, LivingIncomingDamageEvent event) {
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.HEAD_SEEKER.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.HEAD_SEEKER);
|
||||
if (level == 0) return;
|
||||
|
||||
if (GunsTool.getPerkIntTag(tag, "HeadSeeker") > 0) {
|
||||
var tag = data.perk.getTag(ModPerks.HEAD_SEEKER);
|
||||
if (tag.getInt("HeadSeeker") > 0) {
|
||||
event.setAmount(event.getAmount() * (1.095f + 0.0225f * level));
|
||||
}
|
||||
}
|
||||
|
||||
private static void handleDesperado(ItemStack stack) {
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.DESPERADO.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.DESPERADO);
|
||||
if (level == 0) return;
|
||||
|
||||
GunsTool.setPerkIntTag(tag, "DesperadoTime", 90 + level * 10);
|
||||
var tag = data.perk.getTag(ModPerks.DESPERADO);
|
||||
tag.putInt("DesperadoTime", 90 + level * 10);
|
||||
data.save();
|
||||
}
|
||||
|
||||
|
@ -801,8 +794,10 @@ public class LivingEventHandler {
|
|||
}
|
||||
|
||||
// 磁吸Perk
|
||||
final var mainHandTag = NBTTool.getTag(mainHandItem);
|
||||
if (mainHandItem.is(ModTags.Items.GUN) && PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), mainHandTag) > 0 && (DamageTypeTool.isGunDamage(source) || DamageTypeTool.isExplosionDamage(source))) {
|
||||
if (mainHandItem.is(ModTags.Items.GUN)
|
||||
&& GunData.from(mainHandItem).perk.has(ModPerks.POWERFUL_ATTRACTION.get())
|
||||
&& (DamageTypeTool.isGunDamage(source) || DamageTypeTool.isExplosionDamage(source))
|
||||
) {
|
||||
var drops = event.getDrops();
|
||||
drops.forEach(itemEntity -> {
|
||||
ItemStack item = itemEntity.getItem();
|
||||
|
@ -827,9 +822,9 @@ public class LivingEventHandler {
|
|||
|
||||
ItemStack stack = player.getMainHandItem();
|
||||
if (!stack.is(ModTags.Items.GUN)) return;
|
||||
var data = GunData.from(stack);
|
||||
|
||||
final var tag = NBTTool.getTag(stack);
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.POWERFUL_ATTRACTION);
|
||||
if (level > 0) {
|
||||
player.giveExperiencePoints((int) (event.getDroppedExperience() * (0.8f + 0.2f * level)));
|
||||
|
||||
|
@ -846,9 +841,9 @@ public class LivingEventHandler {
|
|||
|
||||
private static void handleVorpalWeaponDamage(ItemStack stack, LivingIncomingDamageEvent event) {
|
||||
var entity = event.getEntity();
|
||||
var data = GunData.from(stack);
|
||||
|
||||
final var tag = NBTTool.getTag(stack);
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.VORPAL_WEAPON.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.VORPAL_WEAPON);
|
||||
if (level <= 0) return;
|
||||
if (entity.getHealth() < 100.0f) return;
|
||||
|
||||
|
|
|
@ -4,7 +4,6 @@ import com.atsuishio.superbwarfare.event.events.ReloadEvent;
|
|||
import com.atsuishio.superbwarfare.init.ModPerks;
|
||||
import com.atsuishio.superbwarfare.init.ModTags;
|
||||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||
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;
|
||||
|
@ -66,7 +65,7 @@ public class ReloadEventHandler {
|
|||
final var tag = data.tag();
|
||||
if (!GunsTool.getPerkBooleanTag(tag, "HealClip")) return;
|
||||
|
||||
int healClipLevel = PerkHelper.getItemPerkLevel(ModPerks.HEAL_CLIP.get(), tag);
|
||||
int healClipLevel = data.perk.getLevel(ModPerks.HEAL_CLIP);
|
||||
if (healClipLevel == 0) {
|
||||
healClipLevel = 1;
|
||||
}
|
||||
|
@ -96,7 +95,7 @@ public class ReloadEventHandler {
|
|||
final var tag = data.tag();
|
||||
if (!GunsTool.getPerkBooleanTag(tag, "KillClip")) return;
|
||||
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.KILL_CLIP.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.KILL_CLIP);
|
||||
GunsTool.setPerkIntTag(tag, "KillClipTime", 90 + 10 * level);
|
||||
data.save();
|
||||
}
|
||||
|
@ -104,7 +103,7 @@ public class ReloadEventHandler {
|
|||
private static void handleKillingTallyPre(ItemStack stack) {
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.KILLING_TALLY.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.KILLING_TALLY);
|
||||
if (level == 0) return;
|
||||
|
||||
GunsTool.setPerkIntTag(tag, "KillingTally", 0);
|
||||
|
@ -129,7 +128,7 @@ public class ReloadEventHandler {
|
|||
final var tag = data.tag();
|
||||
if (!GunsTool.getPerkBooleanTag(tag, "Desperado")) return;
|
||||
|
||||
int level = PerkHelper.getItemPerkLevel(ModPerks.DESPERADO.get(), tag);
|
||||
int level = data.perk.getLevel(ModPerks.DESPERADO);
|
||||
GunsTool.setPerkIntTag(tag, "DesperadoTimePost", 110 + level * 10);
|
||||
data.save();
|
||||
}
|
||||
|
|
|
@ -75,7 +75,7 @@ public class ModPerks {
|
|||
public static final DeferredHolder<Perk, Perk> DESPERADO = DAMAGE_PERKS.register("desperado", () -> new Perk("desperado", Perk.Type.DAMAGE));
|
||||
public static final DeferredHolder<Perk, Perk> VORPAL_WEAPON = DAMAGE_PERKS.register("vorpal_weapon", () -> new Perk("vorpal_weapon", Perk.Type.DAMAGE));
|
||||
|
||||
public static void registerCompatPerks() {
|
||||
// public static void registerCompatPerks() {
|
||||
// if (ModList.get().isLoaded(CompatHolder.DMV)) {
|
||||
// AMMO_PERKS.register("blade_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("blade_bullet", Perk.Type.AMMO)
|
||||
// .bypassArmorRate(-0.2f).damageRate(0.7f).speedRate(0.8f).rgb(0xB4, 0x4B, 0x88).mobEffect(() -> CompatHolder.DMV_BLEEDING)));
|
||||
|
@ -88,10 +88,10 @@ public class ModPerks {
|
|||
// AMMO_PERKS.register("butterfly_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("butterfly_bullet", Perk.Type.AMMO)
|
||||
// .bypassArmorRate(0.0f)));
|
||||
// }
|
||||
}
|
||||
// }
|
||||
|
||||
public static void register(IEventBus bus) {
|
||||
registerCompatPerks();
|
||||
// registerCompatPerks();
|
||||
AMMO_PERKS.register(bus);
|
||||
FUNC_PERKS.register(bus);
|
||||
DAMAGE_PERKS.register(bus);
|
||||
|
|
|
@ -11,14 +11,11 @@ import com.atsuishio.superbwarfare.item.CustomRendererItem;
|
|||
import com.atsuishio.superbwarfare.item.gun.data.AttachmentType;
|
||||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||
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 net.minecraft.client.model.HumanoidModel;
|
||||
import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
|
@ -166,41 +163,40 @@ public abstract class GunItem extends Item implements CustomRendererItem {
|
|||
|
||||
|
||||
private void handleGunPerks(GunData data) {
|
||||
var tag = data.tag();
|
||||
var perk = data.perk;
|
||||
|
||||
reducePerkTagCoolDown(tag, "HealClipTime", "KillClipReloadTime", "KillClipTime", "FourthTimesCharmTick", "HeadSeeker",
|
||||
"DesperadoTime", "DesperadoTimePost");
|
||||
perk.reduceCooldown(ModPerks.HEAL_CLIP, "HealClipTime");
|
||||
|
||||
perk.reduceCooldown(ModPerks.KILL_CLIP, "KillClipReloadTime");
|
||||
perk.reduceCooldown(ModPerks.KILL_CLIP, "KillClipTime");
|
||||
|
||||
perk.reduceCooldown(ModPerks.FOURTH_TIMES_CHARM, "FourthTimesCharmTick");
|
||||
|
||||
perk.reduceCooldown(ModPerks.HEAD_SEEKER, "HeadSeeker");
|
||||
|
||||
perk.reduceCooldown(ModPerks.DESPERADO, "DesperadoTime");
|
||||
perk.reduceCooldown(ModPerks.DESPERADO, "DesperadoTimePost");
|
||||
|
||||
if (perk.getLevel(ModPerks.FOURTH_TIMES_CHARM) > 0) {
|
||||
var tag = data.perk.getTag(ModPerks.FOURTH_TIMES_CHARM);
|
||||
int count = perk.getTag(ModPerks.FOURTH_TIMES_CHARM).getInt("FourthTimesCharmCount");
|
||||
|
||||
if (PerkHelper.getItemPerkLevel(ModPerks.FOURTH_TIMES_CHARM.get(), tag) > 0) {
|
||||
int count = GunsTool.getPerkIntTag(tag, "FourthTimesCharmCount");
|
||||
if (count >= 4) {
|
||||
GunsTool.setPerkIntTag(tag, "FourthTimesCharmTick", 0);
|
||||
GunsTool.setPerkIntTag(tag, "FourthTimesCharmCount", 0);
|
||||
tag.remove("FourthTimesCharmTick");
|
||||
tag.remove("FourthTimesCharmCount");
|
||||
|
||||
int mag = data.magazine();
|
||||
data.setAmmo(Math.min(mag, data.ammo() + 2));
|
||||
}
|
||||
}
|
||||
|
||||
data.save();
|
||||
}
|
||||
|
||||
public boolean canApplyPerk(Perk perk) {
|
||||
return true;
|
||||
}
|
||||
|
||||
private void reducePerkTagCoolDown(final CompoundTag tag, String... tags) {
|
||||
var compound = tag.getCompound("PerkData");
|
||||
|
||||
for (String t : tags) {
|
||||
if (!compound.contains(t)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (compound.getInt(t) > 0) {
|
||||
compound.putInt(t, Math.max(0, compound.getInt(t) - 1));
|
||||
}
|
||||
}
|
||||
tag.put("PerkData", compound);
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否使用弹匣换弹
|
||||
|
|
|
@ -3,7 +3,6 @@ package com.atsuishio.superbwarfare.item.gun.data;
|
|||
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.GunsTool;
|
||||
import net.minecraft.core.component.DataComponents;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
|
@ -20,7 +19,7 @@ public class GunData {
|
|||
private final GunItem item;
|
||||
private final CompoundTag tag;
|
||||
private final CompoundTag data;
|
||||
private final CompoundTag perk;
|
||||
private final CompoundTag perkTag;
|
||||
private final CompoundTag attachmentTag;
|
||||
private final String id;
|
||||
|
||||
|
@ -39,13 +38,14 @@ public class GunData {
|
|||
this.tag = customData != null ? customData.copyTag() : new CompoundTag();
|
||||
|
||||
data = getOrPut("GunData");
|
||||
perk = getOrPut("PerkData");
|
||||
perkTag = getOrPut("Perks");
|
||||
attachmentTag = getOrPut("Attachments");
|
||||
|
||||
reload = new Reload(this);
|
||||
charge = new Charge(this);
|
||||
bolt = new Bolt(this);
|
||||
attachment = new Attachment(this);
|
||||
perk = new Perks(this);
|
||||
}
|
||||
|
||||
private CompoundTag getOrPut(String name) {
|
||||
|
@ -96,7 +96,7 @@ public class GunData {
|
|||
}
|
||||
|
||||
public CompoundTag perk() {
|
||||
return perk;
|
||||
return perkTag;
|
||||
}
|
||||
|
||||
public CompoundTag attachment() {
|
||||
|
@ -116,7 +116,7 @@ public class GunData {
|
|||
}
|
||||
|
||||
public double perkDamageRate() {
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
var perk = this.perk.get(Perk.Type.AMMO);
|
||||
if (perk instanceof AmmoPerk ammoPerk) {
|
||||
return ammoPerk.damageRate;
|
||||
}
|
||||
|
@ -302,6 +302,7 @@ public class GunData {
|
|||
|
||||
public final Bolt bolt;
|
||||
public final Attachment attachment;
|
||||
public final Perks perk;
|
||||
|
||||
public void save() {
|
||||
stack.set(DataComponents.CUSTOM_DATA, CustomData.of(tag));
|
||||
|
|
|
@ -0,0 +1,136 @@
|
|||
package com.atsuishio.superbwarfare.item.gun.data;
|
||||
|
||||
import com.atsuishio.superbwarfare.init.ModPerks;
|
||||
import com.atsuishio.superbwarfare.item.PerkItem;
|
||||
import com.atsuishio.superbwarfare.perk.Perk;
|
||||
import com.atsuishio.superbwarfare.perk.PerkInstance;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.neoforged.neoforge.registries.DeferredHolder;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public final class Perks {
|
||||
private final CompoundTag perks;
|
||||
|
||||
Perks(GunData gun) {
|
||||
this.perks = gun.perk();
|
||||
}
|
||||
|
||||
public boolean has(Perk perk) {
|
||||
if (!has(perk.type)) return false;
|
||||
return getTag(perk).getString("Name").equals(perk.name);
|
||||
}
|
||||
|
||||
public boolean has(Perk.Type type) {
|
||||
return perks.contains(type.getName());
|
||||
}
|
||||
|
||||
public void set(PerkInstance instance) {
|
||||
set(instance.perk(), instance.level());
|
||||
}
|
||||
|
||||
public CompoundTag getTag(DeferredHolder<Perk, Perk> registry) {
|
||||
return getTag(registry.get().type);
|
||||
}
|
||||
|
||||
public CompoundTag getTag(Perk perk) {
|
||||
return getTag(perk.type);
|
||||
}
|
||||
|
||||
public CompoundTag getTag(Perk.Type type) {
|
||||
CompoundTag typeTag;
|
||||
if (!perks.contains(type.getName())) {
|
||||
typeTag = new CompoundTag();
|
||||
perks.put(type.getName(), typeTag);
|
||||
}
|
||||
return perks.getCompound(type.getName());
|
||||
}
|
||||
|
||||
public void set(Perk perk, short level) {
|
||||
getTag(perk).putString("Name", perk.name);
|
||||
getTag(perk).putShort("Level", level);
|
||||
}
|
||||
|
||||
public short getLevel(PerkItem<?> item) {
|
||||
return getLevel(item.getPerk());
|
||||
}
|
||||
|
||||
public short getLevel(DeferredHolder<Perk, Perk> perk) {
|
||||
return getLevel(perk.get());
|
||||
}
|
||||
|
||||
public short getLevel(Perk perk) {
|
||||
var name = perk.name;
|
||||
var tag = getTag(perk);
|
||||
if (!tag.getString("Name").equals(name)) return 0;
|
||||
return getLevel(perk.type);
|
||||
}
|
||||
|
||||
public short getLevel(Perk.Type type) {
|
||||
return getTag(type).getShort("Level");
|
||||
}
|
||||
|
||||
public @Nullable Perk get(DeferredHolder<Perk, Perk> registry) {
|
||||
return get(registry.get());
|
||||
}
|
||||
|
||||
public @Nullable Perk get(Perk perk) {
|
||||
return get(perk.type);
|
||||
}
|
||||
|
||||
public @Nullable Perk get(Perk.Type type) {
|
||||
var perksRegistry = new ArrayList<DeferredHolder<Perk, ? extends Perk>>();
|
||||
perksRegistry.addAll(ModPerks.AMMO_PERKS.getEntries());
|
||||
perksRegistry.addAll(ModPerks.FUNC_PERKS.getEntries());
|
||||
perksRegistry.addAll(ModPerks.DAMAGE_PERKS.getEntries());
|
||||
|
||||
for (var registry : perksRegistry) {
|
||||
var name = getTag(type).getString("Name");
|
||||
if (registry.get().name.equals(name)) {
|
||||
return registry.get();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public @Nullable PerkInstance getInstance(Perk perk) {
|
||||
return getInstance(perk.type);
|
||||
}
|
||||
|
||||
public @Nullable PerkInstance getInstance(Perk.Type type) {
|
||||
var perk = get(type);
|
||||
if (perk == null) return null;
|
||||
|
||||
return new PerkInstance(perk, getLevel(type));
|
||||
}
|
||||
|
||||
public void reduceCooldown(DeferredHolder<Perk, Perk> registry, String name) {
|
||||
reduceCooldown(registry.get(), name);
|
||||
}
|
||||
|
||||
public void reduceCooldown(Perk perk, String name) {
|
||||
reduceCooldown(perk.type, name);
|
||||
}
|
||||
|
||||
public void reduceCooldown(Perk.Type type, String name) {
|
||||
var tag = getTag(type);
|
||||
var value = tag.getInt(name);
|
||||
value--;
|
||||
|
||||
if (value <= 0) {
|
||||
tag.remove(name);
|
||||
} else {
|
||||
tag.putInt(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
public void remove(Perk perk) {
|
||||
remove(perk.type);
|
||||
}
|
||||
|
||||
public void remove(Perk.Type type) {
|
||||
perks.remove(type.getName());
|
||||
}
|
||||
|
||||
}
|
|
@ -262,9 +262,9 @@ public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon {
|
|||
new Vec3(tag.getDouble("TargetPosX"), tag.getDouble("TargetPosY"), tag.getDouble("TargetPosZ"))
|
||||
);
|
||||
|
||||
var dmgPerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE);
|
||||
var dmgPerk = data.perk.get(Perk.Type.DAMAGE);
|
||||
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, tag);
|
||||
int perkLevel = data.perk.getLevel(dmgPerk);
|
||||
missileEntity.setMonsterMultiplier(0.1f + 0.1f * perkLevel);
|
||||
}
|
||||
|
||||
|
|
|
@ -187,16 +187,16 @@ public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon {
|
|||
(float) data.explosionRadius()
|
||||
);
|
||||
|
||||
var dmgPerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE);
|
||||
var dmgPerk = data.perk.get(Perk.Type.DAMAGE);
|
||||
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, tag);
|
||||
int perkLevel = data.perk.getLevel(dmgPerk);
|
||||
gunGrenadeEntity.setMonsterMultiplier(0.1f + 0.1f * perkLevel);
|
||||
}
|
||||
|
||||
gunGrenadeEntity.setNoGravity(PerkHelper.getPerkByType(tag, Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get());
|
||||
gunGrenadeEntity.setNoGravity(data.perk.get(Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get());
|
||||
|
||||
float velocity = (float) data.velocity();
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), data.tag());
|
||||
int perkLevel = data.perk.getLevel(ModPerks.MICRO_MISSILE);
|
||||
if (perkLevel > 0) {
|
||||
gunGrenadeEntity.setExplosionRadius((float) data.explosionRadius() * 0.5f);
|
||||
gunGrenadeEntity.setDamage((float) data.explosionDamage() * (1.1f + perkLevel * 0.1f));
|
||||
|
|
|
@ -201,18 +201,18 @@ public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon {
|
|||
(float) data.explosionRadius()
|
||||
);
|
||||
|
||||
var dmgPerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE);
|
||||
var dmgPerk = data.perk.get(Perk.Type.DAMAGE);
|
||||
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, tag);
|
||||
int perkLevel = data.perk.getLevel(dmgPerk);
|
||||
rocket.setMonsterMultiplier(0.1f + 0.1f * perkLevel);
|
||||
}
|
||||
|
||||
float velocity = (float) data.velocity();
|
||||
|
||||
if (PerkHelper.getPerkByType(tag, Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get()) {
|
||||
if (data.perk.get(Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get()) {
|
||||
rocket.setNoGravity(true);
|
||||
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), tag);
|
||||
int perkLevel = data.perk.getLevel(ModPerks.MICRO_MISSILE);
|
||||
if (perkLevel > 0) {
|
||||
rocket.setExplosionRadius(0.5f);
|
||||
rocket.setDamage((float) data.damage() * (1.1f + perkLevel * 0.1f));
|
||||
|
|
|
@ -291,17 +291,17 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW
|
|||
(float) data.explosionRadius()
|
||||
);
|
||||
|
||||
var dmgPerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE);
|
||||
var dmgPerk = data.perk.get(Perk.Type.DAMAGE);
|
||||
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, tag);
|
||||
int perkLevel = data.perk.getLevel(dmgPerk);
|
||||
gunGrenadeEntity.setMonsterMultiplier(0.1f + 0.1f * perkLevel);
|
||||
}
|
||||
|
||||
gunGrenadeEntity.setNoGravity(PerkHelper.getPerkByType(tag, Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get());
|
||||
gunGrenadeEntity.setNoGravity(data.perk.get(Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get());
|
||||
gunGrenadeEntity.charged(isChargedFire);
|
||||
|
||||
float velocity = (float) data.velocity();
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), data.tag());
|
||||
int perkLevel = data.perk.getLevel(ModPerks.MICRO_MISSILE);
|
||||
if (perkLevel > 0) {
|
||||
gunGrenadeEntity.setExplosionRadius((float) data.explosionRadius() * 0.5f);
|
||||
gunGrenadeEntity.setDamage((float) data.damage() * (1.1f + perkLevel * 0.1f));
|
||||
|
|
|
@ -15,7 +15,6 @@ import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
|||
import com.atsuishio.superbwarfare.network.message.receive.ShootClientMessage;
|
||||
import com.atsuishio.superbwarfare.perk.AmmoPerk;
|
||||
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;
|
||||
|
@ -174,7 +173,7 @@ public class BocekItem extends GunItem implements GeoItem, SpecialFireWeapon {
|
|||
|
||||
var tag = data.tag();
|
||||
var stack = data.stack();
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
var perk = data.perk.get(Perk.Type.AMMO);
|
||||
|
||||
if (player instanceof ServerPlayer serverPlayer) {
|
||||
SoundTool.stopSound(serverPlayer, ModSounds.BOCEK_PULL_1P.getId(), SoundSource.PLAYERS);
|
||||
|
|
|
@ -16,7 +16,6 @@ import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon;
|
|||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||
import com.atsuishio.superbwarfare.network.message.receive.ShootClientMessage;
|
||||
import com.atsuishio.superbwarfare.perk.Perk;
|
||||
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
||||
import com.atsuishio.superbwarfare.tools.GunsTool;
|
||||
import com.atsuishio.superbwarfare.tools.SoundTool;
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
@ -154,7 +153,7 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En
|
|||
data.save();
|
||||
}
|
||||
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.REGENERATION.get(), tag);
|
||||
int perkLevel = data.perk.getLevel(ModPerks.REGENERATION);
|
||||
|
||||
var stackStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM);
|
||||
if (stackStorage != null) {
|
||||
|
@ -228,7 +227,7 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En
|
|||
ItemStack stack = data.stack();
|
||||
var tag = data.tag();
|
||||
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), tag);
|
||||
int perkLevel = data.perk.getLevel(ModPerks.VOLT_OVERLOAD);
|
||||
var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM);
|
||||
var hasEnoughEnergy = energyStorage != null && energyStorage.getEnergyStored() >= 400 + 100 * perkLevel;
|
||||
|
||||
|
@ -244,8 +243,8 @@ public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon, En
|
|||
boolean zoom = cap != null && cap.zoom;
|
||||
double spread = data.spread();
|
||||
|
||||
int volt = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), tag);
|
||||
int wireLength = PerkHelper.getItemPerkLevel(ModPerks.LONGER_WIRE.get(), tag);
|
||||
int volt = data.perk.getLevel(ModPerks.VOLT_OVERLOAD);
|
||||
int wireLength = data.perk.getLevel(ModPerks.LONGER_WIRE);
|
||||
|
||||
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);
|
||||
|
|
|
@ -7,8 +7,7 @@ import com.atsuishio.superbwarfare.item.PerkItem;
|
|||
import com.atsuishio.superbwarfare.item.gun.GunItem;
|
||||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||
import com.atsuishio.superbwarfare.perk.Perk;
|
||||
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
||||
import com.atsuishio.superbwarfare.tools.NBTTool;
|
||||
import com.atsuishio.superbwarfare.perk.PerkInstance;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.Container;
|
||||
import net.minecraft.world.SimpleContainer;
|
||||
|
@ -22,6 +21,7 @@ import net.minecraft.world.item.ItemStack;
|
|||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.List;
|
||||
|
||||
public class ReforgingTableMenu extends AbstractContainerMenu {
|
||||
|
||||
|
@ -164,12 +164,12 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
|
|||
for (int i = 0; i < this.container.getContainerSize(); ++i) {
|
||||
ItemStack itemstack = this.container.getItem(i);
|
||||
|
||||
if (itemstack.getItem() instanceof PerkItem<?> perkItem) {
|
||||
final var tag = NBTTool.getTag(copy);
|
||||
if (!copy.isEmpty() && PerkHelper.getItemPerkLevel(perkItem.getPerk(), tag) > 0) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (copy.getItem() instanceof GunItem
|
||||
&& itemstack.getItem() instanceof PerkItem<?> perkItem
|
||||
&& !copy.isEmpty()
|
||||
&& GunData.from(copy).perk.getLevel(perkItem) > 0
|
||||
) continue;
|
||||
|
||||
|
||||
if (!itemstack.isEmpty()) {
|
||||
pPlayer.getInventory().placeItemBackInInventory(itemstack);
|
||||
|
@ -238,28 +238,24 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
|
|||
|
||||
ItemStack result = gun.copy();
|
||||
var data = GunData.from(result);
|
||||
final var tag = data.tag();
|
||||
|
||||
if (!ammo.isEmpty() && ammo.getItem() instanceof PerkItem<?> perkItem) {
|
||||
if (gunItem.canApplyPerk(perkItem.getPerk())) {
|
||||
PerkHelper.setPerk(tag, perkItem.getPerk(), this.ammoPerkLevel.get());
|
||||
this.container.setItem(AMMO_PERK_SLOT, ItemStack.EMPTY);
|
||||
List.of(ammo, func, damage).forEach(item -> {
|
||||
if (!item.isEmpty()
|
||||
&& item.getItem() instanceof PerkItem<?> perkItem
|
||||
&& gunItem.canApplyPerk(perkItem.getPerk())
|
||||
) {
|
||||
data.perk.set(new PerkInstance(perkItem.getPerk(), (short) switch (perkItem.getPerk().type) {
|
||||
case AMMO -> this.ammoPerkLevel.get();
|
||||
case FUNCTIONAL -> this.funcPerkLevel.get();
|
||||
case DAMAGE -> this.damagePerkLevel.get();
|
||||
}));
|
||||
this.container.setItem(switch (perkItem.getPerk().type) {
|
||||
case AMMO -> AMMO_PERK_SLOT;
|
||||
case FUNCTIONAL -> FUNC_PERK_SLOT;
|
||||
case DAMAGE -> DAMAGE_PERK_SLOT;
|
||||
}, ItemStack.EMPTY);
|
||||
}
|
||||
}
|
||||
|
||||
if (!func.isEmpty() && func.getItem() instanceof PerkItem<?> perkItem) {
|
||||
if (gunItem.canApplyPerk(perkItem.getPerk())) {
|
||||
PerkHelper.setPerk(tag, 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(tag, perkItem.getPerk(), this.damagePerkLevel.get());
|
||||
this.container.setItem(DAMAGE_PERK_SLOT, ItemStack.EMPTY);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
data.save();
|
||||
handleUpgradePoint(result);
|
||||
|
@ -292,22 +288,23 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
|
|||
case DAMAGE -> this.damagePerkLevel.set(0);
|
||||
}
|
||||
|
||||
final var tag = NBTTool.getTag(gun);
|
||||
int level = PerkHelper.getItemPerkLevel(perkItem.getPerk(), tag);
|
||||
var data = GunData.from(gun);
|
||||
var inputData = GunData.from(gun);
|
||||
int level = inputData.perk.getLevel(perkItem);
|
||||
|
||||
if (level <= 0) {
|
||||
this.upgradePoint.set((int) data.upgradePoint());
|
||||
this.upgradePoint.set((int) inputData.upgradePoint());
|
||||
return;
|
||||
}
|
||||
|
||||
ItemStack output = gun.copy();
|
||||
final var outputTag = NBTTool.getTag(output);
|
||||
PerkHelper.removePerkByType(outputTag, perkItem.getPerk().type);
|
||||
data.setUpgradePoint(Math.min(MAX_UPGRADE_POINT, level - 1 + data.upgradePoint()));
|
||||
this.upgradePoint.set((int) data.upgradePoint());
|
||||
var outputData = GunData.from(output);
|
||||
outputData.perk.remove(perkItem.getPerk());
|
||||
|
||||
data.save();
|
||||
inputData.setUpgradePoint(Math.min(MAX_UPGRADE_POINT, level - 1 + inputData.upgradePoint()));
|
||||
this.upgradePoint.set((int) inputData.upgradePoint());
|
||||
|
||||
outputData.save();
|
||||
inputData.save();
|
||||
this.container.setItem(INPUT_SLOT, output);
|
||||
this.container.setChanged();
|
||||
}
|
||||
|
@ -338,30 +335,27 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
|
|||
private void onPlaceGun(ItemStack stack) {
|
||||
if (!(stack.getItem() instanceof GunItem)) return;
|
||||
var data = GunData.from(stack);
|
||||
var tag = data.tag();
|
||||
|
||||
int point = (int) data.upgradePoint();
|
||||
this.upgradePoint.set(Mth.clamp(point, 0, MAX_UPGRADE_POINT));
|
||||
|
||||
var ammoPerk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
if (ammoPerk != null) {
|
||||
this.ammoPerkLevel.set(PerkHelper.getItemPerkLevel(ammoPerk, tag));
|
||||
var ammoPerkItem = PerkHelper.getPerkItem(ammoPerk);
|
||||
ammoPerkItem.ifPresent(registryObject -> this.container.setItem(AMMO_PERK_SLOT, registryObject.get().getDefaultInstance()));
|
||||
}
|
||||
for (var type : Perk.Type.values()) {
|
||||
var perkInstance = data.perk.getInstance(type);
|
||||
if (perkInstance != null) {
|
||||
switch (type) {
|
||||
case AMMO -> this.ammoPerkLevel.set(perkInstance.level());
|
||||
case FUNCTIONAL -> this.funcPerkLevel.set(perkInstance.level());
|
||||
case DAMAGE -> this.damagePerkLevel.set(perkInstance.level());
|
||||
}
|
||||
|
||||
var funcPerk = PerkHelper.getPerkByType(tag, Perk.Type.FUNCTIONAL);
|
||||
if (funcPerk != null) {
|
||||
this.funcPerkLevel.set(PerkHelper.getItemPerkLevel(funcPerk, tag));
|
||||
var funcPerkItem = PerkHelper.getPerkItem(funcPerk);
|
||||
funcPerkItem.ifPresent(registryObject -> this.container.setItem(FUNC_PERK_SLOT, registryObject.get().getDefaultInstance()));
|
||||
}
|
||||
var ammoPerkItem = perkInstance.perk().getItem().get();
|
||||
|
||||
var damagePerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE);
|
||||
if (damagePerk != null) {
|
||||
this.damagePerkLevel.set(PerkHelper.getItemPerkLevel(damagePerk, tag));
|
||||
var damagePerkItem = PerkHelper.getPerkItem(damagePerk);
|
||||
damagePerkItem.ifPresent(registryObject -> this.container.setItem(DAMAGE_PERK_SLOT, registryObject.get().getDefaultInstance()));
|
||||
this.container.setItem(switch (type) {
|
||||
case AMMO -> AMMO_PERK_SLOT;
|
||||
case FUNCTIONAL -> FUNC_PERK_SLOT;
|
||||
case DAMAGE -> DAMAGE_PERK_SLOT;
|
||||
}, ammoPerkItem.getDefaultInstance());
|
||||
}
|
||||
}
|
||||
|
||||
this.container.setChanged();
|
||||
|
@ -374,28 +368,23 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
|
|||
* @param stack 输入的枪械
|
||||
*/
|
||||
private void onTakeGun(ItemStack stack) {
|
||||
if (!(stack.getItem() instanceof GunItem)) {
|
||||
return;
|
||||
}
|
||||
final var tag = NBTTool.getTag(stack);
|
||||
var ammoPerk = PerkHelper.getPerkByType(tag, 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);
|
||||
}
|
||||
}
|
||||
if (!(stack.getItem() instanceof GunItem)) return;
|
||||
|
||||
var funcPerk = PerkHelper.getPerkByType(tag, 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 data = GunData.from(stack);
|
||||
|
||||
var damagePerk = PerkHelper.getPerkByType(tag, 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);
|
||||
for (var type : Perk.Type.values()) {
|
||||
var perk = data.perk.get(type);
|
||||
var slot = switch (type) {
|
||||
case AMMO -> AMMO_PERK_SLOT;
|
||||
case FUNCTIONAL -> FUNC_PERK_SLOT;
|
||||
case DAMAGE -> DAMAGE_PERK_SLOT;
|
||||
};
|
||||
|
||||
if (perk != null &&
|
||||
this.container.getItem(slot).getItem() instanceof PerkItem<?> perkItem
|
||||
&& perkItem.getPerk() == perk
|
||||
) {
|
||||
this.container.setItem(slot, ItemStack.EMPTY);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,7 +10,6 @@ import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon;
|
|||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||
import com.atsuishio.superbwarfare.perk.AmmoPerk;
|
||||
import com.atsuishio.superbwarfare.perk.Perk;
|
||||
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
||||
import com.atsuishio.superbwarfare.tools.GunsTool;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.minecraft.core.Holder;
|
||||
|
@ -105,8 +104,7 @@ public record FireMessage(int msgType) implements CustomPacketPayload {
|
|||
}
|
||||
}
|
||||
|
||||
public static double perkSpeed(final CompoundTag tag) {
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
public static double perkSpeed(Perk perk) {
|
||||
if (perk instanceof AmmoPerk ammoPerk) {
|
||||
return ammoPerk.speedRate;
|
||||
}
|
||||
|
@ -118,9 +116,9 @@ public record FireMessage(int msgType) implements CustomPacketPayload {
|
|||
if (player.level().isClientSide()) return;
|
||||
var data = GunData.from(stack);
|
||||
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
var perk = data.perk.get(Perk.Type.AMMO);
|
||||
float headshot = (float) data.headshot();
|
||||
float velocity = 2 * (float) GunsTool.getGunDoubleTag(tag, "Power", 6) * (float) perkSpeed(tag);
|
||||
float velocity = 2 * (float) GunsTool.getGunDoubleTag(tag, "Power", 6) * (float) perkSpeed(perk);
|
||||
float bypassArmorRate = (float) data.bypassArmor();
|
||||
double damage;
|
||||
|
||||
|
@ -145,7 +143,7 @@ public record FireMessage(int msgType) implements CustomPacketPayload {
|
|||
.zoom(zoom);
|
||||
|
||||
if (perk instanceof AmmoPerk ammoPerk) {
|
||||
int level = PerkHelper.getItemPerkLevel(perk, tag);
|
||||
int level = data.perk.getLevel(perk);
|
||||
|
||||
bypassArmorRate += ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0);
|
||||
projectile.setRGB(ammoPerk.rgb);
|
||||
|
@ -177,24 +175,24 @@ public record FireMessage(int msgType) implements CustomPacketPayload {
|
|||
projectile.bypassArmorRate(bypassArmorRate);
|
||||
|
||||
if (perk == ModPerks.SILVER_BULLET.get()) {
|
||||
int level = PerkHelper.getItemPerkLevel(perk, tag);
|
||||
int level = data.perk.getLevel(perk);
|
||||
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, tag);
|
||||
int level = data.perk.getLevel(perk);
|
||||
projectile.jhpBullet(level);
|
||||
} else if (perk == ModPerks.HE_BULLET.get()) {
|
||||
int level = PerkHelper.getItemPerkLevel(perk, tag);
|
||||
int level = data.perk.getLevel(perk);
|
||||
projectile.heBullet(level);
|
||||
} else if (perk == ModPerks.INCENDIARY_BULLET.get()) {
|
||||
int level = PerkHelper.getItemPerkLevel(perk, tag);
|
||||
int level = data.perk.getLevel(perk);
|
||||
projectile.fireBullet(level, !zoom);
|
||||
}
|
||||
|
||||
var dmgPerk = PerkHelper.getPerkByType(tag, Perk.Type.DAMAGE);
|
||||
var dmgPerk = data.perk.get(Perk.Type.DAMAGE);
|
||||
if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) {
|
||||
int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, tag);
|
||||
int perkLevel = data.perk.getLevel(dmgPerk);
|
||||
projectile.monsterMultiple(0.1f + 0.1f * perkLevel);
|
||||
}
|
||||
|
||||
|
|
|
@ -10,7 +10,6 @@ import com.atsuishio.superbwarfare.init.ModTags;
|
|||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||
import com.atsuishio.superbwarfare.perk.AmmoPerk;
|
||||
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.ParticleTool;
|
||||
|
@ -88,7 +87,7 @@ public record ShootMessage(double spread) implements CustomPacketPayload {
|
|||
}
|
||||
}
|
||||
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
var perk = data.perk.get(Perk.Type.AMMO);
|
||||
|
||||
for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) {
|
||||
GunEventHandler.gunShoot(player, tag, spared);
|
||||
|
@ -110,7 +109,7 @@ public record ShootMessage(double spread) implements CustomPacketPayload {
|
|||
}
|
||||
}
|
||||
|
||||
var perk = PerkHelper.getPerkByType(tag, Perk.Type.AMMO);
|
||||
var perk = data.perk.get(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) {
|
||||
|
|
|
@ -1,26 +1,77 @@
|
|||
package com.atsuishio.superbwarfare.perk;
|
||||
|
||||
import com.atsuishio.superbwarfare.init.ModItems;
|
||||
import com.atsuishio.superbwarfare.item.PerkItem;
|
||||
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.neoforged.neoforge.registries.DeferredHolder;
|
||||
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
public class Perk {
|
||||
public String descriptionId;
|
||||
public Type type;
|
||||
public final String descriptionId;
|
||||
public final String name;
|
||||
public final Type type;
|
||||
public int level = 1;
|
||||
|
||||
public BiFunction<GunData, PerkInstance, Void> tick;
|
||||
public BiFunction<GunData, PerkInstance, Void> preReload;
|
||||
public BiFunction<GunData, PerkInstance, Void> postReload;
|
||||
public BiFunction<GunData, PerkInstance, Void> onKill;
|
||||
|
||||
public Perk(String descriptionId, Type type) {
|
||||
this.descriptionId = descriptionId;
|
||||
this.type = type;
|
||||
|
||||
StringBuilder builder = new StringBuilder();
|
||||
boolean useUpperCase = false;
|
||||
boolean isFirst = true;
|
||||
for (char c : descriptionId.toCharArray()) {
|
||||
if (isFirst || useUpperCase) {
|
||||
builder.append(Character.toUpperCase(c));
|
||||
isFirst = false;
|
||||
useUpperCase = false;
|
||||
} else if (c == '_') {
|
||||
useUpperCase = true;
|
||||
} else {
|
||||
builder.append(c);
|
||||
}
|
||||
}
|
||||
|
||||
this.name = builder.toString();
|
||||
}
|
||||
|
||||
public DeferredHolder<Item, ? extends Item> getItem() {
|
||||
var result = ModItems.PERKS.getEntries().stream().filter(p -> {
|
||||
if (p.get() instanceof PerkItem<?> perkItem) {
|
||||
return perkItem.getPerk() == this;
|
||||
}
|
||||
return false;
|
||||
}).findFirst();
|
||||
if (result.isEmpty()) throw new IllegalStateException("Perk " + this.name + " not found");
|
||||
|
||||
return result.get();
|
||||
}
|
||||
|
||||
public enum Type {
|
||||
AMMO("Ammo"),
|
||||
FUNCTIONAL("Functional"),
|
||||
DAMAGE("Damage");
|
||||
private final String type;
|
||||
AMMO("Ammo", ChatFormatting.YELLOW),
|
||||
FUNCTIONAL("Functional", ChatFormatting.GREEN),
|
||||
DAMAGE("Damage", ChatFormatting.RED);
|
||||
private final String name;
|
||||
private final ChatFormatting color;
|
||||
|
||||
Type(String type) {
|
||||
this.type = type;
|
||||
Type(String type, ChatFormatting color) {
|
||||
this.name = type;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return type;
|
||||
return name;
|
||||
}
|
||||
|
||||
public ChatFormatting getColor() {
|
||||
return color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,171 +1,11 @@
|
|||
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.item.gun.data.GunData;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.item.Item;
|
||||
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, GunData data) {
|
||||
return getItemPerkLevel(perk, data.tag());
|
||||
}
|
||||
|
||||
public static int getItemPerkLevel(Perk perk, final CompoundTag tag) {
|
||||
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(tag, perk.type));
|
||||
}
|
||||
|
||||
public static CompoundTag getPerkTag(GunData data, Perk.Type type) {
|
||||
return getPerkTag(data.tag(), type);
|
||||
}
|
||||
|
||||
public static CompoundTag getPerkTag(final CompoundTag tag, Perk.Type type) {
|
||||
var tagPerk = tag.getCompound(TAG_PERK);
|
||||
if (!tagPerk.contains(type.getName())) return new CompoundTag();
|
||||
return tagPerk.getCompound(type.getName());
|
||||
}
|
||||
|
||||
public static void setPerk(final CompoundTag tag, Perk perk, int level) {
|
||||
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);
|
||||
}
|
||||
|
||||
public static void setPerk(final CompoundTag tag, Perk perk) {
|
||||
setPerk(tag, perk, 1);
|
||||
}
|
||||
|
||||
public static Perk getPerkByType(GunData data, Perk.Type type) {
|
||||
return getPerkByType(data.tag(), type);
|
||||
}
|
||||
|
||||
|
||||
@Nullable
|
||||
public static Perk getPerkByType(final CompoundTag tag, Perk.Type type) {
|
||||
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(final CompoundTag tag, Perk.Type type) {
|
||||
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();
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
package com.atsuishio.superbwarfare.perk;
|
||||
|
||||
public record PerkInstance(Perk perk, short level) {
|
||||
}
|
Loading…
Add table
Reference in a new issue