package blusunrize.immersiveengineering.common.util.network; import blusunrize.immersiveengineering.ImmersiveEngineering; import blusunrize.immersiveengineering.api.ApiUtils; import blusunrize.immersiveengineering.api.shader.ShaderRegistry; import blusunrize.immersiveengineering.common.util.ItemNBTHelper; import io.netty.buffer.ByteBuf; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.network.ByteBufUtils; 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 java.util.Collection; public class MessageShaderManual implements IMessage { MessageType key; String[] args; public MessageShaderManual(MessageType key, String... args) { this.key = key; this.args = args; } public MessageShaderManual() { } @Override public void fromBytes(ByteBuf buf) { this.key = MessageType.values()[buf.readInt()]; int l = buf.readInt(); args = new String[l]; for(int i=0; i<l; i++) args[i] = ByteBufUtils.readUTF8String(buf); } @Override public void toBytes(ByteBuf buf) { buf.writeInt(this.key.ordinal()); if(args!=null) { buf.writeInt(this.args.length); for(String s : args) ByteBufUtils.writeUTF8String(buf, s); } else buf.writeInt(0); } public enum MessageType { SYNC, UNLOCK, SPAWN } public static class HandlerServer implements IMessageHandler<MessageShaderManual, IMessage> { @Override public IMessage onMessage(MessageShaderManual message, MessageContext ctx) { if(message.key==MessageType.SYNC && message.args.length>0) { Collection<String> received = ShaderRegistry.receivedShaders.get(message.args[0]); String[] ss = received.toArray(new String[received.size()+1]); System.arraycopy(ss,0, ss,1, ss.length-1); ss[0] = message.args[0]; ImmersiveEngineering.packetHandler.sendTo(new MessageShaderManual(MessageType.SYNC,ss), ctx.getServerHandler().playerEntity); } else if(message.key==MessageType.UNLOCK && message.args.length>1) { ShaderRegistry.receivedShaders.put(message.args[0], message.args[1]); } else if(message.key==MessageType.SPAWN && message.args.length>1) { EntityPlayer player = FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getPlayerByUsername(message.args[0]); if(!player.capabilities.isCreativeMode) ApiUtils.consumePlayerIngredient(player, ShaderRegistry.shaderRegistry.get(message.args[1]).replicationCost); ItemStack shaderStack = new ItemStack(ShaderRegistry.itemShader); ItemNBTHelper.setString(shaderStack, "shader_name", message.args[1]); EntityItem entityitem = player.dropItem(shaderStack, false); if(entityitem != null) { entityitem.setNoPickupDelay(); entityitem.setOwner(player.getName()); } } return null; } } public static class HandlerClient implements IMessageHandler<MessageShaderManual, IMessage> { @Override public IMessage onMessage(MessageShaderManual message, MessageContext ctx) { if(message.key==MessageType.SYNC && message.args.length>0) { String name = message.args[0]; for(int i=1; i<message.args.length; i++) if(message.args[i]!=null) ShaderRegistry.receivedShaders.put(name, message.args[i]); } return null; } } }