use std::io::{Seek, SeekFrom};

use psopacket::pso_message;
use crate::{PSOPacketData, PacketParseError};


pub trait PSOMessage {
    const CMD: u8;
    fn from_bytes<R: std::io::Read + std::io::Seek>(cur: &mut R) -> Result<Self, PacketParseError> where Self: Sized;
    fn as_bytes(&self) -> Vec<u8>;
}

#[pso_message(0x05)]
pub struct PlayerActivatedSwitch {
    data: u16,
}

#[pso_message(0x06)]
pub struct GuildcardSend {

}

#[pso_message(0x06)]
pub struct GuildcardRecv {
    guildcard: u32,
    name: [u16; 0x18],
    team: [u16; 0x10],
    desc: [u16; 0x58],
    one: u8,
    language: u8,
    section_id: u8,
    class: u8,
}

#[pso_message(0x07)]
pub struct SymbolChat {
    unknown1: u32,
    sc_data: [u8; 60],
}

#[pso_message(0x0A)]
pub struct MobAttack {
    enemy_id: u16,
    damage: u16,
    flags: u16,
}

#[pso_message(0x0B)]
pub struct BoxAttack {
    data: [u8; 8],
}

#[pso_message(0x0C)]
pub struct Unknown0C {
    data: [u8; 8],
}

#[pso_message(0x0D)]
pub struct Unknown0D {
    data: [u8; 8],
}

#[pso_message(0x12)]
pub struct BossInteractionDragon {
    data: [u8; 6],
}

//#[pso_message(0x13)]
//pub struct BossInteractionDeRolLe {

//}

//#[pso_message(0x14)]
//pub struct BossInteractionDeRolLe2 {

//}

//#[pso_message(0x15)]
//pub struct BossInteractionVolOpt {

//}

//#[pso_message(0x16)]
//pub struct BossInteractionVolOpt2 {

//}

//#[pso_message(0x17)]
//pub struct VolOptSecondPhase {
//    x: f32,
//    y: f32,
//    z: f32,
//}

//#[pso_message(0x18)]
//pub struct VolOptSecondPhase2 {

//}

//#[pso_message(0x19)]
//pub struct BossInteractionDarkFalz {

//}

//#[pso_message(0x1B)]
//pub struct PlayerKillActivated {

//}

//#[pso_message(0x1C)]
//pub struct PlayerKillActivated2 {

//}

#[pso_message(0x1F)]
pub struct PlayerChangedMap {
    unknown1: u32,
    unknown2: u32,
    x: f32,
    y: f32,
    z: f32,
}

#[pso_message(0x1F)]
pub struct PlayerChangedMap2 {
    unknown1: u32,
}

#[pso_message(0x20)]
pub struct TellOtherPlayerMyLocation {
    unknown1: u32,
    unknown2: u32,
    x: f32,
    y: f32,
    z: f32,
}

#[pso_message(0x21)]
pub struct PlayerWarpingToFloor {
    area: u8,
    data: u16,
}

#[pso_message(0x22)]
pub struct PlayerWarping {

}


#[pso_message(0x23)]
pub struct PlayerDoneChangingMap {

}

#[pso_message(0x24)]
pub struct PlayerTeleported {
    x: f32,
    y: f32,
    z: f32,
}

#[pso_message(0x25)]
pub struct PlayerEquipItem {
    item_id: u32,
    variety: u8,
    unknown1: u16,
}

#[pso_message(0x26)]
pub struct PlayerUnequipItem {
    item_id: u32,
    unknown1: u32,
}

#[pso_message(0x27)]
pub struct PlayerUseItem {
    item_id: u32,
}

#[pso_message(0x28)]
pub struct PlayerFeedMag {
    mag_id: u32,
    item_id: u32,
}

#[pso_message(0x29)]
pub struct PlayerDropItem {
    item_id: u16,
    amount: u32,
}

#[pso_message(0x2A)]
pub struct PlayerDropItem2 {
    unknown1: u16,
    area: u16,
    item_id: u32,
    x: f32,
    y: f32,
    z: f32,
}

#[pso_message(0x2B)]
pub struct AddItemToInventory {
    item_data: u32,
    item_data2: u32,
    item_data3: u32,
    slot: u32,
    item_data4: u32,
    unknown1: u32,
}

#[pso_message(0x2C)]
pub struct InitializeSpeechNpc {
    unknown1: u16,
    unknown2: u16,
    location: u32,
    location2: u32,
    unknown3: u32,
}

#[pso_message(0x2D)]
pub struct FinishSpeechNpc {
    
}

#[pso_message(0x2F)]
pub struct FinishSpeechNpcBPD {
    
}

#[pso_message(0x30)]
pub struct PlayerLevelUp {
    atp: u16,
    mst: u16,
    evp: u16,
    hp: u16,
    dfp: u16,
    ata: u16,
    lvl: u32,
}

#[pso_message(0x31)]
pub struct PlayerResurrected {

}

#[pso_message(0x32)]
pub struct PlayerResurrectedMedicalCenter {

}

#[pso_message(0x33)]
pub struct PlayerUsedMoonAtomizer {

}

#[pso_message(0x36)]
pub struct PlayerPBDonation {

}

#[pso_message(0x37)]
pub struct PlayerInitiatedPB {
    pb_amount: u8,
    unknown1: u32,
}

#[pso_message(0x3A)]
pub struct PlayerLeftArea {
   
}

#[pso_message(0x3B)]
pub struct PlayerSpawnedIntoArea {
    
}

#[pso_message(0x3E)]
pub struct PlayerStopped {
    unknown1: u32,
    unknown2: u32,
    x: f32,
    y: f32,
    z: f32,
}

#[pso_message(0x3F)]
pub struct PlayerLoadedIn {
    unknown1: u32,
    unknown2: u32,
    x: f32,
    y: f32,
    z: f32,
}

#[pso_message(0x40)]
pub struct PlayerWalking {
    x: f32,
    y: f32,
    z: f32,
}

#[pso_message(0x42)]
pub struct PlayerRunning {
    x: f32,
    z: f32,
}

#[pso_message(0x43)]
pub struct ComboStep1 {
    data: [u8; 4],
}

#[pso_message(0x44)]
pub struct ComboStep2 {
    data: [u8; 4],
}

#[pso_message(0x45)]
pub struct ComboStep3 {
    data: [u8; 4],
}

#[pso_message(0x46)]
pub struct ComboStepDone {
    data: [u8; 4],
}

#[pso_message(0x47)]
pub struct PlayerTechCast {
    technique: u8,
    unknown1: u8,
    unknown2: u8,
    num_of_targets: u8,
}

#[pso_message(0x48)]
pub struct PlayerTechDone {
    technique: u8,
    unknown1: u8,
    level: u8,
    unknown2: u8,
}

#[pso_message(0x49)]
pub struct PlayerPBUsed {
    pb: u8,
    unknown1: u32,
    amount: u8,
    unknown2: u32,
}

#[pso_message(0x4A)]
pub struct PlayerBlockedDamage {
   
}

#[pso_message(0x4B)]
pub struct PlayerReceivedDamage {
    unknown1: u16,
    hp: u16,
    unknown2: u32,
}

#[pso_message(0x4C)]
pub struct PlayerReceivedDamage2 {
    unknown1: u16,
    hp: u16,
    unknown2: u32,
}

#[pso_message(0x4D)]
pub struct PlayerDeath {
    data: [u8; 4],
    
}

#[pso_message(0x4E)]
pub struct PlayerPostDeathAnimation {
    
}

#[pso_message(0x4F)]
pub struct PlayerScapedollResurrection {
    
}

