我的世界java代码_我的世界源代码(转载:java)

public class ExtendedBlockStorage

{

/** Contains the bottom-most Y block represented by this ExtendedBlockStorage. Typically a multiple of 16. */

private int yBase;

/** A total count of the number of non-air blocks in this block storage's Chunk. */

private int blockRefCount;

/**

* Contains the number of blocks in this block storage's parent chunk that require random ticking. Used to cull the

* Chunk from random tick updates for performance reasons.

*/

private int tickRefCount;

private char[] data;

/** The NibbleArray containing a block of Block-light data. */

private NibbleArray blocklightArray;

/** The NibbleArray containing a block of Sky-light data. */

private NibbleArray skylightArray;

public ExtendedBlockStorage(int y, boolean storeSkylight)

{

this.yBase = y;

this.data = new char[4096];

this.blocklightArray = new NibbleArray();

if (storeSkylight)

{

this.skylightArray = new NibbleArray();

}

}

public IBlockState get(int x, int y, int z)

{

IBlockState iblockstate = (IBlockState)Block.BLOCK_STATE_IDS.getByValue(this.data[y << 8 | z << 4 | x]);

return iblockstate != null ? iblockstate : Blocks.air.getDefaultState();

}

public void set(int x, int y, int z, IBlockState state)

{

if (state instanceof net.minecraftforge.common.property.IExtendedBlockState)

state = ((net.minecraftforge.common.property.IExtendedBlockState) state).getClean();

IBlockState iblockstate1 = this.get(x, y, z);

Block block = iblockstate1.getBlock();

Block block1 = state.getBlock();

if (block != Blocks.air)

{

--this.blockRefCount;

if (block.getTickRandomly())

{

--this.tickRefCount;

}

}

if (block1 != Blocks.air)

{

++this.blockRefCount;

if (block1.getTickRandomly())

{

++this.tickRefCount;

}

}

this.data[y << 8 | z << 4 | x] = (char)Block.BLOCK_STATE_IDS.get(state);

}

/**

* Returns the block for a location in a chunk, with the extended ID merged from a byte array and a NibbleArray to

* form a full 12-bit block ID.

*/

public Block getBlockByExtId(int x, int y, int z)

{

return this.get(x, y, z).getBlock();

}

/**

* Returns the metadata associated with the block at the given coordinates in this ExtendedBlockStorage.

*/

public int getExtBlockMetadata(int x, int y, int z)

{

IBlockState iblockstate = this.get(x, y, z);

return iblockstate.getBlock().getMetaFromState(iblockstate);

}

/**

* Returns whether or not this block storage's Chunk is fully empty, based on its internal reference count.

*/

public boolean isEmpty()

{

return this.blockRefCount == 0;

}

/**

* Returns whether or not this block storage's Chunk will require random ticking, used to avoid looping through

* random block ticks when there are no blocks that would randomly tick.

*/

public boolean getNeedsRandomTick()

{

return this.tickRefCount > 0;

}

/**

* Returns the Y location of this ExtendedBlockStorage.

*/

public int getYLocation()

{

return this.yBase;

}

/**

* Sets the saved Sky-light value in the extended block storage structure.

*/

public void setExtSkylightValue(int x, int y, int z, int value)

{

this.skylightArray.set(x, y, z, value);

}

/**

* Gets the saved Sky-light value in the extended block storage structure.

*/

public int getExtSkylightValue(int x, int y, int z)

{

return this.skylightArray.get(x, y, z);

}

/**

* Sets the saved Block-light value in the extended block storage structure.

*/

public void setExtBlocklightValue(int x, int y, int z, int value)

{

this.blocklightArray.set(x, y, z, value);

}

/**

* Gets the saved Block-light value in the extended block storage structure.

*/

public int getExtBlocklightValue(int x, int y, int z)

{

return this.blocklightArray.get(x, y, z);

}

public void removeInvalidBlocks()

{

this.blockRefCount = 0;

this.tickRefCount = 0;

for (int i = 0; i < 16; ++i)

{

for (int j = 0; j < 16; ++j)

{

for (int k = 0; k < 16; ++k)

{

Block block = this.getBlockByExtId(i, j, k);

if (block != Blocks.air)

{

++this.blockRefCount;

if (block.getTickRandomly())

{

++this.tickRefCount;

}

}

}

}

}

}

public char[] getData()

{

return this.data;

}

public void setData(char[] dataArray)

{

this.data = dataArray;

}

/**

* Returns the NibbleArray instance containing Block-light data.

*/

public NibbleArray getBlocklightArray()

{

return this.blocklightArray;

}

/**

* Returns the NibbleArray instance containing Sky-light data.

*/

public NibbleArray getSkylightArray()

{

return this.skylightArray;

}

/**

* Sets the NibbleArray instance used for Block-light values in this particular storage block.

*/

public void setBlocklightArray(NibbleArray newBlocklightArray)

{

this.blocklightArray = newBlocklightArray;

}

/**

* Sets the NibbleArray instance used for Sky-light values in this particular storage block.

*/

public void setSkylightArray(NibbleArray newSkylightArray)

{

this.skylightArray = newSkylightArray;

}

}

