use std::io::{Seek, SeekFrom}; use psopacket::pso_message; use crate::{PSOPacketData, PacketParseError}; pub trait PSOMessage { const CMD: u8; fn from_bytes(cur: &mut R) -> Result where Self: Sized; fn as_bytes(&self) -> Vec; } //#[pso_message(0x05)] //pub struct PlayerActivatedSwitch { //} #[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 { //} #[pso_message(0x0A)] pub struct MobAttack { data: [u8; 8], } #[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 { //} //#[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 { //} //#[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; 0x04], unknown1: u32, } #[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: u32, amount: u32, } #[pso_message(0x2A)] pub struct PlayerDropItem2 { data: [u8; 20], } #[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 { //} //#[pso_message(0x2D)] //pub struct FinishSpeechNpc { //} //#[pso_message(0x2F)] //pub struct FinishSpeechNpcBPD { //} //#[pso_message(0x30)] //pub struct PlayerLevelUp { //} #[pso_message(0x31)] pub struct PlayerResurrected { data: [u8; 4], } #[pso_message(0x32)] pub struct PlayerResurrectedMedicalCenter { data: [u8; 4], } #[pso_message(0x33)] pub struct PlayerUsedMoonAtomizer { data: [u8; 4], } #[pso_message(0x36)] pub struct PlayerPBDonation { data: [u8; 4], } #[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; 8], } #[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 { data: [u8; 4], } #[pso_message(0x4B)] pub struct PlayerReceivedDamage { data: [u8; 12], } #[pso_message(0x4C)] pub struct PlayerReceivedDamage2 { data: [u8; 12], } #[pso_message(0x4D)] pub struct PlayerDeath { data: [u8; 4], } #[pso_message(0x4E)] pub struct PlayerPostDeathAnimation { data: [u8; 4], } #[pso_message(0x4F)] pub struct PlayerScapedollResurrection { data: [u8; 4], } //#[pso_message(0x50)] //pub struct PlayerActivatedSwitch2 { //} #[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: u32, item_id: u32, } //#[pso_message(0x5D)] //pub struct SplittingStack { //} //#[pso_message(0x5F)] //pub struct BoxDrops { //} #[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 PlayerPBParticle { mag_id: u32, effect: u8, unknown1: u32, } #[pso_message(0x63)] pub struct FloorItemLimitItemDeletion { item_id: u32, unknown1: u32, } //#[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(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(0x94)] //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(0xA3)] //pub struct BossInteractionOlgaFlow { //} //#[pso_message(0xA4)] //pub struct BossInteractionOlgaFlow2 { //} //#[pso_message(0xA5)] //pub struct BossInteractionOlgaFlow3 { //} //#[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(0xC0)] //pub struct PlayerSoldItem { //} #[pso_message(0xC3)] pub struct DropCoordinates { drop_area: u32, x: f32, z: f32, drop_ID: u32, } //#[pso_message(0xC4)] //pub struct SortItems { //} //#[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(0xCB)] //pub struct TransferItemRequest { //} //#[pso_message(0xCC)] //pub struct ExchangeItemForTeampoints { //} //#[pso_message(0xCF)] //pub struct RestartBattle { //} //#[pso_message(0xD2)] //pub struct WriteQuestFlag { //} //#[pso_message(0xD5)] //pub struct QuestItemExchange { //} //#[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(0xE1)] //pub struct GallonsPlanQuest { //} #[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), //SplittingStack(SplittingStack), //BoxDrops(BoxDrops), RequestItem(RequestItem), PlayerPBParticle(PlayerPBParticle), FloorItemLimitItemDeletion(FloorItemLimitItemDeletion), //PlayerUsedStarAtomizer(PlayerUsedStarAtomizer), SpawningMonsters(SpawningMonsters), //PlayerTelepipe(PlayerTelepipe), NpcSpawn(NpcSpawn), 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), //BossInteractionOlgaFlow(BossInteractionOlgaFlow), //BossInteractionOlgaFlow2(BossInteractionOlgaFlow2), //BossInteractionOlgaFlow3(BossInteractionOlgaFlow3), //BossInteractionGolDragon(BossInteractionGolDragon), //BossInteractionBarbaRay(BossInteractionBarbaRay), //BossInteractionBarbaRay2(BossInteractionBarbaRay2), PhotonChairSit(PhotonChairSit), //BossInteractionOlgaFlow4(BossInteractionOlgaFlow4), UnknownAE(UnknownAE), PhotonChairTurn(PhotonChairTurn), PhotonChairMove(PhotonChairMove), //PlayerSoldItem(PlayerSoldItem), DropCoordinates(DropCoordinates), //SortItems(SortItems), //PlayerUsedMedicalCenter(PlayerUsedMedicalCenter), //ExperienceSteal(ExperienceSteal), //ChargeAttack(ChargeAttack), RequestExp(RequestExp), //TransferItemRequest(TransferItemRequest), //ExchangeItemForTeampoints(ExchangeItemForTeampoints), //RestartBattle(RestartBattle), //WriteQuestFlag(WriteQuestFlag), //QuestItemExchange(QuestItemExchange), //PaganiniPDExchange(PaganiniPDExchange), //SrankSpecialModification(SrankSpecialModification), //MomokaItemShop(MomokaItemShop), //WeaponAttributeEnhancement(WeaponAttributeEnhancement), //BossInteractionSaintMillion(BossInteractionSaintMillion), //GoodLuckQuest(GoodLuckQuest), //GallonsPlanQuest(GallonsPlanQuest), } impl PSOPacketData for GameMessage { fn from_bytes(mut cur: &mut R) -> Result { 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)?)), //SplittingStack::CMD => Ok(GameMessage::SplittingStack(SplittingStack::from_bytes(&mut cur)?)), //BoxDrops::CMD => Ok(GameMessage::BoxDrops(BoxDrops::from_bytes(&mut cur)?)), RequestItem::CMD => Ok(GameMessage::RequestItem(RequestItem::from_bytes(&mut cur)?)), PlayerPBParticle::CMD => Ok(GameMessage::PlayerPBParticle(PlayerPBParticle::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)?)), 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)?)), //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)?)), //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)?)), //PlayerSoldItem::CMD => Ok(GameMessage::PlayerSoldItem(PlayerSoldItem::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)?)), //TransferItemRequest::CMD => Ok(GameMessage::TransferItemRequest(TransferItemRequest::from_bytes(&mut cur)?)), //ExchangeItemForTeampoints::CMD => Ok(GameMessage::ExchangeItemForTeampoints(ExchangeItemForTeampoints::from_bytes(&mut cur)?)), //RestartBattle::CMD => Ok(GameMessage::RestartBattle(RestartBattle::from_bytes(&mut cur)?)), //WriteQuestFlag::CMD => Ok(GameMessage::WriteQuestFlag(WriteQuestFlag::from_bytes(&mut cur)?)), //QuestItemExchange::CMD => Ok(GameMessage::QuestItemExchange(QuestItemExchange::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)?)), //GallonsPlanQuest::CMD => Ok(GameMessage::GallonsPlanQuest(GallonsPlanQuest::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 { 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::SplittingStack(data) => data.as_bytes(), //GameMessage::BoxDrops(data) => data.as_bytes(), GameMessage::RequestItem(data) => data.as_bytes(), GameMessage::PlayerPBParticle(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::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::BossInteractionOlgaFlow(data) => data.as_bytes(), //GameMessage::BossInteractionOlgaFlow2(data) => data.as_bytes(), //GameMessage::BossInteractionOlgaFlow3(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::PlayerSoldItem(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::TransferItemRequest(data) => data.as_bytes(), //GameMessage::ExchangeItemForTeampoints(data) => data.as_bytes(), //GameMessage::RestartBattle(data) => data.as_bytes(), //GameMessage::WriteQuestFlag(data) => data.as_bytes(), //GameMessage::QuestItemExchange(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::GallonsPlanQuest(data) => data.as_bytes(), } } }