/* This file is part of Project-Zed. Project-Zed is free software: you can redistribute it and/or modify it under the terms of the GNU General Public * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Project-Zed is * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along * with Project-Zed. If not, see <http://www.gnu.org/licenses/> */ package com.projectzed.mod.handler.message; import com.hockeyhurd.hcorelib.api.math.Rect; import com.hockeyhurd.hcorelib.api.math.Vector2; import com.hockeyhurd.hcorelib.api.math.Vector3; import com.hockeyhurd.hcorelib.api.math.VectorHelper; import com.projectzed.api.tileentity.digger.AbstractTileEntityDigger; import com.projectzed.api.util.EnumRedstoneType; import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; import net.minecraftforge.fml.relauncher.Side; /** * Class used to send messages to/from client and server for all digger based machines. * * @author hockeyhurd * @version Jun 19, 2015 */ public class MessageTileEntityDigger implements IMessage, IMessageHandler<MessageTileEntityDigger, IMessage> { protected AbstractTileEntityDigger te; protected Vector3<Integer> vec; protected int stored; protected int energyBurnRate; protected boolean powerMode; protected boolean isDigging; protected Vector3<Integer> mineVec; protected Rect<Integer> quarryRect; protected EnumRedstoneType redstoneType; protected byte[] openSides = new byte[EnumFacing.VALUES.length]; public MessageTileEntityDigger() { } public MessageTileEntityDigger(AbstractTileEntityDigger te) { this.te = te; this.vec = te.worldVec(); this.stored = te.getEnergyStored(); this.energyBurnRate = te.getEnergyBurnRate(); this.powerMode = te.isPoweredOn(); this.redstoneType = te.getRedstoneType() != null ? te.getRedstoneType() : EnumRedstoneType.LOW; for (int i = 0; i < openSides.length; i++) { this.openSides[i] = te.getSideValve(i); } this.quarryRect = te.getQuarryRect(); this.mineVec = te.getCurrentMineVec(); this.isDigging = this.quarryRect != null && this.mineVec != null; } @Override public void fromBytes(ByteBuf buf) { if (vec == null) vec = new Vector3<Integer>(); vec.x = buf.readInt(); vec.y = buf.readInt(); vec.z = buf.readInt(); this.stored = buf.readInt(); this.energyBurnRate = buf.readInt(); this.powerMode = buf.readBoolean(); this.redstoneType = EnumRedstoneType.TYPES[buf.readInt()]; for (int i = 0; i < openSides.length; i++) { openSides[i] = buf.readByte(); } this.isDigging = buf.readBoolean(); if (this.isDigging) { int mx = buf.readInt(); int my = buf.readInt(); int mz = buf.readInt(); this.mineVec = new Vector3<Integer>(mx, my, mz); int q0x = buf.readInt(); int q0y = buf.readInt(); int q1x = buf.readInt(); int q1y = buf.readInt(); this.quarryRect = new Rect<Integer>(new Vector2<Integer>(q0x, q0y), new Vector2<Integer>(q1x, q1y)); } } @Override public void toBytes(ByteBuf buf) { buf.writeInt(vec.x); buf.writeInt(vec.y); buf.writeInt(vec.z); buf.writeInt(stored); buf.writeInt(energyBurnRate); buf.writeBoolean(powerMode); buf.writeInt(redstoneType.ordinal()); for (byte b : openSides) { buf.writeByte(b); } buf.writeBoolean(isDigging); if (isDigging) { buf.writeInt(mineVec.x); buf.writeInt(mineVec.y); buf.writeInt(mineVec.z); buf.writeInt(quarryRect.min.x); buf.writeInt(quarryRect.min.y); buf.writeInt(quarryRect.max.x); buf.writeInt(quarryRect.max.y); } } @Override public IMessage onMessage(MessageTileEntityDigger message, MessageContext ctx) { if (ctx.side == Side.CLIENT) { TileEntity te = FMLClientHandler.instance().getClient().theWorld.getTileEntity(VectorHelper.toBlockPos(message.vec)); if (te != null && te instanceof AbstractTileEntityDigger) { ((AbstractTileEntityDigger) te).setEnergyStored(message.stored); ((AbstractTileEntityDigger) te).setEnergyBurnRate(message.energyBurnRate); ((AbstractTileEntityDigger) te).setPowerMode(message.powerMode); ((AbstractTileEntityDigger) te).setRedstoneType(message.redstoneType); if (message.isDigging) { ((AbstractTileEntityDigger) te).setCurrentMineVec(message.mineVec); ((AbstractTileEntityDigger) te).setQuarryRect(message.quarryRect); } for (int i = 0; i < message.openSides.length; i++) { ((AbstractTileEntityDigger) te).setSideValve(EnumFacing.VALUES[i], message.openSides[i]); } } } else if (ctx.side == Side.SERVER) { World world = ctx.getServerHandler().playerEntity.worldObj; TileEntity te = world.getTileEntity(VectorHelper.toBlockPos(message.vec)); if (world != null && te != null && te instanceof AbstractTileEntityDigger) { AbstractTileEntityDigger te2 = (AbstractTileEntityDigger) te; te2.setEnergyStored(message.stored); te2.setEnergyBurnRate(message.energyBurnRate); te2.setPowerMode(message.powerMode); te2.setRedstoneType(message.redstoneType); if (message.isDigging) { te2.setCurrentMineVec(message.mineVec); te2.setQuarryRect(message.quarryRect); } for (int i = 0; i < message.openSides.length; i++) { te2.setSideValve(EnumFacing.VALUES[i], message.openSides[i]); } } } return null; } }