CreateMod/src/main/java/com/simibubi/create/content/schematics/packet/SchematicPlacePacket.java
2023-05-17 12:47:55 +02:00

69 lines
1.9 KiB
Java

package com.simibubi.create.content.schematics.packet;
import com.simibubi.create.content.schematics.SchematicPrinter;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import com.simibubi.create.foundation.utility.BlockHelper;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraftforge.network.NetworkEvent.Context;
public class SchematicPlacePacket extends SimplePacketBase {
public ItemStack stack;
public SchematicPlacePacket(ItemStack stack) {
this.stack = stack;
}
public SchematicPlacePacket(FriendlyByteBuf buffer) {
stack = buffer.readItem();
}
@Override
public void write(FriendlyByteBuf buffer) {
buffer.writeItem(stack);
}
@Override
public boolean handle(Context context) {
context.enqueueWork(() -> {
ServerPlayer player = context.getSender();
if (player == null)
return;
if (!player.isCreative())
return;
Level world = player.getLevel();
SchematicPrinter printer = new SchematicPrinter();
printer.loadSchematic(stack, world, !player.canUseGameMasterBlocks());
if (!printer.isLoaded() || printer.isErrored())
return;
boolean includeAir = AllConfigs.server().schematics.creativePrintIncludesAir.get();
while (printer.advanceCurrentPos()) {
if (!printer.shouldPlaceCurrent(world))
continue;
printer.handleCurrentTarget((pos, state, blockEntity) -> {
boolean placingAir = state.isAir();
if (placingAir && !includeAir)
return;
CompoundTag data = blockEntity != null ? blockEntity.saveWithFullMetadata() : null;
BlockHelper.placeSchematicBlock(world, state, pos, null, data);
}, (pos, entity) -> {
world.addFreshEntity(entity);
});
}
});
return true;
}
}