重写拆解逻辑

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;
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.minecraft.core.BlockPos;
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.level.Level;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.network.NetworkEvent;
import java.util.HashMap;
import java.util.function.Supplier;
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
@ -43,25 +47,64 @@ public class GunRecycleGuiButtonMessage {
public static void handler(GunRecycleGuiButtonMessage message, Supplier<NetworkEvent.Context> contextSupplier) {
NetworkEvent.Context context = contextSupplier.get();
context.enqueueWork(() -> {
Player entity = context.getSender();
Player player = context.getSender();
int buttonID = message.buttonID;
int x = message.x;
int y = message.y;
int z = message.z;
handleButtonAction(entity, buttonID, x, y, z);
if (player == null) return;
handleButtonAction(player, buttonID, x, y, z);
});
context.setPacketHandled(true);
}
public static void handleButtonAction(Player entity, int buttonID, int x, int y, int z) {
Level world = entity.level();
HashMap<String, Object> guistate = GunRecycleGuiMenu.guistate;
public static void handleButtonAction(Player player, int buttonID, int x, int y, int z) {
// security measure to prevent arbitrary chunk generation
if (!world.hasChunkAt(new BlockPos(x, y, z)))
return;
if (buttonID == 0) {
if (!player.level().hasChunkAt(new BlockPos(x, y, z))) return;
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) {
private final int slot = 0;
@Override
public boolean mayPlace(ItemStack stack) {
@ -109,29 +108,29 @@ public class GunRecycleGuiMenu extends AbstractContainerMenu implements Supplier
ItemStack itemstack = ItemStack.EMPTY;
Slot slot = this.slots.get(index);
if (slot.hasItem()) {
ItemStack itemstack1 = slot.getItem();
itemstack = itemstack1.copy();
ItemStack itemStack = slot.getItem();
itemstack = itemStack.copy();
if (index < 1) {
if (!this.moveItemStackTo(itemstack1, 1, this.slots.size(), true))
if (!this.moveItemStackTo(itemStack, 1, this.slots.size(), true))
return ItemStack.EMPTY;
slot.onQuickCraft(itemstack1, itemstack);
} else if (!this.moveItemStackTo(itemstack1, 0, 1, false)) {
slot.onQuickCraft(itemStack, itemstack);
} else if (!this.moveItemStackTo(itemStack, 0, 1, false)) {
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;
} else {
if (!this.moveItemStackTo(itemstack1, 1, 1 + 27, false))
if (!this.moveItemStackTo(itemStack, 1, 1 + 27, false))
return ItemStack.EMPTY;
}
return ItemStack.EMPTY;
}
if (itemstack1.getCount() == 0)
if (itemStack.getCount() == 0)
slot.set(ItemStack.EMPTY);
else
slot.setChanged();
if (itemstack1.getCount() == itemstack.getCount())
if (itemStack.getCount() == itemstack.getCount())
return ItemStack.EMPTY;
slot.onTake(playerIn, itemstack1);
slot.onTake(playerIn, itemStack);
}
return itemstack;
}