#[pso_message(0x50)]
pub struct PlayerActivatedSwitch2 {
    data: u16,
}

#[pso_message(0x52)]
pub struct TalkToNpc {
    unknown1: u32,
    unknown2: u32,
}

//#[pso_message(0x53)]
//pub struct Unknown53 {

//}

#[pso_message(0x55)]
pub struct PlayerWarped {
    x: f32,
    y: f32,
    z: f32,
}

#[pso_message(0x58)]
pub struct LobbyEmote {
    emote: u32,
}

//#[pso_message(0x59)]
//pub struct PickupItem {
//    client_id: u16,
//    item_id: u32,
//}

#[pso_message(0x5A)]
pub struct PickupItem2  {
    data: [u8; 6],
}

//#[pso_message(0x5D)]
//pub struct SplittingStack {
//    area: u16,
//    unknown1: u16,
//    x: f32,
//    z: f32,
//    item_data: u32,
//    item_data2: u32,
//    item_data3: u32,
//    split_item_id: [u8; 9],
//    item_data4: u32,
//    unknown2: u32,
//}


//#[pso_message(0x5E)]
//pub struct BuyFromShop {
//     item_data: u32,
//     item_data2: u32,
//     item_data3: u32,
//     item_id: u32,
//     amount: u32,
//}

#[pso_message(0x5F)]
pub struct ItemDrop {
    pub area: u8,
    pub variety: u8,
    pub unknown: u16,
    pub x: f32,
    pub z: f32,
    pub unknown2: u32,
    pub item_bytes: [u8; 12],
    pub item_id: u32,
    pub item_bytes2: [u8; 4],
    pub unknown3: u32,
}

#[pso_message(0x60)]
pub struct RequestItem {
    area: u8,
    pt_index: u8,
    enemy_id: u16,
    x: f32,
    z: f32,
    y: f32,
}

#[pso_message(0x61)]
pub struct MagAnimation {
    mag_id: u32,
    effect: u8,
    unknown1: u16,
}

//#[pso_message(0x63)]
//pub struct FloorItemLimitItemDeletion {
//    client_id: u16,
//    item_id: u8,
//    amount: u8,
//}

#[pso_message(0x66)]
pub struct PlayerUsedStarAtomizer {
    
}

#[pso_message(0x67)]
pub struct SpawningMonsters {
    data: [u8; 12],
}

#[pso_message(0x68)]
pub struct PlayerTelepipe {

}

#[pso_message(0x69)]
pub struct NpcSpawn {
    data: [u8; 8],
}

//#[pso_message(0x6F)]
//pub struct PlayerJoiningGame {
    
//}

//#[pso_message(0x71)]
//pub struct PlayerJoiningGame2 {
    
//}

#[pso_message(0x74)]
pub struct WordSelect {
    data: [u8; 28],
}

#[pso_message(0x75)]
pub struct PlayerChangedFloor {
    map: u32,
}

#[pso_message(0x76)]
pub struct KillMonster {
    data: [u8; 4],
}

//#[pso_message(0x77)]
//pub struct SyncQuestRegister {

//}

//#[pso_message(0x79)]
//pub struct GoGoBall {
    
//}

//#[pso_message(0x7C)]
//pub struct CmodeData {

//}

//#[pso_message(0x7D)]
//pub struct BmodeData {

//}

#[pso_message(0x83)]
pub struct PlayerTrapSet {
    trap_type: u16,
    trap_count: u16,
}

//#[pso_message(0x84)]
//pub struct Unknown84 {

//}

//#[pso_message(0x80)]
//pub struct PlayerTrapActivate {

//}

//#[pso_message(0x87)]
//pub struct PlayerShrink {

//}

//#[pso_message(0x88)]
//pub struct PlayerUnshrink {

//}

#[pso_message(0x89)]
pub struct PlayerKilledByMonster {
    data: [u8; 4],
}

//#[pso_message(0x8A)]
//pub struct CmodeStatistics {

//}

//#[pso_message(0x8D)]
//pub struct PlayerTechStart {

//}

#[pso_message(0x94)]
pub struct PlayerWarped2 {

}

//#[pso_message(0x97)]
//pub struct CmodeTryAgain {

//}

#[pso_message(0x9A)]
pub struct ModifyPlayerStats {
    unknown1: u8,
    unknown2: u8,
    stat: u8,
    amount: u8,
}

//#[pso_message(0x9D)]
//pub struct CmodePartyWipe {

//}

//#[pso_message(0xA0)]
//pub struct BossInteractionGalGryphon {

//}

//#[pso_message(0xA1)]
//pub struct PlayerMoonAtomizerResurrection {

//}

//#[pso_message(0xA2)]
//pub struct BoxDropRequest {

//}

//#[pso_message(0xA3)]
//pub struct BossInteractionOlgaFlow {

//}

//#[pso_message(0xA4)]
//pub struct BossInteractionOlgaFlow2 {

//}

//#[pso_message(0xA5)]
//pub struct BossInteractionOlgaFlow3 {

//}

//#[pso_message(0xA6)]
//pub struct TradeRequest {

//}

//#[pso_message(0xA8)]
//pub struct BossInteractionGolDragon {

//}

//#[pso_message(0xA9)]
//pub struct BossInteractionBarbaRay {

//}

//#[pso_message(0xAA)]
//pub struct BossInteractionBarbaRay2 {

//}

#[pso_message(0xAB)]
pub struct PhotonChairSit {
    unknown1: u32,
}

//#[pso_message(0xAD)]
//pub struct BossInteractionOlgaFlow4 {

//}

#[pso_message(0xAE)]
pub struct UnknownAE {
    unknown1: u32,
    unknown2: u32,
    unknown3: u32,
}

#[pso_message(0xAF)]
pub struct PhotonChairTurn {
    unknown1: u32,
}

#[pso_message(0xB0)]
pub struct PhotonChairMove {
    unknown1: u32,
}

//#[pso_message(0xB5)]
//pub struct ShopRequest {
//    unknown1: u16,
//    shop_type: u8,
//}

//#[pso_message(0xB7)]
//pub struct BuyItem {
//    unknown1: u16,
//    item_id: u8,
//    unknown2: u8,
//    shop_item_index: u8,
//    amount: u8,
//    unknown3: u8,
//}

//#[pso_message(0xB8)]
//pub struct TechItem {
    
//}

//#[pso_message(0xBA)]
//pub struct TechWeaponAccept {
    
//}

//#[pso_message(0xBB)]
//pub struct BankRequest {
    
//}

//#[pso_message(0xBD)]
//pub struct BankInteraction {
//    item_id: u16,
//    amount: u8,
//    action: u8,
//    item_amount: u8,
//    unknown2: u8,
//}

//#[pso_message(0xC0)]
//pub struct PlayerSoldItem {
//    client_id: u16,
//    item_id: u8,
//    amount: u8,
//}

//#[pso_message(0xC1)]
//pub struct TeamInvite {

//}

//#[pso_message(0xC2)]
//pub struct AcceptTeamInvite {

//}

#[pso_message(0xC3)]
pub struct DropCoordinates {
    drop_area: u32,
    x: f32,
    z: f32,
    drop_ID: u32,
}

#[pso_message(0xC4)]
pub struct SortItems {
    item_id: [u8; 30],
}

#[pso_message(0xC5)]
pub struct PlayerUsedMedicalCenter {

}

//#[pso_message(0xC6)]
//pub struct ExperienceSteal {

//}

//#[pso_message(0xC7)]
//pub struct ChargeAttack {

//}

