tcr/java/src/game/network/PacketRegistry.java
2025-03-27 17:54:03 +01:00

255 lines
10 KiB
Java
Executable file

package game.network;
import java.util.Map;
import game.collect.BiMap;
import game.collect.HashBiMap;
import game.collect.Maps;
import game.packet.CPacketAction;
import game.packet.CPacketBook;
import game.packet.CPacketBreak;
import game.packet.CPacketCheat;
import game.packet.CPacketClick;
import game.packet.CPacketComplete;
import game.packet.CPacketInput;
import game.packet.CPacketKeepAlive;
import game.packet.CPacketMessage;
import game.packet.CPacketPlace;
import game.packet.CPacketPlayer;
import game.packet.CPacketSign;
import game.packet.CPacketSkin;
import game.packet.HPacketHandshake;
import game.packet.LPacketPasswordResponse;
import game.packet.RPacketDisconnect;
import game.packet.RPacketEnableCompression;
import game.packet.RPacketLoginSuccess;
import game.packet.S14PacketEntity;
import game.packet.S18PacketEntityTeleport;
import game.packet.S19PacketEntityHeadLook;
import game.packet.S1APacketEntityStatus;
import game.packet.S1BPacketEntityAttach;
import game.packet.S1CPacketEntityMetadata;
import game.packet.S1DPacketEntityEffect;
import game.packet.S1EPacketRemoveEntityEffect;
import game.packet.S20PacketEntityProperties;
import game.packet.S27PacketExplosion;
import game.packet.S28PacketEffect;
import game.packet.S29PacketSoundEffect;
import game.packet.S2APacketParticles;
import game.packet.S2BPacketChangeGameState;
import game.packet.S2CPacketSpawnGlobalEntity;
import game.packet.S2DPacketOpenWindow;
import game.packet.S2EPacketCloseWindow;
import game.packet.S2FPacketSetSlot;
import game.packet.S30PacketWindowItems;
import game.packet.S31PacketWindowProperty;
import game.packet.S32PacketConfirmTransaction;
import game.packet.S33PacketUpdateSign;
import game.packet.S35PacketUpdateTileEntity;
import game.packet.S36PacketSignEditorOpen;
import game.packet.S38PacketPlayerListItem;
import game.packet.S39PacketPlayerAbilities;
import game.packet.S3APacketTabComplete;
import game.packet.S43PacketUpdateEntityNBT;
import game.packet.SPacketAnimation;
import game.packet.SPacketBiomes;
import game.packet.SPacketBlockAction;
import game.packet.SPacketBlockBreakAnim;
import game.packet.SPacketBlockChange;
import game.packet.SPacketCamera;
import game.packet.SPacketCharacterList;
import game.packet.SPacketChunkData;
import game.packet.SPacketCollectItem;
import game.packet.SPacketDestroyEntities;
import game.packet.SPacketDimensionName;
import game.packet.SPacketDisconnect;
import game.packet.SPacketEntityEquipment;
import game.packet.SPacketEntityVelocity;
import game.packet.SPacketHeldItemChange;
import game.packet.SPacketJoinGame;
import game.packet.SPacketKeepAlive;
import game.packet.SPacketMapChunkBulk;
import game.packet.SPacketMessage;
import game.packet.SPacketMultiBlockChange;
import game.packet.SPacketPlayerPosLook;
import game.packet.SPacketRespawn;
import game.packet.SPacketSetExperience;
import game.packet.SPacketSkin;
import game.packet.SPacketSpawnMob;
import game.packet.SPacketSpawnObject;
import game.packet.SPacketSpawnPlayer;
import game.packet.SPacketTimeUpdate;
import game.packet.SPacketTrades;
import game.packet.SPacketUpdateHealth;
import game.packet.SPacketWorld;
public enum PacketRegistry
{
HANDSHAKE
{
{
this.client(HPacketHandshake.class);
}
},
LOGIN
{
{
this.server(RPacketDisconnect.class);
this.server(RPacketLoginSuccess.class);
this.server(RPacketEnableCompression.class);
// this.server(RPacketPasswordRequest.class);
// this.client(LPacketLoginStart.class);
this.client(LPacketPasswordResponse.class);
}
},
PLAY
{
{
this.server(SPacketKeepAlive.class);
this.server(SPacketJoinGame.class);
this.server(SPacketMessage.class);
// this.server(SPacketMessage.class);
this.server(SPacketTimeUpdate.class);
this.server(SPacketEntityEquipment.class);
this.server(SPacketUpdateHealth.class);
this.server(SPacketRespawn.class);
this.server(SPacketPlayerPosLook.class);
this.server(SPacketHeldItemChange.class);
this.server(SPacketAnimation.class);
this.server(SPacketSpawnPlayer.class);
this.server(SPacketCollectItem.class);
this.server(SPacketSpawnObject.class);
this.server(SPacketSpawnMob.class);
// this.server(SPacketSpawnPainting.class);
// this.server(SPacketSpawnExperienceOrb.class);
this.server(SPacketEntityVelocity.class);
this.server(SPacketDestroyEntities.class);
this.server(S14PacketEntity.class);
this.server(S14PacketEntity.S15PacketEntityRelMove.class);
this.server(S14PacketEntity.S16PacketEntityLook.class);
this.server(S14PacketEntity.S17PacketEntityLookMove.class);
this.server(S18PacketEntityTeleport.class);
this.server(S19PacketEntityHeadLook.class);
this.server(S1APacketEntityStatus.class);
this.server(S1BPacketEntityAttach.class);
this.server(S1CPacketEntityMetadata.class);
this.server(S1DPacketEntityEffect.class);
this.server(S1EPacketRemoveEntityEffect.class);
this.server(SPacketSetExperience.class);
this.server(S20PacketEntityProperties.class);
this.server(SPacketChunkData.class);
this.server(SPacketMultiBlockChange.class);
this.server(SPacketBlockChange.class);
this.server(SPacketBlockAction.class);
this.server(SPacketBlockBreakAnim.class);
this.server(SPacketMapChunkBulk.class);
this.server(S27PacketExplosion.class);
this.server(S28PacketEffect.class);
this.server(S29PacketSoundEffect.class);
this.server(S2APacketParticles.class);
this.server(S2BPacketChangeGameState.class);
this.server(S2CPacketSpawnGlobalEntity.class);
this.server(S2DPacketOpenWindow.class);
this.server(S2EPacketCloseWindow.class);
this.server(S2FPacketSetSlot.class);
this.server(S30PacketWindowItems.class);
this.server(S31PacketWindowProperty.class);
this.server(S32PacketConfirmTransaction.class);
this.server(S33PacketUpdateSign.class);
// this.server(S34PacketMaps.class);
this.server(S35PacketUpdateTileEntity.class);
this.server(S36PacketSignEditorOpen.class);
// this.server(S37PacketStatistics.class);
this.server(S38PacketPlayerListItem.class);
this.server(S39PacketPlayerAbilities.class);
this.server(S3APacketTabComplete.class);
// this.server(SPacketDisplay.class);
this.server(SPacketSkin.class);
this.server(SPacketDisconnect.class);
this.server(SPacketWorld.class);
// this.server(SPacketCapes.class);
this.server(SPacketCamera.class);
this.server(SPacketBiomes.class);
// this.server(S42PacketTitle.class);
this.server(S43PacketUpdateEntityNBT.class);
// this.server(SPacketBook.class);
this.server(SPacketTrades.class);
// this.server(SPacketNotify.class);
this.server(SPacketDimensionName.class);
this.server(SPacketCharacterList.class);
this.client(CPacketKeepAlive.class);
this.client(CPacketMessage.class);
this.client(CPacketAction.class);
this.client(CPacketPlayer.class);
this.client(CPacketPlayer.C04PacketPlayerPosition.class);
this.client(CPacketPlayer.C05PacketPlayerLook.class);
this.client(CPacketPlayer.C06PacketPlayerPosLook.class);
this.client(CPacketBreak.class);
this.client(CPacketPlace.class);
this.client(CPacketInput.class);
this.client(CPacketClick.class);
this.client(CPacketCheat.class);
this.client(CPacketComplete.class);
this.client(CPacketSkin.class);
this.client(CPacketSign.class);
this.client(CPacketBook.class);
// this.client(CPacketCmdBlock.class);
}
};
private static final Map<Class<? extends Packet>, PacketRegistry> STATES = Maps.<Class<? extends Packet>, PacketRegistry>newHashMap();
private final BiMap<Integer, Class<? extends Packet>> server = HashBiMap.<Integer, Class<? extends Packet>>create();
private final BiMap<Integer, Class<? extends Packet>> client = HashBiMap.<Integer, Class<? extends Packet>>create();
protected void server(Class <? extends Packet > clazz)
{
if(this.server.containsValue(clazz))
throw new IllegalArgumentException("S-Paket " + clazz + " ist bereits bekannt unter ID " + this.server.inverse().get(clazz));
this.server.put(Integer.valueOf(this.server.size()), clazz);
}
protected void client(Class <? extends Packet > clazz)
{
if(this.client.containsValue(clazz))
throw new IllegalArgumentException("C-Paket " + clazz + " ist bereits bekannt unter ID " + this.client.inverse().get(clazz));
this.client.put(Integer.valueOf(this.client.size()), clazz);
}
public Integer getId(boolean client, Packet packet)
{
return (client ? this.client : this.server).inverse().get(packet.getClass());
}
public Packet getPacket(boolean client, int id) throws InstantiationException, IllegalAccessException {
Class<? extends Packet> oclass = (client ? this.client : this.server).get(id);
return oclass == null ? null : oclass.newInstance();
}
public static PacketRegistry getType(Packet packetIn)
{
return STATES.get(packetIn.getClass());
}
static {
for(PacketRegistry reg : values()) {
for(BiMap<Integer, Class<? extends Packet>> map : new BiMap[] {reg.server, reg.client}) {
for(Class<? extends Packet> clazz : map.values()) {
if(STATES.containsKey(clazz) && STATES.get(clazz) != reg) {
throw new Error("Paket " + clazz + " ist bereits zu ID " + STATES.get(clazz)
+ " zugewiesen - kann nicht auf " + reg + " neu zuweisen");
}
try {
clazz.newInstance();
}
catch(Throwable e) {
throw new Error("Paket " + clazz + " kann nicht instanziert werden!");
}
STATES.put(clazz, reg);
}
}
}
}
}