猫史档案馆


我的世界java代码

用户:NaCl123NaCl123查看:14 回复:8 评论:14 创建时间:2021-02-21T10:49:59


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)

    喵on.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()

    喵on.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();

            喵on.collect.ImmutableList.copyOf(this.entityLists[i]));

        }

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

    }



回复

上一页1 页 / 共 1下一页
哎呀果仁君哎呀果仁君

那就...复制呗

点赞0


评论


芜湖咸鱼芜湖咸鱼

喵年,Minecraft不开源,你这代码还有注释,就不可能是反编译的,绝对不是源代码,只能是别人猜的

点赞2


评论


codemaofacecodemaoface

你这名字……官方号?

点赞0


评论


TZ阿柒TZ阿柒

这么少,不可能吧

点赞0


评论


蒟蒻OIer1048576蒟蒻OIer1048576

真正的代码请见宝蓝狼使用的M喵-Reborn

点赞0


评论


NaCl123NaCl123

大家别吵了,搬运自https://www.bilibili.com/read/cv1025813/

emotion_编程猫_搓头

点赞0


评论


黄和黄和

仙法。无尽复制

点赞1


评论


NaCl123NaCl123

不要在此打广告!!!!!!!

emotion_编程猫_搓头

center_image

点赞0


评论