#[pso_message(0xC8)]
pub struct RequestExp {
    enemy_id: u16,
    client_id: u8,
    unused: u8,
    last_hitter: u32,
}

//#[pso_message(0xC9)]
//pub struct QuestRewardMeseta {

//}

//#[pso_message(0xCA)]
//pub struct QuestRewardItem {

//}

//#[pso_message(0xCB)]
//pub struct TransferItemRequest {

//}

//#[pso_message(0xCC)]
//pub struct ExchangeItemForTeampoints {

//}

//#[pso_message(0xCD)]
//pub struct MasterTransfer {

//}

//#[pso_message(0xCE)]
//pub struct AcceptMasterTransfer {

//}

//#[pso_message(0xCF)]
//pub struct RestartBattle {

//}

//#[pso_message(0xD0)]
//pub struct BmodeLevelUp {

//}

//#[pso_message(0xD1)]
//pub struct CmodeGrave {

//}

//#[pso_message(0xD2)]
//pub struct WriteQuestFlag {

//}

//#[pso_message(0xD5)]
//pub struct QuestItemExchange {

//}

//#[pso_message(0xD6)]
//pub struct WrapItem {

//}

//#[pso_message(0xD7)]
//pub struct PaganiniPDExchange {

//}

//#[pso_message(0xD8)]
//pub struct SrankSpecialModification {

//}

//#[pso_message(0xD9)]
//pub struct MomokaItemShop {

//}

//#[pso_message(0xDA)]
//pub struct WeaponAttributeEnhancement {

//}

//#[pso_message(0xDC)]
//pub struct BossInteractionSaintMillion {

//}

//#[pso_message(0xDE)]
//pub struct GoodLuckQuest {

//}

//#[pso_message(0xDF)]
//pub struct BPDPhotonCrystalExchange {

//}

//#[pso_message(0xE0)]
//pub struct BPDRewards {

//}

//#[pso_message(0xE1)]
//pub struct GallonsPlanQuest {

//}

//#[pso_message(0xE2)]
//pub struct Coren {

//}

#[derive(Debug, Clone, PartialEq)]
pub enum GameMessage {
    PlayerActivatedSwitch(PlayerActivatedSwitch),
    GuildcardSend(GuildcardSend),
    GuildcardRecv(GuildcardRecv),
    SymbolChat(SymbolChat),
    MobAttack(MobAttack),
    BoxAttack(BoxAttack),
    Unknown0C(Unknown0C),
    Unknown0D(Unknown0D),
    BossInteractionDragon(BossInteractionDragon),
    //BossInteractionDeRolLe(BossInteractionDeRolLe),
    //BossInteractionDeRolLe2(BossInteractionDeRolLe2),
    //BossInteractionVolOpt(BossInteractionVolOpt),
    //BossInteractionVolOpt2(BossInteractionVolOpt2),
    //VolOptSecondPhase(VolOptSecondPhase),
    //VolOptSecondPhase2(VolOptSecondPhase2),
    //BossInteractionDarkFalz(BossInteractionDarkFalz),
    //PlayerKillActivated(PlayerKillActivated),
    //PlayerKillActivated2(PlayerKillActivated2),
    PlayerChangedMap(PlayerChangedMap),
    PlayerChangedMap2(PlayerChangedMap2),
    TellOtherPlayerMyLocation(TellOtherPlayerMyLocation),
    PlayerWarpingToFloor(PlayerWarpingToFloor),
    PlayerWarping(PlayerWarping),
    PlayerDoneChangingMap(PlayerDoneChangingMap),
    PlayerTeleported(PlayerTeleported),
    PlayerEquipItem(PlayerEquipItem),
    PlayerUnequipItem(PlayerUnequipItem),
    PlayerUseItem(PlayerUseItem),
    PlayerFeedMag(PlayerFeedMag),
    PlayerDropItem(PlayerDropItem),
    PlayerDropItem2(PlayerDropItem2),
    AddItemToInventory(AddItemToInventory),
    InitializeSpeechNpc(InitializeSpeechNpc),
    FinishSpeechNpc(FinishSpeechNpc),
    FinishSpeechNpcBPD(FinishSpeechNpcBPD),
    PlayerLevelUp(PlayerLevelUp),
    PlayerResurrected(PlayerResurrected),
    PlayerResurrectedMedicalCenter(PlayerResurrectedMedicalCenter),
    PlayerUsedMoonAtomizer(PlayerUsedMoonAtomizer),
    PlayerPBDonation(PlayerPBDonation),
    PlayerInitiatedPB(PlayerInitiatedPB),
    PlayerLeftArea(PlayerLeftArea),
    PlayerSpawnedIntoArea(PlayerSpawnedIntoArea),
    PlayerStopped(PlayerStopped),
    PlayerLoadedIn(PlayerLoadedIn),
    PlayerWalking(PlayerWalking),
    PlayerRunning(PlayerRunning),
    ComboStep1(ComboStep1),
    ComboStep2(ComboStep2),
    ComboStep3(ComboStep3),
    ComboStepDone(ComboStepDone),
    PlayerTechCast(PlayerTechCast),
    PlayerTechDone(PlayerTechDone),
    PlayerPBUsed(PlayerPBUsed),
    PlayerBlockedDamage(PlayerBlockedDamage),
    PlayerReceivedDamage(PlayerReceivedDamage),
    PlayerReceivedDamage2(PlayerReceivedDamage2),
    PlayerDeath(PlayerDeath),
    PlayerPostDeathAnimation(PlayerPostDeathAnimation),
    PlayerScapedollResurrection(PlayerScapedollResurrection),
    PlayerActivatedSwitch2(PlayerActivatedSwitch2),
    TalkToNpc(TalkToNpc),
    //Unknown53(Unknown53),
    PlayerWarped(PlayerWarped),
    LobbyEmote(LobbyEmote),
    //PickupItem(PickupItem),
    PickupItem2(PickupItem2),
    //SplittingStack(SplittingStack),
    //BuyFromShop(BuyFromShop),
    ItemDrop(ItemDrop),
    RequestItem(RequestItem),
    MagAnimation(MagAnimation),
    //FloorItemLimitItemDeletion(FloorItemLimitItemDeletion),
    PlayerUsedStarAtomizer(PlayerUsedStarAtomizer),
    SpawningMonsters(SpawningMonsters),
    PlayerTelepipe(PlayerTelepipe),
    NpcSpawn(NpcSpawn),
    //PlayerJoiningGame(PlayerJoiningGame),
    //PlayerJoiningGame2(PlayerJoiningGame2),
    WordSelect(WordSelect),
    PlayerChangedFloor(PlayerChangedFloor),
    KillMonster(KillMonster),
    //SyncQuestRegister(SyncQuestRegister),
    //GoGoBall(GoGoBall),
    //CmodeData(CmodeData),
    //BmodeData(BmodeData),
    PlayerTrapSet(PlayerTrapSet),
    //Unknown84(Unknown84),
    //PlayerTrapActivate(PlayerTrapActivate),
    //PlayerShrink(PlayerShrink),
    //PlayerUnshrink(PlayerUnshrink),
    PlayerKilledByMonster(PlayerKilledByMonster),
    //CmodeStatistics(CmodeStatistics),
    //PlayerTechStart(PlayerTechStart),
    PlayerWarped2(PlayerWarped2),
    //CmodeTryAgain(CmodeTryAgain),
    ModifyPlayerStats(ModifyPlayerStats),
    //CmodePartyWipe(CmodePartyWipe),
    //BossInteractionGalGryphon(BossInteractionGalGryphon),
    //PlayerMoonAtomizerResurrection(PlayerMoonAtomizerResurrection),
    //BoxDropRequest(BoxDropRequest),
    //BossInteractionOlgaFlow(BossInteractionOlgaFlow),
    //BossInteractionOlgaFlow2(BossInteractionOlgaFlow2),
    //BossInteractionOlgaFlow3(BossInteractionOlgaFlow3),
    //TradeRequest(TradeRequest),
    //BossInteractionGolDragon(BossInteractionGolDragon),
    //BossInteractionBarbaRay(BossInteractionBarbaRay),
    //BossInteractionBarbaRay2(BossInteractionBarbaRay2),
    PhotonChairSit(PhotonChairSit),
    //BossInteractionOlgaFlow4(BossInteractionOlgaFlow4),
    UnknownAE(UnknownAE),
    PhotonChairTurn(PhotonChairTurn),
    PhotonChairMove(PhotonChairMove),
    //ShopRequest(ShopRequest),
    //BuyItem(BuyItem),
    //TechItem(TechItem),
    //TechWeaponAccept(TechWeaponAccept),
    //BankRequest(BankRequest),
    //BankInteraction(BankInteraction),
    //PlayerSoldItem(PlayerSoldItem),
    //TeamInvite(TeamInvite),
    //AcceptTeamInvite(AcceptTeamInvite),
    DropCoordinates(DropCoordinates),
    SortItems(SortItems),
    PlayerUsedMedicalCenter(PlayerUsedMedicalCenter),
    //ExperienceSteal(ExperienceSteal),
    //ChargeAttack(ChargeAttack),
    RequestExp(RequestExp),
    //QuestRewardMeseta(QuestRewardMeseta),
    //QuestRewardItem(QuestRewardItem),
    //TransferItemRequest(TransferItemRequest),
    //ExchangeItemForTeampoints(ExchangeItemForTeampoints),
    //MasterTransfer(MasterTransfer),
    //AcceptMasterTransfer(AcceptMasterTransfer),
    //RestartBattle(RestartBattle),
    //BmodeLevelUp(BmodeLevelUp),
    //CmodeGrave(CmodeGrave),
    //WriteQuestFlag(WriteQuestFlag),
    //QuestItemExchange(QuestItemExchange),
    //WrapItem(WrapItem),
    //PaganiniPDExchange(PaganiniPDExchange),
    //SrankSpecialModification(SrankSpecialModification),
    //MomokaItemShop(MomokaItemShop),
    //WeaponAttributeEnhancement(WeaponAttributeEnhancement),
    //BossInteractionSaintMillion(BossInteractionSaintMillion),
    //GoodLuckQuest(GoodLuckQuest),
    //BPDPhotonCrystalExchange(BPDPhotonCrystalExchange),
    //BPDRewards(BPDRewards),
    //GallonsPlanQuest(GallonsPlanQuest),
    //Coren(Coren),
}

