实现移除perk功能

This commit is contained in:
17146 2024-08-13 04:08:44 +08:00
parent 68115e4994
commit 51f0157bd9
2 changed files with 16 additions and 57 deletions

View file

@ -86,6 +86,7 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
} else if (pIndex >= AMMO_PERK_SLOT && pIndex <= DAMAGE_PERK_SLOT) { } else if (pIndex >= AMMO_PERK_SLOT && pIndex <= DAMAGE_PERK_SLOT) {
onTakePerk(stack);
if (!this.moveItemStackTo(stack, RESULT_SLOT + 1, RESULT_SLOT + 37, false)) { if (!this.moveItemStackTo(stack, RESULT_SLOT + 1, RESULT_SLOT + 37, false)) {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@ -210,33 +211,29 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
/** /**
* 从Perk槽中取出对应的Perk物品时根据其类型移除输入槽中枪械的Perk * 从Perk槽中取出对应的Perk物品时根据其类型移除输入槽中枪械的Perk
* *
* @param type Perk类型 * @param perk Perk物品
*/ */
private void onTakePerk(Perk.Type type) { private void onTakePerk(ItemStack perk) {
ItemStack gun = this.container.getItem(INPUT_SLOT); ItemStack gun = this.container.getItem(INPUT_SLOT);
if (!(gun.getItem() instanceof GunItem)) { if (!(gun.getItem() instanceof GunItem)) {
return; return;
} }
ItemStack perk = switch (type) {
case AMMO -> this.container.getItem(AMMO_PERK_SLOT);
case FUNCTIONAL -> this.container.getItem(FUNC_PERK_SLOT);
case DAMAGE -> this.container.getItem(DAMAGE_PERK_SLOT);
};
if (perk.getItem() instanceof PerkItem perkItem) { if (perk.getItem() instanceof PerkItem perkItem) {
if (PerkHelper.getItemPerkLevel(perkItem.getPerk(), gun) <= 0) { if (PerkHelper.getItemPerkLevel(perkItem.getPerk(), gun) <= 0) {
return; return;
} }
switch (type) { switch (perkItem.getPerk().type) {
case AMMO -> this.ammoPerkLevel.set(1); case AMMO -> this.ammoPerkLevel.set(1);
case FUNCTIONAL -> this.funcPerkLevel.set(1); case FUNCTIONAL -> this.funcPerkLevel.set(1);
case DAMAGE -> this.damagePerkLevel.set(1); case DAMAGE -> this.damagePerkLevel.set(1);
} }
PerkHelper.removePerkByType(gun, perkItem.getPerk().type); ItemStack output = gun.copy();
this.container.setItem(INPUT_SLOT, gun); PerkHelper.removePerkByType(output, perkItem.getPerk().type);
this.container.setItem(INPUT_SLOT, output);
this.container.setChanged(); this.container.setChanged();
} }
} }
@ -251,6 +248,8 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
return; return;
} }
this.container.setChanged();
var ammoPerk = PerkHelper.getPerkByType(pStack, Perk.Type.AMMO); var ammoPerk = PerkHelper.getPerkByType(pStack, Perk.Type.AMMO);
if (ammoPerk != null) { if (ammoPerk != null) {
this.ammoPerkLevel.set(PerkHelper.getItemPerkLevel(ammoPerk, pStack)); this.ammoPerkLevel.set(PerkHelper.getItemPerkLevel(ammoPerk, pStack));
@ -271,6 +270,8 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
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()));
} }
this.broadcastChanges();
} }
/** /**
@ -287,7 +288,6 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
if (ammoPerk != null) { if (ammoPerk != null) {
if (this.container.getItem(AMMO_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == ammoPerk) { if (this.container.getItem(AMMO_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == ammoPerk) {
this.container.setItem(AMMO_PERK_SLOT, ItemStack.EMPTY); this.container.setItem(AMMO_PERK_SLOT, ItemStack.EMPTY);
this.container.setChanged();
} }
} }
@ -295,7 +295,6 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
if (funcPerk != null) { if (funcPerk != null) {
if (this.container.getItem(FUNC_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == funcPerk) { if (this.container.getItem(FUNC_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == funcPerk) {
this.container.setItem(FUNC_PERK_SLOT, ItemStack.EMPTY); this.container.setItem(FUNC_PERK_SLOT, ItemStack.EMPTY);
this.container.setChanged();
} }
} }
@ -303,10 +302,11 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
if (damagePerk != null) { if (damagePerk != null) {
if (this.container.getItem(DAMAGE_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == damagePerk) { if (this.container.getItem(DAMAGE_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == damagePerk) {
this.container.setItem(DAMAGE_PERK_SLOT, ItemStack.EMPTY); this.container.setItem(DAMAGE_PERK_SLOT, ItemStack.EMPTY);
}
}
this.container.setChanged(); this.container.setChanged();
} }
}
}
class InputSlot extends Slot { class InputSlot extends Slot {
public InputSlot(Container pContainer, int pSlot, int pX, int pY) { public InputSlot(Container pContainer, int pSlot, int pX, int pY) {
@ -340,8 +340,8 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
@Override @Override
public void setByPlayer(ItemStack pStack) { public void setByPlayer(ItemStack pStack) {
super.setByPlayer(pStack);
onPlaceGun(pStack); onPlaceGun(pStack);
super.setByPlayer(pStack);
} }
} }
@ -363,7 +363,7 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
@Override @Override
public void onTake(Player pPlayer, ItemStack pStack) { public void onTake(Player pPlayer, ItemStack pStack) {
onTakePerk(type); onTakePerk(pStack);
super.onTake(pPlayer, pStack); super.onTake(pPlayer, pStack);
} }
} }

View file

@ -1,41 +0,0 @@
package net.mcreator.superbwarfare.event;
import net.mcreator.superbwarfare.init.ModTags;
import net.mcreator.superbwarfare.item.PerkItem;
import net.mcreator.superbwarfare.perk.PerkHelper;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.event.AnvilUpdateEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
// TODO 移除此类功能移动到枪械重铸台
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE)
public class TempEventHandler {
@SubscribeEvent
public static void onAnvilUpdate(AnvilUpdateEvent event) {
ItemStack left = event.getLeft();
ItemStack right = event.getRight();
if (right.getItem() instanceof PerkItem perkItem && left.is(ModTags.Items.GUN)) {
ItemStack output = left.copy();
int level = PerkHelper.getItemPerkLevel(perkItem.getPerk(), output);
PerkHelper.setPerk(output, perkItem.getPerk(), level + 1);
event.setOutput(output);
event.setCost(10);
event.setMaterialCost(1);
}
if (right.is(ModTags.Items.GUN) && left.getItem() instanceof PerkItem perkItem) {
ItemStack output = right.copy();
PerkHelper.removePerkByType(output, perkItem.getPerk().type);
event.setOutput(output);
event.setCost(10);
event.setMaterialCost(0);
}
}
}