mirror of
https://github.com/GTNewHorizons/Chisel.git
synced 2026-11-11 15:57:31 +00:00
Angelica Thread Safety
This commit is contained in:
1 parent
e9e63d6fc5
commit
06ec360694
15 files changed
+82
-38
No files matched your search
@@ -100,7 +100,8 @@ public enum TextureType {
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
protected RenderBlocks createRenderContext(RenderBlocks rendererOld, IBlockAccess world, Object cachedObject) {
|
||||
RenderBlocksColumn ret = theRenderBlocksColumn;
|
||||
TextureType.initStatics();
|
||||
RenderBlocksColumn ret = theRenderBlocksColumn.get();
|
||||
Pair<TextureSubmap, IIcon> data = (Pair<TextureSubmap, IIcon>) cachedObject;
|
||||
|
||||
ret.blockAccess = world;
|
||||
@@ -205,7 +206,7 @@ public enum TextureType {
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
protected RenderBlocks createRenderContext(RenderBlocks rendererOld, IBlockAccess world, Object cachedObject) {
|
||||
RenderBlocksCTM ret = theRenderBlocksCTM;
|
||||
RenderBlocksCTM ret = theRenderBlocksCTM.get();
|
||||
Triple<?, TextureSubmap, TextureSubmap> data = (Triple<?, TextureSubmap, TextureSubmap>) cachedObject;
|
||||
ret.blockAccess = world;
|
||||
|
||||
@@ -325,9 +326,9 @@ public enum TextureType {
|
||||
private static final CTM ctm = CTM.getInstance();
|
||||
private static final Random rand = new Random();
|
||||
@SideOnly(Side.CLIENT)
|
||||
private static RenderBlocksCTM theRenderBlocksCTM;
|
||||
private static ThreadLocal<RenderBlocksCTM> theRenderBlocksCTM;
|
||||
@SideOnly(Side.CLIENT)
|
||||
private static RenderBlocksColumn theRenderBlocksColumn;
|
||||
private static ThreadLocal<RenderBlocksColumn> theRenderBlocksColumn;
|
||||
|
||||
private String[] suffixes;
|
||||
static {
|
||||
@@ -338,16 +339,17 @@ public enum TextureType {
|
||||
this.suffixes = suffixes.length == 0 ? new String[] { "" } : suffixes;
|
||||
}
|
||||
|
||||
private static void initStatics() {
|
||||
if (theRenderBlocksCTM == null) {
|
||||
theRenderBlocksCTM = new RenderBlocksCTM();
|
||||
theRenderBlocksColumn = new RenderBlocksColumn();
|
||||
}
|
||||
}
|
||||
private static void initStatics() {
|
||||
if (theRenderBlocksCTM == null) {
|
||||
theRenderBlocksCTM = ThreadLocal.withInitial(RenderBlocksCTM::new);
|
||||
theRenderBlocksColumn = ThreadLocal.withInitial(RenderBlocksColumn::new);
|
||||
}
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public static void clearStatics() {
|
||||
theRenderBlocksCTM = null;
|
||||
theRenderBlocksColumn = null;
|
||||
theRenderBlocksCTM.remove();
|
||||
theRenderBlocksColumn.remove();
|
||||
}
|
||||
|
||||
public ISubmapManager createManagerFor(ICarvingVariation variation, String texturePath) {
|
||||
@@ -428,7 +430,6 @@ public enum TextureType {
|
||||
|
||||
@Override
|
||||
public RenderBlocks createRenderContext(RenderBlocks rendererOld, Block block, IBlockAccess world) {
|
||||
initStatics();
|
||||
RenderBlocks rb = type.createRenderContext(rendererOld, world, cachedObject);
|
||||
rb.setRenderBoundsFromBlock(block);
|
||||
return rb;
|
||||
|
||||
@@ -10,10 +10,13 @@ import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import cpw.mods.fml.client.registry.RenderingRegistry;
|
||||
import team.chisel.ctmlib.Drawing;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RendererCTMPane implements ISimpleBlockRenderingHandler {
|
||||
|
||||
public static int id;
|
||||
@@ -32,8 +35,6 @@ public class RendererCTMPane implements ISimpleBlockRenderingHandler {
|
||||
|
||||
class PaneRenderer {
|
||||
|
||||
Tessellator tessellator;
|
||||
|
||||
double i0u0;
|
||||
double i0uh;
|
||||
double i0u1;
|
||||
@@ -69,8 +70,6 @@ public class RendererCTMPane implements ISimpleBlockRenderingHandler {
|
||||
double y1;
|
||||
|
||||
void set(double x, double y, double z, IIcon icon, IIcon icon1, IIcon icon2) {
|
||||
tessellator = Tessellator.instance;
|
||||
|
||||
i0u0 = icon.getMinU();
|
||||
i0uh = icon.getInterpolatedU(8.0D);
|
||||
i0u1 = icon.getMaxU();
|
||||
@@ -107,6 +106,8 @@ public class RendererCTMPane implements ISimpleBlockRenderingHandler {
|
||||
}
|
||||
|
||||
public void renderNorthPane() {
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
|
||||
tessellator.addVertexWithUV(xh, y1, z0, i0uh, i0v0);
|
||||
tessellator.addVertexWithUV(xh, y0, z0, i0uh, i0v1);
|
||||
tessellator.addVertexWithUV(xh, y0, zh, i0u0, i0v1);
|
||||
@@ -118,6 +119,8 @@ public class RendererCTMPane implements ISimpleBlockRenderingHandler {
|
||||
}
|
||||
|
||||
public void renderSouthPane() {
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
|
||||
tessellator.addVertexWithUV(xh, y1, zh, i0u1, i0v0);
|
||||
tessellator.addVertexWithUV(xh, y0, zh, i0u1, i0v1);
|
||||
tessellator.addVertexWithUV(xh, y0, z1, i0uh, i0v1);
|
||||
@@ -129,6 +132,8 @@ public class RendererCTMPane implements ISimpleBlockRenderingHandler {
|
||||
}
|
||||
|
||||
public void renderWestPane() {
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
|
||||
tessellator.addVertexWithUV(x0, y1, zh, i0uh, i0v0);
|
||||
tessellator.addVertexWithUV(x0, y0, zh, i0uh, i0v1);
|
||||
tessellator.addVertexWithUV(xh, y0, zh, i0u0, i0v1);
|
||||
@@ -140,6 +145,8 @@ public class RendererCTMPane implements ISimpleBlockRenderingHandler {
|
||||
}
|
||||
|
||||
public void renderEastPane() {
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
|
||||
tessellator.addVertexWithUV(xh, y1, zh, i0u1, i0v0);
|
||||
tessellator.addVertexWithUV(xh, y0, zh, i0u1, i0v1);
|
||||
tessellator.addVertexWithUV(x1, y0, zh, i0uh, i0v1);
|
||||
@@ -151,6 +158,8 @@ public class RendererCTMPane implements ISimpleBlockRenderingHandler {
|
||||
}
|
||||
|
||||
public void renderVerticalNS(double y, double zoff0, double zoff1, double v0, double v1) {
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
|
||||
tessellator.addVertexWithUV(xp0, y0 + y, z0 + zoff0, i1u0, i1v0 + i1v * v0);
|
||||
tessellator.addVertexWithUV(xp0, y0 + y, z0 + zoff1, i1u0, i1v0 + i1v * v1);
|
||||
tessellator.addVertexWithUV(xp1, y0 + y, z0 + zoff1, i1u1, i1v0 + i1v * v1);
|
||||
@@ -162,6 +171,8 @@ public class RendererCTMPane implements ISimpleBlockRenderingHandler {
|
||||
}
|
||||
|
||||
public void renderVerticalWE(double y, double xoff0, double xoff1, double v0, double v1) {
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
|
||||
tessellator.addVertexWithUV(x0 + xoff0, y0 + y, zp1, i1u1, i1v0 + i1v * v0);
|
||||
tessellator.addVertexWithUV(x0 + xoff1, y0 + y, zp1, i1u1, i1v0 + i1v * v1);
|
||||
tessellator.addVertexWithUV(x0 + xoff1, y0 + y, zp0, i1u0, i1v0 + i1v * v1);
|
||||
@@ -173,6 +184,8 @@ public class RendererCTMPane implements ISimpleBlockRenderingHandler {
|
||||
}
|
||||
|
||||
public void renderHorizontalNS(double zoff, double v0, double v1) {
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
|
||||
tessellator.addVertexWithUV(xp0, y1, z0 + zoff, i2u0, i2v0 + i2v * v1);
|
||||
tessellator.addVertexWithUV(xp0, y0, z0 + zoff, i2u0, i2v0 + i2v * v0);
|
||||
tessellator.addVertexWithUV(xp1, y0, z0 + zoff, i2u1, i2v0 + i2v * v0);
|
||||
@@ -185,6 +198,8 @@ public class RendererCTMPane implements ISimpleBlockRenderingHandler {
|
||||
}
|
||||
|
||||
public void renderHorizontalWE(double xoff, double v0, double v1) {
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
|
||||
tessellator.addVertexWithUV(x0 + xoff, y1, zp0, i2u0, i2v0 + i2v * v1);
|
||||
tessellator.addVertexWithUV(x0 + xoff, y0, zp0, i2u0, i2v0 + i2v * v0);
|
||||
tessellator.addVertexWithUV(x0 + xoff, y0, zp1, i2u1, i2v0 + i2v * v0);
|
||||
@@ -196,13 +211,14 @@ public class RendererCTMPane implements ISimpleBlockRenderingHandler {
|
||||
}
|
||||
}
|
||||
|
||||
PaneRenderer paneRenderer = new PaneRenderer();
|
||||
final ThreadLocal<PaneRenderer> paneRendererThreadLocal = ThreadLocal.withInitial(PaneRenderer::new);
|
||||
|
||||
@Override
|
||||
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block b, int modelId,
|
||||
RenderBlocks renderer) {
|
||||
BlockPane block = (BlockPane) b;
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
final Tessellator tessellator = Tessellator.instance;
|
||||
final PaneRenderer paneRenderer = paneRendererThreadLocal.get();
|
||||
|
||||
tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z));
|
||||
|
||||
|
||||
@@ -6,11 +6,14 @@ import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import cpw.mods.fml.client.registry.RenderingRegistry;
|
||||
import team.chisel.Chisel;
|
||||
import team.chisel.ctmlib.Drawing;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RendererEldritch implements ISimpleBlockRenderingHandler {
|
||||
|
||||
public RendererEldritch() {
|
||||
@@ -24,12 +27,14 @@ public class RendererEldritch implements ISimpleBlockRenderingHandler {
|
||||
GL11.glTranslatef(0.5F, 0.5F, 0.5F);
|
||||
}
|
||||
|
||||
RenderBlocksEldritch renderer = new RenderBlocksEldritch();
|
||||
ThreadLocal<RenderBlocksEldritch> rendererThreadLocal = ThreadLocal.withInitial(RenderBlocksEldritch::new);
|
||||
|
||||
@Override
|
||||
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
|
||||
RenderBlocks rendererOld) {
|
||||
|
||||
final RenderBlocksEldritch renderer = rendererThreadLocal.get();
|
||||
|
||||
// tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x,
|
||||
// y, z));
|
||||
/*
|
||||
|
||||
@@ -7,6 +7,8 @@ import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import cpw.mods.fml.client.registry.RenderingRegistry;
|
||||
import team.chisel.Chisel;
|
||||
@@ -15,6 +17,7 @@ import team.chisel.config.Configurations;
|
||||
import team.chisel.ctmlib.Drawing;
|
||||
import team.chisel.utils.GeneralClient;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RendererLayeredGlow implements ISimpleBlockRenderingHandler {
|
||||
|
||||
public RendererLayeredGlow() {
|
||||
@@ -36,8 +39,9 @@ public class RendererLayeredGlow implements ISimpleBlockRenderingHandler {
|
||||
@Override
|
||||
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
|
||||
RenderBlocks renderer) {
|
||||
Tessellator.instance.setColorOpaque_I(Configurations.configColors[world.getBlockMetadata(x, y, z)]);
|
||||
Tessellator.instance.setBrightness(0xF000F0);
|
||||
final Tessellator tessellator = Tessellator.instance;
|
||||
tessellator.setColorOpaque_I(Configurations.configColors[world.getBlockMetadata(x, y, z)]);
|
||||
tessellator.setBrightness(0xF000F0);
|
||||
Drawing.renderAllFaces(renderer, block, x, y, z, ((BlockCarvableGlow) block).getGlowTexture());
|
||||
renderer.renderStandardBlock(block, x, y, z);
|
||||
return true;
|
||||
|
||||
@@ -16,14 +16,18 @@ import net.minecraft.init.Blocks;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraftforge.client.MinecraftForgeClient;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import cpw.mods.fml.client.registry.RenderingRegistry;
|
||||
import team.chisel.block.BlockMultiLayerBase;
|
||||
import team.chisel.ctmlib.Drawing;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RendererMultiLayer implements ISimpleBlockRenderingHandler {
|
||||
|
||||
float bot = -0.001f, top = 1.0f - bot;
|
||||
final static float bot = -0.001f;
|
||||
final static float top = 1.0f - bot;
|
||||
public static int id;
|
||||
|
||||
public RendererMultiLayer() {
|
||||
|
||||
@@ -7,12 +7,15 @@ import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import cpw.mods.fml.client.registry.RenderingRegistry;
|
||||
import team.chisel.Chisel;
|
||||
import team.chisel.block.BlockRoadLine;
|
||||
import team.chisel.ctmlib.Drawing;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RendererRoadLine implements ISimpleBlockRenderingHandler {
|
||||
|
||||
public RendererRoadLine() {
|
||||
|
||||
@@ -6,12 +6,15 @@ import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import cpw.mods.fml.client.registry.RenderingRegistry;
|
||||
import team.chisel.Chisel;
|
||||
import team.chisel.block.BlockCarvableLayered;
|
||||
import team.chisel.ctmlib.Drawing;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RendererSimpleLayered implements ISimpleBlockRenderingHandler {
|
||||
|
||||
public RendererSimpleLayered() {
|
||||
|
||||
@@ -6,11 +6,14 @@ import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import cpw.mods.fml.client.registry.RenderingRegistry;
|
||||
import team.chisel.block.BlockSnakestone;
|
||||
import team.chisel.ctmlib.Drawing;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RendererSnakeStone implements ISimpleBlockRenderingHandler {
|
||||
|
||||
public static int id;
|
||||
|
||||
@@ -6,11 +6,14 @@ import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import cpw.mods.fml.client.registry.RenderingRegistry;
|
||||
import team.chisel.block.BlockCarvableStairs;
|
||||
import team.chisel.ctmlib.Drawing;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RendererStairs implements ISimpleBlockRenderingHandler {
|
||||
|
||||
public static int id;
|
||||
|
||||
@@ -83,7 +83,7 @@ public class CTM {
|
||||
|
||||
public Optional<Boolean> disableObscuredFaceCheck = Optional.absent();
|
||||
|
||||
protected TIntObjectMap<Dir[]> submapMap = new TIntObjectHashMap<Dir[]>();
|
||||
protected TIntObjectMap<Dir[]> submapMap = new TIntObjectHashMap<>();
|
||||
protected EnumMap<Dir, Boolean> connectionMap = Maps.newEnumMap(Dir.class);
|
||||
|
||||
protected CTM() {
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
package team.chisel.ctmlib;
|
||||
|
||||
import cpw.mods.fml.common.ModAPIManager;
|
||||
import team.chisel.Tags;
|
||||
|
||||
public class CTMLib {
|
||||
|
||||
public static final String VERSION = "GRADLETOKEN_VERSION";
|
||||
public static final String VERSION = Tags.VERSION;
|
||||
|
||||
private static boolean chiselPresent, chiselInitialized;
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ import cpw.mods.fml.common.registry.GameRegistry;
|
||||
*/
|
||||
public class CTMRenderer implements ISimpleBlockRenderingHandler {
|
||||
|
||||
private int renderId;
|
||||
private final int renderId;
|
||||
|
||||
public CTMRenderer(int renderId) {
|
||||
this.renderId = renderId;
|
||||
|
||||
@@ -113,10 +113,11 @@ public class RenderBlocksCTM extends RenderBlocks {
|
||||
private static double u, v, xDiff, yDiff, zDiff, uDiff, vDiff;
|
||||
|
||||
void render(RenderBlocksCTM inst, ForgeDirection normal, int cacheID) {
|
||||
final Tessellator tessellator = Tessellator.instance;
|
||||
|
||||
if (inst.enableAO) {
|
||||
Tessellator.instance
|
||||
.setColorOpaque_F(inst.redCache[cacheID], inst.grnCache[cacheID], inst.bluCache[cacheID]);
|
||||
Tessellator.instance.setBrightness(inst.lightingCache[cacheID]);
|
||||
tessellator.setColorOpaque_F(inst.redCache[cacheID], inst.grnCache[cacheID], inst.bluCache[cacheID]);
|
||||
tessellator.setBrightness(inst.lightingCache[cacheID]);
|
||||
}
|
||||
|
||||
u = cacheID == 1 || cacheID == 2 ? inst.maxU : inst.minU;
|
||||
@@ -151,7 +152,7 @@ public class RenderBlocksCTM extends RenderBlocks {
|
||||
xDiff = yDiff = zDiff = 1;
|
||||
}
|
||||
|
||||
Tessellator.instance.addVertexWithUV(
|
||||
tessellator.addVertexWithUV(
|
||||
inst.renderMinX + (x * xDiff),
|
||||
inst.renderMinY + (y * yDiff),
|
||||
inst.renderMinZ + (z * zDiff),
|
||||
@@ -225,7 +226,6 @@ public class RenderBlocksCTM extends RenderBlocks {
|
||||
renderMaxX = renderMaxY = renderMaxZ = 1;
|
||||
}
|
||||
|
||||
protected Tessellator tessellator = Tessellator.instance;
|
||||
protected double minU, maxU;
|
||||
protected double minV, maxV;
|
||||
protected int[] lightingCache = new int[4];
|
||||
@@ -253,16 +253,17 @@ public class RenderBlocksCTM extends RenderBlocks {
|
||||
by = y;
|
||||
bz = z;
|
||||
meta = Minecraft.getMinecraft().theWorld.getBlockMetadata(x, y, z);
|
||||
final Tessellator tessellator = Tessellator.instance;
|
||||
|
||||
Tessellator.instance.setColorOpaque_F(1.0F, 1.0F, 1.0F);
|
||||
Tessellator.instance.addTranslation(x, y, z);
|
||||
tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F);
|
||||
tessellator.addTranslation(x, y, z);
|
||||
if (rendererOld != null && rendererOld.hasOverrideBlockTexture()) {
|
||||
setOverrideBlockTexture(rendererOld.overrideBlockTexture);
|
||||
}
|
||||
inWorld = true;
|
||||
boolean res = super.renderStandardBlock(block, x, y, z);
|
||||
inWorld = false;
|
||||
Tessellator.instance.addTranslation(-x, -y, -z);
|
||||
tessellator.addTranslation(-x, -y, -z);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -17,7 +17,8 @@ import lombok.Getter;
|
||||
public class SubmapManagerCTM implements ISubmapManager {
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
private static RenderBlocksCTM rb;
|
||||
private static final ThreadLocal<RenderBlocksCTM> renderBlocksThreadLocal = ThreadLocal
|
||||
.withInitial(RenderBlocksCTM::new);
|
||||
|
||||
@Getter
|
||||
private TextureSubmap submap, submapSmall;
|
||||
@@ -54,9 +55,7 @@ public class SubmapManagerCTM implements ISubmapManager {
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public RenderBlocks createRenderContext(RenderBlocks rendererOld, Block block, IBlockAccess world) {
|
||||
if (rb == null) {
|
||||
rb = new RenderBlocksCTM();
|
||||
}
|
||||
RenderBlocksCTM rb = renderBlocksThreadLocal.get();
|
||||
rb.setRenderBoundsFromBlock(block);
|
||||
rb.submap = submap;
|
||||
rb.submapSmall = submapSmall;
|
||||
|
||||
Reference in new issue
Block a user