9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-29 20:09:13 +00:00

宝贝实体方块渲染雏形

This commit is contained in:
XiaoMoMi
2025-09-06 05:57:52 +08:00
parent 4415acecdd
commit a42f70b941
17 changed files with 312 additions and 26 deletions

View File

@@ -6,4 +6,4 @@ import net.momirealms.craftengine.core.block.entity.BlockEntityTypes;
public class BukkitBlockEntityTypes extends BlockEntityTypes {
public static final BlockEntityType<SimpleStorageBlockEntity> SIMPLE_STORAGE = register(BlockEntityTypeKeys.SIMPLE_STORAGE, SimpleStorageBlockEntity::new);
}
}

View File

@@ -24,7 +24,6 @@ import org.bukkit.GameEvent;
import org.bukkit.GameMode;
import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable;
@@ -200,6 +199,4 @@ public class SimpleStorageBlockEntity extends BlockEntity {
}
this.inventory.clear();
}
}

View File

@@ -237,6 +237,10 @@ public final class WorldStorageInjector {
chunk.removeBlockEntity(pos);
}
}
if (previous.hasBlockEntityRenderer()) {
BlockPos pos = new BlockPos(chunk.chunkPos.x * 16 + x, section.sectionY * 16 + y, chunk.chunkPos.z * 16 + z);
chunk.removeBlockEntityRenderer(pos);
}
if (Config.enableLightSystem()) {
// 自定义块到原版块,只需要判断旧块是否和客户端一直
BlockStateWrapper wrapper = previous.vanillaBlockState();
@@ -266,6 +270,10 @@ public final class WorldStorageInjector {
chunk.removeBlockEntity(pos);
}
}
if (previousImmutableBlockState.hasBlockEntityRenderer()) {
BlockPos pos = new BlockPos(chunk.chunkPos.x * 16 + x, section.sectionY * 16 + y, chunk.chunkPos.z * 16 + z);
chunk.removeBlockEntityRenderer(pos);
}
}
if (newImmutableBlockState.hasBlockEntity()) {
BlockPos pos = new BlockPos(chunk.chunkPos.x * 16 + x, section.sectionY * 16 + y, chunk.chunkPos.z * 16 + z);
@@ -285,6 +293,10 @@ public final class WorldStorageInjector {
chunk.replaceOrCreateTickingBlockEntity(blockEntity);
}
}
if (newImmutableBlockState.hasBlockEntityRenderer()) {
BlockPos pos = new BlockPos(chunk.chunkPos.x * 16 + x, section.sectionY * 16 + y, chunk.chunkPos.z * 16 + z);
chunk.addBlockEntityRenderer(pos, newImmutableBlockState);
}
// 如果新方块的光照属性和客户端认为的不同
if (Config.enableLightSystem()) {
if (previousImmutableBlockState.isEmpty()) {

View File

@@ -37,6 +37,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntityType
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.bukkit.util.*;
import net.momirealms.craftengine.bukkit.world.BukkitWorldManager;
import net.momirealms.craftengine.core.advancement.network.AdvancementHolder;
import net.momirealms.craftengine.core.advancement.network.AdvancementProgress;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
@@ -64,6 +65,7 @@ import net.momirealms.craftengine.core.plugin.network.*;
import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider;
import net.momirealms.craftengine.core.util.*;
import net.momirealms.craftengine.core.world.*;
import net.momirealms.craftengine.core.world.chunk.CEChunk;
import net.momirealms.craftengine.core.world.chunk.ChunkStatus;
import net.momirealms.craftengine.core.world.chunk.Palette;
import net.momirealms.craftengine.core.world.chunk.PalettedContainer;
@@ -261,14 +263,24 @@ public class PacketConsumers {
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> FORGET_LEVEL_CHUNK = (user, event) -> {
try {
BukkitServerPlayer player = (BukkitServerPlayer) user;
FriendlyByteBuf buf = event.getBuffer();
CEWorld ceWorld = BukkitWorldManager.instance().getWorld(player.world().uuid());
if (VersionHelper.isOrAbove1_20_2()) {
long chunkPos = buf.readLong();
user.removeTrackedChunk(chunkPos);
CEChunk ceChunk = ceWorld.getChunkAtIfLoaded(chunkPos);
if (ceChunk != null) {
ceChunk.despawnBlockEntities(player);
}
} else {
int x = buf.readInt();
int y = buf.readInt();
user.removeTrackedChunk(ChunkPos.asLong(x, y));
CEChunk ceChunk = ceWorld.getChunkAtIfLoaded(x, y);
if (ceChunk != null) {
ceChunk.despawnBlockEntities(player);
}
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundForgetLevelChunkPacket", e);
@@ -401,6 +413,12 @@ public class PacketConsumers {
ChunkPos chunkPos = new ChunkPos(chunkX, chunkZ);
// 记录加载的区块
player.addTrackedChunk(chunkPos.longKey, new ChunkStatus());
CEWorld ceWorld = BukkitWorldManager.instance().getWorld(player.world().uuid());
CEChunk ceChunk = ceWorld.getChunkAtIfLoaded(chunkPos.longKey);
if (ceChunk != null) {
ceChunk.spawnBlockEntities(player);
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundLevelChunkWithLightPacket", e);
}

View File

@@ -8,7 +8,6 @@ import io.netty.channel.ChannelHandler;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks;
import net.momirealms.craftengine.bukkit.block.entity.BlockEntityHolder;
import net.momirealms.craftengine.bukkit.block.entity.SimpleStorageBlockEntity;
import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
@@ -48,7 +47,6 @@ import org.bukkit.*;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.block.Block;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;

View File

@@ -1,8 +1,11 @@
package net.momirealms.craftengine.bukkit.world;
import net.momirealms.craftengine.bukkit.util.LightUtils;
import net.momirealms.craftengine.core.block.entity.render.BlockEntityRenderer;
import net.momirealms.craftengine.core.block.entity.render.BlockEntityRendererConfig;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.util.SectionPosUtils;
import net.momirealms.craftengine.core.world.BlockPos;
import net.momirealms.craftengine.core.world.CEWorld;
import net.momirealms.craftengine.core.world.SectionPos;
import net.momirealms.craftengine.core.world.World;
@@ -39,4 +42,9 @@ public class BukkitCEWorld extends CEWorld {
);
}
}
@Override
public BlockEntityRenderer createBlockEntityRenderer(BlockEntityRendererConfig config, BlockPos pos) {
return null;
}
}