/******************************************************************************************************************* * Authors: SanAndreasP * Copyright: SanAndreasP * License: Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International * http://creativecommons.org/licenses/by-nc-sa/4.0/ *******************************************************************************************************************/ package de.sanandrew.core.manpack.network; import com.google.common.collect.Maps; import de.sanandrew.core.manpack.init.ManPackLoadingPlugin; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufInputStream; import net.minecraft.network.INetHandler; import org.apache.logging.log4j.Level; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Map; public final class PacketProcessor { private final String modId; private final Map<Short, Class<? extends IPacket>> packetMap = Maps.newHashMap(); public PacketProcessor(String modId) { this.modId = modId; } public void processPacket(ByteBuf data, INetHandler handler) { short packetId = -1; try( ByteBufInputStream bbis = new ByteBufInputStream(data) ) { packetId = bbis.readShort(); if( this.packetMap.containsKey(packetId) ) { this.packetMap.get(packetId).getConstructor().newInstance().process(bbis, data, handler); } } catch( IOException ioe ) { ManPackLoadingPlugin.MOD_LOG.log(Level.ERROR, "The packet with the ID %d from %s cannot be processed!", packetId, this.modId); ioe.printStackTrace(); } catch( IllegalAccessException | InstantiationException rex ) { ManPackLoadingPlugin.MOD_LOG.log(Level.ERROR, "The packet with the ID %d from %s cannot be instantiated!", packetId, this.modId); rex.printStackTrace(); } catch( NoSuchMethodException | InvocationTargetException e ) { e.printStackTrace(); } } public Class<? extends IPacket> getPacketCls(short packetId) { return this.packetMap.get(packetId); } public void addPacketCls(int packetId, Class<? extends IPacket> packetCls) { this.packetMap.put((short) packetId, packetCls); } }