impl PSOPacketData for GameMessage {
    fn from_bytes<R: std::io::Read + std::io::Seek>(mut cur: &mut R) -> Result<Self, PacketParseError> {
        let mut byte = [0u8; 1];
        let mut len = [0u8; 1];
        cur.read(&mut byte);
        cur.read(&mut len);
        cur.seek(SeekFrom::Current(-2)); // Cursor doesn't implement Peek?
        match byte[0] {
            PlayerActivatedSwitch::CMD => Ok(GameMessage::PlayerActivatedSwitch(PlayerActivatedSwitch::from_bytes(&mut cur)?)),
            GuildcardSend::CMD => Ok(GameMessage::GuildcardSend(GuildcardSend::from_bytes(&mut cur)?)),
            GuildcardRecv::CMD => Ok(GameMessage::GuildcardRecv(GuildcardRecv::from_bytes(&mut cur)?)),
            SymbolChat::CMD => Ok(GameMessage::SymbolChat(SymbolChat::from_bytes(&mut cur)?)),
            MobAttack::CMD => Ok(GameMessage::MobAttack(MobAttack::from_bytes(&mut cur)?)),
            BoxAttack::CMD => Ok(GameMessage::BoxAttack(BoxAttack::from_bytes(&mut cur)?)),
            Unknown0C::CMD => Ok(GameMessage::Unknown0C(Unknown0C::from_bytes(&mut cur)?)),
            Unknown0D::CMD => Ok(GameMessage::Unknown0D(Unknown0D::from_bytes(&mut cur)?)),
            BossInteractionDragon::CMD => Ok(GameMessage::BossInteractionDragon(BossInteractionDragon::from_bytes(&mut cur)?)),
            //BossInteractionDeRolLe::CMD => Ok(GameMessage::BossInteractionDeRolLe(BossInteractionDeRolLe::from_bytes(&mut cur)?)),
            //BossInteractionDeRolLe2::CMD => Ok(GameMessage::BossInteractionDeRolLe2(BossInteractionDeRolLe2::from_bytes(&mut cur)?)),
            //BossInteractionVolOpt::CMD => Ok(GameMessage::BossInteractionVolOpt(BossInteractionVolOpt::from_bytes(&mut cur)?)),
            //BossInteractionVolOpt2::CMD => Ok(GameMessage::BossInteractionVolOpt2(BossInteractionVolOpt2::from_bytes(&mut cur)?)),
            //VolOptSecondPhase::CMD => Ok(GameMessage::VolOptSecondPhase(VolOptSecondPhase::from_bytes(&mut cur)?)),
            //VolOptSecondPhase2::CMD => Ok(GameMessage::VolOptSecondPhase2(VolOptSecondPhase2::from_bytes(&mut cur)?)),
            //BossInteractionDarkFalz::CMD => Ok(GameMessage::BossInteractionDarkFalz(BossInteractionDarkFalz::from_bytes(&mut cur)?)),
            //PlayerKillActivated::CMD => Ok(GameMessage::PlayerKillActivated(PlayerKillActivated::from_bytes(&mut cur)?)),
            //PlayerKillActivated2::CMD => Ok(GameMessage::PlayerKillActivated2(PlayerKillActivated2::from_bytes(&mut cur)?)),
            PlayerChangedMap::CMD if len[0] == 6 => Ok(GameMessage::PlayerChangedMap(PlayerChangedMap::from_bytes(&mut cur)?)),
            PlayerChangedMap2::CMD if len[0] == 2 => Ok(GameMessage::PlayerChangedMap2(PlayerChangedMap2::from_bytes(&mut cur)?)),
            TellOtherPlayerMyLocation::CMD => Ok(GameMessage::TellOtherPlayerMyLocation(TellOtherPlayerMyLocation::from_bytes(&mut cur)?)),
            PlayerWarpingToFloor::CMD => Ok(GameMessage::PlayerWarpingToFloor(PlayerWarpingToFloor::from_bytes(&mut cur)?)),
            PlayerWarping::CMD => Ok(GameMessage::PlayerWarping(PlayerWarping::from_bytes(&mut cur)?)),
            PlayerDoneChangingMap::CMD => Ok(GameMessage::PlayerDoneChangingMap(PlayerDoneChangingMap::from_bytes(&mut cur)?)),
            PlayerTeleported::CMD => Ok(GameMessage::PlayerTeleported(PlayerTeleported::from_bytes(&mut cur)?)),
            PlayerEquipItem::CMD => Ok(GameMessage::PlayerEquipItem(PlayerEquipItem::from_bytes(&mut cur)?)),
            PlayerUnequipItem::CMD => Ok(GameMessage::PlayerUnequipItem(PlayerUnequipItem::from_bytes(&mut cur)?)),
            PlayerUseItem::CMD => Ok(GameMessage::PlayerUseItem(PlayerUseItem::from_bytes(&mut cur)?)),
            PlayerFeedMag::CMD => Ok(GameMessage::PlayerFeedMag(PlayerFeedMag::from_bytes(&mut cur)?)),
            PlayerDropItem::CMD => Ok(GameMessage::PlayerDropItem(PlayerDropItem::from_bytes(&mut cur)?)),
            PlayerDropItem2::CMD => Ok(GameMessage::PlayerDropItem2(PlayerDropItem2::from_bytes(&mut cur)?)),
            AddItemToInventory::CMD => Ok(GameMessage::AddItemToInventory(AddItemToInventory::from_bytes(&mut cur)?)),
            InitializeSpeechNpc::CMD => Ok(GameMessage::InitializeSpeechNpc(InitializeSpeechNpc::from_bytes(&mut cur)?)),
            FinishSpeechNpc::CMD => Ok(GameMessage::FinishSpeechNpc(FinishSpeechNpc::from_bytes(&mut cur)?)),
            FinishSpeechNpcBPD::CMD => Ok(GameMessage::FinishSpeechNpcBPD(FinishSpeechNpcBPD::from_bytes(&mut cur)?)),
            PlayerLevelUp::CMD => Ok(GameMessage::PlayerLevelUp(PlayerLevelUp::from_bytes(&mut cur)?)),
            PlayerResurrected::CMD => Ok(GameMessage::PlayerResurrected(PlayerResurrected::from_bytes(&mut cur)?)),
            PlayerResurrectedMedicalCenter::CMD => Ok(GameMessage::PlayerResurrectedMedicalCenter(PlayerResurrectedMedicalCenter::from_bytes(&mut cur)?)),
            PlayerUsedMoonAtomizer::CMD => Ok(GameMessage::PlayerUsedMoonAtomizer(PlayerUsedMoonAtomizer::from_bytes(&mut cur)?)),
            PlayerPBDonation::CMD => Ok(GameMessage::PlayerPBDonation(PlayerPBDonation::from_bytes(&mut cur)?)),
            PlayerInitiatedPB::CMD => Ok(GameMessage::PlayerInitiatedPB(PlayerInitiatedPB::from_bytes(&mut cur)?)),
            PlayerLeftArea::CMD => Ok(GameMessage::PlayerLeftArea(PlayerLeftArea::from_bytes(&mut cur)?)),
            PlayerSpawnedIntoArea::CMD => Ok(GameMessage::PlayerSpawnedIntoArea(PlayerSpawnedIntoArea::from_bytes(&mut cur)?)),
            PlayerStopped::CMD => Ok(GameMessage::PlayerStopped(PlayerStopped::from_bytes(&mut cur)?)),
            PlayerLoadedIn::CMD => Ok(GameMessage::PlayerLoadedIn(PlayerLoadedIn::from_bytes(&mut cur)?)),
            PlayerWalking::CMD => Ok(GameMessage::PlayerWalking(PlayerWalking::from_bytes(&mut cur)?)),
            PlayerRunning::CMD => Ok(GameMessage::PlayerRunning(PlayerRunning::from_bytes(&mut cur)?)),
            ComboStep1::CMD => Ok(GameMessage::ComboStep1(ComboStep1::from_bytes(&mut cur)?)),
            ComboStep2::CMD => Ok(GameMessage::ComboStep2(ComboStep2::from_bytes(&mut cur)?)),
            ComboStep3::CMD => Ok(GameMessage::ComboStep3(ComboStep3::from_bytes(&mut cur)?)),
            ComboStepDone::CMD => Ok(GameMessage::ComboStepDone(ComboStepDone::from_bytes(&mut cur)?)),
            PlayerTechCast::CMD => Ok(GameMessage::PlayerTechCast(PlayerTechCast::from_bytes(&mut cur)?)),
            PlayerTechDone::CMD => Ok(GameMessage::PlayerTechDone(PlayerTechDone::from_bytes(&mut cur)?)),
            PlayerPBUsed::CMD => Ok(GameMessage::PlayerPBUsed(PlayerPBUsed::from_bytes(&mut cur)?)),
            PlayerBlockedDamage::CMD => Ok(GameMessage::PlayerBlockedDamage(PlayerBlockedDamage::from_bytes(&mut cur)?)),
            PlayerReceivedDamage::CMD => Ok(GameMessage::PlayerReceivedDamage(PlayerReceivedDamage::from_bytes(&mut cur)?)),
            PlayerReceivedDamage2::CMD => Ok(GameMessage::PlayerReceivedDamage2(PlayerReceivedDamage2::from_bytes(&mut cur)?)),
            PlayerDeath::CMD => Ok(GameMessage::PlayerDeath(PlayerDeath::from_bytes(&mut cur)?)),
            PlayerPostDeathAnimation::CMD => Ok(GameMessage::PlayerPostDeathAnimation(PlayerPostDeathAnimation::from_bytes(&mut cur)?)),
            PlayerScapedollResurrection::CMD => Ok(GameMessage::PlayerScapedollResurrection(PlayerScapedollResurrection::from_bytes(&mut cur)?)),
            PlayerActivatedSwitch2::CMD => Ok(GameMessage::PlayerActivatedSwitch2(PlayerActivatedSwitch2::from_bytes(&mut cur)?)),
            TalkToNpc::CMD => Ok(GameMessage::TalkToNpc(TalkToNpc::from_bytes(&mut cur)?)),
            //Unknown53::CMD => Ok(GameMessage::Unknown53(Unknown53::from_bytes(&mut cur)?)),
            PlayerWarped::CMD => Ok(GameMessage::PlayerWarped(PlayerWarped::from_bytes(&mut cur)?)),
            LobbyEmote::CMD => Ok(GameMessage::LobbyEmote(LobbyEmote::from_bytes(&mut cur)?)),
            //PickupItem::CMD => Ok(GameMessage::PickupItem(PickupItem::from_bytes(&mut cur)?)),
            PickupItem2::CMD => Ok(GameMessage::PickupItem2(PickupItem2::from_bytes(&mut cur)?)),
            //SplittingStack::CMD => Ok(GameMessage::SplittingStack(SplittingStack::from_bytes(&mut cur)?)),
            //BuyFromShop::CMD => Ok(GameMessage::BuyFromShop(BuyFromShop::from_bytes(&mut cur)?)),
            ItemDrop::CMD => Ok(GameMessage::ItemDrop(ItemDrop::from_bytes(&mut cur)?)),
            RequestItem::CMD => Ok(GameMessage::RequestItem(RequestItem::from_bytes(&mut cur)?)),
            MagAnimation::CMD => Ok(GameMessage::MagAnimation(MagAnimation::from_bytes(&mut cur)?)),
            //FloorItemLimitItemDeletion::CMD => Ok(GameMessage::FloorItemLimitItemDeletion(FloorItemLimitItemDeletion::from_bytes(&mut cur)?)),
            PlayerUsedStarAtomizer::CMD => Ok(GameMessage::PlayerUsedStarAtomizer(PlayerUsedStarAtomizer::from_bytes(&mut cur)?)),
            SpawningMonsters::CMD => Ok(GameMessage::SpawningMonsters(SpawningMonsters::from_bytes(&mut cur)?)),
            PlayerTelepipe::CMD => Ok(GameMessage::PlayerTelepipe(PlayerTelepipe::from_bytes(&mut cur)?)),
            NpcSpawn::CMD => Ok(GameMessage::NpcSpawn(NpcSpawn::from_bytes(&mut cur)?)),
            //PlayerJoiningGame::CMD => Ok(GameMessage::PlayerJoiningGame(PlayerJoiningGame::from_bytes(&mut cur)?)),
            //PlayerJoiningGame2::CMD => Ok(GameMessage::PlayerJoiningGame2(PlayerJoiningGame2::from_bytes(&mut cur)?)),
            WordSelect::CMD => Ok(GameMessage::WordSelect(WordSelect::from_bytes(&mut cur)?)),
            PlayerChangedFloor::CMD => Ok(GameMessage::PlayerChangedFloor(PlayerChangedFloor::from_bytes(&mut cur)?)),
            KillMonster::CMD => Ok(GameMessage::KillMonster(KillMonster::from_bytes(&mut cur)?)),
            //SyncQuestRegister::CMD => Ok(GameMessage::SyncQuestRegister(SyncQuestRegister::from_bytes(&mut cur)?)),
            //GoGoBall::CMD => Ok(GameMessage::GoGoBall(GoGoBall::from_bytes(&mut cur)?)),
            //CmodeData::CMD => Ok(GameMessage::CmodeData(CmodeData::from_bytes(&mut cur)?)),
            //BmodeData::CMD => Ok(GameMessage::BmodeData(BmodeData::from_bytes(&mut cur)?)),
            PlayerTrapSet::CMD => Ok(GameMessage::PlayerTrapSet(PlayerTrapSet::from_bytes(&mut cur)?)),
            //Unknown84::CMD => Ok(GameMessage::Unknown84(Unknown84::from_bytes(&mut cur)?)),
            //PlayerTrapActivate::CMD => Ok(GameMessage::PlayerTrapActivate(PlayerTrapActivate::from_bytes(&mut cur)?)),
            //PlayerShrink::CMD => Ok(GameMessage::PlayerShrink(PlayerShrink::from_bytes(&mut cur)?)),
            //PlayerUnshrink::CMD => Ok(GameMessage::PlayerUnshrink(PlayerUnshrink::from_bytes(&mut cur)?)),
            PlayerKilledByMonster::CMD => Ok(GameMessage::PlayerKilledByMonster(PlayerKilledByMonster::from_bytes(&mut cur)?)),
            //CmodeStatistics::CMD => Ok(GameMessage::CmodeStatistics(CmodeStatistics::from_bytes(&mut cur)?)),
            //PlayerTechStart::CMD => Ok(GameMessage::PlayerTechStart(PlayerTechStart::from_bytes(&mut cur)?)),
            PlayerWarped2::CMD => Ok(GameMessage::PlayerWarped2(PlayerWarped2::from_bytes(&mut cur)?)),
            //CmodeTryAgain::CMD => Ok(GameMessage::CmodeTryAgain(CmodeTryAgain::from_bytes(&mut cur)?)),
            ModifyPlayerStats::CMD => Ok(GameMessage::ModifyPlayerStats(ModifyPlayerStats::from_bytes(&mut cur)?)),
            //CmodePartyWipe::CMD => Ok(GameMessage::CmodePartyWipe(CmodePartyWipe::from_bytes(&mut cur)?)),
            //BossInteractionGalGryphon::CMD => Ok(GameMessage::BossInteractionGalGryphon(BossInteractionGalGryphon::from_bytes(&mut cur)?)),
            //PlayerMoonAtomizerResurrection::CMD => Ok(GameMessage::PlayerMoonAtomizerResurrection(PlayerMoonAtomizerResurrection::from_bytes(&mut cur)?)),
            //BoxDropRequest::CMD => Ok(GameMessage::BoxDropRequest(BoxDropRequest::from_bytes(&mut cur)?)),
            //BossInteractionOlgaFlow::CMD => Ok(GameMessage::BossInteractionOlgaFlow(BossInteractionOlgaFlow::from_bytes(&mut cur)?)),
            //BossInteractionOlgaFlow2::CMD => Ok(GameMessage::BossInteractionOlgaFlow2(BossInteractionOlgaFlow2::from_bytes(&mut cur)?)),
            //BossInteractionOlgaFlow3::CMD => Ok(GameMessage::BossInteractionOlgaFlow3(BossInteractionOlgaFlow3::from_bytes(&mut cur)?)),
            //TradeRequest::CMD => Ok(GameMessage::TradeRequest(TradeRequest::from_bytes(&mut cur)?)),
            //BossInteractionGolDragon::CMD => Ok(GameMessage::BossInteractionGolDragon(BossInteractionGolDragon::from_bytes(&mut cur)?)),
            //BossInteractionBarbaRay::CMD => Ok(GameMessage::BossInteractionBarbaRay(BossInteractionBarbaRay::from_bytes(&mut cur)?)),
            //BossInteractionBarbaRay2::CMD => Ok(GameMessage::BossInteractionBarbaRay2(BossInteractionBarbaRay2::from_bytes(&mut cur)?)),
            PhotonChairSit::CMD => Ok(GameMessage::PhotonChairSit(PhotonChairSit::from_bytes(&mut cur)?)),
            //BossInteractionOlgaFlow4::CMD => Ok(GameMessage::BossInteractionOlgaFlow4(BossInteractionOlgaFlow4::from_bytes(&mut cur)?)),
            UnknownAE::CMD => Ok(GameMessage::UnknownAE(UnknownAE::from_bytes(&mut cur)?)),
            PhotonChairTurn::CMD => Ok(GameMessage::PhotonChairTurn(PhotonChairTurn::from_bytes(&mut cur)?)),
            PhotonChairMove::CMD => Ok(GameMessage::PhotonChairMove(PhotonChairMove::from_bytes(&mut cur)?)),
            //ShopRequest::CMD => Ok(GameMessage::ShopRequest(ShopRequest::from_bytes(&mut cur)?)),
            //BuyItem::CMD => Ok(GameMessage::BuyItem(BuyItem::from_bytes(&mut cur)?)),
            //TechItem::CMD => Ok(GameMessage::TechItem(TechItem::from_bytes(&mut cur)?)),
            //TechWeaponAccept::CMD => Ok(GameMessage::TechWeaponAccept(TechWeaponAccept::from_bytes(&mut cur)?)),
            //BankRequest::CMD => Ok(GameMessage::BankRequest(BankRequest::from_bytes(&mut cur)?)),
            //BankInteraction::CMD => Ok(GameMessage::BankInteraction(BankInteraction::from_bytes(&mut cur)?)),
            //PlayerSoldItem::CMD => Ok(GameMessage::PlayerSoldItem(PlayerSoldItem::from_bytes(&mut cur)?)),
            //TeamInvite::CMD => Ok(GameMessage::TeamInvite(TeamInvite::from_bytes(&mut cur)?)),
            //AcceptTeamInvite::CMD => Ok(GameMessage::AcceptTeamInvite(AcceptTeamInvite::from_bytes(&mut cur)?)),
            DropCoordinates::CMD => Ok(GameMessage::DropCoordinates(DropCoordinates::from_bytes(&mut cur)?)),
            SortItems::CMD => Ok(GameMessage::SortItems(SortItems::from_bytes(&mut cur)?)),
            PlayerUsedMedicalCenter::CMD => Ok(GameMessage::PlayerUsedMedicalCenter(PlayerUsedMedicalCenter::from_bytes(&mut cur)?)),
            //ExperienceSteal::CMD => Ok(GameMessage::ExperienceSteal(ExperienceSteal::from_bytes(&mut cur)?)),
            //ChargeAttack::CMD => Ok(GameMessage::ChargeAttack(ChargeAttack::from_bytes(&mut cur)?)),
            RequestExp::CMD => Ok(GameMessage::RequestExp(RequestExp::from_bytes(&mut cur)?)),
            //QuestRewardMeseta::CMD => Ok(GameMessage::QuestRewardMeseta(QuestRewardMeseta::from_bytes(&mut cur)?)),
            //QuestRewardItem::CMD => Ok(GameMessage::QuestRewardItem(QuestRewardItem::from_bytes(&mut cur)?)),
            //TransferItemRequest::CMD => Ok(GameMessage::TransferItemRequest(TransferItemRequest::from_bytes(&mut cur)?)),
            //ExchangeItemForTeampoints::CMD => Ok(GameMessage::ExchangeItemForTeampoints(ExchangeItemForTeampoints::from_bytes(&mut cur)?)),
            //MasterTransfer::CMD => Ok(GameMessage::MasterTransfer(MasterTransfer::from_bytes(&mut cur)?)),
            //AcceptMasterTransfer::CMD => Ok(GameMessage::AcceptMasterTransfer(AcceptMasterTransfer::from_bytes(&mut cur)?)),
            //RestartBattle::CMD => Ok(GameMessage::RestartBattle(RestartBattle::from_bytes(&mut cur)?)),
            //BmodeLevelUp::CMD => Ok(GameMessage::BmodeLevelUp(BmodeLevelUp::from_bytes(&mut cur)?)),
            //CmodeGrave::CMD => Ok(GameMessage::CmodeGrave(CmodeGrave::from_bytes(&mut cur)?)),
            //WriteQuestFlag::CMD => Ok(GameMessage::WriteQuestFlag(WriteQuestFlag::from_bytes(&mut cur)?)),
            //QuestItemExchange::CMD => Ok(GameMessage::QuestItemExchange(QuestItemExchange::from_bytes(&mut cur)?)),
            //WrapItem::CMD => Ok(GameMessage::WrapItem(WrapItem::from_bytes(&mut cur)?)),
            //PaganiniPDExchange::CMD => Ok(GameMessage::PaganiniPDExchange(PaganiniPDExchange::from_bytes(&mut cur)?)),
            //SrankSpecialModification::CMD => Ok(GameMessage::SrankSpecialModification(SrankSpecialModification::from_bytes(&mut cur)?)),
            //MomokaItemShop::CMD => Ok(GameMessage::MomokaItemShop(MomokaItemShop::from_bytes(&mut cur)?)),
            //WeaponAttributeEnhancement::CMD => Ok(GameMessage::WeaponAttributeEnhancement(WeaponAttributeEnhancement::from_bytes(&mut cur)?)),
            //BossInteractionSaintMillion::CMD => Ok(GameMessage::BossInteractionSaintMillion(BossInteractionSaintMillion::from_bytes(&mut cur)?)),
            //GoodLuckQuest::CMD => Ok(GameMessage::GoodLuckQuest(GoodLuckQuest::from_bytes(&mut cur)?)),
            //BPDPhotonCrystalExchange::CMD => Ok(GameMessage::BPDPhotonCrystalExchange(BPDPhotonCrystalExchange::from_bytes(&mut cur)?)),
            //BPDRewards::CMD => Ok(GameMessage::BPDRewards(BPDRewards::from_bytes(&mut cur)?)),
            //GallonsPlanQuest::CMD => Ok(GameMessage::GallonsPlanQuest(GallonsPlanQuest::from_bytes(&mut cur)?)),
            //Coren::CMD => Ok(GameMessage::Coren(Coren::from_bytes(&mut cur)?)),
            _ => Err(PacketParseError::UnknownMessage(byte[0],
                                                      {
                                                          let mut b = vec![0; len[0] as usize * 4];
                                                          cur.read(&mut b).unwrap();
                                                          b.to_vec()
                                                      }
            )),
        }
    }
    
