buildcraft.core.lib.network.PacketTileState.java Source code

Java tutorial

Introduction

Here is the source code for buildcraft.core.lib.network.PacketTileState.java

Source

/**
 * 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.lib.network;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;

import buildcraft.api.core.ISerializable;
import buildcraft.core.network.PacketIds;

public class PacketTileState extends PacketCoordinates {

    private ByteBuf state;

    private class StateWithId {
        public byte stateId;
        public ISerializable state;

        public StateWithId(byte stateId, ISerializable state) {
            this.stateId = stateId;
            this.state = state;
        }
    }

    private List<StateWithId> stateList = new LinkedList<StateWithId>();

    /**
     * Default constructor for incoming packets
     */
    public PacketTileState() {
    }

    /**
     * Constructor for outgoing packets
     *
     * @param x, y, z - the coordinates the tile to sync
     */
    public PacketTileState(int x, int y, int z) {
        super(PacketIds.STATE_UPDATE, x, y, z);
        isChunkDataPacket = true;
    }

    @Override
    public int getID() {
        return PacketIds.STATE_UPDATE;
    }

    public void applyStates(ISyncedTile tile) throws IOException {
        byte stateCount = state.readByte();
        for (int i = 0; i < stateCount; i++) {
            byte stateId = state.readByte();
            tile.getStateInstance(stateId).readData(state);
            tile.afterStateUpdated(stateId);
        }
    }

    public void addStateForSerialization(byte stateId, ISerializable state) {
        stateList.add(new StateWithId(stateId, state));
    }

    @Override
    public void writeData(ByteBuf data) {
        super.writeData(data);

        ByteBuf tmpState = Unpooled.buffer();

        tmpState.writeByte(stateList.size());
        for (StateWithId stateWithId : stateList) {
            tmpState.writeByte(stateWithId.stateId);
            stateWithId.state.writeData(tmpState);
        }

        data.writeShort((short) tmpState.readableBytes());
        data.writeBytes(tmpState.readBytes(tmpState.readableBytes()));
    }

    @Override
    public void readData(ByteBuf data) {
        super.readData(data);

        state = Unpooled.buffer();
        int length = data.readUnsignedShort();
        state.writeBytes(data.readBytes(length));
    }
}