添加重铸台的部分功能

This commit is contained in:
17146 2024-08-13 03:34:59 +08:00
parent 1a84f2739f
commit 68115e4994
4 changed files with 189 additions and 14 deletions

View file

@ -79,15 +79,21 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
if (slot.hasItem()) {
ItemStack stack = slot.getItem();
itemstack = stack.copy();
if (pIndex == RESULT_SLOT) {
if (!this.moveItemStackTo(stack, RESULT_SLOT, RESULT_SLOT + 36, false)) {
if (pIndex == INPUT_SLOT) {
onTakeGun(stack);
if (!this.moveItemStackTo(stack, RESULT_SLOT + 1, RESULT_SLOT + 37, false)) {
return ItemStack.EMPTY;
}
} else if (pIndex >= AMMO_PERK_SLOT && pIndex <= DAMAGE_PERK_SLOT) {
if (!this.moveItemStackTo(stack, RESULT_SLOT + 1, RESULT_SLOT + 37, false)) {
return ItemStack.EMPTY;
}
} else if (pIndex != INPUT_SLOT) {
} else if (pIndex == RESULT_SLOT) {
if (!this.moveItemStackTo(stack, RESULT_SLOT, RESULT_SLOT + 36, false)) {
return ItemStack.EMPTY;
}
} else {
if (stack.is(ModTags.Items.GUN)) {
if (!this.moveItemStackTo(stack, INPUT_SLOT, INPUT_SLOT + 1, false)) {
return ItemStack.EMPTY;
@ -108,8 +114,6 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
}
}
}
} else if (!this.moveItemStackTo(stack, RESULT_SLOT + 1, RESULT_SLOT + 37, false)) {
return ItemStack.EMPTY;
}
if (stack.isEmpty()) {
@ -159,6 +163,9 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
}
}
/**
* 根据输入槽的枪械和Perk槽中的物品与等级生成重铸后的武器并放入输出槽中
*/
public void generateResult() {
ItemStack gun = this.container.getItem(INPUT_SLOT);
if (!(gun.getItem() instanceof GunItem gunItem)) {
@ -175,21 +182,21 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
ItemStack result = gun.copy();
if (!ammo.isEmpty() && ammo.getItem() instanceof PerkItem perkItem) {
if (gunItem.canApplyPerk(result, perkItem.getPerk(), Perk.Type.AMMO)) {
if (gunItem.canApplyPerk(result, perkItem.getPerk())) {
PerkHelper.setPerk(result, perkItem.getPerk(), this.ammoPerkLevel.get());
this.container.setItem(AMMO_PERK_SLOT, ItemStack.EMPTY);
}
}
if (!func.isEmpty() && func.getItem() instanceof PerkItem perkItem) {
if (gunItem.canApplyPerk(result, perkItem.getPerk(), Perk.Type.FUNCTIONAL)) {
if (gunItem.canApplyPerk(result, perkItem.getPerk())) {
PerkHelper.setPerk(result, perkItem.getPerk(), this.funcPerkLevel.get());
this.container.setItem(FUNC_PERK_SLOT, ItemStack.EMPTY);
}
}
if (!damage.isEmpty() && damage.getItem() instanceof PerkItem perkItem) {
if (gunItem.canApplyPerk(result, perkItem.getPerk(), Perk.Type.DAMAGE)) {
if (gunItem.canApplyPerk(result, perkItem.getPerk())) {
PerkHelper.setPerk(result, perkItem.getPerk(), this.damagePerkLevel.get());
this.container.setItem(DAMAGE_PERK_SLOT, ItemStack.EMPTY);
}
@ -200,21 +207,145 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
this.container.setChanged();
}
static class InputSlot extends Slot {
/**
* 从Perk槽中取出对应的Perk物品时根据其类型移除输入槽中枪械的Perk
*
* @param type Perk类型
*/
private void onTakePerk(Perk.Type type) {
ItemStack gun = this.container.getItem(INPUT_SLOT);
if (!(gun.getItem() instanceof GunItem)) {
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 (PerkHelper.getItemPerkLevel(perkItem.getPerk(), gun) <= 0) {
return;
}
switch (type) {
case AMMO -> this.ammoPerkLevel.set(1);
case FUNCTIONAL -> this.funcPerkLevel.set(1);
case DAMAGE -> this.damagePerkLevel.set(1);
}
PerkHelper.removePerkByType(gun, perkItem.getPerk().type);
this.container.setItem(INPUT_SLOT, gun);
this.container.setChanged();
}
}
/**
* 将枪械放入输入槽中时根据枪械上已有的Perk生成对应的Perk物品并将等级调整为当前的等级
*
* @param pStack 输入的枪械
*/
private void onPlaceGun(ItemStack pStack) {
if (!(pStack.getItem() instanceof GunItem)) {
return;
}
var ammoPerk = PerkHelper.getPerkByType(pStack, Perk.Type.AMMO);
if (ammoPerk != null) {
this.ammoPerkLevel.set(PerkHelper.getItemPerkLevel(ammoPerk, pStack));
var ammoPerkItem = PerkHelper.getPerkItem(ammoPerk);
ammoPerkItem.ifPresent(registryObject -> this.container.setItem(AMMO_PERK_SLOT, registryObject.get().getDefaultInstance()));
}
var funcPerk = PerkHelper.getPerkByType(pStack, Perk.Type.FUNCTIONAL);
if (funcPerk != null) {
this.funcPerkLevel.set(PerkHelper.getItemPerkLevel(funcPerk, pStack));
var funcPerkItem = PerkHelper.getPerkItem(funcPerk);
funcPerkItem.ifPresent(registryObject -> this.container.setItem(FUNC_PERK_SLOT, registryObject.get().getDefaultInstance()));
}
var damagePerk = PerkHelper.getPerkByType(pStack, Perk.Type.DAMAGE);
if (damagePerk != null) {
this.damagePerkLevel.set(PerkHelper.getItemPerkLevel(damagePerk, pStack));
var damagePerkItem = PerkHelper.getPerkItem(damagePerk);
damagePerkItem.ifPresent(registryObject -> this.container.setItem(DAMAGE_PERK_SLOT, registryObject.get().getDefaultInstance()));
}
}
/**
* 拿走输入槽中的枪械时如果Perk槽中存在放入枪械时生成的Perk物品则将其移除如果是没有的Perk则无视
*
* @param pStack 输入的枪械
*/
private void onTakeGun(ItemStack pStack) {
if (!(pStack.getItem() instanceof GunItem)) {
return;
}
var ammoPerk = PerkHelper.getPerkByType(pStack, Perk.Type.AMMO);
if (ammoPerk != null) {
if (this.container.getItem(AMMO_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == ammoPerk) {
this.container.setItem(AMMO_PERK_SLOT, ItemStack.EMPTY);
this.container.setChanged();
}
}
var funcPerk = PerkHelper.getPerkByType(pStack, Perk.Type.FUNCTIONAL);
if (funcPerk != null) {
if (this.container.getItem(FUNC_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == funcPerk) {
this.container.setItem(FUNC_PERK_SLOT, ItemStack.EMPTY);
this.container.setChanged();
}
}
var damagePerk = PerkHelper.getPerkByType(pStack, Perk.Type.DAMAGE);
if (damagePerk != null) {
if (this.container.getItem(DAMAGE_PERK_SLOT).getItem() instanceof PerkItem perkItem && perkItem.getPerk() == damagePerk) {
this.container.setItem(DAMAGE_PERK_SLOT, ItemStack.EMPTY);
this.container.setChanged();
}
}
}
class InputSlot extends Slot {
public InputSlot(Container pContainer, int pSlot, int pX, int pY) {
super(pContainer, pSlot, pX, pY);
}
public boolean mayPlace(ItemStack pStack) {
return pStack.is(ModTags.Items.GUN);
if (pStack.getItem() instanceof GunItem gunItem) {
ItemStack ammoPerk = this.container.getItem(AMMO_PERK_SLOT);
ItemStack funcPerk = this.container.getItem(FUNC_PERK_SLOT);
ItemStack damagePerk = this.container.getItem(DAMAGE_PERK_SLOT);
boolean flag1 = ammoPerk.isEmpty() || (ammoPerk.getItem() instanceof PerkItem perkItem && gunItem.canApplyPerk(pStack, perkItem.getPerk()));
boolean flag2 = funcPerk.isEmpty() || (funcPerk.getItem() instanceof PerkItem perkItem && gunItem.canApplyPerk(pStack, perkItem.getPerk()));
boolean flag3 = damagePerk.isEmpty() || (damagePerk.getItem() instanceof PerkItem perkItem && gunItem.canApplyPerk(pStack, perkItem.getPerk()));
return flag1 && flag2 && flag3 && this.container.getItem(RESULT_SLOT).isEmpty();
}
return false;
}
public int getMaxStackSize() {
return 1;
}
@Override
public void onTake(Player pPlayer, ItemStack pStack) {
super.onTake(pPlayer, pStack);
onTakeGun(pStack);
}
@Override
public void setByPlayer(ItemStack pStack) {
super.setByPlayer(pStack);
onPlaceGun(pStack);
}
}
static class PerkSlot extends Slot {
class PerkSlot extends Slot {
public Perk.Type type;
public PerkSlot(Container pContainer, int pSlot, Perk.Type type, int pX, int pY) {
@ -223,12 +354,18 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
}
public boolean mayPlace(ItemStack pStack) {
return pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == type;
return pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == type && !container.getItem(INPUT_SLOT).isEmpty();
}
public int getMaxStackSize() {
return 1;
}
@Override
public void onTake(Player pPlayer, ItemStack pStack) {
onTakePerk(type);
super.onTake(pPlayer, pStack);
}
}
static class ResultSlot extends Slot {

View file

@ -27,5 +27,15 @@ public class TempEventHandler {
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);
}
}
}

View file

@ -182,7 +182,7 @@ public abstract class GunItem extends Item {
}
}
public boolean canApplyPerk(ItemStack stack, Perk perk, Perk.Type slot) {
return perk.type == slot;
public boolean canApplyPerk(ItemStack stack, Perk perk) {
return true;
}
}

View file

@ -1,13 +1,17 @@
package net.mcreator.superbwarfare.perk;
import net.mcreator.superbwarfare.init.ModItems;
import net.mcreator.superbwarfare.init.ModPerks;
import net.mcreator.superbwarfare.item.PerkItem;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.registries.RegistryObject;
import javax.annotation.Nullable;
import java.util.Optional;
public class PerkHelper {
private static final String TAG_PERK_ID = "id";
@ -146,6 +150,30 @@ public class PerkHelper {
};
}
public static void removePerkByType(ItemStack stack, Perk.Type type) {
var tag = stack.getTag();
if (tag == null) {
return;
}
var tagPerk = tag.getCompound(TAG_PERK);
if (!tagPerk.contains(type.getName())) {
return;
}
tagPerk.remove(type.getName());
stack.addTagElement(TAG_PERK, tagPerk);
}
public static Optional<RegistryObject<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();
}