I spent a day working on VoA just to have something prepared in case Steam gets a new VoA client sometime soon.
I wrote a couple of scripts that make updating our patch_<expansion>.conf files a bit easier based on some other opcode info we have. It still requires some manual work to get all of the opcodes, but not nearly as much work as before.
Here is the March 21 2012 client .conf file I made using these new scripts with a few adjustments I made manually while working on the client:
Code:
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x4d5c #
OP_ApproveWorld=0x655c #
OP_LogServer=0x1497 #
OP_SendCharInfo=0x7f9e #
OP_ExpansionInfo=0x7e4d #
OP_GuildsList=0x5b0b #
OP_EnterWorld=0x710e #
OP_PostEnterWorld=0x7930 #
OP_World_Client_CRC1=0x7ce4 #
OP_World_Client_CRC2=0x7705 #
OP_SendSpellChecksum=0x0000 #
OP_SendSkillCapsChecksum=0x0000 #
# haracter Select Related:
OP_DeleteCharacter=0x5ca5 #
OP_CharacterCreateRequest=0x4eba #
OP_CharacterCreate=0x3237 #
OP_RandomNameGenerator=0x26aa #
OP_ApproveName=0x3154 #
OP_MOTD=0x0b80 #
OP_SetChatServer=0x2c38 #
OP_SetChatServer2=0x441c #
OP_ZoneServerInfo=0x16f5 #
OP_WorldComplete=0x6c63 #
OP_WorldUnknown001=0x4274 #
OP_FloatListThing=0x1910 #
# Reasons for Disconnect:
OP_ZoneUnavail=0x20bc #
OP_WorldClientReady=0x0b89 # Testing VoA 0x3f24
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 #
OP_ZoneEntry=0x5821 # Testing VoA 0x5821
OP_ReqNewZone=0x4118 #
OP_NewZone=0x43ac #
OP_ZoneSpawns=0x5f5e #
OP_PlayerProfile=0x6afd # Testing VoA 0x6022
OP_TimeOfDay=0x6015 #
OP_LevelUpdate=0x6a99 #
OP_Stamina=0x7686 #
OP_RequestClientZoneChange=0x224f #
OP_ZoneChange=0x0976 #
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x3f55 #
OP_ChangeSize=0x0000 #
OP_TributeUpdate=0x0000 #
OP_TributeTimer=0x1525 # Testing VoA 0x1525
OP_TaskDescription=0x2e4f #
OP_TaskActivity=0x512b #
OP_CompletedTasks=0x3141 #
OP_Weather=0x3e50 #
OP_SendAATable=0x6a7e # Testing VoA 0x6a7e
OP_UpdateAA=0x5363 # Testing VoA 0x5363
OP_RespondAA=0x0643 # Testing VoA 0x0643 or maybe 0x7bf6
OP_ReqClientSpawn=0x2c27 #
OP_SpawnDoor=0x7113 #
OP_GroundSpawn=0x33e5 #
OP_SendZonepoints=0x399f #
OP_SendAAStats=0x4e22 #
OP_WorldObjectsSent=0x7b73 #
OP_BlockedBuffs=0x1681 #
OP_RemoveBlockedBuffs=0x6a86 #
OP_ClearBlockedBuffs=0x7ae1 #
OP_SendExpZonein=0x0f14 #
OP_SendTributes=0x010d #
OP_TributeInfo=0x047c #
OP_SendGuildTributes=0x0000 #
OP_AAExpUpdate=0x1318 #
OP_ExpUpdate=0x0000 # Testing VoA 0x0555
OP_HPUpdate=0x2369 #
OP_ManaChange=0x569a #
OP_TGB=0x3672 #
OP_SpecialMesg=0x039d #
OP_GuildMemberList=0x51bc #
OP_GuildMOTD=0x0000 # Testing VoA 0x0a1d
OP_CharInventory=0x0000 # Testing VoA 0x6cfe
OP_WearChange=0x1a58 #
OP_ClientUpdate=0x7062 #
OP_ClientReady=0x6cdc #
OP_SetServerFilter=0x053a #
# Guild Opcodes
OP_GetGuildMOTD=0x3415 #
OP_GetGuildMOTDReply=0x709d #
OP_GuildMemberUpdate=0x589f #
OP_GuildInvite=0x5488 #
OP_GuildRemove=0x47d3 #
OP_GuildPeace=0x2bff #
OP_SetGuildMOTD=0x5f85 #
OP_GuildList=0x0000 #
OP_GuildWar=0x5408 #
OP_GuildLeader=0x0598 #
OP_GuildDelete=0x230e #
OP_GuildInviteAccept=0x2b5a #
OP_GuildDemote=0x1899 #
OP_GuildPublicNote=0x2dbd #
OP_GuildManageBanker=0x0000 #
OP_GuildBank=0x0000 #
OP_SetGuildRank=0x4ffe #
OP_GuildUpdateURLAndChannel=0x03d1 #
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
OP_GuildStatus=0x4cf2 #
OP_GuildCreate=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x6989 #
OP_GMBecomeNPC=0x56e7 #
OP_GMZoneRequest=0x701f #
OP_GMZoneRequest2=0x01 #
OP_GMGoto=0x15a1 #
OP_GMSearchCorpse=0x5a81 #
OP_GMHideMe=0x28ef #
OP_GMDelCorpse=0x072f #
OP_GMApproval=0x481f #
OP_GMToggle=0x2042 #
OP_GMSummon=0x6e47 #
OP_GMEmoteZone=0x307d #
OP_GMEmoteWorld=0x0c2d #
OP_GMFind=0x6e27 #
OP_GMKick=0x5a56 #
OP_GMKill=0x51fe #
OP_GMNameChange=0x0000 #
OP_GMLastName=0x7bfb #
OP_InspectAnswer=0x0c54 #
OP_BeginCast=0x0d5a #
OP_BuffFadeMsg=0x71bf #
OP_ConsentResponse=0x35c6 #
OP_MemorizeSpell=0x3887 #
OP_SwapSpell=0x28a7 #
OP_CastSpell=0x50c2 #
OP_Consider=0x70c6 #
OP_FormattedMessage=0x4675 #
OP_SimpleMessage=0x0698 #
OP_Buff=0x3a18 #
OP_Illusion=0x10b7 #
OP_MoneyOnCorpse=0x4074 #
OP_RandomReply=0x6d5d #
OP_DenyResponse=0x0370 #
OP_SkillUpdate=0x7f01 #
OP_GMTrainSkillConfirm=0x0000 #
OP_RandomReq=0x303e #
OP_Death=0x6685 #
OP_Bind_Wound=0x7b64 #
OP_GMTraining=0x5960 #
OP_GMEndTraining=0x4a61 #
OP_GMTrainSkill=0x4885 #
OP_Animation=0x5bd9 #
OP_Begging=0x32af #
OP_Consent=0x6bb9 #
OP_ConsentDeny=0x6b7f #
OP_AutoFire=0x23fc #
OP_PetCommands=0x7312 #
OP_DeleteSpell=0x0142 #
OP_Surname=0x777c #
OP_ClearSurname=0x0000 #
OP_FaceChange=0x0507 #
OP_SenseHeading=0x1b8a #
OP_Action=0x1b85 #
OP_ConsiderCorpse=0x0e94 #
OP_HideCorpse=0x0000 #
OP_CorpseDrag=0x0000 #
OP_CorpseDrop=0x0000 #
OP_Bug=0x3365 #
OP_Feedback=0x52b5 #
OP_Report=0x211a #
OP_Damage=0x631a # or OP_Action2?
OP_ChannelMessage=0x2e79 #
OP_Assist=0x5658 #
OP_AssistGroup=0x43bc #
OP_MoveCoin=0x2963 #
OP_ZonePlayerToBind=0x2480 #
OP_KeyRing=0x3b85 #
OP_WhoAllRequest=0x177a #
OP_WhoAllResponse=0x15de #
OP_FriendsWho=0x73d6 #
OP_ConfirmDelete=0x604d #
OP_Logout=0x6275 #
OP_Rewind=0x09e3 #
OP_TargetCommand=0x3088 #
OP_InspectRequest=0x2683 #
OP_Hide=0x3497 #
OP_Jump=0x083b #
OP_Camp=0x3cd6 #
OP_Emote=0x0000 #
OP_SetRunMode=0x3d06 #
OP_BankerChange=0x0000 #
OP_TargetMouse=0x3edc #
OP_MobHealth=0x5cb0 #
OP_InitialMobHealth=0x0000 #
OP_TargetHoTT=0x460e #
OP_TargetBuffs=0x7c24 #
OP_BuffCreate=0x0c98 #
OP_BuffRemoveRequest=0x3567 #
OP_DeleteSpawn=0x3164 #
OP_AutoAttack=0x2257 #
OP_AutoAttack2=0x0000 #
OP_Consume=0x2ee2 #
OP_MoveItem=0x1cb3 #
OP_DeleteItem=0x7547 #
OP_DeleteCharge=0x6a90 #
OP_ItemPacket=0x2dd3 #
OP_ItemLinkResponse=0x6948 #
OP_ItemLinkClick=0x3c66 #
OP_NewSpawn=0x016c #
OP_Track=0x2444 #
OP_TrackTarget=0x538f #
OP_TrackUnknown=0x03e7 #
OP_ClickDoor=0x48f9 #
OP_MoveDoor=0x231f #
OP_RemoveAllDoors=0x24a3 #
OP_EnvDamage=0x2730 #
OP_BoardBoat=0x7554 #
OP_Forage=0x3c02 #
OP_LeaveBoat=0x7286 #
OP_ControlBoat=0x0ca5 #
OP_SafeFallSuccess=0x6df7 #
OP_RezzComplete=0x7108 #
OP_RezzRequest=0x6024 #
OP_RezzAnswer=0x2d41 #
OP_Shielding=0x7598 #
OP_RequestDuel=0x0e71 #
OP_MobRename=0x6884 #
OP_AugmentItem=0x4cc6 #
OP_WeaponEquip1=0x11bc #
OP_WeaponEquip2=0x3f24 # Testing VoA 0x2121
OP_WeaponUnequip2=0x7b87 #
OP_ApplyPoison=0x5cd3 #
OP_Save=0x47e7 #
OP_TestBuff=0x712b #
OP_CustomTitles=0x6ade #
OP_Split=0x0ed5 #
OP_YellForHelp=0x1f87 #
OP_LoadSpellSet=0x440f #
OP_Bandolier=0x3ad1 #
OP_PotionBelt=0x7b7f #
OP_DuelResponse=0x1df9 #
OP_DuelResponse2=0x36f8 #
OP_SaveOnZoneReq=0x2913 #
OP_ReadBook=0x41b5 #
OP_Dye=0x32c6 #
OP_InterruptCast=0x7706 #
OP_AAAction=0x55dd #
OP_LeadershipExpToggle=0x69d0 #
OP_LeadershipExpUpdate=0x3703 #
OP_PurchaseLeadershipAA=0x6e58 #
OP_UpdateLeadershipAA=0x0297 #
OP_MarkNPC=0x6b9e #
OP_ClearNPCMarks=0x074f #
OP_DoGroupLeadershipAbility=0x0000 #
OP_GroupLeadershipAAUpdate=0x0000 #
OP_DelegateAbility=0x105b #
OP_SetGroupTarget=0x42c7 #
OP_Charm=0x17f7 #
OP_Stun=0x41a6 #
OP_SendFindableNPCs=0x3015 #
OP_FindPersonRequest=0x19a8 #
OP_FindPersonReply=0x7e45 #
OP_Sound=0x2d1d #
OP_PetBuffWindow=0x4895 #
OP_LevelAppearance=0x78b9 #
OP_Translocate=0x42ef #
OP_Sacrifice=0x2dc6 #
OP_PopupResponse=0x0000 #
OP_OnLevelMessage=0x0000 #
OP_AugmentInfo=0x0000 #
OP_Petition=0x31d1 #
OP_SomeItemPacketMaybe=0x1513 #
OP_PVPStats=0x0000 #
OP_PVPLeaderBoardRequest=0x0000 #
OP_PVPLeaderBoardReply=0x0000 #
OP_PVPLeaderBoardDetailsRequest=0x0000 #
OP_PVPLeaderBoardDetailsReply=0x0000 #
OP_RestState=0x0000 #
OP_RespawnWindow=0x435b #
OP_DisciplineTimer=0x74ca #
OP_LDoNButton=0x597d #
OP_SetStartCity=0x179d #
OP_VoiceMacroIn=0x0fce #
OP_VoiceMacroOut=0x1c36 #
OP_ItemViewUnknown=0x0000 #
OP_VetRewardsAvaliable=0x3637 # Mispelled?
OP_VetClaimRequest=0x032b #
OP_VetClaimReply=0x7b6e #
OP_CrystalCountUpdate=0x0000 #
OP_DisciplineUpdate=0x0d8d #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 # OP_Damage?
OP_MobUpdate=0x4656 # Same as OP_SpawnPositionUpdate
OP_NPCMoveUpdate=0x2339 #
OP_CameraEffect=0x6812 #
OP_SpellEffect=0x0989 #
OP_RemoveNimbusEffect=0x0000 #
OP_AltCurrency=0x2536
OP_AltCurrencyMerchantRequest=0x5aac
OP_AltCurrencyMerchantReply=0x17c7
OP_AltCurrencyPurchase=0x6efe
OP_AltCurrencySell=0x32d9
OP_AltCurrencySellSelection=0x7eac
OP_AltCurrencyReclaim=0x1560
OP_CrystalReclaim=0x0000
OP_CrystalCreate=0x0000
OP_Untargetable=0x101e
OP_IncreaseStats=0x4acf
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 #
OP_ManaUpdate=0x7c94 #
OP_EnduranceUpdate=0x5851 #
OP_MobManaUpdate=0x4d27 #
OP_MobEnduranceUpdate=0x190c #
# Looting
OP_LootRequest=0x1d85 #
OP_EndLootRequest=0x0bc #
OP_LootItem=0x6d37 #
OP_LootComplete=0x4ca1 #
# bazaar trader stuff stuff:
OP_BazaarSearch=0x2881 #
OP_TraderDelItem=0x0000 #
OP_BecomeTrader=0x358a #
OP_TraderShop=0x49f4 #
OP_Trader=0x058c #
OP_TraderBuy=0x783c #
OP_Barter=0x766f #
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0c24 #
OP_TradeAcceptClick=0x064a #
OP_TradeRequestAck=0x606a #
OP_TradeCoins=0x0149 #
OP_FinishTrade=0x3ff6 #
OP_CancelTrade=0x527e #
OP_TradeMoneyUpdate=0x1ebb #
OP_MoneyUpdate=0x528f #
OP_TradeBusy=0x2c03 #
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x3c27 #
OP_FinishWindow2=0x6759 #
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 #
OP_ItemVerifyReply=0x0000 #
# merchant crap
OP_ShopPlayerSell=0x0b27 #
OP_ShopRequest=0x4194 #
OP_ShopEnd=0x3753 #
OP_ShopEndConfirm=0x4762 #
OP_ShopPlayerBuy=0x436a #
OP_ShopDelItem=0x63c8 #
# tradeskill stuff:
OP_ClickObject=0x5f0d #
OP_ClickObjectAction=0x29df #
OP_ClearObject=0x38d1 #
OP_RecipeDetails=0x068 #
OP_RecipesFavorite=0x0000 #
OP_RecipesSearch=0x0239 #
OP_RecipeReply=0x1ecf #
OP_RecipeAutoCombine=0x66bf #
OP_TradeSkillCombine=0x4212 #
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 #
OP_OpenTributeMaster=0x3ba3 #
OP_SelectTribute=0x314f #
OP_TributeItem=0x0000 #
OP_TributeMoney=0x1772 #
OP_TributeToggle=0x0000 #
OP_TributePointUpdate=0x0000 #
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x771f #
OP_AdventureFinish=0x3168 #
OP_AdventureInfoRequest=0x05d8 #
OP_AdventureInfo=0x164b #
OP_AdventureRequest=0x3a75 #
OP_AdventureDetails=0x05 #
OP_AdventureData=0x21df #
OP_AdventureUpdate=0x6129 #
OP_AdventureMerchantRequest=0x0000 #
OP_AdventureMerchantResponse=0x0000 #
OP_AdventureMerchantPurchase=0x0000 #
OP_AdventureMerchantSell=0x0000 #
OP_AdventurePointsUpdate=0x7d05 #
OP_AdventureStatsRequest=0x684c #
OP_AdventureStatsReply=0x15a7 #
OP_AdventureLeaderboardRequest=0x0b89 #
OP_AdventureLeaderboardReply=0x6bfb #
# Group Opcodes
OP_GroupDisband=0x4200 #
OP_GroupInvite=0x3288 #
OP_GroupFollow=0x1190 #
OP_GroupUpdate=0x0000 #
OP_GroupUpdateB=0x0000 #
OP_GroupCancelInvite=0x0000 # - Same as OP_CancelInvite?
OP_GroupAcknowledge=0x0000 #
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x2736 #
OP_GroupFollow2=0x6c16 #
OP_GroupInvite2=0x5251 #
OP_GroupDisbandYou=0x0000 #
OP_GroupDisbandOther=0x0000 #
OP_GroupLeaderChange=0x0000 #
OP_GroupRoles=0x0000 #
OP_GroupMakeLeader=0x13da
# LFG/LFP Opcodes
OP_LFGCommand=0x457d #
OP_LFGGetMatchesRequest=0x49e7 #
OP_LFGGetMatchesResponse=0x4817 #
OP_LFPGetMatchesRequest=0x5fc7 #
OP_LFPGetMatchesResponse=0x3d0c #
OP_LFPCommand=0x20c6 #
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x550f #
OP_RaidUpdate=0x0000 # Testing VoA 0x0c08
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x732c #
OP_CombatAbility=0x16a5 #
OP_SenseTraps=0x416b #
OP_PickPocket=0x13bd #
OP_DisarmTraps=0x0000 #
OP_Disarm=0x6def #
OP_Sneak=0x1d22 #
OP_Fishing=0x7093 #
OP_InstillDoubt=0x221a #
OP_FeignDeath=0x6145 #
OP_Mend=0x10a6 #
OP_LDoNOpen=0x7c87 #
# Task packets
OP_TaskActivityComplete=0x0000 #
OP_TaskMemberList=0x0000 #
OP_OpenNewTasksWindow=0x0000 #
OP_AvaliableTask=0x0000 # Mispelled?
OP_AcceptNewTask=0x0000 #
OP_TaskHistoryRequest=0x6d1f #
OP_TaskHistoryReply=0x189b #
OP_CancelTask=0x47ea #
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x6d95 #
OP_RequestTitles=0x0000 #
OP_SendTitleList=0x0000 #
OP_SetTitle=0x725b #
OP_SetTitleReply=0x38e8 #
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
Here is the PP struct, which should be almost perfect for the current March 21 2012 client. I did have to add 20 bytes in near the end, which is probably because I miscalculated the struct somewhere and had 20 bytes missing. Either way, this struct is functional:
Code:
struct PlayerProfile_Struct
{
/*00000*/ uint32 checksum; //
//BEGIN SUB-STRUCT used for shrouding stuff...
/*00004*/ uint32 gender; // Player Gender - 0 Male, 1 Female
/*00008*/ uint32 race; // Player race
/*00012*/ uint32 class_; // Player class
/*00016*/ uint8 unknown00016[40]; // #### uint32 unknown00016; in Titanium ####uint8[40]
/*00056*/ uint8 level; // Level of player
/*00057*/ uint8 level1; // Level of player (again?)
/*00058*/ uint8 unknown00058[2]; // ***Placeholder
/*00060*/ BindStruct binds[5]; // Bind points (primary is first)
/*00160*/ uint32 deity; // deity
/*00164*/ uint32 intoxication; // Alcohol level (in ticks till sober?)
/*00168*/ uint32 spellSlotRefresh[MAX_PP_MEMSPELL]; // Refresh time (millis) - 4 Octets Each
/*00216*/ uint8 unknown00208[6]; // Seen 00 00 00 00 00 00 00 00 00 00 00 00 02 01
/*00222*/ uint32 abilitySlotRefresh;
/*00226*/ uint8 haircolor; // Player hair color
/*00227*/ uint8 beardcolor; // Player beard color
/*00228*/ uint8 eyecolor1; // Player left eye color
/*00229*/ uint8 eyecolor2; // Player right eye color
/*00230*/ uint8 hairstyle; // Player hair style
/*00231*/ uint8 beard; // Player beard type
/*00232*/ uint8 unknown00232[4]; // was 14 288
/*00236*/ union
{
struct
{
/*236*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
/*252*/ EquipStruct equip_chest; // Equiptment: Chest visual
/*268*/ EquipStruct equip_arms; // Equiptment: Arms visual
/*284*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
/*300*/ EquipStruct equip_hands; // Equiptment: Hands visual
/*316*/ EquipStruct equip_legs; // Equiptment: Legs visual
/*332*/ EquipStruct equip_feet; // Equiptment: Boots visual
/*348*/ EquipStruct equip_primary; // Equiptment: Main visual
/*364*/ EquipStruct equip_secondary; // Equiptment: Off visual
} equip;
/*00236*/ EquipStruct equipment[9]; //Live Shows [108] for this part
};
/*00344*/ uint8 unknown00344[36]; // EquipStruct is now 16 bytes instead of 12
/*00380*/ uint8 unknown00380[220]; // Live Shows [160]
/*00600*/ Color_Struct item_tint[9]; // RR GG BB 00
/*00636*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each
/*04236*/ uint32 points; // Unspent Practice points - RELOCATED???
/*04240*/ uint32 mana; // Current mana
/*04244*/ uint32 cur_hp; // Current HP without +HP equipment
/*04248*/ uint32 STR; // Strength - 6e 00 00 00 - 110
/*04252*/ uint32 STA; // Stamina - 73 00 00 00 - 115
/*04256*/ uint32 CHA; // Charisma - 37 00 00 00 - 55
/*04260*/ uint32 DEX; // Dexterity - 50 00 00 00 - 80
/*04264*/ uint32 INT; // Intelligence - 3c 00 00 00 - 60
/*04268*/ uint32 AGI; // Agility - 5f 00 00 00 - 95
/*04272*/ uint32 WIS; // Wisdom - 46 00 00 00 - 70
/*04276*/ uint8 unknown04188[28]; //
/*04304*/ uint8 face; // Player face - Actually int32?
/*04305*/ uint8 unknown04217[147]; // was [175]
/*04452*/ uint8 unknown04452[36]; // Spell related new to VoA March 21 2012
/*04488*/ int32 spell_book[MAX_PP_SPELLBOOK]; // List of the Spells in spellbook 720 = 90 pages [2880] was [1920]
/*06408*/ uint8 unknown06284[960]; // Spacer for the end of the book for now (pages 60 to 90)
/*07368*/ int32 mem_spells[MAX_PP_MEMSPELL]; // [48] List of spells memorized
/*07416*/ uint8 unknown07284[20]; //#### uint8 unknown04396[32]; in Titanium ####[28]
/*07436*/ uint32 platinum; // Platinum Pieces on player
/*07440*/ uint32 gold; // Gold Pieces on player
/*07444*/ uint32 silver; // Silver Pieces on player
/*07448*/ uint32 copper; // Copper Pieces on player
/*07452*/ uint32 platinum_cursor; // Platinum Pieces on cursor
/*07456*/ uint32 gold_cursor; // Gold Pieces on cursor
/*07460*/ uint32 silver_cursor; // Silver Pieces on cursor
/*07464*/ uint32 copper_cursor; // Copper Pieces on cursor
/*07468*/ uint32 skills[MAX_PP_SKILL]; // [300] List of skills
//uint32 innateSkills[25]; // -72
/*07768*/ uint8 unknown07644[236]; // -272 - 16 = -256 + 236 = -20
/*08004*/ uint32 toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
/*08008*/ uint32 thirst_level; // Drink (ticks till next drink)
/*08012*/ uint32 hunger_level; // Food (ticks till next eat)
/*08016*/ SpellBuff_Struct buffs[BUFF_COUNT]; // [2200] Buffs currently on the player (30 Max) - (Each Size 88)
/*10216*/ SpellBuff_Struct MoreBuffs[5]; // 440 -1064 (-116 to go)
/*10656*/ uint8 unknown08492[1056]; // End of Buffs - was [360] - Added 360 for Feb 8 2011, not sure exactly where these extra bytes go, but know they go before zone_id.
/*11712*/ Disciplines_Struct disciplines; // [400] Known disciplines
/*12112*/ uint8 unknown11252[400]; // Discs?
/*12512*/ uint32 recastTimers[MAX_RECAST_TYPES]; // [80] Timers (UNIX Time of last use)
/*12912*/ uint8 unknown11732[480]; // Some type of Timers was 160
/*13072*/ uint32 endurance; // Current endurance
/*13076*/ uint8 unknown13076[20]; //
/*13096*/ uint32 aapoints_spent; // Number of spent AA points
/*13100*/ uint32 aapoints; // Unspent AA points
/*13104*/ uint8 unknown11924[4];
/*13108*/ Bandolier_Struct bandoliers[MAX_PLAYER_BANDOLIER]; // [6400] bandolier contents
/*19508*/ PotionBelt_Struct potionbelt; // [360] potion belt 72 extra octets by adding 1 more belt slot
/*19868*/ uint8 unknown18688[8];
/*19876*/ uint32 available_slots;
/*19880*/ uint8 unknown18700[80]; //
//END SUB-STRUCT used for shrouding.
/*19960*/ char name[64]; // Name of player - 19960 for Live 1180 difference
/*20024*/ char last_name[32]; // Last name of player
/*20056*/ uint8 unknown18876[12]; //#### Not In Titanium #### new to SoF[12]
/*20068*/ int32 guild_id; // guildid
/*20072*/ uint32 birthday; // character birthday
/*20076*/ uint32 account_startdate; // Date the Account was started
/*20080*/ uint32 lastlogin; // character last save time
/*20084*/ uint32 timePlayedMin; // time character played
/*20088*/ uint8 pvp; // 1=pvp, 0=not pvp
/*20089*/ uint8 anon; // 2=roleplay, 1=anon, 0=not anon
/*20090*/ uint8 gm; // 0=no, 1=yes (guessing!)
/*20091*/ int8 guildrank; // 0=member, 1=officer, 2=guildleader -1=no guild
/*20092*/ uint32 guildbanker;
/*20096*/ uint8 unknown18912[12]; // was 4
/*20108*/ uint32 exp; // Current Experience
/*20112*/ uint8 unknown18920[8];
/*20120*/ uint32 timeentitledonaccount;
/*20124*/ uint8 languages[MAX_PP_LANGUAGE]; // List of languages
/*20149*/ uint8 unknown18957[7]; //#### uint8 unknown13109[4]; in Titanium ####[7]
/*20156*/ float y; // Players y position (NOT positive about this switch)
/*20160*/ float x; // Players x position
/*20164*/ float z; // Players z position
/*20168*/ float heading; // Players heading
/*20172*/ uint8 unknown18980[4]; // ***Placeholder
/*20176*/ uint32 platinum_bank; // Platinum Pieces in Bank
/*20180*/ uint32 gold_bank; // Gold Pieces in Bank
/*20184*/ uint32 silver_bank; // Silver Pieces in Bank
/*20188*/ uint32 copper_bank; // Copper Pieces in Bank
/*20192*/ uint32 platinum_shared; // Shared platinum pieces
/*20196*/ uint32 unknown20196[3]; //
/*20208*/ uint8 unknown19004[2112]; //
/*22320*/ uint32 expansions; // Bitmask for expansions ff 7f 00 00 - SoD
/*22324*/ uint8 unknown21132[12];
/*22336*/ uint32 autosplit; // 0 = off, 1 = on
/*22340*/ uint8 unknown21148[16];
/*22356*/ uint16 zone_id; // see zones.h
/*22358*/ uint16 zoneInstance; // Instance id
/*22360*/ char groupMembers[MAX_GROUP_MEMBERS][64];// 384 all the members in group, including self
/*22744*/ char groupLeader[64]; // Leader of the group ?
/*22808*/ uint8 unknown21616[540]; // was [604]
/*23348*/ uint32 entityid;
/*23352*/ uint32 leadAAActive; // 0 = leader AA off, 1 = leader AA on
/*23356*/ uint8 unknown22228[4];
/*23360*/ sint32 ldon_points_guk; // Earned GUK points
/*23364*/ sint32 ldon_points_mir; // Earned MIR points
/*23368*/ sint32 ldon_points_mmc; // Earned MMC points
/*23372*/ sint32 ldon_points_ruj; // Earned RUJ points
/*23376*/ sint32 ldon_points_tak; // Earned TAK points
/*23380*/ sint32 ldon_points_available;// Available LDON points
/*23384*/ uint8 unknown22256[136]; // was [144]
/*23520*/ uint8 unknown23520[8]; //
/*23528*/ float tribute_time_remaining;// Time remaining on tribute (millisecs)
/*23532*/ uint32 career_tribute_points;// Total favor points for this char
/*23536*/ uint32 unknown22332; // *** Placeholder
/*23540*/ uint32 tribute_points; // Current tribute points
/*23544*/ uint32 unknown22340; // *** Placeholder
/*23548*/ uint32 tribute_active; // 0 = off, 1=on
/*23552*/ Tribute_Struct tributes[MAX_PLAYER_TRIBUTES]; // [60] Current tribute loadout
/*23612*/ uint8 unknown22348[64]; //
/*23676*/ double group_leadership_exp; // Current group lead exp points
/*23684*/ double raid_leadership_exp; // Current raid lead AA exp points
/*23692*/ uint32 group_leadership_points; // Unspent group lead AA points
/*23696*/ uint32 raid_leadership_points; // Unspent raid lead AA points
/*23700*/ LeadershipAA_Struct leader_abilities; // [128]Leader AA ranks 19332
/*23828*/ uint8 unknown22632[128]; // was [132]
/*23956*/ uint32 air_remaining; // Air supply (seconds)
/*23960*/ uint32 PVPKills;
/*23964*/ uint32 PVPDeaths;
/*23968*/ uint32 PVPCurrentPoints;
/*23972*/ uint32 PVPCareerPoints;
/*23976*/ uint32 PVPBestKillStreak;
/*23980*/ uint32 PVPWorstDeathStreak;
/*23984*/ uint32 PVPCurrentKillStreak;
/*23988*/ PVPStatsEntry_Struct PVPLastKill; // size 88
/*24076*/ PVPStatsEntry_Struct PVPLastDeath; // size 88
/*24164*/ uint32 PVPNumberOfKillsInLast24Hours;
/*24168*/ PVPStatsEntry_Struct PVPRecentKills[50]; // size 4400 - 88 each
/*28568*/ uint32 expAA; // Exp earned in current AA point
/*28572*/ uint8 unknown27380[40];
/*28612*/ uint32 currentRadCrystals; // Current count of radiant crystals
/*28616*/ uint32 careerRadCrystals; // Total count of radiant crystals ever
/*28620*/ uint32 currentEbonCrystals; // Current count of ebon crystals
/*28624*/ uint32 careerEbonCrystals; // Total count of ebon crystals ever
/*28628*/ uint8 groupAutoconsent; // 0=off, 1=on
/*28629*/ uint8 raidAutoconsent; // 0=off, 1=on
/*28630*/ uint8 guildAutoconsent; // 0=off, 1=on
/*28631*/ uint8 unknown27439; // ***Placeholder (6/29/2005)
/*28632*/ uint32 level3; // SoF looks at the level here to determine how many leadership AA you can bank.
/*28636*/ uint32 showhelm; // 0=no, 1=yes
/*28640*/ uint32 RestTimer;
/*28644*/ uint8 unknown27452[1036]; // ***Placeholder (2/13/2007) was[1028]or[940]or[1380] - END of Struct
/*29680*/ uint8 unknown29680[28]; // was 8 (added 20 to the end to get the right packet size)
/*29688*/
};
Note that for this PP to work, you have to change the following field to be 12 instead of 10:
Code:
static const uint32 MAX_PP_MEMSPELL = 12;
Otherwise, you can add 8 bytes after the 2 fields that use that value and leave it as 10.
Also, here are the character select struct changes that are required to see characters properly:
Code:
struct CharacterSelectEntry_Struct {
/*0000*/ uint8 level; //
/*0000*/ uint8 hairstyle; //
/*0002*/ uint8 gender; //
/*0003*/ char name[1]; //variable length, edi+0
/*0000*/ uint8 beard; //
/*0000*/ uint8 haircolor; //
/*0000*/ uint8 face; //
/*0000*/ CharSelectEquip equip[9];
/*0000*/ uint32 primary; //
/*0000*/ uint32 secondary; //
/*0000*/ uint8 u15; // 0xff
/*0000*/ uint32 deity; //
/*0000*/ uint16 zone; //
/*0000*/ uint16 instance;
/*0000*/ uint8 gohome; //
/*0000*/ uint8 u19; // 0xff
/*0000*/ uint32 race; //
/*0000*/ uint8 tutorial; //
/*0000*/ uint8 class_; //
/*0000*/ uint8 eyecolor1; //
/*0000*/ uint8 beardcolor; //
/*0000*/ uint8 eyecolor2; //
/*0000*/ uint32 drakkin_heritage; // Drakkin Heritage
/*0000*/ uint32 drakkin_tattoo; // Drakkin Tattoo
/*0000*/ uint32 drakkin_details; // Drakkin Details (Facial Spikes)
/*0000*/ uint8 unknown; // New field to Live
/*0000*/ uint8 char_enabled; // 0 for disabled character, 1 for enabled
/*0000*/ uint32 LastLogin; // Unix timestamp of last login - 1212696584
/*0000*/ uint8 unknown2; //
/*0000*/ uint8 unknown3; //
/*0000*/ uint32 unknown4; // Seen 01 00 00 00
};
There are a few unknowns there which I am not sure about. Also, I assume there is a new separate packet that sets the character creation limit (0/0 characters). So, until that is figured out, you can only use accounts that have existing characters on them.
Other than that, I think the only other thing I had to do was add 37 bytes to the spawn struct and I was able to get all of the way in-game. Unfortunately, the game closes immediately after you completely zone in. I found a few other struct size changes that were required, but still haven't figured out what is causing the client to close. My best guess is that it is due to me setting the inventory opcode to 0x0000 to prevent the packet from crashing the client completely. Maybe if I can figure out the item struct changes it will work, but that is probably the biggest change required for Live clients to work and I don't think it will be easy due to how slots were changed around.
I may work on it a bit more if I get time, but figured I would share the info I have so far in case anyone else wants to work on it.
If Steam doesn't release a functional client that we can use for EQEmu, we will need some way for the community to get a compatible client legally. Maybe there is a way we can do an update every 6 months or so to work with Live clients, but that still leaves out anyone that tries to join between those times after a new patch is in place that breaks compatibility. I just don't want to have to do this type of thing every month as it takes quite a bit of time. At least with the new scripts I made, it should make filling in 90% of the opcodes much quicker.
There may be a chance that Steam isn't getting a new client just because SOE knows that is where we have been getting our clients. If they were smart, they would just put a good VoA client on Steam and not a F2P HoT client or maybe the HoT client would be a different download to get just the patcher, since it still costs money to buy VoA (only up to HoT is free). Then, at least they would still make money off of EQEmu players vs forcing us to try to use Live patched clients which are free to everyone. If they want to stop EQEmu, there are much easier ways to do it, though I don't want to give them any ideas lol. I imagine they don't really care as much as you might think they would. So, hopefully EQ1 isn't on Steam right now just because Steam is always slow to get EQ client updates put up on their site.