优化NBT#Level Exp UpgradePoint
This commit is contained in:
parent
645effa77b
commit
ef1cedbf0a
5 changed files with 37 additions and 41 deletions
|
@ -8,7 +8,6 @@ import com.atsuishio.superbwarfare.perk.AmmoPerk;
|
||||||
import com.atsuishio.superbwarfare.perk.Perk;
|
import com.atsuishio.superbwarfare.perk.Perk;
|
||||||
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
||||||
import com.atsuishio.superbwarfare.tools.GunsTool;
|
import com.atsuishio.superbwarfare.tools.GunsTool;
|
||||||
import com.atsuishio.superbwarfare.tools.ItemNBTTool;
|
|
||||||
import com.atsuishio.superbwarfare.tools.TooltipTool;
|
import com.atsuishio.superbwarfare.tools.TooltipTool;
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
import net.minecraft.client.gui.Font;
|
import net.minecraft.client.gui.Font;
|
||||||
|
@ -23,7 +22,6 @@ import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
|
|
||||||
// TODO 等nbt重置后,修改nbt位置
|
|
||||||
public class ClientGunImageTooltip implements ClientTooltipComponent {
|
public class ClientGunImageTooltip implements ClientTooltipComponent {
|
||||||
|
|
||||||
protected final int width;
|
protected final int width;
|
||||||
|
@ -106,7 +104,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent {
|
||||||
if (this.stack.getItem() instanceof GunItem gunItem && gunItem.autoWeapon(this.stack)) {
|
if (this.stack.getItem() instanceof GunItem gunItem && gunItem.autoWeapon(this.stack)) {
|
||||||
return Component.translatable("des.superbwarfare.tips.rpm").withStyle(ChatFormatting.GRAY)
|
return Component.translatable("des.superbwarfare.tips.rpm").withStyle(ChatFormatting.GRAY)
|
||||||
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
||||||
.append(Component.literal(new DecimalFormat("##").format(GunsTool.getGunIntTag(stack, "RPM", 0) + ItemNBTTool.getDouble(stack, "customRpm", 0)))
|
.append(Component.literal(new DecimalFormat("##").format(GunsTool.getGunIntTag(stack, "RPM", 0)))
|
||||||
.withStyle(ChatFormatting.GREEN));
|
.withStyle(ChatFormatting.GREEN));
|
||||||
}
|
}
|
||||||
return Component.literal("");
|
return Component.literal("");
|
||||||
|
@ -125,8 +123,8 @@ public class ClientGunImageTooltip implements ClientTooltipComponent {
|
||||||
* 获取武器等级文本组件
|
* 获取武器等级文本组件
|
||||||
*/
|
*/
|
||||||
protected Component getLevelComponent() {
|
protected Component getLevelComponent() {
|
||||||
int level = ItemNBTTool.getInt(stack, "Level", 0);
|
int level = GunsTool.getGunIntTag(stack, "Level", 0);
|
||||||
double rate = ItemNBTTool.getDouble(stack, "Exp", 0) / (20 * Math.pow(level, 2) + 160 * level + 20);
|
double rate = GunsTool.getGunDoubleTag(stack, "Exp", 0) / (20 * Math.pow(level, 2) + 160 * level + 20);
|
||||||
|
|
||||||
ChatFormatting formatting;
|
ChatFormatting formatting;
|
||||||
if (level < 10) {
|
if (level < 10) {
|
||||||
|
@ -152,7 +150,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent {
|
||||||
* 获取武器强化点数文本组件
|
* 获取武器强化点数文本组件
|
||||||
*/
|
*/
|
||||||
protected Component getUpgradePointComponent() {
|
protected Component getUpgradePointComponent() {
|
||||||
int upgradePoint = Mth.floor(ItemNBTTool.getDouble(stack, "UpgradePoint", 0));
|
int upgradePoint = Mth.floor(GunsTool.getGunDoubleTag(stack, "UpgradePoint", 0));
|
||||||
return Component.translatable("des.superbwarfare.tips.upgrade_point").withStyle(ChatFormatting.GRAY)
|
return Component.translatable("des.superbwarfare.tips.upgrade_point").withStyle(ChatFormatting.GRAY)
|
||||||
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
.append(Component.literal("").withStyle(ChatFormatting.RESET))
|
||||||
.append(Component.literal(String.valueOf(upgradePoint)).withStyle(ChatFormatting.WHITE).withStyle(ChatFormatting.BOLD));
|
.append(Component.literal(String.valueOf(upgradePoint)).withStyle(ChatFormatting.WHITE).withStyle(ChatFormatting.BOLD));
|
||||||
|
|
|
@ -446,7 +446,6 @@ public class ClientEventHandler {
|
||||||
burstFireSize--;
|
burstFireSize--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (stack.is(ModItems.DEVOTION.get())) {
|
if (stack.is(ModItems.DEVOTION.get())) {
|
||||||
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.TURBO_CHARGER.get(), stack);
|
int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.TURBO_CHARGER.get(), stack);
|
||||||
customRpm = Math.min(customRpm + 15 + ((perkLevel > 0 ? 5 : 0) + 3 * perkLevel), 500);
|
customRpm = Math.min(customRpm + 15 + ((perkLevel > 0 ? 5 : 0) + 3 * perkLevel), 500);
|
||||||
|
|
|
@ -189,14 +189,14 @@ public class LivingEventHandler {
|
||||||
// 先处理发射器类武器或高爆弹的爆炸伤害
|
// 先处理发射器类武器或高爆弹的爆炸伤害
|
||||||
if (source.is(ModDamageTypes.PROJECTILE_BOOM)) {
|
if (source.is(ModDamageTypes.PROJECTILE_BOOM)) {
|
||||||
if (stack.is(ModTags.Items.LAUNCHER) || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), stack) > 0) {
|
if (stack.is(ModTags.Items.LAUNCHER) || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), stack) > 0) {
|
||||||
stack.getOrCreateTag().putDouble("Exp", stack.getOrCreateTag().getDouble("Exp") + amount);
|
GunsTool.setGunDoubleTag(stack, "Exp", GunsTool.getGunDoubleTag(stack, "Exp", 0) + amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 再判断是不是枪械能造成的伤害
|
// 再判断是不是枪械能造成的伤害
|
||||||
if (!DamageTypeTool.isGunDamage(source)) return;
|
if (!DamageTypeTool.isGunDamage(source)) return;
|
||||||
|
|
||||||
stack.getOrCreateTag().putDouble("Exp", stack.getOrCreateTag().getDouble("Exp") + amount);
|
GunsTool.setGunDoubleTag(stack, "Exp", GunsTool.getGunDoubleTag(stack, "Exp", 0) + amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void giveKillExpToWeapon(LivingDeathEvent event) {
|
private static void giveKillExpToWeapon(LivingDeathEvent event) {
|
||||||
|
@ -209,32 +209,31 @@ public class LivingEventHandler {
|
||||||
if (event.getEntity() instanceof TargetEntity) return;
|
if (event.getEntity() instanceof TargetEntity) return;
|
||||||
|
|
||||||
double amount = 20 + 2 * event.getEntity().getMaxHealth();
|
double amount = 20 + 2 * event.getEntity().getMaxHealth();
|
||||||
var tag = stack.getOrCreateTag();
|
|
||||||
|
|
||||||
// 先处理发射器类武器或高爆弹的爆炸伤害
|
// 先处理发射器类武器或高爆弹的爆炸伤害
|
||||||
if (source.is(ModDamageTypes.PROJECTILE_BOOM)) {
|
if (source.is(ModDamageTypes.PROJECTILE_BOOM)) {
|
||||||
if (stack.is(ModTags.Items.LAUNCHER) || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), stack) > 0) {
|
if (stack.is(ModTags.Items.LAUNCHER) || PerkHelper.getItemPerkLevel(ModPerks.HE_BULLET.get(), stack) > 0) {
|
||||||
tag.putDouble("Exp", tag.getDouble("Exp") + amount);
|
GunsTool.setGunDoubleTag(stack, "Exp", GunsTool.getGunDoubleTag(stack, "Exp", 0) + amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 再判断是不是枪械能造成的伤害
|
// 再判断是不是枪械能造成的伤害
|
||||||
if (DamageTypeTool.isGunDamage(source)) {
|
if (DamageTypeTool.isGunDamage(source)) {
|
||||||
tag.putDouble("Exp", tag.getDouble("Exp") + amount);
|
GunsTool.setGunDoubleTag(stack, "Exp", GunsTool.getGunDoubleTag(stack, "Exp", 0) + amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 提升武器等级
|
// 提升武器等级
|
||||||
int level = tag.getInt("Level");
|
int level = GunsTool.getGunIntTag(stack, "Level", 0);
|
||||||
double exp = tag.getDouble("Exp");
|
double exp = GunsTool.getGunDoubleTag(stack, "Exp", 0);
|
||||||
double upgradeExpNeeded = 20 * Math.pow(level, 2) + 160 * level + 20;
|
double upgradeExpNeeded = 20 * Math.pow(level, 2) + 160 * level + 20;
|
||||||
|
|
||||||
while (exp >= upgradeExpNeeded) {
|
while (exp >= upgradeExpNeeded) {
|
||||||
exp -= upgradeExpNeeded;
|
exp -= upgradeExpNeeded;
|
||||||
level = tag.getInt("Level") + 1;
|
level = GunsTool.getGunIntTag(stack, "Level", 0) + 1;
|
||||||
upgradeExpNeeded = 20 * Math.pow(level, 2) + 160 * level + 20;
|
upgradeExpNeeded = 20 * Math.pow(level, 2) + 160 * level + 20;
|
||||||
tag.putDouble("Exp", exp);
|
GunsTool.setGunDoubleTag(stack, "Exp", exp);
|
||||||
tag.putInt("Level", level);
|
GunsTool.setGunIntTag(stack, "Level", level);
|
||||||
tag.putDouble("UpgradePoint", tag.getDouble("UpgradePoint") + 0.5);
|
GunsTool.setGunDoubleTag(stack, "UpgradePoint", GunsTool.getGunDoubleTag(stack, "UpgradePoint", 0) + 0.5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,18 +246,17 @@ public class LivingEventHandler {
|
||||||
if (!stack.is(ModTags.Items.GUN)) return;
|
if (!stack.is(ModTags.Items.GUN)) return;
|
||||||
if (event.getEntity() instanceof TargetEntity) return;
|
if (event.getEntity() instanceof TargetEntity) return;
|
||||||
|
|
||||||
var tag = stack.getOrCreateTag();
|
int level = GunsTool.getGunIntTag(stack, "Level", 0);
|
||||||
int level = tag.getInt("Level");
|
double exp = GunsTool.getGunDoubleTag(stack, "Exp", 0);
|
||||||
double exp = tag.getDouble("Exp");
|
|
||||||
double upgradeExpNeeded = 20 * Math.pow(level, 2) + 160 * level + 20;
|
double upgradeExpNeeded = 20 * Math.pow(level, 2) + 160 * level + 20;
|
||||||
|
|
||||||
while (exp >= upgradeExpNeeded) {
|
while (exp >= upgradeExpNeeded) {
|
||||||
exp -= upgradeExpNeeded;
|
exp -= upgradeExpNeeded;
|
||||||
level = tag.getInt("Level") + 1;
|
level = GunsTool.getGunIntTag(stack, "Level", 0) + 1;
|
||||||
upgradeExpNeeded = 20 * Math.pow(level, 2) + 160 * level + 20;
|
upgradeExpNeeded = 20 * Math.pow(level, 2) + 160 * level + 20;
|
||||||
tag.putDouble("Exp", exp);
|
GunsTool.setGunDoubleTag(stack, "Exp", exp);
|
||||||
tag.putInt("Level", level);
|
GunsTool.setGunIntTag(stack, "Level", level);
|
||||||
tag.putDouble("UpgradePoint", tag.getDouble("UpgradePoint") + 0.5);
|
GunsTool.setGunDoubleTag(stack, "UpgradePoint", GunsTool.getGunDoubleTag(stack, "UpgradePoint", 0) + 0.5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -380,7 +380,7 @@ public class PlayerEventHandler {
|
||||||
if (left.is(ModTags.Items.GUN) && right.getItem() == ModItems.SHORTCUT_PACK.get()) {
|
if (left.is(ModTags.Items.GUN) && right.getItem() == ModItems.SHORTCUT_PACK.get()) {
|
||||||
ItemStack output = left.copy();
|
ItemStack output = left.copy();
|
||||||
|
|
||||||
output.getOrCreateTag().putDouble("UpgradePoint", output.getOrCreateTag().getDouble("UpgradePoint") + 1);
|
GunsTool.setGunDoubleTag(output, "UpgradePoint", GunsTool.getGunDoubleTag(output, "UpgradePoint", 0) + 1);
|
||||||
|
|
||||||
event.setOutput(output);
|
event.setOutput(output);
|
||||||
event.setCost(10);
|
event.setCost(10);
|
||||||
|
|
|
@ -7,6 +7,7 @@ import com.atsuishio.superbwarfare.item.PerkItem;
|
||||||
import com.atsuishio.superbwarfare.item.gun.GunItem;
|
import com.atsuishio.superbwarfare.item.gun.GunItem;
|
||||||
import com.atsuishio.superbwarfare.perk.Perk;
|
import com.atsuishio.superbwarfare.perk.Perk;
|
||||||
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
import com.atsuishio.superbwarfare.perk.PerkHelper;
|
||||||
|
import com.atsuishio.superbwarfare.tools.GunsTool;
|
||||||
import net.minecraft.util.Mth;
|
import net.minecraft.util.Mth;
|
||||||
import net.minecraft.world.Container;
|
import net.minecraft.world.Container;
|
||||||
import net.minecraft.world.SimpleContainer;
|
import net.minecraft.world.SimpleContainer;
|
||||||
|
@ -204,13 +205,13 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
double oldPoint = stack.getOrCreateTag().getDouble("UpgradePoint");
|
double oldPoint = GunsTool.getGunDoubleTag(stack, "UpgradePoint", 0);
|
||||||
int point = (int) oldPoint;
|
int point = (int) oldPoint;
|
||||||
int newPoint = this.upgradePoint.get();
|
int newPoint = this.upgradePoint.get();
|
||||||
int delta = newPoint - point;
|
int delta = newPoint - point;
|
||||||
|
|
||||||
if (delta != 0) {
|
if (delta != 0) {
|
||||||
stack.getOrCreateTag().putDouble("UpgradePoint", oldPoint + delta);
|
GunsTool.setGunDoubleTag(stack, "UpgradePoint", oldPoint + delta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,14 +287,14 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
|
||||||
int level = PerkHelper.getItemPerkLevel(perkItem.getPerk(), gun);
|
int level = PerkHelper.getItemPerkLevel(perkItem.getPerk(), gun);
|
||||||
|
|
||||||
if (level <= 0) {
|
if (level <= 0) {
|
||||||
this.upgradePoint.set((int) gun.getOrCreateTag().getDouble("UpgradePoint"));
|
this.upgradePoint.set((int) GunsTool.getGunDoubleTag(gun, "UpgradePoint", 0));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemStack output = gun.copy();
|
ItemStack output = gun.copy();
|
||||||
PerkHelper.removePerkByType(output, perkItem.getPerk().type);
|
PerkHelper.removePerkByType(output, perkItem.getPerk().type);
|
||||||
output.getOrCreateTag().putDouble("UpgradePoint", Math.min(MAX_UPGRADE_POINT, level - 1 + output.getOrCreateTag().getDouble("UpgradePoint")));
|
GunsTool.setGunDoubleTag(output, "UpgradePoint", Math.min(MAX_UPGRADE_POINT, level - 1 + GunsTool.getGunDoubleTag(output, "UpgradePoint", 0)));
|
||||||
this.upgradePoint.set((int) output.getOrCreateTag().getDouble("UpgradePoint"));
|
this.upgradePoint.set((int) GunsTool.getGunDoubleTag(gun, "UpgradePoint", 0));
|
||||||
|
|
||||||
this.container.setItem(INPUT_SLOT, output);
|
this.container.setItem(INPUT_SLOT, output);
|
||||||
this.container.setChanged();
|
this.container.setChanged();
|
||||||
|
@ -320,33 +321,33 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
|
||||||
/**
|
/**
|
||||||
* 将枪械放入输入槽中时,根据枪械上已有的Perk生成对应的Perk物品,并将等级调整为当前的等级
|
* 将枪械放入输入槽中时,根据枪械上已有的Perk生成对应的Perk物品,并将等级调整为当前的等级
|
||||||
*
|
*
|
||||||
* @param pStack 输入的枪械
|
* @param stack 输入的枪械
|
||||||
*/
|
*/
|
||||||
private void onPlaceGun(ItemStack pStack) {
|
private void onPlaceGun(ItemStack stack) {
|
||||||
if (!(pStack.getItem() instanceof GunItem)) {
|
if (!(stack.getItem() instanceof GunItem)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int point = (int) pStack.getOrCreateTag().getDouble("UpgradePoint");
|
int point = (int) GunsTool.getGunDoubleTag(stack, "UpgradePoint", 0);
|
||||||
this.upgradePoint.set(Mth.clamp(point, 0, MAX_UPGRADE_POINT));
|
this.upgradePoint.set(Mth.clamp(point, 0, MAX_UPGRADE_POINT));
|
||||||
|
|
||||||
var ammoPerk = PerkHelper.getPerkByType(pStack, Perk.Type.AMMO);
|
var ammoPerk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
|
||||||
if (ammoPerk != null) {
|
if (ammoPerk != null) {
|
||||||
this.ammoPerkLevel.set(PerkHelper.getItemPerkLevel(ammoPerk, pStack));
|
this.ammoPerkLevel.set(PerkHelper.getItemPerkLevel(ammoPerk, stack));
|
||||||
var ammoPerkItem = PerkHelper.getPerkItem(ammoPerk);
|
var ammoPerkItem = PerkHelper.getPerkItem(ammoPerk);
|
||||||
ammoPerkItem.ifPresent(registryObject -> this.container.setItem(AMMO_PERK_SLOT, registryObject.get().getDefaultInstance()));
|
ammoPerkItem.ifPresent(registryObject -> this.container.setItem(AMMO_PERK_SLOT, registryObject.get().getDefaultInstance()));
|
||||||
}
|
}
|
||||||
|
|
||||||
var funcPerk = PerkHelper.getPerkByType(pStack, Perk.Type.FUNCTIONAL);
|
var funcPerk = PerkHelper.getPerkByType(stack, Perk.Type.FUNCTIONAL);
|
||||||
if (funcPerk != null) {
|
if (funcPerk != null) {
|
||||||
this.funcPerkLevel.set(PerkHelper.getItemPerkLevel(funcPerk, pStack));
|
this.funcPerkLevel.set(PerkHelper.getItemPerkLevel(funcPerk, stack));
|
||||||
var funcPerkItem = PerkHelper.getPerkItem(funcPerk);
|
var funcPerkItem = PerkHelper.getPerkItem(funcPerk);
|
||||||
funcPerkItem.ifPresent(registryObject -> this.container.setItem(FUNC_PERK_SLOT, registryObject.get().getDefaultInstance()));
|
funcPerkItem.ifPresent(registryObject -> this.container.setItem(FUNC_PERK_SLOT, registryObject.get().getDefaultInstance()));
|
||||||
}
|
}
|
||||||
|
|
||||||
var damagePerk = PerkHelper.getPerkByType(pStack, Perk.Type.DAMAGE);
|
var damagePerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE);
|
||||||
if (damagePerk != null) {
|
if (damagePerk != null) {
|
||||||
this.damagePerkLevel.set(PerkHelper.getItemPerkLevel(damagePerk, pStack));
|
this.damagePerkLevel.set(PerkHelper.getItemPerkLevel(damagePerk, stack));
|
||||||
var damagePerkItem = PerkHelper.getPerkItem(damagePerk);
|
var damagePerkItem = PerkHelper.getPerkItem(damagePerk);
|
||||||
damagePerkItem.ifPresent(registryObject -> this.container.setItem(DAMAGE_PERK_SLOT, registryObject.get().getDefaultInstance()));
|
damagePerkItem.ifPresent(registryObject -> this.container.setItem(DAMAGE_PERK_SLOT, registryObject.get().getDefaultInstance()));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue