/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * BuildCraft is distributed under the terms of the Minecraft Mod Public * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.core.properties; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.LongHashMap; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.IWorldAccess; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; public class DimensionProperty implements IWorldAccess { private final LongHashMap chunkMapping = new LongHashMap(); private final World world; private final int worldHeight; private final WorldProperty worldProperty; public DimensionProperty(World iWorld, WorldProperty iProp) { world = iWorld; worldHeight = iWorld.getHeight(); world.addWorldAccess(this); worldProperty = iProp; } public synchronized boolean get(int x, int y, int z) { int xChunk = x >> 4; int zChunk = z >> 4; if (world.getChunkProvider().chunkExists(xChunk, zChunk)) { long chunkId = ChunkCoordIntPair.chunkXZ2Int(xChunk, zChunk); ChunkProperty property; if (!chunkMapping.containsItem(chunkId)) { property = new ChunkProperty(world, world.getHeight(), xChunk, zChunk); chunkMapping.add(chunkId, property); load(world.getChunkFromChunkCoords(xChunk, zChunk), property); } else { property = (ChunkProperty) chunkMapping.getValueByKey(chunkId); } return property.get(x & 0xF, y, z & 0xF); } else { return false; } } private void load(Chunk chunk, ChunkProperty property) { synchronized (world) { for (int x = 0; x < 16; ++x) { for (int y = 0; y < worldHeight; ++y) { for (int z = 0; z < 16; ++z) { Block block = chunk.getBlock(x, y, z); int meta = chunk.getBlockMetadata(x, y, z); boolean prop = worldProperty. get(world, block, meta, chunk.xPosition * 16 + x, y, chunk.zPosition * 16 + z); property.set(x, y, z, prop); } } } } } @Override public synchronized void markBlockForUpdate(int x, int y, int z) { int xChunk = x >> 4; int zChunk = z >> 4; if (world.getChunkProvider().chunkExists(xChunk, zChunk)) { long chunkId = ChunkCoordIntPair.chunkXZ2Int(xChunk, zChunk); if (chunkMapping.containsItem(chunkId)) { ChunkProperty property = (ChunkProperty) chunkMapping.getValueByKey(chunkId); Block block = world.getBlock(x, y, z); int meta = world.getBlockMetadata(x, y, z); boolean prop = worldProperty. get(world, block, meta, x, y, z); property.set(x & 0xF, y, z & 0xF, prop); } } } @Override public void markBlockForRenderUpdate(int var1, int var2, int var3) { } @Override public void markBlockRangeForRenderUpdate(int x1, int y1, int z1, int x2, int y2, int z2) { } @Override public void playSound(String var1, double var2, double var4, double var6, float var8, float var9) { } @Override public void playSoundToNearExcept(EntityPlayer var1, String var2, double var3, double var5, double var7, float var9, float var10) { } @Override public void spawnParticle(String var1, double var2, double var4, double var6, double var8, double var10, double var12) { } @Override public void onEntityCreate(Entity var1) { } @Override public void onEntityDestroy(Entity var1) { } @Override public void playRecord(String var1, int var2, int var3, int var4) { } @Override public void broadcastSound(int var1, int var2, int var3, int var4, int var5) { } @Override public void playAuxSFX(EntityPlayer var1, int var2, int var3, int var4, int var5, int var6) { } @Override public void destroyBlockPartially(int var1, int var2, int var3, int var4, int var5) { } @Override public void onStaticEntitiesChanged() { } public void clear() { world.removeWorldAccess(this); } }