重写拆解逻辑

This commit is contained in:
Light_Quanta 2024-05-11 01:54:41 +08:00
parent 0224bb1766
commit 24c23e8eb4
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
3 changed files with 65 additions and 123 deletions

View file

@ -1,18 +1,22 @@
package net.mcreator.target.network; package net.mcreator.target.network;
import net.mcreator.target.TargetMod; import net.mcreator.target.TargetMod;
import net.mcreator.target.procedures.DismantlePressProcedure; import net.mcreator.target.init.TargetModItems;
import net.mcreator.target.init.TargetModTags;
import net.mcreator.target.world.inventory.GunRecycleGuiMenu; import net.mcreator.target.world.inventory.GunRecycleGuiMenu;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkEvent;
import java.util.HashMap;
import java.util.function.Supplier; import java.util.function.Supplier;
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
@ -43,25 +47,64 @@ public class GunRecycleGuiButtonMessage {
public static void handler(GunRecycleGuiButtonMessage message, Supplier<NetworkEvent.Context> contextSupplier) { public static void handler(GunRecycleGuiButtonMessage message, Supplier<NetworkEvent.Context> contextSupplier) {
NetworkEvent.Context context = contextSupplier.get(); NetworkEvent.Context context = contextSupplier.get();
context.enqueueWork(() -> { context.enqueueWork(() -> {
Player entity = context.getSender(); Player player = context.getSender();
int buttonID = message.buttonID; int buttonID = message.buttonID;
int x = message.x; int x = message.x;
int y = message.y; int y = message.y;
int z = message.z; int z = message.z;
handleButtonAction(entity, buttonID, x, y, z); if (player == null) return;
handleButtonAction(player, buttonID, x, y, z);
}); });
context.setPacketHandled(true); context.setPacketHandled(true);
} }
public static void handleButtonAction(Player entity, int buttonID, int x, int y, int z) { public static void handleButtonAction(Player player, int buttonID, int x, int y, int z) {
Level world = entity.level();
HashMap<String, Object> guistate = GunRecycleGuiMenu.guistate;
// security measure to prevent arbitrary chunk generation // security measure to prevent arbitrary chunk generation
if (!world.hasChunkAt(new BlockPos(x, y, z))) if (!player.level().hasChunkAt(new BlockPos(x, y, z))) return;
return;
if (buttonID == 0) {
DismantlePressProcedure.execute(entity); if (buttonID == 0) {
dismantleGun(player);
}
}
private static void dismantleGun(Player player) {
var menu = ((GunRecycleGuiMenu) player.containerMenu).get();
var slot0 = menu.get(0);
var gun = slot0.getItem();
if (gun.is(ItemTags.create(new ResourceLocation("target:gun")))) {
// 普通稀有度
var material = switch (gun.getRarity()) {
case COMMON -> Items.IRON_INGOT;
case RARE -> TargetModItems.INGOT_STEEL.get();
case EPIC -> TargetModItems.CEMENTED_CARBIDE_INGOT.get();
default -> null;
};
if (material != null) ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(material));
// 特殊稀有度
if (gun.is(TargetModTags.Items.LEGENDARY_GUN)) {
ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(Items.NETHERITE_INGOT));
}
if (gun.is(TargetModTags.Items.SPECIAL_GUN)) {
ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(TargetModItems.SOUL_STEEL_INGOT.get()));
}
// 高等级额外奖励
double level = gun.getOrCreateTag().getDouble("level");
if (level >= 10) {
var soulSteelNuggetCount = 0;
if (Math.random() < 0.005 * level) soulSteelNuggetCount += 3;
if (Math.random() < 0.01 * level) soulSteelNuggetCount += 2;
if (Math.random() < 0.03 * level) soulSteelNuggetCount++;
if (Math.random() < 0.06 * level) soulSteelNuggetCount++;
ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(TargetModItems.SOUL_STEEL_NUGGET.get(), soulSteelNuggetCount));
}
slot0.set(ItemStack.EMPTY);
player.containerMenu.broadcastChanges();
} }
} }

View file

