2025-03-11 00:23:54 +01:00
|
|
|
package game.network;
|
|
|
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
2025-03-25 11:31:48 +01:00
|
|
|
import game.collect.BiMap;
|
|
|
|
import game.collect.HashBiMap;
|
|
|
|
import game.collect.Maps;
|
2025-03-16 17:40:47 +01:00
|
|
|
|
2025-03-11 00:23:54 +01:00
|
|
|
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;
|
2025-03-27 17:54:03 +01:00
|
|
|
import game.packet.SPacketCharacterList;
|
2025-03-11 00:23:54 +01:00
|
|
|
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);
|
2025-03-27 17:54:03 +01:00
|
|
|
this.server(SPacketCharacterList.class);
|
2025-03-11 00:23:54 +01:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|