probably fix issue with phosphor crashing contraptions

This commit is contained in:
JozsefA 2021-02-12 21:11:35 -08:00
parent e88dd89262
commit b1905ddfd4
6 changed files with 72 additions and 19 deletions

View file

@ -7,6 +7,7 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.WorldAttached; import com.simibubi.create.foundation.utility.WorldAttached;
@ -17,7 +18,9 @@ import net.minecraft.entity.LivingEntity;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.common.util.Constants.NBT;
import net.minecraftforge.fml.DistExecutor;
public class ContraptionHandler { public class ContraptionHandler {

View file

@ -10,6 +10,10 @@ import com.simibubi.create.foundation.render.TileEntityRenderHelper;
import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher;
import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.Backend;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.Matrix4f;
@ -30,9 +34,12 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ForkJoinPool;
public class ContraptionRenderDispatcher { public class ContraptionRenderDispatcher {
public static final HashMap<Integer, RenderedContraption> renderers = new HashMap<>(); public static final Int2ObjectMap<RenderedContraption> renderers = new Int2ObjectOpenHashMap<>();
public static void notifyLightUpdate(ILightReader world, LightType type, SectionPos pos) { public static void notifyLightUpdate(ILightReader world, LightType type, SectionPos pos) {
for (RenderedContraption renderer : renderers.values()) { for (RenderedContraption renderer : renderers.values()) {
@ -82,16 +89,15 @@ public class ContraptionRenderDispatcher {
} }
private static RenderedContraption getRenderer(World world, Contraption c) { private static RenderedContraption getRenderer(World world, Contraption c) {
RenderedContraption renderer;
int entityId = c.entity.getEntityId(); int entityId = c.entity.getEntityId();
if (renderers.containsKey(entityId)) { RenderedContraption contraption = renderers.get(entityId);
renderer = renderers.get(entityId);
} else { if (contraption == null) {
renderer = new RenderedContraption(world, c); contraption = new RenderedContraption(world, c);
renderers.put(entityId, renderer); renderers.put(entityId, contraption);
} }
return renderer; return contraption;
} }
public static void renderLayer(RenderType layer, Matrix4f viewProjection, float camX, float camY, float camZ) { public static void renderLayer(RenderType layer, Matrix4f viewProjection, float camX, float camY, float camZ) {

View file

@ -34,7 +34,7 @@ import java.util.List;
import java.util.Random; import java.util.Random;
public class RenderedContraption { public class RenderedContraption {
private HashMap<RenderType, ContraptionModel> renderLayers = new HashMap<>(); private final HashMap<RenderType, ContraptionModel> renderLayers = new HashMap<>();
public final PlacementSimulationWorld renderWorld; public final PlacementSimulationWorld renderWorld;

View file

@ -89,6 +89,10 @@ public class PlacementSimulationWorld extends WrappedWorld {
return true; return true;
} }
public BlockState getBlockState(int x, int y, int z) {
return getBlockState(scratch.setPos(x, y, z));
}
@Override @Override
public BlockState getBlockState(BlockPos pos) { public BlockState getBlockState(BlockPos pos) {
BlockState state = blocksAdded.get(pos); BlockState state = blocksAdded.get(pos);

View file

@ -30,11 +30,13 @@ import java.util.stream.Stream;
public class WrappedChunk implements IChunk { public class WrappedChunk implements IChunk {
private final PlacementSimulationWorld world; final PlacementSimulationWorld world;
private boolean needsLight; boolean needsLight;
private final int x; final int x;
private final int z; final int z;
private final ChunkPos pos; final ChunkPos pos;
private final ChunkSection[] sections;
public WrappedChunk(PlacementSimulationWorld world, int x, int z) { public WrappedChunk(PlacementSimulationWorld world, int x, int z) {
this.world = world; this.world = world;
@ -42,6 +44,12 @@ public class WrappedChunk implements IChunk {
this.x = x; this.x = x;
this.z = z; this.z = z;
this.pos = new ChunkPos(x, z); this.pos = new ChunkPos(x, z);
this.sections = new ChunkSection[16];
for (int i = 0; i < 16; i++) {
sections[i] = new WrappedChunkSection(this, i << 4);
}
} }
@Override @Override
@ -57,6 +65,11 @@ public class WrappedChunk implements IChunk {
.map(Map.Entry::getKey); .map(Map.Entry::getKey);
} }
@Override
public ChunkSection[] getSections() {
return sections;
}
@Nullable @Nullable
@Override @Override
public BlockState setBlockState(BlockPos p_177436_1_, BlockState p_177436_2_, boolean p_177436_3_) { public BlockState setBlockState(BlockPos p_177436_1_, BlockState p_177436_2_, boolean p_177436_3_) {
@ -78,11 +91,6 @@ public class WrappedChunk implements IChunk {
return null; return null;
} }
@Override
public ChunkSection[] getSections() {
return new ChunkSection[0];
}
@Override @Override
public Collection<Map.Entry<Heightmap.Type, Heightmap>> func_217311_f() { public Collection<Map.Entry<Heightmap.Type, Heightmap>> func_217311_f() {
return null; return null;

View file

@ -0,0 +1,32 @@
package com.simibubi.create.foundation.utility.worldWrappers.chunk;
import net.minecraft.block.BlockState;
import net.minecraft.world.chunk.ChunkSection;
public class WrappedChunkSection extends ChunkSection {
public WrappedChunk owner;
public final int xStart;
public final int yStart;
public final int zStart;
public WrappedChunkSection(WrappedChunk owner, int yBase) {
super(yBase);
this.owner = owner;
this.xStart = owner.pos.getXStart();
this.yStart = yBase;
this.zStart = owner.pos.getZStart();
}
@Override
public BlockState getBlockState(int x, int y, int z) {
// ChunkSection#getBlockState expects local chunk coordinates, so we add to get back into world coords.
return owner.world.getBlockState(x + xStart, y + yStart, z + zStart);
}
@Override
public BlockState setBlockState(int p_177484_1_, int p_177484_2_, int p_177484_3_, BlockState p_177484_4_, boolean p_177484_5_) {
throw new IllegalStateException("Chunk sections should not be mutated in a fake world.");
}
}