    fn as_bytes(&self) -> Vec<u8> {
        match self {
            GameMessage::PlayerActivatedSwitch(data) => data.as_bytes(),
            GameMessage::GuildcardSend(data) => data.as_bytes(),
            GameMessage::GuildcardRecv(data) => data.as_bytes(),
            GameMessage::SymbolChat(data) => data.as_bytes(),
            GameMessage::MobAttack(data) => data.as_bytes(),       
            GameMessage::BoxAttack(data) => data.as_bytes(),     
            GameMessage::Unknown0C(data) => data.as_bytes(),
            GameMessage::Unknown0D(data) => data.as_bytes(),
            GameMessage::BossInteractionDragon(data) => data.as_bytes(),
            //GameMessage::BossInteractionDeRolLe(data) => data.as_bytes(),
            //GameMessage::BossInteractionDeRolLe2(data) => data.as_bytes(),
            //GameMessage::BossInteractionVolOpt(data) => data.as_bytes(),
            //GameMessage::BossInteractionVolOpt2(data) => data.as_bytes(),
            //GameMessage::VolOptSecondPhase(data) => data.as_bytes(),
            //GameMessage::VolOptSecondPhase2(data) => data.as_bytes(),
            //GameMessage::BossInteractionDarkFalz(data) => data.as_bytes(),
            //GameMessage::PlayerKillActivated(data) => data.as_bytes(),
            //GameMessage::PlayerKillActivated2(data) => data.as_bytes(),
            GameMessage::PlayerChangedMap(data) => data.as_bytes(),
            GameMessage::PlayerChangedMap2(data) => data.as_bytes(),
            GameMessage::TellOtherPlayerMyLocation(data) => data.as_bytes(),
            GameMessage::PlayerWarpingToFloor(data) => data.as_bytes(),
            GameMessage::PlayerWarping(data) => data.as_bytes(),
            GameMessage::PlayerDoneChangingMap(data) => data.as_bytes(),
            GameMessage::PlayerTeleported(data) => data.as_bytes(),
            GameMessage::PlayerEquipItem(data) => data.as_bytes(),
            GameMessage::PlayerUnequipItem(data) => data.as_bytes(),
            GameMessage::PlayerUseItem(data) => data.as_bytes(),
            GameMessage::PlayerFeedMag(data) => data.as_bytes(),
            GameMessage::PlayerDropItem(data) => data.as_bytes(),
            GameMessage::PlayerDropItem2(data) => data.as_bytes(),
            GameMessage::AddItemToInventory(data) => data.as_bytes(),
            GameMessage::InitializeSpeechNpc(data) => data.as_bytes(),
            GameMessage::FinishSpeechNpc(data) => data.as_bytes(),
            GameMessage::FinishSpeechNpcBPD(data) => data.as_bytes(),
            GameMessage::PlayerLevelUp(data) => data.as_bytes(),
            GameMessage::PlayerResurrected(data) => data.as_bytes(),
            GameMessage::PlayerResurrectedMedicalCenter(data) => data.as_bytes(),
            GameMessage::PlayerUsedMoonAtomizer(data) => data.as_bytes(),
            GameMessage::PlayerPBDonation(data) => data.as_bytes(),
            GameMessage::PlayerInitiatedPB(data) => data.as_bytes(),
            GameMessage::PlayerLeftArea(data) => data.as_bytes(),
            GameMessage::PlayerSpawnedIntoArea(data) => data.as_bytes(),
            GameMessage::PlayerStopped(data) => data.as_bytes(),
            GameMessage::PlayerLoadedIn(data) => data.as_bytes(),
            GameMessage::PlayerWalking(data) => data.as_bytes(),
            GameMessage::PlayerRunning(data) => data.as_bytes(),
            GameMessage::ComboStep1(data) => data.as_bytes(),
            GameMessage::ComboStep2(data) => data.as_bytes(),
            GameMessage::ComboStep3(data) => data.as_bytes(),
            GameMessage::ComboStepDone(data) => data.as_bytes(),
            GameMessage::PlayerTechCast(data) => data.as_bytes(),
            GameMessage::PlayerTechDone(data) => data.as_bytes(),
            GameMessage::PlayerPBUsed(data) => data.as_bytes(),
            GameMessage::PlayerBlockedDamage(data) => data.as_bytes(),
            GameMessage::PlayerReceivedDamage(data) => data.as_bytes(),
            GameMessage::PlayerReceivedDamage2(data) => data.as_bytes(),
            GameMessage::PlayerDeath(data) => data.as_bytes(),
            GameMessage::PlayerPostDeathAnimation(data) => data.as_bytes(),
            GameMessage::PlayerScapedollResurrection(data) => data.as_bytes(),
            GameMessage::PlayerActivatedSwitch2(data) => data.as_bytes(),
            GameMessage::TalkToNpc(data) => data.as_bytes(),
            //GameMessage::Unknown53(data) => data.as_bytes(),
            GameMessage::PlayerWarped(data) => data.as_bytes(),
            GameMessage::LobbyEmote(data) => data.as_bytes(),
            //GameMessage::PickupItem(data) => data.as_bytes(),
            GameMessage::PickupItem2(data) => data.as_bytes(),
            //GameMessage::SplittingStack(data) => data.as_bytes(),
            //GameMessage::BuyFromShop(data) => data.as_bytes(),
            GameMessage::ItemDrop(data) => data.as_bytes(),
            GameMessage::RequestItem(data) => data.as_bytes(),
            GameMessage::MagAnimation(data) => data.as_bytes(),
            //GameMessage::FloorItemLimitItemDeletion(data) => data.as_bytes(),
            GameMessage::PlayerUsedStarAtomizer(data) => data.as_bytes(),
            GameMessage::SpawningMonsters(data) => data.as_bytes(),
            GameMessage::PlayerTelepipe(data) => data.as_bytes(),
            GameMessage::NpcSpawn(data) => data.as_bytes(),
            //GameMessage::PlayerJoiningGame(data) => data.as_bytes(),
            //GameMessage::PlayerJoiningGame2(data) => data.as_bytes(),
            GameMessage::WordSelect(data) => data.as_bytes(),
            GameMessage::PlayerChangedFloor(data) => data.as_bytes(),
            GameMessage::KillMonster(data) => data.as_bytes(),
            //GameMessage::SyncQuestRegister(data) => data.as_bytes(),
            //GameMessage::GoGoBall(data) => data.as_bytes(),
            //GameMessage::CmodeData(data) => data.as_bytes(),
            //GameMessage::BmodeData(data) => data.as_bytes(),
            GameMessage::PlayerTrapSet(data) => data.as_bytes(),
            //GameMessage::Unknown84(data) => data.as_bytes(),
            //GameMessage::PlayerTrapActivate(data) => data.as_bytes(),
            //GameMessage::PlayerShrink(data) => data.as_bytes(),
            //GameMessage::PlayerUnshrink(data) => data.as_bytes(),
            GameMessage::PlayerKilledByMonster(data) => data.as_bytes(),
            //GameMessage::CmodeStatistics(data) => data.as_bytes(),
            //GameMessage::PlayerTechStart(data) => data.as_bytes(),
            GameMessage::PlayerWarped2(data) => data.as_bytes(),
            //GameMessage::CmodeTryAgain(data) => data.as_bytes(),
            GameMessage::ModifyPlayerStats(data) => data.as_bytes(),
            //GameMessage::CmodePartyWipe(data) => data.as_bytes(),
            //GameMessage::BossInteractionGalGryphon(data) => data.as_bytes(),
            //GameMessage::PlayerMoonAtomizerResurrection(data) => data.as_bytes(),
            //GameMessage::BoxDropRequest(data) => data.as_bytes(),
            //GameMessage::BossInteractionOlgaFlow(data) => data.as_bytes(),
            //GameMessage::BossInteractionOlgaFlow2(data) => data.as_bytes(),
            //GameMessage::BossInteractionOlgaFlow3(data) => data.as_bytes(),
            //GameMessage::TradeRequest(data) => data.as_bytes(),
            //GameMessage::BossInteractionGolDragon(data) => data.as_bytes(),
            //GameMessage::BossInteractionBarbaRay(data) => data.as_bytes(),
            //GameMessage::BossInteractionBarbaRay2(data) => data.as_bytes(),
            GameMessage::PhotonChairSit(data) => data.as_bytes(),
            //GameMessage::BossInteractionOlgaFlow4(data) => data.as_bytes(),
            GameMessage::UnknownAE(data) => data.as_bytes(),
            GameMessage::PhotonChairTurn(data) => data.as_bytes(),
            GameMessage::PhotonChairMove(data) => data.as_bytes(),
            //GameMessage::ShopRequest(data) => data.as_bytes(),
            //GameMessage::BuyItem(data) => data.as_bytes(),
            //GameMessage::TechItem(data) => data.as_bytes(),
            //GameMessage::TechWeaponAccept(data) => data.as_bytes(),
            //GameMessage::BankRequest(data) => data.as_bytes(),
            //GameMessage::BankInteraction(data) => data.as_bytes(),
            //GameMessage::PlayerSoldItem(data) => data.as_bytes(),
            //GameMessage::TeamInvite(data) => data.as_bytes(),
            //GameMessage::AcceptTeamInvite(data) => data.as_bytes(),
            GameMessage::DropCoordinates(data) => data.as_bytes(),
            GameMessage::SortItems(data) => data.as_bytes(),
            GameMessage::PlayerUsedMedicalCenter(data) => data.as_bytes(),
            //GameMessage::ExperienceSteal(data) => data.as_bytes(),
            //GameMessage::ChargeAttack(data) => data.as_bytes(),
            GameMessage::RequestExp(data) => data.as_bytes(),
            //GameMessage::QuestRewardMeseta(data) => data.as_bytes(),
            //GameMessage::QuestRewardItem(data) => data.as_bytes(),
            //GameMessage::TransferItemRequest(data) => data.as_bytes(),
            //GameMessage::ExchangeItemForTeampoints(data) => data.as_bytes(),
            //GameMessage::MasterTransfer(data) => data.as_bytes(),
            //GameMessage::AcceptMasterTransfer(data) => data.as_bytes(),
            //GameMessage::RestartBattle(data) => data.as_bytes(),
            //GameMessage::BmodeLevelUp(data) => data.as_bytes(),
            //GameMessage::CmodeGrave(data) => data.as_bytes(),
            //GameMessage::WriteQuestFlag(data) => data.as_bytes(),
            //GameMessage::QuestItemExchange(data) => data.as_bytes(),
            //GameMessage::WrapItem(data) => data.as_bytes(),
            //GameMessage::PaganiniPDExchange(data) => data.as_bytes(),
            //GameMessage::SrankSpecialModification(data) => data.as_bytes(),
            //GameMessage::MomokaItemShop(data) => data.as_bytes(),
            //GameMessage::WeaponAttributeEnhancement(data) => data.as_bytes(),
            //GameMessage::BossInteractionSaintMillion(data) => data.as_bytes(),
            //GameMessage::GoodLuckQuest(data) => data.as_bytes(),
            //GameMessage::BPDPhotonCrystalExchange(data) => data.as_bytes(),
            //GameMessage::BPDRewards(data) => data.as_bytes(),
            //GameMessage::GallonsPlanQuest(data) => data.as_bytes(),
            //GameMessage::Coren(data) => data.as_bytes(),        
        }
    }
}