卸载对应的函数是Chunk.onChunkUnload

/**

* Called when this Chunk is unloaded by the ChunkProvider

*/

public void onChunkUnload()

{

this.isChunkLoaded = false;

Iterator iterator = this.chunkTileEntityMap.values().iterator();

while (iterator.hasNext())

{

TileEntity tileentity = (TileEntity)iterator.next();

this.worldObj.markTileEntityForRemoval(tileentity);

}

for (int i = 0; i < this.entityLists.length; ++i)

{

this.worldObj.unloadEntities(this.entityLists[i]);

}

MinecraftForge.EVENT_BUS.post(new ChunkEvent.Unload(this));

}

初次生成世界,需要预先加载一部分的块,对应的是Minecraft Server的

protected void initialWorldChunkLoad()

{

boolean flag = true;

boolean flag1 = true;

boolean flag2 = true;

boolean flag3 = true;

int i = 0;

this.setUserMessage("menu.generatingTerrain");

byte b0 = 0;

logger.info("Preparing start region for level " + b0);

WorldServer worldserver = net.minecraftforge.common.DimensionManager.getWorld(b0);

BlockPos blockpos = worldserver.getSpawnPoint();

long j = getCurrentTimeMillis();

for (int k = -192; k <= 192 && this.isServerRunning(); k += 16)

{

for (int l = -192; l <= 192 && this.isServerRunning(); l += 16)

{

long i1 = getCurrentTimeMillis();

if (i1 - j > 1000L)

{

this.outputPercentRemaining("Preparing spawn area", i * 100 / 625);

j = i1;

}

++i;

worldserver.theChunkProviderServer.loadChunk(blockpos.getX() + k >> 4, blockpos.getZ() + l >> 4);

}

}

this.clearCurrentTask();

}

对应PlayerInstance中的

public void addPlayer(EntityPlayerMP playerMP)

{

if (this.playersWatchingChunk.contains(playerMP))

{

PlayerManager.pmLogger.debug("Failed to add player. {} already is in chunk {}, {}", new Object[] {playerMP, Integer.valueOf(this.chunkCoords.chunkXPos), Integer.valueOf(this.chunkCoords.chunkZPos)});

}

else

{

if (this.playersWatchingChunk.isEmpty())

{

this.previousWorldTime = PlayerManager.this.theWorldServer.getTotalWorldTime();

}

this.playersWatchingChunk.add(playerMP);

Runnable playerRunnable = null;

if (this.loaded)

{

playerMP.loadedChunks.add(this.chunkCoords);

}

else

{

final EntityPlayerMP tmp = playerMP;

playerRunnable = new Runnable()

{

public void run()

{

tmp.loadedChunks.add(PlayerInstance.this.chunkCoords);

}

};

PlayerManager.this.getMinecraftServer().theChunkProviderServer.loadChunk(this.chunkCoords.chunkXPos, this.chunkCoords.chunkZPos, playerRunnable);

}

this.players.put(playerMP, playerRunnable);

}

Chunk加载对应的回调函数

/**

* Called when this Chunk is loaded by the ChunkProvider

*/

public void onChunkLoad()

{

this.isChunkLoaded = true;

this.worldObj.addTileEntities(this.chunkTileEntityMap.values());

for (int i = 0; i < this.entityLists.length; ++i)

{

Iterator iterator = this.entityLists[i].iterator();

while (iterator.hasNext())

{

Entity entity = (Entity)iterator.next();

entity.onChunkLoad();

}

this.worldObj.loadEntities(com.google.common.collect.ImmutableList.copyOf(this.entityLists[i]));

}

MinecraftForge.EVENT_BUS.post(new ChunkEvent.Load(this));

}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值