@ -1,100 +0,0 @@
package net.mcreator.target.procedures;
import net.mcreator.target.init.TargetModItems;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.Rarity;
import net.minecraftforge.items.ItemHandlerHelper;
import java.util.Map;
import java.util.function.Supplier;
public class DismantlePressProcedure {
public static void execute(Entity entity) {
if (entity == null)
return;
ItemStack stack;
stack = (entity instanceof Player _plrSlotItem && _plrSlotItem.containerMenu instanceof Supplier _splr && _splr.get() instanceof Map _slt ? ((Slot) _slt.get(0)).getItem() : ItemStack.EMPTY);
if (stack.is(ItemTags.create(new ResourceLocation("target:gun")))) {
if (stack.getRarity() == Rarity.COMMON) {
if (entity instanceof Player _player) {
ItemStack _setstack = new ItemStack(Items.IRON_INGOT);
_setstack.setCount(1);
ItemHandlerHelper.giveItemToPlayer(_player, _setstack);
}
}
if (stack.getRarity() == Rarity.RARE) {
if (entity instanceof Player _player) {
ItemStack _setstack = new ItemStack(TargetModItems.INGOT_STEEL.get());
_setstack.setCount(1);
ItemHandlerHelper.giveItemToPlayer(_player, _setstack);
}
}
if (stack.getRarity() == Rarity.EPIC) {
if (entity instanceof Player _player) {
ItemStack _setstack = new ItemStack(TargetModItems.CEMENTED_CARBIDE_INGOT.get());
_setstack.setCount(1);
ItemHandlerHelper.giveItemToPlayer(_player, _setstack);
}
}
if (stack.is(ItemTags.create(new ResourceLocation("target:legendary_gun")))) {
if (entity instanceof Player _player) {
ItemStack _setstack = new ItemStack(Items.NETHERITE_INGOT);
_setstack.setCount(1);
ItemHandlerHelper.giveItemToPlayer(_player, _setstack);
}
}
if (stack.is(ItemTags.create(new ResourceLocation("target:special_gun")))) {
if (entity instanceof Player _player) {
ItemStack _setstack = new ItemStack(TargetModItems.SOUL_STEEL_INGOT.get());
_setstack.setCount(1);
ItemHandlerHelper.giveItemToPlayer(_player, _setstack);
}
}
if (stack.getOrCreateTag().getDouble("level") >= 10) {
if (Math.random() < 0.005 * stack.getOrCreateTag().getDouble("level")) {
if (entity instanceof Player _player) {
ItemStack _setstack = new ItemStack(TargetModItems.SOUL_STEEL_NUGGET.get());
_setstack.setCount(3);
ItemHandlerHelper.giveItemToPlayer(_player, _setstack);
}
}
if (Math.random() < 0.01 * stack.getOrCreateTag().getDouble("level")) {
if (entity instanceof Player _player) {
ItemStack _setstack = new ItemStack(TargetModItems.SOUL_STEEL_NUGGET.get());
_setstack.setCount(2);
ItemHandlerHelper.giveItemToPlayer(_player, _setstack);
}
}
if (Math.random() < 0.03 * stack.getOrCreateTag().getDouble("level")) {
if (entity instanceof Player _player) {
ItemStack _setstack = new ItemStack(TargetModItems.SOUL_STEEL_NUGGET.get());
_setstack.setCount(1);
ItemHandlerHelper.giveItemToPlayer(_player, _setstack);
}
}
if (Math.random() < 0.06 * stack.getOrCreateTag().getDouble("level")) {
if (entity instanceof Player _player) {
ItemStack _setstack = new ItemStack(TargetModItems.SOUL_STEEL_NUGGET.get());
_setstack.setCount(1);
ItemHandlerHelper.giveItemToPlayer(_player, _setstack);
}
}
if (entity instanceof Player _player) {
ItemStack _setstack = new ItemStack(TargetModItems.SOUL_STEEL_NUGGET.get());
_setstack.setCount(1);
ItemHandlerHelper.giveItemToPlayer(_player, _setstack);
}
}
if (entity instanceof Player _player && _player.containerMenu instanceof Supplier _current && _current.get() instanceof Map _slots) {
((Slot) _slots.get(0)).set(ItemStack.EMPTY);
_player.containerMenu.broadcastChanges();
}
}
}
}

View file

@ -77,7 +77,6 @@ public class GunRecycleGuiMenu extends AbstractContainerMenu implements Supplier
} }
} }
this.customSlots.put(0, this.addSlot(new SlotItemHandler(internal, 0, 79, 27) { this.customSlots.put(0, this.addSlot(new SlotItemHandler(internal, 0, 79, 27) {
private final int slot = 0;
@Override @Override
public boolean mayPlace(ItemStack stack) { public boolean mayPlace(ItemStack stack) {
@ -109,29 +108,29 @@ public class GunRecycleGuiMenu extends AbstractContainerMenu implements Supplier
ItemStack itemstack = ItemStack.EMPTY; ItemStack itemstack = ItemStack.EMPTY;
Slot slot = this.slots.get(index); Slot slot = this.slots.get(index);
if (slot.hasItem()) { if (slot.hasItem()) {
ItemStack itemstack1 = slot.getItem(); ItemStack itemStack = slot.getItem();
itemstack = itemstack1.copy(); itemstack = itemStack.copy();
if (index < 1) { if (index < 1) {
if (!this.moveItemStackTo(itemstack1, 1, this.slots.size(), true)) if (!this.moveItemStackTo(itemStack, 1, this.slots.size(), true))
return ItemStack.EMPTY; return ItemStack.EMPTY;
slot.onQuickCraft(itemstack1, itemstack); slot.onQuickCraft(itemStack, itemstack);
} else if (!this.moveItemStackTo(itemstack1, 0, 1, false)) { } else if (!this.moveItemStackTo(itemStack, 0, 1, false)) {
if (index < 1 + 27) { if (index < 1 + 27) {
if (!this.moveItemStackTo(itemstack1, 1 + 27, this.slots.size(), true)) if (!this.moveItemStackTo(itemStack, 1 + 27, this.slots.size(), true))
return ItemStack.EMPTY; return ItemStack.EMPTY;
} else { } else {
if (!this.moveItemStackTo(itemstack1, 1, 1 + 27, false)) if (!this.moveItemStackTo(itemStack, 1, 1 + 27, false))
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
if (itemstack1.getCount() == 0) if (itemStack.getCount() == 0)
slot.set(ItemStack.EMPTY); slot.set(ItemStack.EMPTY);
else else
slot.setChanged(); slot.setChanged();
if (itemstack1.getCount() == itemstack.getCount()) if (itemStack.getCount() == itemstack.getCount())
return ItemStack.EMPTY; return ItemStack.EMPTY;
slot.onTake(playerIn, itemstack1); slot.onTake(playerIn, itemStack);
} }
return itemstack; return itemstack;
} }