mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-19 15:09:15 +00:00
改进entity renderer
This commit is contained in:
@@ -45,6 +45,14 @@ public class ItemBlockEntityElementConfig implements BlockEntityElementConfig<It
|
||||
return new ItemBlockEntityElement(this, pos, previous.entityId1, previous.entityId2, !previous.config.position.equals(this.position));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemBlockEntityElement createExact(World world, BlockPos pos, ItemBlockEntityElement previous) {
|
||||
if (!previous.config.equals(this)) {
|
||||
return null;
|
||||
}
|
||||
return new ItemBlockEntityElement(this, pos, previous.entityId1, previous.entityId2, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<ItemBlockEntityElement> elementClass() {
|
||||
return ItemBlockEntityElement.class;
|
||||
@@ -62,6 +70,12 @@ public class ItemBlockEntityElementConfig implements BlockEntityElementConfig<It
|
||||
return this.lazyMetadataPacket.apply(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (!(o instanceof ItemBlockEntityElementConfig that)) return false;
|
||||
return this.position.equals(that.position);
|
||||
}
|
||||
|
||||
public static class Factory implements BlockEntityElementConfigFactory {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package net.momirealms.craftengine.bukkit.block.entity.renderer.element;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import net.momirealms.craftengine.bukkit.entity.data.ItemDisplayEntityData;
|
||||
import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
|
||||
import net.momirealms.craftengine.core.block.entity.render.element.BlockEntityElement;
|
||||
@@ -87,6 +88,14 @@ public class ItemDisplayBlockEntityElementConfig implements BlockEntityElementCo
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemDisplayBlockEntityElement createExact(World world, BlockPos pos, ItemDisplayBlockEntityElement previous) {
|
||||
if (!previous.config.equals(this)) {
|
||||
return null;
|
||||
}
|
||||
return new ItemDisplayBlockEntityElement(this, pos, previous.entityId, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<ItemDisplayBlockEntityElement> elementClass() {
|
||||
return ItemDisplayBlockEntityElement.class;
|
||||
@@ -140,6 +149,16 @@ public class ItemDisplayBlockEntityElementConfig implements BlockEntityElementCo
|
||||
return this.lazyMetadataPacket.apply(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (!(o instanceof ItemDisplayBlockEntityElementConfig that)) return false;
|
||||
return Float.compare(xRot, that.xRot) == 0 &&
|
||||
Float.compare(yRot, that.yRot) == 0 &&
|
||||
Objects.equal(position, that.position) &&
|
||||
Objects.equal(translation, that.translation) &&
|
||||
Objects.equal(rotation, that.rotation);
|
||||
}
|
||||
|
||||
public static class Factory implements BlockEntityElementConfigFactory {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package net.momirealms.craftengine.bukkit.block.entity.renderer.element;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.momirealms.craftengine.bukkit.entity.data.TextDisplayEntityData;
|
||||
import net.momirealms.craftengine.bukkit.util.ComponentUtils;
|
||||
@@ -75,6 +76,14 @@ public class TextDisplayBlockEntityElementConfig implements BlockEntityElementCo
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TextDisplayBlockEntityElement createExact(World world, BlockPos pos, TextDisplayBlockEntityElement previous) {
|
||||
if (!previous.config.equals(this)) {
|
||||
return null;
|
||||
}
|
||||
return new TextDisplayBlockEntityElement(this, pos, previous.entityId, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<TextDisplayBlockEntityElement> elementClass() {
|
||||
return TextDisplayBlockEntityElement.class;
|
||||
@@ -116,6 +125,16 @@ public class TextDisplayBlockEntityElementConfig implements BlockEntityElementCo
|
||||
return this.lazyMetadataPacket.apply(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (!(o instanceof TextDisplayBlockEntityElementConfig that)) return false;
|
||||
return Float.compare(xRot, that.xRot) == 0 &&
|
||||
Float.compare(yRot, that.yRot) == 0 &&
|
||||
Objects.equal(position, that.position) &&
|
||||
Objects.equal(translation, that.translation) &&
|
||||
Objects.equal(rotation, that.rotation);
|
||||
}
|
||||
|
||||
public static class Factory implements BlockEntityElementConfigFactory {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
|
||||
@@ -1382,8 +1382,8 @@ public class BukkitServerPlayer extends Player {
|
||||
}
|
||||
|
||||
@Override
|
||||
public VirtualCullableObject addTrackedBlockEntity(BlockPos blockPos, ConstantBlockEntityRenderer renderer) {
|
||||
return this.trackedBlockEntityRenderers.put(blockPos, new VirtualCullableObject(renderer));
|
||||
public void addTrackedBlockEntity(BlockPos blockPos, ConstantBlockEntityRenderer renderer) {
|
||||
this.trackedBlockEntityRenderers.put(blockPos, new VirtualCullableObject(renderer));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1834,354 +1834,354 @@ templates:
|
||||
state: ${base_block}[east=false,north=false,south=false,waterlogged=false,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
east=true,north=false,south=false,waterlogged=false,west=false:
|
||||
state: ${base_block}[east=true,north=false,south=false,waterlogged=false,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=false,north=true,south=false,waterlogged=false,west=false:
|
||||
state: ${base_block}[east=false,north=true,south=false,waterlogged=false,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
east=false,north=false,south=true,waterlogged=false,west=false:
|
||||
state: ${base_block}[east=false,north=false,south=true,waterlogged=false,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
east=false,north=false,south=false,waterlogged=false,west=true:
|
||||
state: ${base_block}[east=false,north=false,south=false,waterlogged=false,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
east=true,north=true,south=false,waterlogged=false,west=false:
|
||||
state: ${base_block}[east=true,north=true,south=false,waterlogged=false,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=true,north=false,south=true,waterlogged=false,west=false:
|
||||
state: ${base_block}[east=true,north=false,south=true,waterlogged=false,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=true,north=false,south=false,waterlogged=false,west=true:
|
||||
state: ${base_block}[east=true,north=false,south=false,waterlogged=false,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=false,north=true,south=true,waterlogged=false,west=false:
|
||||
state: ${base_block}[east=false,north=true,south=true,waterlogged=false,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
east=false,north=true,south=false,waterlogged=false,west=true:
|
||||
state: ${base_block}[east=false,north=true,south=false,waterlogged=false,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
east=false,north=false,south=true,waterlogged=false,west=true:
|
||||
state: ${base_block}[east=false,north=false,south=true,waterlogged=false,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
east=true,north=true,south=true,waterlogged=false,west=false:
|
||||
state: ${base_block}[east=true,north=true,south=true,waterlogged=false,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=true,north=true,south=false,waterlogged=false,west=true:
|
||||
state: ${base_block}[east=true,north=true,south=false,waterlogged=false,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=true,north=false,south=true,waterlogged=false,west=true:
|
||||
state: ${base_block}[east=true,north=false,south=true,waterlogged=false,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=false,north=true,south=true,waterlogged=false,west=true:
|
||||
state: ${base_block}[east=false,north=true,south=true,waterlogged=false,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
east=true,north=true,south=true,waterlogged=false,west=true:
|
||||
state: ${base_block}[east=true,north=true,south=true,waterlogged=false,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=false,north=false,south=false,waterlogged=true,west=false:
|
||||
state: ${base_block}[east=false,north=false,south=false,waterlogged=true,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
east=true,north=false,south=false,waterlogged=true,west=false:
|
||||
state: ${base_block}[east=true,north=false,south=false,waterlogged=true,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=false,north=true,south=false,waterlogged=true,west=false:
|
||||
state: ${base_block}[east=false,north=true,south=false,waterlogged=true,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
east=false,north=false,south=true,waterlogged=true,west=false:
|
||||
state: ${base_block}[east=false,north=false,south=true,waterlogged=true,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
east=false,north=false,south=false,waterlogged=true,west=true:
|
||||
state: ${base_block}[east=false,north=false,south=false,waterlogged=true,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
east=true,north=true,south=false,waterlogged=true,west=false:
|
||||
state: ${base_block}[east=true,north=true,south=false,waterlogged=true,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=true,north=false,south=true,waterlogged=true,west=false:
|
||||
state: ${base_block}[east=true,north=false,south=true,waterlogged=true,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=true,north=false,south=false,waterlogged=true,west=true:
|
||||
state: ${base_block}[east=true,north=false,south=false,waterlogged=true,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=false,north=true,south=true,waterlogged=true,west=false:
|
||||
state: ${base_block}[east=false,north=true,south=true,waterlogged=true,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
east=false,north=true,south=false,waterlogged=true,west=true:
|
||||
state: ${base_block}[east=false,north=true,south=false,waterlogged=true,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
east=false,north=false,south=true,waterlogged=true,west=true:
|
||||
state: ${base_block}[east=false,north=false,south=true,waterlogged=true,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
east=true,north=true,south=true,waterlogged=true,west=false:
|
||||
state: ${base_block}[east=true,north=true,south=true,waterlogged=true,west=false]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=true,north=true,south=false,waterlogged=true,west=true:
|
||||
state: ${base_block}[east=true,north=true,south=false,waterlogged=true,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=true,north=false,south=true,waterlogged=true,west=true:
|
||||
state: ${base_block}[east=true,north=false,south=true,waterlogged=true,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
east=false,north=true,south=true,waterlogged=true,west=true:
|
||||
state: ${base_block}[east=false,north=true,south=true,waterlogged=true,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
east=true,north=true,south=true,waterlogged=true,west=true:
|
||||
state: ${base_block}[east=true,north=true,south=true,waterlogged=true,west=true]
|
||||
entity-renderer:
|
||||
- item: ${fence_post_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
scale: 1.0003
|
||||
translation: 0,0.0001,0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 0
|
||||
rotation: 0
|
||||
- item: ${fence_side_item}
|
||||
yaw: 90
|
||||
rotation: 90
|
||||
- item: ${fence_side_item}
|
||||
yaw: 180
|
||||
rotation: 180
|
||||
- item: ${fence_side_item}
|
||||
yaw: 270
|
||||
rotation: 270
|
||||
variants:
|
||||
waterlogged=true:
|
||||
settings:
|
||||
|
||||
@@ -11,5 +11,9 @@ public interface BlockEntityElementConfig<E extends BlockEntityElement> {
|
||||
return null;
|
||||
}
|
||||
|
||||
default E createExact(World world, BlockPos pos, E previous) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Class<E> elementClass();
|
||||
}
|
||||
|
||||
@@ -207,7 +207,7 @@ public abstract class Player extends AbstractEntity implements NetWorkUser {
|
||||
|
||||
public abstract void addTrackedBlockEntities(Map<BlockPos, ConstantBlockEntityRenderer> renders);
|
||||
|
||||
public abstract VirtualCullableObject addTrackedBlockEntity(BlockPos blockPos, ConstantBlockEntityRenderer renderer);
|
||||
public abstract void addTrackedBlockEntity(BlockPos blockPos, ConstantBlockEntityRenderer renderer);
|
||||
|
||||
public abstract VirtualCullableObject getTrackedBlockEntity(BlockPos blockPos);
|
||||
|
||||
|
||||
@@ -153,6 +153,12 @@ public class CEChunk {
|
||||
if (previous != null) {
|
||||
// 由于entity-render的体量基本都很小,所以考虑一个特殊情况,即前后都是1个renderer,对此情况进行简化和优化
|
||||
BlockEntityElement[] previousElements = previous.elements().clone();
|
||||
|
||||
/*
|
||||
*
|
||||
* 1 对 1,命中率最高
|
||||
*
|
||||
*/
|
||||
if (previousElements.length == 1 && renderers.length == 1) {
|
||||
BlockEntityElement previousElement = previousElements[0];
|
||||
BlockEntityElementConfig<? extends BlockEntityElement> config = renderers[0];
|
||||
@@ -162,18 +168,19 @@ public class CEChunk {
|
||||
if (element != null) {
|
||||
elements[0] = element;
|
||||
if (hasTrackedBy) {
|
||||
// 如果启用实体剔除,那么只对已经渲染的进行变换
|
||||
if (Config.enableEntityCulling()) {
|
||||
for (Player player : trackedBy) {
|
||||
VirtualCullableObject trackedBlockEntity = player.addTrackedBlockEntity(pos, renderer);
|
||||
if (trackedBlockEntity == null || trackedBlockEntity.isShown()) {
|
||||
// 如果启用剔除,则暂时保留原先可见度,因为大概率可见度不发生变化
|
||||
if (Config.enableEntityCulling()) {
|
||||
VirtualCullableObject trackedBlockEntity = player.getTrackedBlockEntity(pos);
|
||||
if (trackedBlockEntity == null || trackedBlockEntity.isShown) {
|
||||
element.transform(player);
|
||||
}
|
||||
if (trackedBlockEntity != null) {
|
||||
trackedBlockEntity.setCullable(renderer);
|
||||
} else {
|
||||
player.addTrackedBlockEntity(pos, renderer);
|
||||
}
|
||||
}
|
||||
// 否则直接变换
|
||||
else {
|
||||
for (Player player : trackedBy) {
|
||||
} else {
|
||||
element.transform(player);
|
||||
}
|
||||
}
|
||||
@@ -184,47 +191,56 @@ public class CEChunk {
|
||||
BlockEntityElement element = config.create(wrappedWorld, pos);
|
||||
elements[0] = element;
|
||||
if (hasTrackedBy) {
|
||||
// 如果启用实体剔除,那么只添加记录
|
||||
if (Config.enableEntityCulling()) {
|
||||
for (Player player : trackedBy) {
|
||||
VirtualCullableObject trackedBlockEntity = player.addTrackedBlockEntity(pos, renderer);
|
||||
if (trackedBlockEntity != null && trackedBlockEntity.isShown()) {
|
||||
if (Config.enableEntityCulling()) {
|
||||
VirtualCullableObject trackedBlockEntity = player.getTrackedBlockEntity(pos);
|
||||
if (trackedBlockEntity != null) {
|
||||
if (trackedBlockEntity.isShown) {
|
||||
trackedBlockEntity.setShown(player, false);
|
||||
}
|
||||
trackedBlockEntity.setCullable(renderer);
|
||||
} else {
|
||||
player.addTrackedBlockEntity(pos, renderer);
|
||||
}
|
||||
}
|
||||
// 否则直接显示
|
||||
else {
|
||||
for (Player player : trackedBy) {
|
||||
} else {
|
||||
previousElement.hide(player);
|
||||
element.show(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
}
|
||||
/*
|
||||
*
|
||||
* 1 对 多, 多 对 多
|
||||
*
|
||||
*/
|
||||
else {
|
||||
|
||||
VirtualCullableObject[] previousObjects = hasTrackedBy ? new VirtualCullableObject[trackedBy.size()] : null;
|
||||
if (hasTrackedBy) {
|
||||
for (int j = 0; j < previousObjects.length; j++) {
|
||||
previousObjects[j] = trackedBy.get(j).getTrackedBlockEntity(pos);
|
||||
}
|
||||
}
|
||||
|
||||
outer: for (int i = 0; i < elements.length; i++) {
|
||||
BlockEntityElementConfig<? extends BlockEntityElement> config = renderers[i];
|
||||
/*
|
||||
* 严格可变换部分
|
||||
*/
|
||||
for (int j = 0; j < previousElements.length; j++) {
|
||||
BlockEntityElement previousElement = previousElements[j];
|
||||
if (previousElement != null && config.elementClass().isInstance(previousElement)) {
|
||||
BlockEntityElement newElement = ((BlockEntityElementConfig) config).create(wrappedWorld, pos, previousElement);
|
||||
BlockEntityElement newElement = ((BlockEntityElementConfig) config).createExact(wrappedWorld, pos, previousElement);
|
||||
if (newElement != null) {
|
||||
previousElements[j] = null;
|
||||
elements[i] = newElement;
|
||||
if (hasTrackedBy) {
|
||||
// 如果启用实体剔除,那么只对已经渲染的进行变换
|
||||
if (Config.enableEntityCulling()) {
|
||||
for (Player player : trackedBy) {
|
||||
VirtualCullableObject trackedBlockEntity = player.addTrackedBlockEntity(pos, renderer);
|
||||
if (trackedBlockEntity == null || trackedBlockEntity.isShown()) {
|
||||
newElement.transform(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 否则直接变换
|
||||
else {
|
||||
for (Player player : trackedBy) {
|
||||
for (int k = 0; k < trackedBy.size(); k++) {
|
||||
Player player = trackedBy.get(k);
|
||||
VirtualCullableObject cullableObject = previousObjects[k];
|
||||
if (cullableObject == null || cullableObject.isShown) {
|
||||
newElement.transform(player);
|
||||
}
|
||||
}
|
||||
@@ -233,21 +249,48 @@ public class CEChunk {
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* 可变换部分
|
||||
*/
|
||||
for (int j = 0; j < previousElements.length; j++) {
|
||||
BlockEntityElement previousElement = previousElements[j];
|
||||
if (previousElement != null && config.elementClass().isInstance(previousElement)) {
|
||||
BlockEntityElement newElement = ((BlockEntityElementConfig) config).create(wrappedWorld, pos, previousElement);
|
||||
if (newElement != null) {
|
||||
previousElements[j] = null;
|
||||
elements[i] = newElement;
|
||||
if (hasTrackedBy) {
|
||||
for (int k = 0; k < trackedBy.size(); k++) {
|
||||
Player player = trackedBy.get(k);
|
||||
VirtualCullableObject cullableObject = previousObjects[k];
|
||||
if (cullableObject == null || cullableObject.isShown) {
|
||||
newElement.transform(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* 不可变换的直接生成
|
||||
*/
|
||||
BlockEntityElement newElement = config.create(wrappedWorld, pos);
|
||||
elements[i] = newElement;
|
||||
if (hasTrackedBy) {
|
||||
if (Config.enableEntityCulling()) {
|
||||
for (Player player : trackedBy) {
|
||||
player.addTrackedBlockEntity(pos, renderer);
|
||||
}
|
||||
} else {
|
||||
for (Player player : trackedBy) {
|
||||
for (int k = 0; k < trackedBy.size(); k++) {
|
||||
Player player = trackedBy.get(k);
|
||||
VirtualCullableObject cullableObject = previousObjects[k];
|
||||
if (cullableObject == null || cullableObject.isShown) {
|
||||
newElement.show(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hasTrackedBy) {
|
||||
/*
|
||||
* 未能完成变化的,需要直接删除
|
||||
*/
|
||||
for (int i = 0; i < previousElements.length; i++) {
|
||||
BlockEntityElement previousElement = previousElements[i];
|
||||
if (previousElement != null) {
|
||||
@@ -256,19 +299,31 @@ public class CEChunk {
|
||||
}
|
||||
}
|
||||
}
|
||||
// 添加 track
|
||||
for (int i = 0; i < previousObjects.length; i++) {
|
||||
VirtualCullableObject previousObject = previousObjects[i];
|
||||
if (previousObject != null) {
|
||||
previousObject.setCullable(renderer);
|
||||
} else {
|
||||
trackedBy.get(i).addTrackedBlockEntity(pos, renderer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
*
|
||||
* 全新方块实体
|
||||
*
|
||||
*/
|
||||
for (int i = 0; i < elements.length; i++) {
|
||||
elements[i] = renderers[i].create(wrappedWorld, pos);
|
||||
}
|
||||
if (hasTrackedBy) {
|
||||
for (Player player : trackedBy) {
|
||||
if (Config.enableEntityCulling()) {
|
||||
for (Player player : trackedBy) {
|
||||
player.addTrackedBlockEntity(pos, renderer);
|
||||
}
|
||||
} else {
|
||||
for (Player player : trackedBy) {
|
||||
renderer.show(player);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import net.momirealms.craftengine.core.entity.player.Player;
|
||||
import net.momirealms.craftengine.core.world.Cullable;
|
||||
|
||||
public class VirtualCullableObject {
|
||||
public final Cullable cullable;
|
||||
public Cullable cullable;
|
||||
public boolean isShown;
|
||||
|
||||
public VirtualCullableObject(Cullable cullable) {
|
||||
@@ -12,6 +12,10 @@ public class VirtualCullableObject {
|
||||
this.isShown = false;
|
||||
}
|
||||
|
||||
public void setCullable(Cullable cullable) {
|
||||
this.cullable = cullable;
|
||||
}
|
||||
|
||||
public Cullable cullable() {
|
||||
return cullable;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
org.gradle.jvmargs=-Xmx1G
|
||||
|
||||
# Project settings
|
||||
project_version=0.0.65.14
|
||||
project_version=0.0.65.15
|
||||
config_version=60
|
||||
lang_version=41
|
||||
project_group=net.momirealms
|
||||
|
||||
Reference in New Issue
Block a user