Rich (BB code):
# 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=0x13da # V
OP_ApproveWorld=0x86c7 # C
OP_LogServer=0x6f79 # C
OP_SendCharInfo=0x4200 # C
OP_ExpansionInfo=0x7e4d # C
OP_GuildsList=0x5b0b # C
OP_EnterWorld=0x51b9 # C
OP_PostEnterWorld=0x5d32 # C
OP_World_Client_CRC1=0x3a18 # C
OP_World_Client_CRC2=0x3e50 # C
OP_SendSpellChecksum=0x46d3 # C
OP_SendSkillCapsChecksum=0x040b # C
# Character Select Related:
OP_DeleteCharacter=0x5ca5 # C
OP_CharacterCreateRequest=0x53a3 # C
OP_CharacterCreate=0x1b85 # C
OP_RandomNameGenerator=0x647a # C 0x440f
OP_ApproveName=0x4f1f # C
OP_MOTD=0x7629 # C 0x2b59
OP_SetChatServer=0x7d90 # C 0x0479
OP_SetChatServer2=0x158f # C 0x158f
OP_ZoneServerInfo=0x1190 # C 0x41c0
OP_WorldComplete=0x441c # C
OP_WorldUnknown001=0x6f9d # C 0x77b1
OP_FloatListThing=0x61ba # V
# Reasons for Disconnect:
OP_ZoneUnavail=0x3288 # C 0x1190
OP_WorldClientReady=0x7d05 # C 0x4786
# Zone in opcodes
OP_AckPacket=0x3594 # V
OP_ZoneEntry=0x4b61 # V
OP_ReqNewZone=0x4118 # V
OP_NewZone=0x43ac # V
OP_ZoneSpawns=0x7114 # ?
OP_PlayerProfile=0x6022 # V
OP_TimeOfDay=0x6015 # V
OP_LevelUpdate=0x6a99 # V
OP_Stamina=0x3d86 # V
OP_RequestClientZoneChange=0x18ea # C
OP_ZoneChange=0x6d37 # C
# Required to fully log in
OP_SpawnAppearance=0x3e17 # V
OP_ChangeSize=0x6942 #
OP_TributeUpdate=0x684c # V
OP_TributeTimer=0x4895 # C
OP_TaskDescription=0x156c # C
OP_TaskActivity=0x31f3 # C
OP_CompletedTasks=0x687f # C
OP_Weather=0x4658 # V
OP_SendAATable=0x6ef9 # V
OP_UpdateAA=0x7bf6 # V
OP_RespondAA=0x1fbd # C 0x2bad
OP_ReqClientSpawn=0x69cd # V
OP_SpawnDoor=0x6f2b # V
OP_GroundSpawn=0x5c85 # V
OP_SendZonepoints=0x2370 # V
OP_SendAAStats=0x78b9 # C
OP_WorldObjectsSent=0x7b73 # V
OP_BlockedBuffs=0x05d5 # V
OP_RemoveBlockedBuffs=0x37c1 # V
OP_ClearBlockedBuffs=0x5570 # C
OP_SendExpZonein=0x47e7 # V
OP_SendTributes=0x6bfb # V
OP_TributeInfo=0x5a67 # V
OP_SendGuildTributes=0x4df0 # C 0x5a01
OP_AAExpUpdate=0x4aa2 # V
OP_ExpUpdate=0x0555 # V
OP_HPUpdate=0x6145 # V
OP_ManaChange=0x569a # C
OP_TGB=0x42ef # C
OP_SpecialMesg=0x016c # V
OP_GuildMemberList=0x51bc # C
OP_GuildMOTD=0x5658 # V
OP_CharInventory=0x47ae # V
OP_WearChange=0x0400 # V
OP_ClientUpdate=0x7062 # V
OP_ClientReady=0x6cdc # V
OP_SetServerFilter=0x2d74 # V
# Guild Opcodes
OP_GetGuildMOTD=0x1899 # C
OP_GetGuildMOTDReply=0x4a5c # C
OP_GuildMemberUpdate=0x0a53 # C
OP_GuildInvite=0x1a58 # C
OP_GuildRemove=0x3c02 # C
OP_GuildPeace=0x2bff # C
OP_SetGuildMOTD=0x053a # C
OP_GuildList=0x5b0b # C
OP_GuildWar=0x5408 # C
OP_GuildLeader=0x0598 # C
OP_GuildDelete=0x3f55 # C
OP_GuildInviteAccept=0x7b64 # C
OP_GuildDemote=0x457d # C
OP_GuildPublicNote=0x2dbd # C
OP_GuildManageBanker=0x1e4c # C
OP_GuildBank=0x0d8a # C
OP_SetGuildRank=0x4ffe # C
OP_GuildUpdateURLAndChannel=0x5232 # C
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
OP_GuildStatus=0x28c8 #
OP_GuildCreate=0x192d #
OP_LFGuild=0x7e23 #
# GM/guide opcodes
OP_GMServers=0x6989 # C
OP_GMBecomeNPC=0x56e7 # C
OP_GMZoneRequest=0x3fd2 # C
OP_GMZoneRequest2=0x538f # C
OP_GMGoto=0x5ebc # C
OP_GMSearchCorpse=0x5a81 # C
OP_GMHideMe=0x28ef # C
OP_GMDelCorpse=0x655c # C
OP_GMApproval=0x7312 # C
OP_GMToggle=0x097f # C 0x7566
OP_GMSummon=0x712b # C
OP_GMEmoteZone=0x1ac1 # C
OP_GMEmoteWorld=0x2444 # C
OP_GMFind=0x6e27 # C
OP_GMKick=0x0402 # C
OP_GMKill=0x799c # C
OP_GMNameChange=0x0f48 # C
OP_GMLastName=0x7bfb # C
OP_InspectAnswer=0x0c2b # C
OP_BeginCast=0x0d5a # C
OP_BuffFadeMsg=0x71bf # C
OP_ConsentResponse=0x0e87 # C
OP_MemorizeSpell=0x3887 # C
OP_SwapSpell=0x5805 # C
OP_CastSpell=0x50c2 # C
OP_Consider=0x3c2d # C
OP_FormattedMessage=0x3b52 # C
OP_SimpleMessage=0x1f4d # C 0x5448
OP_Buff=0x0d1d # C
OP_Illusion=0x231f # C
OP_MoneyOnCorpse=0x4a83 # C
OP_RandomReply=0x6d5d # C
OP_DenyResponse=0x6129 # C
OP_SkillUpdate=0x7f01 # C
OP_GMTrainSkillConfirm=0x3190 # C
OP_RandomReq=0x139d # C
OP_Death=0x7f9e # C
OP_Bind_Wound=0x4b1a # C
OP_GMTraining=0x51fa # C
OP_GMEndTraining=0x5479 # C
OP_GMTrainSkill=0x2257 # C
OP_Animation=0x4a61 # Was 0x47d3
OP_Begging=0x53f9 # C
OP_Consent=0x6bb9 # C
OP_ConsentDeny=0x4cd1 # C
OP_AutoFire=0x5db5 # C
OP_PetCommands=0x7706 # C
OP_DeleteSpell=0x0698 # C
OP_Surname=0x44ae # C
OP_ClearSurname=0x6705 # C
OP_FaceChange=0x37a7 # C
OP_SenseHeading=0x1b8a # C
OP_Action=0x0f14 # C
OP_ConsiderCorpse=0x0a18 # C
OP_HideCorpse=0x2d08 # C 0x1842
OP_CorpseDrag=0x3331 #
OP_CorpseDrop=0x2e70 #
OP_Bug=0x2369 # C
OP_Feedback=0x7705 # C
OP_Report=0x50d0 # C
OP_Damage=0x631a # C or OP_Action2?
OP_ChannelMessage=0x2e79 # C
OP_Assist=0x35b1 # C
OP_AssistGroup=0x194f # C
OP_MoveCoin=0x6024 # C
OP_ZonePlayerToBind=0x382c # C
OP_KeyRing=0x5c06 # C
OP_WhoAllRequest=0x177a # C
OP_WhoAllResponse=0x6ffa # C
OP_FriendsWho=0x6275 # C
OP_ConfirmDelete=0x3edc # V
OP_Logout=0x224f # C
OP_Rewind=0x7d63 # C
OP_TargetCommand=0x756c # C Was 0x5f5e
OP_InspectRequest=0x7c94 # C
OP_Hide=0x3497 # C
OP_Jump=0x083b # C
OP_Camp=0x5f85 # C
OP_Emote=0x3164 # C
OP_SetRunMode=0x3d06 # C
OP_BankerChange=0x300a # C
OP_TargetMouse=0x5f5e # C 0x7bbb
OP_MobHealth=0x15de # C
OP_InitialMobHealth=0x5cb0 # C
OP_TargetHoTT=0x790c # C
OP_XTargetResponse=0x6eb5 #
OP_XTargetRequest=0x4750 #
OP_XTargetAutoAddHaters=0x1a28 #
OP_TargetBuffs=0x3f24 # C
OP_BuffCreate=0x2121 # V
OP_BuffRemoveRequest=0x4065
OP_DeleteSpawn=0x58c5 # C
OP_AutoAttack=0x1df9 # C
OP_AutoAttack2=0x517b # C
OP_Consume=0x24c5 # V
OP_MoveItem=0x2641 # C
OP_DeleteItem=0x66e0 # C
OP_DeleteCharge=0x4ca1 # C
OP_ItemPacket=0x7b6e # C
OP_ItemLinkResponse=0x695c # C
OP_ItemLinkClick=0x3c66 # C
OP_NewSpawn=0x429b # C
OP_Track=0x709d # C
OP_TrackTarget=0x3f49 # C
OP_TrackUnknown=0x03e7 # C
OP_ClickDoor=0x6e97 # C
OP_MoveDoor=0x3154 # C
OP_RemoveAllDoors=0x6215 # C
OP_EnvDamage=0x2730 # C
OP_BoardBoat=0x7554 # C
OP_Forage=0x739b # C
OP_LeaveBoat=0x7286 # C
OP_ControlBoat=0x7ea8 # C
OP_SafeFallSuccess=0x6df7 # C
OP_RezzComplete=0x30a4 # C
OP_RezzRequest=0x32af # C
OP_RezzAnswer=0x2d41 # C
OP_Shielding=0x4675 # C
OP_RequestDuel=0x6cfe # C
OP_MobRename=0x0507 # C
OP_AugmentItem=0x7c87 # C
OP_WeaponEquip1=0x4572 # C
OP_WeaponEquip2=0x399b # C
OP_WeaponUnequip2=0x416b # C
OP_ApplyPoison=0x5cd3 # C
OP_Save=0x6618 # C
OP_TestBuff=0x3415 # C
OP_CustomTitles=0x6a7e # C
OP_Split=0x1418 # C
OP_YellForHelp=0x55a8 # C
OP_LoadSpellSet=0x6617 # C
OP_Bandolier=0x510c # C
OP_PotionBelt=0x0651 # C
OP_DuelResponse=0x41a6 # C
OP_DuelResponse2=0x6d60 # C
OP_SaveOnZoneReq=0x2913 # C
OP_ReadBook=0x465e # C
OP_Dye=0x2137 # C
OP_InterruptCast=0x7566 # C
OP_AAAction=0x2bad # C
OP_LeadershipExpToggle=0x5033 # C
OP_LeadershipExpUpdate=0x074f # C
OP_PurchaseLeadershipAA=0x5f55 # C
OP_UpdateLeadershipAA=0x77ed # C
OP_MarkNPC=0x3ec7 # C
OP_ClearNPCMarks=0x5c29 # C
OP_DoGroupLeadershipAbility=0x0068 # C
OP_GroupLeadershipAAUpdate=0x167b # C
OP_DelegateAbility=0x6e58 # C
OP_SetGroupTarget=0x6b9e # C
OP_Charm=0x1fd5 # C
OP_Stun=0x3d00 # C
OP_SendFindableNPCs=0x6193 # C
OP_FindPersonRequest=0x1e04 # C
OP_FindPersonReply=0x7cae # C
OP_Sound=0x737a # C
OP_PetBuffWindow=0x7b87 # C
OP_LevelAppearance=0x1bd4 # C
OP_Translocate=0x3d9c # C
OP_Sacrifice=0x301b # C
OP_PopupResponse=0x6d27 # C
OP_OnLevelMessage=0x24cb # C
OP_AugmentInfo=0x31b1 # C
OP_Petition=0x31d1 # C
OP_SomeItemPacketMaybe=0x2c27 # C
OP_PVPStats=0x6840 # C
OP_PVPLeaderBoardRequest=0x4973 # C
OP_PVPLeaderBoardReply=0x3842 # C
OP_PVPLeaderBoardDetailsRequest=0x6c75 # C
OP_PVPLeaderBoardDetailsReply=0x7fd7 # C
OP_RestState=0x5d24 # C
OP_RespawnWindow=0x107f # C
OP_DisciplineTimer=0x047c # C
OP_LDoNButton=0x1031 # C
OP_SetStartCity=0x68f0 # C
OP_VoiceMacroIn=0x1524 # C
OP_VoiceMacroOut=0x1d99 # C
OP_ItemViewUnknown=0x4eb3 # C
OP_VetRewardsAvaliable=0x0baa # C Mispelled?
OP_VetClaimRequest=0x34f8 # C
OP_VetClaimReply=0x6a5d # C
OP_CrystalCountUpdate=0x3fc8 # C
OP_DisciplineUpdate=0x6ed3 #
OP_MobUpdate=0x4656 # Same as OP_SpawnPositionUpdate
OP_NPCMoveUpdate=0x0f3e #
OP_CameraEffect=0x6b0e # V
OP_SpellEffect=0x57a3 # V
OP_RemoveNimbusEffect=0x2c77 # C
OP_AltCurrency=0x659e
OP_AltCurrencyMerchantRequest=0x214C
OP_AltCurrencyMerchantReply=0x4348
OP_AltCurrencyPurchase=0x4ad7
OP_AltCurrencySell=0x14cf
OP_AltCurrencySellSelection=0x322a
OP_AltCurrencyReclaim=0x365d
OP_CrystalReclaim=0x726e
OP_CrystalCreate=0x12f3
OP_Untargetable=0x301d
OP_IncreaseStats=0x4acf
OP_DzQuit=0x1539
OP_DzListTimers=0x21e9
OP_DzAddPlayer=0x3657
OP_DzRemovePlayer=0x054e
OP_DzSwapPlayer=0x4661
OP_DzMakeLeader=0x226f
OP_DzPlayerList=0x74e4
OP_DzJoinExpeditionConfirm=0x3c5e
OP_DzJoinExpeditionReply=0x1154
OP_DzExpeditionInfo=0x1150
OP_DzMemberStatus=0x2d17
OP_DzLeaderStatus=0x2caf
OP_DzExpeditionEndsWarning=0x6ac2
OP_DzExpeditionList=0x70d8
OP_DzMemberList=0x15c4
OP_DzCompass=0x01cb
# New Opcodes
OP_SpawnPositionUpdate=0x4656 # C
OP_ManaUpdate=0x0433 # C
OP_EnduranceUpdate=0x6b76 # C
OP_MobManaUpdate=0x7901 # C
OP_MobEnduranceUpdate=0x6c5f # C
# Looting
OP_LootRequest=0x6ad7 # C
OP_EndLootRequest=0x6546 # C
OP_LootItem=0x5960 # C
OP_LootComplete=0x604d # C
# bazaar trader stuff stuff:
OP_BazaarSearch=0x550f # C
OP_TraderDelItem=0x63c8 # C
OP_BecomeTrader=0x0a1d # C
OP_TraderShop=0x2881 # C
OP_Trader=0x0c08 # C
OP_TraderBuy=0x3672 # C
OP_Barter=0x6db5 # C
# pc/npc trading
OP_TradeRequest=0x7113 # C
OP_TradeAcceptClick=0x064a # C
OP_TradeRequestAck=0x606a # C
OP_TradeCoins=0x0149 # C
OP_FinishTrade=0x3ff6 # C
OP_CancelTrade=0x527e # C
OP_TradeMoneyUpdate=0x2a6d # C
OP_MoneyUpdate=0xd677 # C
OP_TradeBusy=0x5ed3 # C
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x3c27 # C
OP_FinishWindow2=0x6759 # C
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x101e # C
OP_ItemVerifyReply=0x21c7 # C
# merchant crap
OP_ShopPlayerSell=0x0b27 # C
OP_ShopRequest=0x442a # C
OP_ShopEnd=0x3753 # C
OP_ShopEndConfirm=0x4578 # C
OP_ShopPlayerBuy=0x436a # C
OP_ShopDelItem=0x63c8 # C
# tradeskill stuff:
OP_ClickObject=0x33e5 # V
OP_ClickObjectAction=0x41b5 # V
OP_ClearObject=0x71d1 # C
OP_RecipeDetails=0x58d9 # C
OP_RecipesFavorite=0x7770 # C
OP_RecipesSearch=0x6948 # C
OP_RecipeReply=0x521c # C
OP_RecipeAutoCombine=0x0322 # C
OP_TradeSkillCombine=0x4212 # C
# Tribute Packets:
OP_OpenGuildTributeMaster=0x5e79 # C
OP_OpenTributeMaster=0x7c24 # C
OP_SelectTribute=0x0c98 # C
OP_TributeItem=0x0b89 # C
OP_TributeMoney=0x314f # C
OP_TributeToggle=0x6dc3 # C
OP_TributePointUpdate=0x15a7 # C
# Adventure packets:
OP_LeaveAdventure=0x3ed4 # C
OP_AdventureFinish=0x6acc # C
OP_AdventureInfoRequest=0x3541 # C
OP_AdventureInfo=0x5cea # C
OP_AdventureRequest=0x2c03 # C
OP_AdventureDetails=0x1d40 # C
OP_AdventureData=0x34f2 # C
OP_AdventureUpdate=0x771f # C
OP_AdventureMerchantRequest=0x4e22 # C
OP_AdventureMerchantResponse=0x4dd5 # C
OP_AdventureMerchantPurchase=0x7b7f # C
OP_AdventureMerchantSell=0x179d # C
OP_AdventurePointsUpdate=0x7537 # C
OP_AdventureStatsRequest=0x4786 # C
OP_AdventureStatsReply=0x38b0 # C
OP_AdventureLeaderboardRequest=0x4cc6 # C
OP_AdventureLeaderboardReply=0x4423 # C
# Group Opcodes
OP_GroupDisband=0x54e8 # C
OP_GroupInvite=0x4f60 # C
OP_GroupFollow=0x7f2b # C
OP_GroupUpdate=0x5331 # C
OP_GroupUpdateB=0x0786 # C
OP_GroupCancelInvite=0x2736 # C - Same as OP_CancelInvite?
OP_GroupAcknowledge=0x3e22 # C
OP_GroupDelete=0x58e6 #
OP_CancelInvite=0x2736 # C
OP_GroupFollow2=0x6c16 # C
OP_GroupInvite2=0x5251 # C
OP_GroupDisbandYou=0x0bd0 # C
OP_GroupDisbandOther=0x49f6 # C
OP_GroupLeaderChange=0x0c33 # C
OP_GroupRoles=0x116d # C
OP_GroupMakeLeader=0x5851
# LFG/LFP Opcodes
OP_LFGCommand=0x2c38 # C
OP_LFGGetMatchesRequest=0x28d4 # C
OP_LFGGetMatchesResponse=0x7a16 # C
OP_LFPGetMatchesRequest=0x189e # C
OP_LFPGetMatchesResponse=0x589f # C
OP_LFPCommand=0x7429 # C
# Raid Opcodes
OP_RaidInvite=0x60b5 # C
OP_RaidUpdate=0x4d8b # C
# Button-push commands
OP_Taunt=0x30e2 # C
OP_CombatAbility=0x36f8 # C
OP_SenseTraps=0x7e45 # C
OP_PickPocket=0x5821 # C
OP_DisarmTraps=0x0000 #
OP_Disarm=0x6def # C
OP_Sneak=0x1d22 # C
OP_Fishing=0x7093 # C
OP_InstillDoubt=0x221a # C
OP_FeignDeath=0x002b # C
OP_Mend=0x10a6 # C
OP_LDoNOpen=0x032b # C
# Task packets
OP_TaskActivityComplete=0x5832 # C
OP_TaskMemberList=0x66ba # C
OP_OpenNewTasksWindow=0x98f6 # C
OP_AvaliableTask=0x6255 # C Mispelled?
OP_AcceptNewTask=0x17d5 # C
OP_TaskHistoryRequest=0x547c # C
OP_TaskHistoryReply=0x4524 # C
OP_CancelTask=0x3bf5 # C
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x4b49 # C
OP_RequestTitles=0x4d3e # C
OP_SendTitleList=0x0d96 # C
OP_SetTitle=0x675c # C
OP_SetTitleReply=0x75f5 # C
# 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
# Login opcodes
OP_SessionReady=0x0001 #
OP_Login=0x0002 #
OP_ServerListRequest=0x0004 #
OP_PlayEverquestRequest=0x000d #
OP_PlayEverquestResponse=0x0021 #
OP_ChatMessage=0x0016 #
OP_LoginAccepted=0x0017 #
OP_ServerListResponse=0x0018 #
OP_Poll=0x0029 #
OP_EnterChat=0x000f #
OP_PollResponse=0x0011 #
Structs
Rich (BB code):
static const uint32 BUFF_COUNT = 25;
/*
** Compiler override to ensure
** byte aligned structures
*/
#pragma pack(1)
struct LoginInfo_Struct {
/*000*/ char login_info[64];
/*064*/ uint8 unknown064[124];
/*188*/ uint8 zoning; // 01 if zoning, 00 if not
/*189*/ uint8 unknown189[275];
/*488*/
};
struct EnterWorld_Struct {
/*000*/ char name[64];
/*064*/ uint32 tutorial; // 01 on "Enter Tutorial", 00 if not
/*068*/ uint32 return_home; // 01 on "Return Home", 00 if not
};
//New For SoF
struct WorldObjectsSent_Struct {
};
/* Name Approval Struct */
/* Len: */
/* Opcode: 0x8B20*/
struct NameApproval
{
char name[64];
int32 race;
int32 class_;
int32 deity;
};
/*
** Entity identification struct
** Size: 4 bytes
** OPCodes: OP_DeleteSpawn, OP_Assist
*/
struct EntityId_Struct
{
/*00*/ uint32 entity_id;
/*04*/
};
struct Duel_Struct
{
int32 duel_initiator;
int32 duel_target;
};
struct DuelResponse_Struct
{
int32 target_id;
int32 entity_id;
int32 unknown;
};
/*
Cofruben:
Adventure stuff,not a net one,just one for our use
*/
static const uint32 ADVENTURE_COLLECT = 0;
static const uint32 ADVENTURE_MASSKILL = 1;
static const uint32 ADVENTURE_NAMED = 2;
static const uint32 ADVENTURE_RESCUE = 3;
struct AdventureInfo {
int32 QuestID;
int32 NPCID;
bool in_use;
int32 status;
bool ShowCompass;
int32 Objetive;// can be item to collect,mobs to kill,boss to kill and someone to rescue.
int32 ObjetiveValue;// number of items,or number of needed mob kills.
char text[512];
int8 type;
int32 minutes;
int32 points;
float x;
float y;
int32 zoneid;
int32 zonedungeonid;
};
///////////////////////////////////////////////////////////////////////////////
/*
** Color_Struct
** Size: 4 bytes
** Used for convenience
** Merth: Gave struct a name so gcc 2.96 would compile
**
*/
struct Color_Struct
{
union
{
struct
{
int8 blue;
int8 green;
int8 red;
uint8 use_tint; // if there's a tint this is FF
} rgb;
uint32 color;
};
};
struct CharSelectEquip {
//totally guessed;
uint32 equip0;
uint32 equip1;
uint32 itemid;
Color_Struct color;
};
struct CharacterSelectEntry_Struct {
/*0000*/ uint8 level; //
/*0000*/ uint8 hairstyle; //
/*0002*/ uint8 gender; //
/*0003*/ char name[1]; //variable length, edi+0
/*0000*/ uint8 beard; //
/*0001*/ 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 Underfoot
};
/*
** Character Selection Struct
**
*/
struct CharacterSelect_Struct {
/*0000*/ int32 char_count; //number of chars in this packet
/*0004*/ int32 total_chars; //total number of chars allowed?
/*0008*/ CharacterSelectEntry_Struct entries[0];
};
/*
* Visible equiptment.
* Size: 12 Octets
*/
struct EquipStruct {
/*00*/ uint32 equip0;
/*04*/ uint32 equip1;
/*08*/ uint32 itemId;
/*12*/
};
/*
** Generic Spawn Struct
** Length: 897 Octets
** Used in:
** spawnZoneStruct
** dbSpawnStruct
** petStruct
** newSpawnStruct
*/
/*
showeq -> eqemu
sed -e 's/_t//g' -e 's/seto_0xFF/set_to_0xFF/g'
*/
struct Spawn_Struct_Bitfields
{
unsigned ispet:1; // Could be 'is summoned pet' rather than just is pet.
unsigned afk:1; // 0=no, 1=afk
unsigned sneak:1;
unsigned lfg:1;
unsigned padding5:1;
unsigned invis:1; // 0 = visible, 1 = invis/sneaking
unsigned padding7:11;
unsigned gm:1;
unsigned anon:2; // 0=normal, 1=anon, 2=roleplay
unsigned gender:2; // Gender (0=male, 1=female, 2=monster)
unsigned linkdead:1; // Toggles LD on or off after name
unsigned betabuffed:1;
unsigned showhelm:1;
unsigned padding26:1;
unsigned targetable:1; // 1 = Targetable 0 = Not Targetable (is_npc?)
unsigned targetable_with_hotkey:1; // is_npc?
unsigned showname:1;
unsigned statue:1;
unsigned trader:1;
unsigned buyer:1;
};
struct Spawn_Struct_Position
{
/*0000*/ signed padding0000:12; // ***Placeholder
signed deltaX:13; // change in x
signed padding0005:7; // ***Placeholder
/*0000*/ signed deltaHeading:10;// change in heading
signed deltaY:13; // change in y
signed padding0006:9; // ***Placeholder
/*0000*/ signed y:19; // y coord
signed animation:13; // animation
/*0000*/ unsigned heading:12; // heading
signed x:19; // x coord
signed padding0014:1; // ***Placeholder
/*0000*/ signed z:19; // z coord
signed deltaZ:13; // change in z
};
struct Spawn_Struct
{
// Note this struct is not used as such, it is here for reference. As the struct is variable sized, the packets
// are constructed in Underfoot.cpp
//
/*0000*/ char name[1]; //name[64];
/*0000*/ //int8 nullterm1; // hack to null terminate name
/*0064*/ uint32 spawnId;
/*0068*/ uint8 level;
/*0069*/ float unknown1;
/*0073*/ uint8 NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
Spawn_Struct_Bitfields Bitfields;
/*0000*/ uint8 otherData; // & 4 - has title, & 8 - has suffix, & 1 - it's a chest or untargetable
/*0000*/ float unknown3; // seen -1
/*0000*/ float unknown4;
/*0000*/ float size;
/*0000*/ uint8 face;
/*0000*/ float walkspeed;
/*0000*/ float runspeed;
/*0000*/ uint32 race;
/*0000*/ uint8 showname; // for body types - was charProperties
/*0000*/ uint32 bodytype;
/*0000*/ //uint32 bodytype2; // this is only present if charProperties==2
// are there more than two possible properties?
/*0000*/ uint8 curHp;
/*0000*/ uint8 haircolor;
/*0000*/ uint8 beardcolor;
/*0000*/ uint8 eyecolor1;
/*0000*/ uint8 eyecolor2;
/*0000*/ uint8 hairstyle;
/*0000*/ uint8 beard;
/*0000*/ uint32 drakkin_heritage;
/*0000*/ uint32 drakkin_tattoo;
/*0000*/ uint32 drakkin_details;
/*0000*/ uint8 statue; // was holding
/*0000*/ uint32 deity;
/*0000*/ uint32 guildID;
/*0000*/ uint32 guildrank; // 0=member, 1=officer, 2=leader, -1=not guilded
/*0000*/ uint8 class_;
/*0000*/ uint8 pvp; // 0 = normal name color, 2 = PVP name color
/*0000*/ uint8 StandState; // stand state - 0x64 for normal animation
/*0000*/ uint8 light;
/*0000*/ uint8 flymode;
/*0000*/ uint8 equip_chest2;
/*0000*/ uint8 unknown9;
/*0000*/ uint8 unknown10;
/*0000*/ uint8 helm;
/*0000*/ char lastName[1];
/*0000*/ //uint8 lastNameNull; //hack!
/*0000*/ uint32 aatitle; // 0=none, 1=general, 2=archtype, 3=class was AARank
/*0000*/ uint8 unknown12;
/*0000*/ uint32 petOwnerId;
/*0000*/ uint8 unknown13;
/*0000*/ uint32 unknown14; // Stance 64 = normal 4 = aggressive 40 = stun/mezzed
/*0000*/ uint32 unknown15;
/*0000*/ uint32 unknown16;
/*0000*/ uint32 unknown17;
/*0000*/ uint32 unknown18;
/*0000*/ uint32 unknown19;
Spawn_Struct_Position Position;
/*0000*/ union
{
struct
{
/*0000*/ Color_Struct color_helmet; // Color of helmet item
/*0000*/ Color_Struct color_chest; // Color of chest item
/*0000*/ Color_Struct color_arms; // Color of arms item
/*0000*/ Color_Struct color_bracers; // Color of bracers item
/*0000*/ Color_Struct color_hands; // Color of hands item
/*0000*/ Color_Struct color_legs; // Color of legs item
/*0000*/ Color_Struct color_feet; // Color of feet item
/*0000*/ Color_Struct color_primary; // Color of primary item
/*0000*/ Color_Struct color_secondary; // Color of secondary item
} equipment_colors;
/*0000*/ Color_Struct colors[9]; // Array elements correspond to struct equipment_colors above
};
// skip these bytes if not a valid player race
/*0000*/ union
{
struct
{
/*0000*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
/*0000*/ EquipStruct equip_chest; // Equiptment: Chest visual
/*0000*/ EquipStruct equip_arms; // Equiptment: Arms visual
/*0000*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
/*0000*/ EquipStruct equip_hands; // Equiptment: Hands visual
/*0000*/ EquipStruct equip_legs; // Equiptment: Legs visual
/*0000*/ EquipStruct equip_feet; // Equiptment: Boots visual
/*0000*/ EquipStruct equip_primary; // Equiptment: Main visual
/*0000*/ EquipStruct equip_secondary; // Equiptment: Off visual
} equip;
/*0000*/ EquipStruct equipment[9];
};
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
/*0000*/ //char suffix[0]; // only read if(hasTitleOrSuffix & 8)
char unknown20[8];
uint8 IsMercenary; // If NPC == 1 and this == 1, then the NPC name is Orange.
/*0000*/ char unknown21[28];
};
/*
** Generic Spawn Struct
** Fields from old struct not yet found:
** int8 traptype; // 65 is disarmable trap, 66 and 67 are invis triggers/traps
** uint8 is_pet; // 0=no, 1=yes
** uint8 afk; // 0=no, 1=afk
** uint8 is_npc; // 0=no, 1=yes
** uint8 max_hp; // (name prolly wrong)takes on the value 100 for players, 100 or 110 for NPCs and 120 for PC corpses...
** int8 guildrank; // 0=normal, 1=officer, 2=leader
** uint8 eyecolor2; //not sure, may be face
** int8 aaitle; // 0=none, 1=general, 2=archtype, 3=class
*/
/*
** New Spawn
** Length: 176 Bytes
** OpCode: 4921
*/
struct NewSpawn_Struct
{
struct Spawn_Struct spawn; // Spawn Information
};
/*
** Client Zone Entry struct
** Length: 68 Octets
** OpCode: ZoneEntryCode (when direction == client)
*/
struct ClientZoneEntry_Struct {
/*0000*/ uint32 unknown0000; // ***Placeholder
/*0004*/ char char_name[64]; // Player firstname [32]
//*0036*/ uint8 unknown0036[28]; // ***Placeholder
//*0064*/ uint32 unknown0064; // unknown
};
/*
** Server Zone Entry Struct
** Length: 452 Bytes
** OPCodes: OP_ServerZoneEntry
**
*/
struct ServerZoneEntry_Struct //Adjusted from SEQ Everquest.h Struct
{
struct NewSpawn_Struct player;
};
//New Zone Struct - Size: 932
struct NewZone_Struct {
/*0000*/ char char_name[64]; // Character Name
/*0064*/ char zone_short_name[32]; // Zone Short Name
/*0096*/ char unknown0096[96];
/*0192*/ char zone_long_name[278]; // Zone Long Name
/*0470*/ uint8 ztype; // Zone type (usually FF)
/*0471*/ uint8 fog_red[4]; // Zone fog (red)
/*0475*/ uint8 fog_green[4]; // Zone fog (green)
/*0479*/ uint8 fog_blue[4]; // Zone fog (blue)
/*0483*/ uint8 unknown323;
/*0484*/ float fog_minclip[4];
/*0500*/ float fog_maxclip[4];
/*0516*/ float gravity;
/*0520*/ int8 time_type;
/*0521*/ uint8 unknown521[49];
/*0570*/ uint8 sky; // Sky Type
/*0571*/ uint8 unknown571[13]; // ***Placeholder
/*0584*/ float zone_exp_multiplier; // Experience Multiplier
/*0588*/ float safe_y; // Zone Safe Y
/*0592*/ float safe_x; // Zone Safe X
/*0596*/ float safe_z; // Zone Safe Z
/*0600*/ float min_z; // Guessed - NEW - Seen 0
/*0604*/ float max_z; // Guessed
/*0608*/ float underworld; // Underworld, min z (Not Sure?)
/*0612*/ float minclip; // Minimum View Distance
/*0616*/ float maxclip; // Maximum View DIstance
/*0620*/ int8 unknown620[84]; // ***Placeholder
/*0704*/ char zone_short_name2[96]; //zone file name? excludes instance number which can be in previous version.
/*0800*/ sint32 unknown800; //seen -1
/*0804*/ char unknown804[40]; //
/*0844*/ sint32 unknown844; //seen 600
/*0848*/ sint32 unknown848;
/*0852*/ uint16 zone_id;
/*0854*/ uint16 zone_instance;
/*0856*/ char unknown856[20];
/*0876*/ uint32 SuspendBuffs;
/*0880*/ uint32 unknown880; //seen 50
/*0884*/ uint32 unknown884; //seen 10
/*0888*/ uint8 unknown888; //seen 1
/*0889*/ uint8 unknown889; //seen 0 (POK) or 1 (rujj)
/*0890*/ uint8 unknown890; //seen 1
/*0891*/ uint8 unknown891; //seen 0
/*0892*/ uint8 unknown892; //seen 0
/*0893*/ uint8 unknown893; //seen 0 - 00
/*0894*/ uint8 fall_damage; // 0 = Fall Damage on, 1 = Fall Damage off
/*0895*/ uint8 unknown895; //seen 0 - 00
/*0896*/ uint32 unknown896; //seen 180
/*0900*/ uint32 unknown900; //seen 180
/*0904*/ uint32 unknown904; //seen 180
/*0908*/ uint32 unknown908; //seen 2
/*0912*/ uint32 unknown912; //seen 2
/*0916*/ float FogDensity; //Of about 10 or so zones tested, all but one have this set to 0.33 Blightfire had 0.16
/*0920*/ uint32 unknown920; //seen 0
/*0924*/ uint32 unknown924; //seen 0
/*0928*/ uint32 unknown928; //seen 0
/*0932*/ uint8 unknown932[12];
};
/*
** Memorize Spell Struct
** Length: 16 Bytes
**
*/
struct MemorizeSpell_Struct {
int32 slot; // Spot in the spell book/memorized slot
int32 spell_id; // Spell id (200 or c8 is minor healing, etc)
int32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
//int32 unknown12;
};
/*
** Make Charmed Pet
** Length: 12 Bytes
**
*/
struct Charm_Struct {
/*00*/ int32 owner_id;
/*04*/ int32 pet_id;
/*08*/ int32 command; // 1: make pet, 0: release pet
/*12*/
};
struct InterruptCast_Struct
{
int32 spawnid;
int32 messageid;
char message[0];
};
struct DeleteSpell_Struct
{
/*000*/sint16 spell_slot;
/*002*/int8 unknowndss002[2];
/*004*/int8 success;
/*005*/int8 unknowndss006[3];
/*008*/
};
struct ManaChange_Struct
{
int32 new_mana; // New Mana AMount
int32 stamina;
int32 spell_id;
int32 unknown12;
int32 unknown16;
};
struct SwapSpell_Struct
{
int32 from_slot;
int32 to_slot;
};
struct BeginCast_Struct
{
// len = 8
/*004*/ int16 caster_id;
/*006*/ int16 spell_id;
/*016*/ int32 cast_time; // in miliseconds
};
struct CastSpell_Struct
{
int32 slot;
int32 spell_id;
int32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
int32 target_id;
int32 cs_unknown[5];
};
/*
** SpawnAppearance_Struct
** Changes client appearance for all other clients in zone
** Size: 8 bytes
** Used in: OP_SpawnAppearance
**
*/
struct SpawnAppearance_Struct
{
/*0000*/ uint16 spawn_id; // ID of the spawn
/*0002*/ uint16 type; // Values associated with the type
/*0004*/ uint32 parameter; // Type of data sent
/*0008*/
};
// Size 76 (was 24)
struct SpellBuff_Struct
{
/*000*/ int8 slotid; // badly named... seems to be 2 for a real buff, 0 otherwise
/*001*/ int8 level;
/*002*/ int8 bard_modifier;
/*003*/ int8 effect; // not real
/*004*/ uint32 unknown004; // Seen 1 for no buff
/*008*/ int32 spellid;
/*012*/ int32 duration;
/*016*/ int32 unknown016;
/*020*/ int32 player_id; // 'global' ID of the caster, for wearoff messages
/*024*/ uint32 counters;
/*028*/ uint8 unknown0028[48];
/*076*/
};
// Not functional yet, but this is what the packet looks like on Underfoot
struct SpellBuffFade_Struct_Underfoot {
/*000*/ uint32 entityid; // Player id who cast the buff
/*004*/ int8 slot;
/*005*/ int8 level;
/*006*/ int8 effect;
/*007*/ int8 unknown7;
/*008*/ float unknown008;
/*012*/ uint32 spellid;
/*016*/ uint32 duration;
/*020*/ uint32 unknown016;
/*024*/ uint32 playerId; // Global player ID?
/*028*/ uint32 unknown020;
/*032*/ uint8 unknown0028[48];
/*080*/ uint32 slotid;
/*084*/ uint32 bufffade;
/*088*/
};
struct SpellBuffFade_Struct {
/*000*/ uint32 entityid;
/*004*/ int8 slot;
/*005*/ int8 level;
/*006*/ int8 effect;
/*007*/ int8 unknown7;
/*008*/ uint32 spellid;
/*012*/ uint32 duration;
/*016*/ uint32 unknown016;
/*020*/ uint32 unknown020; // Global player ID?
/*024*/ uint32 playerId; // Player id who cast the buff
/*028*/ uint32 slotid;
/*032*/ uint32 bufffade;
/*036*/
};
struct BuffRemoveRequest_Struct
{
/*00*/ uint32 SlotID;
/*04*/ uint32 EntityID;
/*08*/
};
struct GMTrainee_Struct
{
/*000*/ uint32 npcid;
/*004*/ uint32 playerid;
/*008*/ uint32 skills[73];
/*300*/ int8 unknown300[148];
/*448*/
};
struct GMTrainEnd_Struct
{
/*000*/ uint32 npcid;
/*004*/ uint32 playerid;
/*008*/
};
struct GMSkillChange_Struct {
/*000*/ int16 npcid;
/*002*/ int8 unknown1[2]; // something like PC_ID, but not really. stays the same thru the session though
/*002*/ int16 skillbank; // 0 if normal skills, 1 if languages
/*002*/ int8 unknown2[2];
/*008*/ uint16 skill_id;
/*010*/ int8 unknown3[2];
};
struct ConsentResponse_Struct {
char grantname[64];
char ownername[64];
int8 permission;
char zonename[64];
};
/*
** Name Generator Struct
** Length: 72 bytes
** OpCode: 0x0290
*/
struct NameGeneration_Struct
{
/*0000*/ int32 race;
/*0004*/ int32 gender;
/*0008*/ char name[64];
/*0072*/
};
/*
** Character Creation struct
** Length: 140 Bytes
** OpCode: 0x009b
*/
struct CharCreate_Struct
{
/*0000*/ int32 class_;
/*0004*/ int32 haircolor;
/*0008*/ int32 beard;
/*0012*/ int32 beardcolor;
/*0016*/ int32 gender;
/*0020*/ int32 race;
/*0024*/ int32 start_zone;
/*0028*/ int32 hairstyle;
/*0032*/ int32 deity;
/*0036*/ int32 STR;
/*0040*/ int32 STA;
/*0044*/ int32 AGI;
/*0048*/ int32 DEX;
/*0052*/ int32 WIS;
/*0056*/ int32 INT;
/*0060*/ int32 CHA;
/*0064*/ int32 face; // Could be unknown0076
/*0068*/ int32 eyecolor1; //its possiable we could have these switched
/*0073*/ int32 eyecolor2; //since setting one sets the other we really can't check
/*0076*/ int32 tutorial;
/*0080*/ int32 drakkin_heritage;
/*0084*/ int32 drakkin_tattoo;
/*0088*/ int32 drakkin_details;
/*0092*/
};
/*
** Character Creation struct
** Length: 0 Bytes
** OpCode: 0x
*/
struct CharCreate_Struct_Temp //Size is now 0
{
};
/*
*Used in PlayerProfile
*/
struct AA_Array
{
int32 AA;
int32 value;
int32 unknown08; // Looks like AA_Array is now 12 bytes in Underfoot
};
static const uint32 MAX_PP_DISCIPLINES = 200;
struct Disciplines_Struct {
uint32 values[MAX_PP_DISCIPLINES];
};
static const uint32 MAX_PLAYER_TRIBUTES = 5;
static const uint32 MAX_PLAYER_BANDOLIER = 20;
static const uint32 MAX_PLAYER_BANDOLIER_ITEMS = 4;
static const uint32 MAX_POTIONS_IN_BELT = 5;
static const uint32 TRIBUTE_NONE = 0xFFFFFFFF;
struct Tribute_Struct {
uint32 tribute;
uint32 tier;
};
//len = 72
struct BandolierItem_Struct {
uint32 item_id;
uint32 icon;
char item_name[64];
};
//len = 320
enum { //bandolier item positions
bandolierMainHand = 0,
bandolierOffHand,
bandolierRange,
bandolierAmmo
};
struct Bandolier_Struct {
char name[32];
BandolierItem_Struct items[MAX_PLAYER_BANDOLIER_ITEMS];
};
struct PotionBelt_Struct {
BandolierItem_Struct items[MAX_POTIONS_IN_BELT];
};
static const uint32 MAX_GROUP_LEADERSHIP_AA_ARRAY = 16;
static const uint32 MAX_RAID_LEADERSHIP_AA_ARRAY = 16;
static const uint32 MAX_LEADERSHIP_AA_ARRAY = (MAX_GROUP_LEADERSHIP_AA_ARRAY+MAX_RAID_LEADERSHIP_AA_ARRAY);
struct LeadershipAA_Struct {
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
};
struct GroupLeadershipAA_Struct {
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
};
struct RaidLeadershipAA_Struct {
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
};
/**
* A bind point.
* Size: 20 Octets
*/
struct BindStruct {
/*000*/ uint32 zoneId;
/*004*/ float x;
/*008*/ float y;
/*012*/ float z;
/*016*/ float heading;
/*020*/
};
/*
** Player Profile
**
** Length: 4308 bytes
** OpCode: 0x006a
*/
static const uint32 MAX_PP_LANGUAGE = 25; //
static const uint32 MAX_PP_SPELLBOOK = 480; // Confirmed 60 pages on Underfoot now
static const uint32 MAX_PP_MEMSPELL = 10; //was 9 now 10 on Underfoot
static const uint32 MAX_PP_SKILL = 75;
static const uint32 MAX_PP_AA_ARRAY = 300; //was 299
static const uint32 MAX_GROUP_MEMBERS = 6;
static const uint32 MAX_RECAST_TYPES = 20;
/*
showeq -> eqemu
sed -e 's/_t//g' -e 's/MAX_AA/MAX_PP_AA_ARRAY/g' \
-e 's/MAX_SPELL_SLOTS/MAX_PP_MEMSPELL/g' \
-e 's/MAX_KNOWN_SKILLS/MAX_PP_SKILL/g' \
-e 's/MAXRIBUTES/MAX_PLAYER_TRIBUTES/g' \
-e 's/MAX_BUFFS/BUFF_COUNT/g' \
-e 's/MAX_KNOWN_LANGS/MAX_PP_LANGUAGE/g' \
-e 's/MAX_RECASTYPES/MAX_RECAST_TYPES/g' \
-e 's/spellBuff/SpellBuff_Struct/g' \
-e 's/lastName/last_name/g' \
-e 's/guildID/guild_id/g' \
-e 's/itemint/item_tint/g' \
-e 's/MANA/mana/g' \
-e 's/curHp/cur_hp/g' \
-e 's/sSpellBook/spell_book/g' \
-e 's/sMemSpells/mem_spells/g' \
-e 's/uint32[ \t]*disciplines\[MAX_DISCIPLINES\]/Disciplines_Struct disciplines/g' \
-e 's/aa_unspent/aapoints/g' \
-e 's/aa_spent/aapoints_spent/g' \
-e 's/InlineItem[ \t]*potionBelt\[MAX_POTIONS_IN_BELT\]/PotionBelt_Struct potionbelt/g' \
-e 's/ldon_guk_points/ldon_points_guk/g' \
-e 's/ldon_mir_points/ldon_points_mir/g' \
-e 's/ldon_mmc_points/ldon_points_mmc/g' \
-e 's/ldon_ruj_points/ldon_points_ruj/g' \
-e 's/ldonak_points/ldon_points_tak/g' \
-e 's/ldon_avail_points/ldon_points_available/g' \
-e 's/tributeTime/tribute_time_remaining/g' \
-e 's/careerTribute/career_tribute_points/g' \
-e 's/currentTribute/tribute_points/g' \
-e 's/tributeActive/tribute_active/g' \
-e 's/TributeStruct/Tribute_Struct/g' \
-e 's/expGroupLeadAA/group_leadership_exp/g' \
-e 's/expRaidLeadAA/raid_leadership_exp/g' \
-e 's/groupLeadAAUnspent/group_leadership_points/g' \
-e 's/raidLeadAAUnspent/raid_leadership_points/g' \
-e 's/uint32[ \t]*leadershipAAs\[MAX_LEAD_AA\]/LeadershipAA_Struct leader_abilities/g' \
-e 's/BandolierStruct/Bandolier_Struct/g' \
-e 's/MAX_BANDOLIERS/MAX_PLAYER_BANDOLIER/g' \
-e 's/birthdayTime/birthday/g' \
-e 's/lastSaveTime/lastlogin/g' \
-e 's/zoneId/zone_id/g' \
-e 's/hunger/hunger_level/g' \
-e 's/thirst/thirst_level/g' \
-e 's/guildstatus/guildrank/g' \
-e 's/airRemaining/air_remaining/g' \
*/
// Underfoot May 5 2010 - Size 25312 + 1320
// Underfoot May 12 2010 - Size 26632
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
/*00208*/ uint8 unknown00208[14]; // 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
/*00236*/ union
{
struct
{
/*00236*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
/*00248*/ EquipStruct equip_chest; // Equiptment: Chest visual
/*00260*/ EquipStruct equip_arms; // Equiptment: Arms visual
/*00272*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
/*00284*/ EquipStruct equip_hands; // Equiptment: Hands visual
/*00296*/ EquipStruct equip_legs; // Equiptment: Legs visual
/*00308*/ EquipStruct equip_feet; // Equiptment: Boots visual
/*00320*/ EquipStruct equip_primary; // Equiptment: Main visual
/*00332*/ EquipStruct equip_secondary; // Equiptment: Off visual
} equip;
/*00236*/ EquipStruct equipment[9]; //Underfoot Shows [108] for this part
};
/*00344*/ uint8 unknown00344[168]; // Underfoot Shows [160]
/*00512*/ Color_Struct item_tint[9]; // RR GG BB 00
/*00548*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each
/*04148*/ uint32 points; // Unspent Practice points - RELOCATED???
/*04152*/ uint32 mana; // Current mana
/*04156*/ uint32 cur_hp; // Current HP without +HP equipment
/*04160*/ uint32 STR; // Strength - 6e 00 00 00 - 110
/*04164*/ uint32 STA; // Stamina - 73 00 00 00 - 115
/*04168*/ uint32 CHA; // Charisma - 37 00 00 00 - 55
/*04172*/ uint32 DEX; // Dexterity - 50 00 00 00 - 80
/*04176*/ uint32 INT; // Intelligence - 3c 00 00 00 - 60
/*04180*/ uint32 AGI; // Agility - 5f 00 00 00 - 95
/*04184*/ uint32 WIS; // Wisdom - 46 00 00 00 - 70
/*04188*/ uint8 unknown04188[28]; //
/*04216*/ uint8 face; // Player face - Actually int32?
/*04217*/ uint8 unknown04217[147]; // was [175]
/*04364*/ int32 spell_book[MAX_PP_SPELLBOOK]; // List of the Spells in spellbook 720 = 90 pages [2880] was [1920]
/*06284*/ uint8 unknown06284[960]; // Spacer for the end of the book for now (pages 60 to 90)
/*07244*/ int32 mem_spells[MAX_PP_MEMSPELL]; // List of spells memorized
/*07284*/ uint8 unknown07284[28]; //#### uint8 unknown04396[32]; in Titanium ####[28]
/*07312*/ uint32 platinum; // Platinum Pieces on player
/*07316*/ uint32 gold; // Gold Pieces on player
/*07320*/ uint32 silver; // Silver Pieces on player
/*07324*/ uint32 copper; // Copper Pieces on player
/*07328*/ uint32 platinum_cursor; // Platinum Pieces on cursor
/*07332*/ uint32 gold_cursor; // Gold Pieces on cursor
/*07336*/ uint32 silver_cursor; // Silver Pieces on cursor
/*07340*/ uint32 copper_cursor; // Copper Pieces on cursor
/*07344*/ uint32 skills[MAX_PP_SKILL]; // [300] List of skills
/*07644*/ uint8 unknown07644[236];
/*07880*/ uint32 toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
/*07884*/ uint32 thirst_level; // Drink (ticks till next drink)
/*07888*/ uint32 hunger_level; // Food (ticks till next eat)
/*07892*/ SpellBuff_Struct buffs[BUFF_COUNT]; // [1900] Buffs currently on the player (30 Max) - (Each Size 76)
/*09792*/ uint8 unknown09792[380]; // BUFF_COUNT has been left at 25. These are the extra 5 buffs in Underfoot
/*10172*/ Disciplines_Struct disciplines; // [400] Known disciplines
/*10972*/ uint32 recastTimers[MAX_RECAST_TYPES]; // Timers (UNIX Time of last use)
/*11052*/ uint8 unknown11052[160]; // Some type of Timers
/*11212*/ uint32 endurance; // Current endurance
/*11216*/ uint8 unknown11216[20]; // ?
/*11236*/ uint32 aapoints_spent; // Number of spent AA points
/*11240*/ uint32 aapoints; // Unspent AA points
/*11244*/ uint8 unknown11244[4];
/*11248*/ Bandolier_Struct bandoliers[MAX_PLAYER_BANDOLIER]; // [6400] bandolier contents
/*17648*/ PotionBelt_Struct potionbelt; // [360] potion belt 72 extra octets by adding 1 more belt slot
/*18008*/ uint8 unknown18008[8];
/*18016*/ uint32 available_slots;
/*18020*/ uint8 unknown18020[80]; //
//END SUB-STRUCT used for shrouding.
/*18100*/ char name[64]; // Name of player
/*18164*/ char last_name[32]; // Last name of player
/*18196*/ uint8 unknown18196[8]; //#### Not In Titanium #### new to SoF[12]
/*18204*/ int32 guild_id; // guildid
/*18208*/ uint32 birthday; // character birthday
/*18212*/ uint32 lastlogin; // character last save time
/*18216*/ uint32 account_startdate; // Date the Account was started - New Field for Underfoot***
/*18220*/ uint32 timePlayedMin; // time character played
/*18224*/ uint8 pvp; // 1=pvp, 0=not pvp
/*18225*/ uint8 anon; // 2=roleplay, 1=anon, 0=not anon
/*18226*/ uint8 gm; // 0=no, 1=yes (guessing!)
/*18227*/ int8 guildrank; // 0=member, 1=officer, 2=guildleader -1=no guild
/*18228*/ uint32 guildbanker;
/*18232*/ uint8 unknown18232[4]; //was [8]
/*18236*/ uint32 exp; // Current Experience
/*18240*/ uint8 unknown18240[8];
/*18248*/ uint32 timeentitledonaccount;
/*18252*/ uint8 languages[MAX_PP_LANGUAGE]; // List of languages
/*18277*/ uint8 unknown18277[7]; //#### uint8 unknown13109[4]; in Titanium ####[7]
/*18284*/ float y; // Players y position (NOT positive about this switch)
/*18288*/ float x; // Players x position
/*18292*/ float z; // Players z position
/*18296*/ float heading; // Players heading
/*18300*/ uint8 unknown18300[4]; // ***Placeholder
/*18304*/ uint32 platinum_bank; // Platinum Pieces in Bank
/*18308*/ uint32 gold_bank; // Gold Pieces in Bank
/*18312*/ uint32 silver_bank; // Silver Pieces in Bank
/*18316*/ uint32 copper_bank; // Copper Pieces in Bank
/*18320*/ uint32 platinum_shared; // Shared platinum pieces
/*18324*/ uint8 unknown18324[1036]; // was [716]
/*19360*/ uint32 expansions; // Bitmask for expansions ff 7f 00 00 - SoD
/*19364*/ uint8 unknown19364[12];
/*19376*/ uint32 autosplit; // 0 = off, 1 = on
/*19380*/ uint8 unknown19380[16];
/*19396*/ uint16 zone_id; // see zones.h
/*19398*/ uint16 zoneInstance; // Instance id
/*19400*/ char groupMembers[MAX_GROUP_MEMBERS][64];// 384 all the members in group, including self
/*19784*/ char groupLeader[64]; // Leader of the group ?
/*19848*/ uint8 unknown19848[540]; // was [348]
/*20388*/ uint32 entityid;
/*20392*/ uint32 leadAAActive; // 0 = leader AA off, 1 = leader AA on
/*20396*/ uint8 unknown20396[4];
/*20400*/ sint32 ldon_points_guk; // Earned GUK points
/*20404*/ sint32 ldon_points_mir; // Earned MIR points
/*20408*/ sint32 ldon_points_mmc; // Earned MMC points
/*20412*/ sint32 ldon_points_ruj; // Earned RUJ points
/*20416*/ sint32 ldon_points_tak; // Earned TAK points
/*20420*/ sint32 ldon_points_available; // Available LDON points
/*20424*/ uint32 unknown20424[7];
/*20452*/ uint32 unknown20452;
/*20456*/ uint32 unknown20456;
/*20460*/ uint8 unknown20460[4];
/*20464*/ uint32 unknown20464[6];
/*20488*/ uint8 unknown20488[72]; // was [136]
/*20560*/ float tribute_time_remaining; // Time remaining on tribute (millisecs)
/*20564*/ uint32 career_tribute_points; // Total favor points for this char
/*20568*/ uint32 unknown20546; // *** Placeholder
/*20572*/ uint32 tribute_points; // Current tribute points
/*20576*/ uint32 unknown20572; // *** Placeholder
/*20580*/ uint32 tribute_active; // 0 = off, 1=on
/*20584*/ Tribute_Struct tributes[MAX_PLAYER_TRIBUTES]; // [40] Current tribute loadout
/*20624*/ uint8 unknown20620[4];
/*20628*/ double group_leadership_exp; // Current group lead exp points
/*20636*/ double raid_leadership_exp; // Current raid lead AA exp points
/*20644*/ uint32 group_leadership_points; // Unspent group lead AA points
/*20648*/ uint32 raid_leadership_points; // Unspent raid lead AA points
/*20652*/ LeadershipAA_Struct leader_abilities; // [128]Leader AA ranks 19332
/*20780*/ uint8 unknown20776[128]; // was [128]
/*20908*/ uint32 air_remaining; // Air supply (seconds)
/*20912*/ uint32 PVPKills;
/*20916*/ uint32 PVPDeaths;
/*20920*/ uint32 PVPCurrentPoints;
/*20924*/ uint32 PVPCareerPoints;
/*20928*/ uint32 PVPBestKillStreak;
/*20932*/ uint32 PVPWorstDeathStreak;
/*20936*/ uint32 PVPCurrentKillStreak;
/*20940*/ PVPStatsEntry_Struct PVPLastKill; // size 88
/*21028*/ PVPStatsEntry_Struct PVPLastDeath; // size 88
/*21116*/ uint32 PVPNumberOfKillsInLast24Hours;
/*21120*/ PVPStatsEntry_Struct PVPRecentKills[50]; // size 4400 - 88 each
/*25520*/ uint32 expAA; // Exp earned in current AA point
/*25524*/ uint8 unknown25524[40];
/*25564*/ uint32 currentRadCrystals; // Current count of radiant crystals
/*25568*/ uint32 careerRadCrystals; // Total count of radiant crystals ever
/*25572*/ uint32 currentEbonCrystals; // Current count of ebon crystals
/*25576*/ uint32 careerEbonCrystals; // Total count of ebon crystals ever
/*25580*/ uint8 groupAutoconsent; // 0=off, 1=on
/*25581*/ uint8 raidAutoconsent; // 0=off, 1=on
/*25582*/ uint8 guildAutoconsent; // 0=off, 1=on
/*25583*/ uint8 unknown25583; // ***Placeholder (6/29/2005)
/*25584*/ uint32 level3; // SoF looks at the level here to determine how many leadership AA you can bank.
/*25588*/ uint32 showhelm; // 0=no, 1=yes
/*25592*/ uint32 RestTimer;
/*25596*/ uint8 unknown25596[1036]; // ***Placeholder (2/13/2007) was[1028]or[940]or[1380] - END of Struct
/*26632*/
};
/**
* Shroud spawn. For others shrouding, this has their spawnId and
* spawnStruct.
*
* Length: 586
* OpCode: OP_Shroud
*/
//struct spawnShroudOther_Struct
//{
//*0000*/ uint32 spawnId; // Spawn Id of the shrouded player
//*0004*/ spawn_Struct spawn; // Updated spawn struct for the player
//*0586*/
//};
/**
* Shroud yourself. For yourself shrouding, this has your spawnId, spawnStruct,
* bits of your charProfileStruct (no checksum, then charProfile up till
* but not including name), and an itemPlayerPacket for only items on the player
* and not the bank.
*
* Length: Variable
* OpCode: OP_Shroud
*/
//struct spawnShroudSelf_Struct
//{
//*00000*/ uint32 spawnId; // Spawn Id of you
//*00004*/ spawn_Struct spawn; // Updated spawnStruct for you
//*00586*/ PlayerProfile_Struct profile; // Character profile for shrouded char
//*13522*/ uint8 items; // Items on the player
/*xxxxx*/
//};
/*
** Client Target Struct
** Length: 2 Bytes
** OpCode: 6221
*/
struct ClientTarget_Struct {
/*000*/ int32 new_target; // Target ID
};
/*
** Target Rejection Struct
** Length: 12 Bytes
** OpCode: OP_TargetReject
*/
struct TargetReject_Struct {
/*00*/ uint8 unknown00[12];
};
struct PetCommand_Struct {
/*000*/ int32 command;
/*004*/ int32 unknown;
};
/*
** Delete Spawn
** Length: 4 Bytes
** OpCode: OP_DeleteSpawn
*/
struct DeleteSpawn_Struct
{
/*00*/ int32 spawn_id; // Spawn ID to delete
/*04*/
};
/*
** Channel Message received or sent
** Length: 144 Bytes + Variable Length + 1
** OpCode: OP_ChannelMessage
**
*/
struct ChannelMessage_Struct
{
/*000*/ char targetname[64]; // Tell recipient
/*064*/ char sender[64]; // The senders name (len might be wrong)
/*128*/ int32 language; // Language
/*132*/ int32 chan_num; // Channel
/*136*/ int32 cm_unknown4[2]; // ***Placeholder
/*144*/ int32 skill_in_language; // The players skill in this language? might be wrong
/*148*/ char message[0]; // Variable length message
};
/*
** Special Message
** Length: 4 Bytes + Variable Text Length + 1
** OpCode: OP_SpecialMesg
**
*/
/*
Theres something wrong with this... example live packet:
Server->Client: [ Opcode: OP_SpecialMesg (0x0fab) Size: 244 ]
0: 01 02 00 0A 00 00 00 09 - 05 00 00 42 61 72 73 74 | ...........Barst
16: 72 65 20 53 6F 6E 67 77 - 65 61 76 65 72 00 7C F9 | re Songweaver.|.
32: FF FF 84 FF FF FF 03 00 - 00 00 47 72 65 65 74 69 | ..........Greeti
*/
struct SpecialMesg_Struct
{
/*00*/ char header[3]; // 04 04 00 <-- for #emote style msg
/*03*/ uint32 msg_type; // Color of text (see MT_*** below)
/*07*/ uint32 target_spawn_id; // Who is it being said to?
/*11*/ char sayer[1]; // Who is the source of the info - Was 1
/*12*/ uint8 unknown12[12];
/*24*/ char message[128]; // What is being said? - was 128
};
/*
** When somebody changes what they're wearing
** or give a pet a weapon (model changes)
** Length: 19 Bytes
*/
struct WearChange_Struct{
/*000*/ int16 spawn_id;
/*002*/ int32 material;
/*006*/ uint32 unknown06;
/*010*/ uint32 c; // 1 for Drakkin Elite Material
/*014*/ Color_Struct color;
/*018*/ int8 wear_slot_id;
/*019*/
};
/*
** Type: Bind Wound Structure
** Length: 8 Bytes
*/
//Fixed for 7-14-04 patch
struct BindWound_Struct
{
/*000*/ int16 to; // TargetID
/*002*/ int16 unknown2; // ***Placeholder
/*004*/ int16 type;
/*006*/ int16 unknown6;
};
/*
** Type: Zone Change Request (before hand)
** Length: 88 bytes
** OpCode: a320
*/
struct ZoneChange_Struct {
/*000*/ char char_name[64]; // Character Name
/*064*/ uint16 zoneID;
/*066*/ uint16 instanceID;
/*068*/ float y;
/*072*/ float x;
/*076*/ float z;
/*080*/ int32 zone_reason; //0x0A == death, I think
/*084*/ sint32 success; // =0 client->server, =1 server->client, -X=specific error
/*088*/
};
struct RequestClientZoneChange_Struct {
/*00*/ uint16 zone_id;
/*02*/ uint16 instance_id;
/*04*/ float y;
/*08*/ float x;
/*12*/ float z;
/*16*/ float heading;
/*20*/ uint32 type; //unknown... values
};
struct Animation_Struct {
/*00*/ int16 spawnid;
/*02*/ int8 action;
/*03*/ int8 value;
/*04*/
};
// solar: this is what causes the caster to animate and the target to
// get the particle effects around them when a spell is cast
// also causes a buff icon
struct Action_Struct
{
/*00*/ int16 target; // id of target
/*02*/ int16 source; // id of caster
/*04*/ uint16 level; // level of caster - Seen 0
/*06*/ uint32 unknown06;
/*10*/ uint16 instrument_focus;
/*12*/ uint16 unknown12; // seems to always be set to something and it doesn't change between casts except in special cases like changing instrument mods
/*14*/ uint32 unknown14; // seen 0
/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again
/*22*/ uint32 unknown22;
/*26*/ uint8 type;
/*27*/ uint32 damage;
/*31*/ uint16 unknown31;
/*33*/ int16 spell; // spell id being cast
/*35*/ int8 level2; // level of caster again? Or maybe the castee
/*36*/ int8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
};
// Starting with 2/21/2006, OP_Actions seem to come in pairs, duplicating
// themselves, with the second one with slightly more information. Maybe this
// has to do with buff blocking??
struct ActionAlt_Struct
{
/*00*/ int16 target; // id of target
/*02*/ int16 source; // id of caster
/*04*/ uint16 level; // level of caster - Seen 0
/*06*/ uint32 unknown06;
/*10*/ float instrument_mod;
/*14*/ uint32 unknown14; // seen 0
/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again
/*22*/ uint32 unknown22;
/*26*/ uint8 type;
/*27*/ uint32 damage;
/*31*/ uint16 unknown31;
/*33*/ int16 spell; // spell id being cast
/*35*/ int8 level2; // level of caster again? Or maybe the castee
/*36*/ int8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
/*37*/ int32 unknown37; // New field to Underfoot - Seen 14
/*41*/ int8 unknown41; // New field to Underfoot - Seen 0
/*42*/ int8 unknown42; // New field to Underfoot - Seen 0
/*43*/ int8 unknown43; // New field to Underfoot - Seen 0
/*44*/ int32 unknown44; // New field to Underfoot - Seen 23
/*48*/ int32 unknown48; // New field to Underfoot - Seen -1
/*52*/ int32 unknown52; // New field to Underfoot - Seen -1
/*56*/ int32 unknown56; // New field to Underfoot - Seen 0
/*60*/ int32 unknown60; // New field to Underfoot - Seen 0
/*64*/
};
// solar: this is what prints the You have been struck. and the regular
// melee messages like You try to pierce, etc. It's basically the melee
// and spell damage message
struct CombatDamage_Struct
{
/* 00 */ int16 target;
/* 02 */ int16 source;
/* 04 */ int8 type; //slashing, etc. 231 (0xE7) for spells
/* 05 */ int16 spellid;
/* 07 */ sint32 damage;
/* 11 */ float unknown11; // cd cc cc 3d
/* 15 */ float sequence; // see above notes in Action_Struct
/* 19 */ uint8 unknown19[9]; // was [9]
/* 28 */
};
/*
** Consider Struct
** Length: 20 Bytes
*/
struct Consider_Struct{
/*000*/ uint32 playerid; // PlayerID
/*004*/ uint32 targetid; // TargetID
/*008*/ int32 faction; // Faction
/*012*/ int32 level; // Level
/*016*/ int8 pvpcon; // Pvp con flag 0/1
/*017*/ int8 unknown017[3]; //
/*020*/
};
/*
** Spawn Death Blow
** Length: 32 Bytes
** OpCode: 0114
*/
struct Death_Struct
{
/*000*/ int32 spawn_id;
/*004*/ int32 killer_id;
/*008*/ int32 corpseid; // was corpseid
/*012*/ int32 attack_skill; // was type
/*016*/ int32 spell_id;
/*020*/ int32 bindzoneid; //bindzoneid?
/*024*/ int32 damage;
/*028*/ int32 unknown028;
};
struct BecomeCorpse_Struct {
int32 spawn_id;
float y;
float x;
float z;
};
struct ZonePlayerToBind_Struct {
/*000*/ uint16 bind_zone_id;
/*002*/ uint16 bind_instance_id;
/*004*/ float x;
/*008*/ float y;
/*012*/ float z;
/*016*/ float heading;
/*020*/ char zone_name[1]; // Or "Bind Location"
/*000*/ uint8 unknown021; // Seen 1 - Maybe 0 would be to force a rezone and 1 is just respawn
/*000*/ uint32 unknown022; // Seen 32 or 59
/*000*/ uint32 unknown023; // Seen 0
/*000*/ uint32 unknown024; // Seen 21 or 43
};
struct ZonePlayerToBindHeader_Struct
{
/*000*/ uint16 bind_zone_id;
/*002*/ uint16 bind_instance_id;
/*004*/ float x;
/*008*/ float y;
/*012*/ float z;
/*016*/ float heading;
/*020*/ char zone_name[1]; // Or "Bind Location"
};
struct ZonePlayerToBindFooter_Struct
{
/*000*/ uint8 unknown021; // Seen 1 - Maybe 0 would be to force a rezone and 1 is just respawn
/*000*/ uint32 unknown022; // Seen 32 or 59
/*000*/ uint32 unknown023; // Seen 0
/*000*/ uint32 unknown024; // Seen 21 or 43
};
typedef struct {
/*000*/ uint32 bind_number; // Number of this bind in the iteration
/*004*/ uint32 bind_zone_id; // ID of the zone for this bind point or resurect point
/*008*/ float x; // X loc for this bind point
/*012*/ float y; // Y loc for this bind point
/*016*/ float z; // Z loc for this bind point
/*020*/ float heading; // Heading for this bind point
/*024*/ char bind_zone_name[1]; // Or "Bind Location" or "Resurrect"
/*000*/ uint8 validity; // 0 = valid choice, 1 = not a valid choice at this time (resurrection)
} RespawnOptions_Struct;
struct RespawnWindow_Struct {
/*000*/ uint32 unknown000; // Seen 0
/*004*/ uint32 time_remaining; // Total time before respawn in milliseconds
/*008*/ uint32 unknown008; // Seen 0
/*012*/ uint32 total_binds; // Total Bind Point Options? - Seen 2
/*016*/ RespawnOptions_Struct bind_points;
// First bind point is "Bind Location" and the last one is "Ressurect"
};
/*
** Spawn position update - Size: 22
** Struct sent from server->client to update position of
** another spawn's position update in zone (whether NPC or PC)
**
*/
struct PlayerPositionUpdateServer_Struct
{
/*0000*/ uint16 spawn_id;
/*0002*/ signed padding0000:12; // ***Placeholder
signed delta_x:13; // change in x
signed padding0005:7; // ***Placeholder
/*0006*/ signed delta_heading:10;// change in heading
signed delta_y:13; // change in y
signed padding0006:9; // ***Placeholder
/*0010*/ signed y_pos:19; // y coord
signed animation:10; // animation
signed padding0010:3; // ***Placeholder
/*0014*/ unsigned heading:12; // heading
signed x_pos:19; // x coord
signed padding0014:1; // ***Placeholder
/*0018*/ signed z_pos:19; // z coord
signed delta_z:13; // change in z
/*0022*/
};
/*
** Player position update - Size: 40
** Struct sent from client->server to update
** player position on server
**
*/
struct PlayerPositionUpdateClient_Struct
{
/*0000*/ uint16 spawn_id; // Player's spawn id
/*0002*/ uint16 sequence; // increments one each packet - Verified
/*0004*/ uint8 unknown0004[4]; // ***Placeholder
/*0008*/ float x_pos; // x coord (2nd loc value)
/*0012*/ float y_pos; // y coord (1st loc value)
/*0016*/ signed delta_heading:10; // change in heading
unsigned padding0036:10; // animation
unsigned padding0016:12; // ***Placeholder
/*0020*/ float delta_x; // Change in x
/*0024*/ float delta_y; // Change in y
/*0028*/ float z_pos; // z coord (3rd loc value)
/*0032*/ float delta_z; // Change in z
/*0036*/ unsigned animation:10; // ***Placeholder
unsigned heading:12; // Directional heading
unsigned padding0037:10; // ***Placeholder
/*0040*/
};
/*
** Spawn HP Update
** Length: 10 Bytes
** OpCode: OP_HPUpdate
*/
struct SpawnHPUpdate_Struct
{
/*00*/ uint32 cur_hp; // Id of spawn to update
/*04*/ sint32 max_hp; // Maximum hp of spawn
/*08*/ sint16 spawn_id; // Current hp of spawn
/*10*/
};
/*
** SendExpZonein
** Length: 152 Bytes
** OpCode: OP_SendExpZonein
*/
struct SendExpZonein_Struct
{
/*0000*/ uint16 spawn_id; // ID of the spawn
/*0002*/ uint16 type; // Values associated with the type
/*0004*/ uint32 parameter; // Type of data sent
/*0008*/ uint32 exp; // Current experience ratio from 0 to 330
/*0012*/ uint32 expAA;
/*0016*/ uint8 unknown0016[4];
/*0020*/ char name[64];
/*0084*/ char last_name[64];
/*00148*/ int32 unknown132;
/*00152*/
};
/*
** SendExpZonein
** Length: 0 Bytes
** OpCode: OP_SendExpZonein
*/
//struct SendExpZonein_Struct {};
struct SpawnHPUpdate_Struct2
{
/*01*/ sint16 spawn_id;
/*00*/ int8 hp;
};
/*
** Stamina
** Length: 8 Bytes
** OpCode: 5721
*/
struct Stamina_Struct {
/*00*/ int32 food; // (low more hungry 127-0)
/*02*/ int32 water; // (low more thirsty 127-0)
};
/*
** Level Update
** Length: 12 Bytes
*/
struct LevelUpdate_Struct
{
/*00*/ uint32 level; // New level
/*04*/ uint32 level_old; // Old level
/*08*/ uint32 exp; // Current Experience
};
/*
** Experience Update
** Length: 14 Bytes
** OpCode: 9921
*/
struct ExpUpdate_Struct
{
/*0000*/ uint32 exp; // Current experience ratio from 0 to 330
/*0004*/ uint32 aaxp; // @BP ??
};
/*
** Item Packet Struct - Works on a variety of opcodes
** Packet Types: See ItemPacketType enum
**
*/
enum ItemPacketType
{
ItemPacketViewLink = 0x00,
ItemPacketTradeView = 0x65,
ItemPacketLoot = 0x66,
ItemPacketTrade = 0x67,
ItemPacketCharInventory = 0x69,
ItemPacketSummonItem = 0x6A,
ItemPacketTributeItem = 0x6C,
ItemPacketMerchant = 0x64,
ItemPacketWorldContainer = 0x6B
};
struct ItemPacket_Struct
{
/*00*/ ItemPacketType PacketType;
/*04*/ char SerializedItem[1]; //was 1
/*xx*/
};
struct BulkItemPacket_Struct
{
/*00*/ char SerializedItem[0];
/*xx*/
};
struct Consume_Struct
{
/*0000*/ int32 slot;
/*0004*/ int32 auto_consumed; // 0xffffffff when auto eating e7030000 when right click
/*0008*/ int8 c_unknown1[4];
/*0012*/ int8 type; // 0x01=Food 0x02=Water
/*0013*/ int8 unknown13[3];
/*0016*/
};
struct ItemNamePacket_Struct {
/*000*/ uint32 item_id;
/*004*/ uint32 unkown004;
/*008*/ char name[64];
/*072*/
};
// Length: 16
struct ItemProperties_Struct_Old {
/*000*/ int8 unknown01[2];
/*002*/ int8 charges;
/*003*/ int8 unknown02[13];
/*016*/
};
// Length: 8
struct ItemProperties_Struct {
/*000*/ int8 unknown01[4];
/*004*/ int8 charges;
/*005*/ int8 unknown02[3];
/*008*/
};
struct DeleteItem_Struct {
/*0000*/ uint32 from_slot;
/*0004*/ uint32 to_slot;
/*0008*/ uint32 number_in_stack;
/*0012*/
};
struct MoveItem_Struct
{
/*0000*/ uint32 from_slot;
/*0004*/ uint32 to_slot;
/*0008*/ uint32 number_in_stack;
/*0012*/
};
//
// from_slot/to_slot
// -1 - destroy
// 0 - cursor
// 1 - inventory
// 2 - bank
// 3 - trade
// 4 - shared bank
//
// cointype
// 0 - copeer
// 1 - silver
// 2 - gold
// 3 - platinum
//
static const uint32 COINTYPE_PP = 3;
static const uint32 COINTYPE_GP = 2;
static const uint32 COINTYPE_SP = 1;
static const uint32 COINTYPE_CP = 0;
struct MoveCoin_Struct
{
sint32 from_slot;
sint32 to_slot;
sint32 cointype1;
sint32 cointype2;
sint32 amount;
};
struct TradeCoin_Struct{
int32 trader;
int8 slot;
int16 unknown5;
int8 unknown7;
int32 amount;
};
struct TradeMoneyUpdate_Struct{
int32 trader;
int32 type;
int32 amount;
};
/*
** Surname struct
** Size: 100 bytes
*/
struct Surname_Struct
{
/*0000*/ char name[64];
/*0064*/ uint32 unknown0064;
/*0068*/ char lastname[32];
/*0100*/
};
struct GuildsListEntry_Struct {
char name[64];
};
static const uint32 MAX_NUMBER_GUILDS = 1500;
struct GuildsList_Struct {
int8 head[64]; // First on guild list seems to be empty...
GuildsListEntry_Struct Guilds[MAX_NUMBER_GUILDS];
};
struct GuildUpdate_Struct {
int32 guildID;
GuildsListEntry_Struct entry;
};
/*
** Money Loot
** Length: 22 Bytes
** OpCode: 5020
*/
struct moneyOnCorpseStruct {
/*0000*/ uint8 response; // 0 = someone else is, 1 = OK, 2 = not at this time
/*0001*/ uint8 unknown1; // = 0x5a
/*0002*/ uint8 unknown2; // = 0x40
/*0003*/ uint8 unknown3; // = 0
/*0004*/ uint32 platinum; // Platinum Pieces
/*0008*/ uint32 gold; // Gold Pieces
/*0012*/ uint32 silver; // Silver Pieces
/*0016*/ uint32 copper; // Copper Pieces
};
struct LootingItem_Struct {
/*000*/ int32 lootee;
/*004*/ int32 looter;
/*008*/ int32 slot_id;
/*012*/ int32 auto_loot;
/*016*/ int32 unknown16;
/*020*/
};
struct GuildManageStatus_Struct{
int32 guildid;
int32 oldrank;
int32 newrank;
char name[64];
};
// Guild invite, remove
struct GuildJoin_Struct{
/*000*/ int32 guild_id;
/*004*/ int32 unknown04;
/*008*/ int32 level;
/*012*/ int32 class_;
/*016*/ int32 rank;//0 member, 1 officer, 2 leader
/*020*/ int32 zoneid;
/*024*/ int32 unknown24;
/*028*/ char name[64];
/*092*/
};
struct GuildInviteAccept_Struct {
char inviter[64];
char newmember[64];
int32 response;
int32 guildeqid;
};
struct GuildManageRemove_Struct {
int32 guildeqid;
char member[64];
};
struct GuildCommand_Struct {
char othername[64];
char myname[64];
int16 guildeqid;
int8 unknown[2]; // for guildinvite all 0's, for remove 0=0x56, 2=0x02
int32 officer;
};
// Opcode OP_GMZoneRequest
// Size = 88 bytes
struct GMZoneRequest_Struct {
/*0000*/ char charname[64];
/*0064*/ int32 zone_id;
/*0068*/ float x;
/*0072*/ float y;
/*0076*/ float z;
/*0080*/ char unknown0080[4];
/*0084*/ int32 success; // 0 if command failed, 1 if succeeded?
/*0088*/
// /*072*/ sint8 success; // =0 client->server, =1 server->client, -X=specific error
// /*073*/ int8 unknown0073[3]; // =0 ok, =ffffff error
};
struct GMSummon_Struct {
/* 0*/ char charname[64];
/* 30*/ char gmname[64];
/* 60*/ int32 success;
/* 61*/ int32 zoneID;
/*92*/ sint32 y;
/*96*/ sint32 x;
/*100*/ sint32 z;
/*104*/ int32 unknown2; // E0 E0 56 00
};
struct GMGoto_Struct { // x,y is swapped as compared to summon and makes sense as own packet
/* 0*/ char charname[64];
/* 64*/ char gmname[64];
/* 128*/ int32 success;
/* 132*/ int32 zoneID;
/*136*/ sint32 y;
/*140*/ sint32 x;
/*144*/ sint32 z;
/*148*/ int32 unknown2; // E0 E0 56 00
};
struct GMLastName_Struct {
char name[64];
char gmname[64];
char lastname[64];
int16 unknown[4]; // 0x00, 0x00
// 0x01, 0x00 = Update the clients
};
struct OnLevelMessage_Struct {
/*0000*/ char Title[128];
/*0128*/ char Text[4096];
/*4224*/ char ButtonName0[25]; // If Buttons = 1, these two are the text for the left and right buttons respectively
/*4249*/ char ButtonName1[25];
/*4274*/ uint8 Buttons;
/*4275*/ uint8 Unknown4275; // Something to do with audio controls
/*4276*/ uint32 Duration;
/*4280*/ uint32 PopupID; // If none zero, a response packet with 00 00 00 00 <PopupID> is returned on clicking the left button
/*4284*/ uint32 NegativeID; // If none zero, a response packet with 01 00 00 00 <NegativeID> is returned on clicking the right button
/*4288*/ uint32 Unknown4288;
/*4292*/
};
//Combat Abilities
struct CombatAbility_Struct {
int32 m_target; //the ID of the target mob
int32 m_atk;
int32 m_skill;
};
//Instill Doubt
struct Instill_Doubt_Struct {
int8 i_id;
int8 ia_unknown;
int8 ib_unknown;
int8 ic_unknown;
int8 i_atk;
int8 id_unknown;
int8 ie_unknown;
int8 if_unknown;
int8 i_type;
int8 ig_unknown;
int8 ih_unknown;
int8 ii_unknown;
};
struct GiveItem_Struct {
uint16 to_entity;
sint16 to_equipSlot;
uint16 from_entity;
sint16 from_equipSlot;
};
struct RandomReq_Struct {
int32 low;
int32 high;
};
/* solar: 9/23/03 reply to /random command; struct from Zaphod */
struct RandomReply_Struct {
/* 00 */ int32 low;
/* 04 */ int32 high;
/* 08 */ int32 result;
/* 12 */ char name[64];
/* 76 */
};
/*
** LFG_Appearance_Struct
** Packet sent to clients to notify when someone in zone toggles LFG flag
** Size: 8 bytes
** Used in: OP_LFGAppearance
**
*/
struct LFG_Appearance_Struct
{
/*0000*/ uint32 spawn_id; // ID of the client
/*0004*/ uint8 lfg; // 1=LFG, 0=Not LFG
/*0005*/ char unknown0005[3]; //
/*0008*/
};
// EverQuest Time Information:
// 72 minutes per EQ Day
// 3 minutes per EQ Hour
// 6 seconds per EQ Tick (2 minutes EQ Time)
// 3 seconds per EQ Minute
struct TimeOfDay_Struct {
int8 hour;
int8 minute;
int8 day;
int8 month;
int16 year;
/*0006*/ uint16 unknown0016; // Placeholder
/*0008*/
};
// Darvik: shopkeeper structs
struct Merchant_Click_Struct {
/*000*/ int32 npcid; // Merchant NPC's entity id
/*004*/ int32 playerid;
/*008*/ int32 command; //1=open, 0=cancel/close
/*012*/ float rate; //cost multiplier, dosent work anymore
};
/*
Unknowns:
0 is e7 from 01 to // MAYBE SLOT IN PURCHASE
1 is 03
2 is 00
3 is 00
4 is ??
5 is ??
6 is 00 from a0 to
7 is 00 from 3f to */
/*
0 is F6 to 01
1 is CE CE
4A 4A
00 00
00 E0
00 CB
00 90
00 3F
*/
struct Merchant_Sell_Struct {
/*000*/ int32 npcid; // Merchant NPC's entity id
/*004*/ int32 playerid; // Player's entity id
/*008*/ int32 itemslot;
/*012*/ int32 unknown12;
/*016*/ int8 quantity; // Already sold
/*017*/ int8 Unknown017[3];
/*020*/ uint32 Unknown020;
/*024*/ uint32 price;
/*028*/ uint32 pricehighorderbits; // It appears the price is 64 bits in Underfoot+
/*032*/
};
struct Merchant_Purchase_Struct {
/*000*/ int32 npcid; // Merchant NPC's entity id
/*004*/ int32 itemslot; // Player's entity id
/*008*/ int32 quantity;
/*012*/ int32 price;
};
struct Merchant_DelItem_Struct{
/*000*/ int32 npcid; // Merchant NPC's entity id
/*004*/ int32 playerid; // Player's entity id
/*008*/ int32 itemslot;
};
struct Adventure_Purchase_Struct {
/*000*/ int32 some_flag; //set to 1 generally...
/*004*/ int32 npcid;
/*008*/ int32 itemid;
/*012*/ int32 variable;
};
struct Adventure_Sell_Struct {
/*000*/ int32 unknown000; //0x01 - Stack Size/Charges?
/*004*/ int32 npcid;
/*008*/ int32 slot;
/*012*/ int32 charges;
/*016*/ int32 sell_price;
};
struct AdventurePoints_Update_Struct {
/*000*/ uint32 ldon_available_points; // Total available points
/*004*/ uint8 unkown_apu004[20];
/*024*/ uint32 ldon_guk_points; // Earned Deepest Guk points
/*028*/ uint32 ldon_mirugal_points; // Earned Mirugal' Mebagerie points
/*032*/ uint32 ldon_mistmoore_points; // Earned Mismoore Catacombs Points
/*036*/ uint32 ldon_rujarkian_points; // Earned Rujarkian Hills points
/*040*/ uint32 ldon_takish_points; // Earned Takish points
/*044*/ uint8 unknown_apu042[216];
};
struct AdventureFinish_Struct{
uint32 win_lose;//Cofruben: 00 is a lose,01 is win.
uint32 points;
};
//OP_AdventureRequest
struct AdventureRequest_Struct{
int32 risk;//1 normal,2 hard.
int32 entity_id;
};
struct AdventureRequestResponse_Struct{
int32 unknown000;
char text[2048];
int32 timetoenter;
int32 timeleft;
int32 risk;
float x;
float y;
float z;
int32 showcompass;
int32 unknown2080;
};
//this is mostly right but something is off that causes the client to crash sometimes
//I don't really care enough about the feature to work on it anymore though.
struct AdventureLeaderboardEntry_Struct
{
/*004*/ char name[64];
/*008*/ int32 success;
/*012*/ int32 failure;
/*016*/
};
struct AdventureLeaderboard_Struct
{
/*000*/ int32 unknown000;
/*004*/ int32 unknown004;
/*008*/ int32 success;
/*012*/ int32 failure;
/*016*/ int32 our_rank;
/*020*/
};
/*struct Item_Shop_Struct {
uint16 merchantid;
int8 itemtype;
Item_Struct item;
int8 iss_unknown001[6];
};*/
struct Illusion_Struct { //size: 256
/*000*/ uint32 spawnid;
/*004*/ char charname[64]; //
/*068*/ uint16 race; //
/*070*/ char unknown006[2]; // Weird green name
/*072*/ uint8 gender;
/*073*/ uint8 texture;
/*074*/ uint8 unknown074; //
/*075*/ uint8 unknown075; //
/*076*/ uint8 helmtexture; //
/*077*/ uint8 unknown077; //
/*078*/ uint8 unknown078; //
/*079*/ uint8 unknown079; //
/*080*/ uint32 face; //
/*084*/ uint8 hairstyle; // Some Races don't change Hair Style Properly in SoF
/*085*/ uint8 haircolor; //
/*086*/ uint8 beard; //
/*087*/ uint8 beardcolor; //
/*088*/ float size; //
/*092*/ uint8 unknown092[148];
/*240*/ int32 unknown240; // Removes armor?
/*244*/ int32 drakkin_heritage; //
/*248*/ int32 drakkin_tattoo; //
/*252*/ int32 drakkin_details; //
/*256*/
};
struct ZonePoint_Entry { //28 octets
/*0000*/ int32 iterator;
/*0004*/ float y;
/*0008*/ float x;
/*0012*/ float z;
/*0016*/ float heading;
/*0020*/ int16 zoneid;
/*0022*/ int16 zoneinstance; // LDoN instance
/*0024*/ uint32 unknown024;
/*0028*/
};
struct ZonePoints {
/*0000*/ int32 count;
/*0004*/ struct ZonePoint_Entry zpe[0]; // Always add one extra to the end after all zonepoints
//*0xxx*/ uint8 unknown0xxx[24]; //New from SEQ
};
struct SkillUpdate_Struct {
/*00*/ uint32 skillId;
/*04*/ uint32 value;
/*08*/
};
struct ZoneUnavail_Struct {
//This actually varies, but...
char zonename[16];
sint16 unknown[4];
};
struct GroupInvite_Struct {
/*0000*/ char invitee_name[64];
/*0064*/ char inviter_name[64];
/*0128*/ int32 unknown0128;
/*0132*/ int32 unknown0132;
/*0136*/ int32 unknown0136;
/*0140*/ int32 unknown0140;
/*0144*/ int32 unknown0144;
/*0148*/
};
struct GroupGeneric_Struct {
/*0000*/ char name1[64];
/*0064*/ char name2[64];
/*0128*/ int32 unknown0128;
/*0132*/ int32 unknown0132;
/*0136*/ int32 unknown0136;
/*0140*/ int32 unknown0140;
/*0144*/ int32 unknown0144;
/*0148*/
};
struct GroupCancel_Struct {
/*000*/ char name1[64];
/*064*/ char name2[64];
/*128*/ uint8 unknown128[20];
/*148*/ uint32 toggle;
/*152*/
};
struct GroupUpdate_Struct {
/*0000*/ int32 action;
/*0004*/ char yourname[64];
/*0068*/ char membername[5][64];
/*0388*/ char leadersname[64];
/*0452*/
};
struct GroupUpdate2_Struct {
/*0000*/ int32 action;
/*0004*/ char yourname[64];
/*0068*/ char membername[5][64];
/*0388*/ char leadersname[64];
/*0452*/ GroupLeadershipAA_Struct leader_aas;
/*0516*/ int8 unknown[252]; // Titanium uses [188] here
/*0768*/
};
struct GroupUpdate_Struct_Underfoot { // New for Underfoot
/*0000*/ int32 groupid; // Guess - Matches unknown0136 from GroupFollow_Struct
/*0004*/ int32 totalmembers; // Guess
/*0000*/ //int32 leadersname[0]; // Group Leader Name Null Terminated
/*0008*/ //GroupMembers_Struct groupmembers;
};
struct GroupMembers_Struct { // New for Underfoot
/*0000*/ int32 membernumber; // Guess - number of member in the group (0 to 5?)
/*0000*/ //char membername[0]; // Member Name Null Terminated
/*0000*/ int8 unknown001[3]; // Seen 0
/*0000*/ int32 memberlevel; // Guess
/*0000*/ int8 unknown002[11]; // Seen 0
};
struct GroupJoin_Struct_Underfoot { // New for Underfoot
/*0000*/ int32 unknown0000; // Matches unknown0136 from GroupFollow_Struct
/*0004*/ int32 action;
/*0008*/ int8 unknown0008[5]; // Seen 0
/*0013*/ //char membername[0]; // Null Terminated?
/*0000*/ int8 unknown0013[3]; // Seen 0
/*0000*/ int32 unknown0016; // Matches unknown0132 from GroupFollow_Struct
/*0000*/ int8 unknown0020[11]; // Seen 0
};
struct GroupJoin_Struct {
/*000*/ char unknown000[64];
/*064*/ char membername[64];
/*128*/ int8 unknown128[20]; // Leadership AA ?
/*148*/
};
struct GroupFollow_Struct { // Underfoot Follow Struct
/*0000*/ char name1[64]; // inviter
/*0064*/ char name2[64]; // invitee
/*0128*/ int32 unknown0128; // Seen 0
/*0132*/ int32 unknown0132; // Group ID or member level?
/*0136*/ int32 unknown0136; // Maybe Voice Chat Channel or Group ID?
/*0140*/ int32 unknown0140; // Seen 0
/*0144*/ int32 unknown0144; // Seen 0
/*0148*/ int32 unknown0148;
/*0152*/
};
struct LFG_Struct {
/*000*/ uint32 unknown000;
/*004*/ uint32 value; // 0x00 = off 0x01 = on
/*008*/ uint32 unknown008;
/*012*/ uint32 unknown012;
/*016*/ char name[64];
};
struct FaceChange_Struct {
/*000*/ int8 haircolor;
/*001*/ int8 beardcolor;
/*002*/ int8 eyecolor1;
/*003*/ int8 eyecolor2;
/*004*/ int8 hairstyle;
/*005*/ int8 beard;
/*006*/ int8 face;
/*007*/ int8 unknown007;
/*008*/ int32 drakkin_heritage;
/*012*/ int32 drakkin_tattoo;
/*016*/ int32 drakkin_details;
/*020*/ int32 unknown020;
/*024*/
};
//there are only 10 faces for barbs changing woad just
//increase the face value by ten so if there were 8 woad
//designs then there would be 80 barb faces
/*
** Trade request from one client to another
** Used to initiate a trade
** Size: 8 bytes
** Used in: OP_TradeRequest
*/
struct TradeRequest_Struct {
/*00*/ uint32 to_mob_id;
/*04*/ uint32 from_mob_id;
/*08*/
};
struct TradeAccept_Struct {
/*00*/ uint32 from_mob_id;
/*04*/ uint32 unknown4; //seems to be garbage
/*08*/
};
/*
** Cancel Trade struct
** Sent when a player cancels a trade
** Size: 8 bytes
** Used In: OP_CancelTrade
**
*/
struct CancelTrade_Struct {
/*00*/ int32 fromid;
/*04*/ int32 action;
/*08*/
};
struct PetitionUpdate_Struct {
int32 petnumber; // Petition Number
int32 color; // 0x00 = green, 0x01 = yellow, 0x02 = red
int32 status;
time_t senttime; // 4 has to be 0x1F
char accountid[32];
char gmsenttoo[64];
sint32 quetotal;
char charname[64];
};
struct Petition_Struct {
int32 petnumber;
int32 urgency;
char accountid[32];
char lastgm[32];
int32 zone;
//char zone[32];
char charname[64];
int32 charlevel;
int32 charclass;
int32 charrace;
int32 unknown;
//time_t senttime; // Time?
int32 checkouts;
int32 unavail;
//int8 unknown5[4];
time_t senttime;
int32 unknown2;
char petitiontext[1024];
char gmtext[1024];
};
struct Who_All_Struct { // 76 length total
/*000*/ char whom[64];
/*064*/ int32 wrace; // FF FF = no race
/*068*/ int32 wclass; // FF FF = no class
/*072*/ int32 lvllow; // FF FF = no numbers
/*076*/ int32 lvlhigh; // FF FF = no numbers
/*080*/ int32 gmlookup; // FF FF = not doing /who all gm
/*084*/ int32 guildid; // Also used for Buyer/Trader/LFG
/*088*/ int8 unknown088[64];
/*156*/ int32 type; // 0 = /who 3 = /who all
};
struct Stun_Struct { // 8 bytes total
/*000*/ int32 duration; // Duration of stun
/*004*/ int8 unknown004; // seen 0
/*005*/ int8 unknown005; // seen 163
/*006*/ int8 unknown006; // seen 67
/*007*/ int8 unknown007; // seen 0
/*008*/
};
struct AugmentItem_Struct {
/*00*/ sint16 container_slot;
/*02*/ char unknown02[2];
/*04*/ sint32 augment_slot;
/*08*/
};
// OP_Emote
struct Emote_Struct {
/*0000*/ int32 unknown01;
/*0004*/ char message[1024]; // was 1024
/*1028*/
};
// Inspect
struct Inspect_Struct {
int32 TargetID;
int32 PlayerID;
};
//OP_InspectAnswer - Size: 1860
struct InspectResponse_Struct{
/*000*/ int32 TargetID;
/*004*/ int32 playerid;
/*008*/ char itemnames[22][64];
/*1416*/char unknown_zero[64];
/*1480*/int32 itemicons[22];
/*1568*/int32 unknown_zero2;
/*1572*/char text[288]; // Max number of chars in Inspect Window appears to be 254
/*1860*/
};
//OP_SetDataRate
struct SetDataRate_Struct {
float newdatarate;
};
//OP_SetServerFilter
struct SetServerFilter_Struct {
uint32 filters[34]; //see enum eqFilterType [31]
};
//Op_SetServerFilterAck
struct SetServerFilterAck_Struct {
int8 blank[8];
};
struct IncreaseStat_Struct{
/*0000*/ int8 unknown0;
/*0001*/ int8 str;
/*0002*/ int8 sta;
/*0003*/ int8 agi;
/*0004*/ int8 dex;
/*0005*/ int8 int_;
/*0006*/ int8 wis;
/*0007*/ int8 cha;
/*0008*/ int8 fire;
/*0009*/ int8 cold;
/*0010*/ int8 magic;
/*0011*/ int8 poison;
/*0012*/ int8 disease;
/*0013*/ char unknown13[116];
/*0129*/ int8 str2;
/*0130*/ int8 sta2;
/*0131*/ int8 agi2;
/*0132*/ int8 dex2;
/*0133*/ int8 int_2;
/*0134*/ int8 wis2;
/*0135*/ int8 cha2;
/*0136*/ int8 fire2;
/*0137*/ int8 cold2;
/*0138*/ int8 magic2;
/*0139*/ int8 poison2;
/*0140*/ int8 disease2;
};
struct GMName_Struct {
char oldname[64];
char gmname[64];
char newname[64];
int8 badname;
int8 unknown[3];
};
struct GMDelCorpse_Struct {
char corpsename[64];
char gmname[64];
int8 unknown;
};
struct GMKick_Struct {
char name[64];
char gmname[64];
int8 unknown;
};
struct GMKill_Struct {
char name[64];
char gmname[64];
int8 unknown;
};
struct GMEmoteZone_Struct {
char text[512];
};
// The BookText_Struct is not used in SoF and later clients.
// The BookRequest_Struct is used instead for both request and reply.
//
struct BookText_Struct {
uint8 window; // where to display the text (0xFF means new window)
uint8 type; //type: 0=scroll, 1=book, 2=item info.. prolly
char booktext[1]; // Variable Length - was 1
};
// This is the request to read a book.
// This is just a "text file" on the server
// or in our case, the 'name' column in our books table.
struct BookRequest_Struct {
/*0000*/ uint32 window; // where to display the text (0xFFFFFFFF means new window).
/*0004*/ uint32 invslot; // The inventory slot the book is in. Not used, but echoed in the response packet.
/*0008*/ uint32 type; // 0 = Scroll, 1 = Book, 2 = Item Info. Possibly others
/*0012*/ uint32 unknown0012;
/*0016*/ uint16 unknown0016;
/*0018*/ char txtfile[8194];
};
/*
** Object/Ground Spawn struct
** Used for Forges, Ovens, ground spawns, items dropped to ground, etc
** Size: 104 bytes
** OpCodes: OP_CreateObject
** Last Updated: Oct-17-2003
**
*/
struct Object_Struct {
/*00*/ uint32 linked_list_addr[2];// <Zaphod> They are, get this, prev and next, ala linked list
/*08*/ uint32 unknown008; // Something related to the linked list?
/*12*/ uint32 drop_id; // Unique object id for zone
/*16*/ uint16 zone_id; // Redudant, but: Zone the object appears in
/*18*/ uint16 zone_instance; //
/*20*/ uint32 unknown020; // 00 00 00 00
/*24*/ uint32 unknown024; // 53 9e f9 7e - same for all objects in the zone?
/*40*/ float heading; // heading
/*32*/ uint8 unknown032[8]; // 00 00 00 00 00 00 00 00
/*28*/ float size; // Size - default 1
/*44*/ float z; // z coord
/*48*/ float x; // x coord
/*52*/ float y; // y coord
/*56*/ char object_name[32]; // Name of object, usually something like IT63_ACTORDEF was [20]
/*88*/ uint32 unknown088; // unique ID? Maybe for a table that includes the contents?
/*92*/ uint32 object_type; // Type of object, not directly translated to OP_OpenObject
/*96*/ uint8 unknown096[4]; // ff ff ff ff
/*100*/ uint32 spawn_id; // Spawn Id of client interacting with object
/*104*/
};
//<Zaphod> 01 = generic drop, 02 = armor, 19 = weapon
//[13:40] <Zaphod> and 0xff seems to be indicative of the tradeskill/openable items that end up returning the old style item type in the OP_OpenObject
/*
** Click Object Struct
** Client clicking on zone object (forge, groundspawn, etc)
** Size: 8 bytes
** Last Updated: Oct-17-2003
**
*/
struct ClickObject_Struct {
/*00*/ uint32 drop_id;
/*04*/ uint32 player_id;
/*08*/
};
struct Shielding_Struct {
uint32 target_id;
};
/*
** Click Object Acknowledgement Struct
** Response to client clicking on a World Container (ie, forge)
**
*/
struct ClickObjectAction_Struct {
/*00*/ uint32 player_id; // Entity Id of player who clicked object
/*04*/ uint32 drop_id; // Zone-specified unique object identifier
/*08*/ uint32 open; // 1=opening, 0=closing
/*12*/ uint32 type; // See object.h, "Object Types"
/*16*/ uint32 unknown16; //
/*20*/ uint32 icon; // Icon to display for tradeskill containers
/*24*/ uint32 unknown24; //
/*28*/ char object_name[64]; // Object name to display
/*92*/
};
/*
** This is different now, mostly unknown
**
*/
struct CloseContainer_Struct {
/*00*/ uint32 player_id; // Entity Id of player who clicked object
/*04*/ uint32 drop_id; // Zone-specified unique object identifier
/*08*/ uint32 open; // 1=opening, 0=closing
/*12*/ uint32 unknown12[12];
};
/*
** Generic Door Struct
** Length: 52 Octets
** Used in:
** cDoorSpawnsStruct(f721)
**
*/
struct Door_Struct
{
/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
/*0032*/ float yPos; // y loc
/*0036*/ float xPos; // x loc
/*0040*/ float zPos; // z loc
/*0044*/ float heading;
/*0048*/ int32 incline; // rotates the whole door
/*0052*/ int32 size; // 100 is normal, smaller number = smaller model
/*0054*/ int8 unknown0054[4]; // 00 00 00 00
/*0060*/ uint8 doorId; // door's id #
/*0061*/ uint8 opentype;
/*0062*/ uint8 state_at_spawn;
/*0063*/ uint8 invert_state; // if this is 1, the door is normally open
/*0064*/ int32 door_param; // normally ff ff ff ff (-1)
/*0068*/ int32 unknown0068; // 00 00 00 00
/*0072*/ int32 unknown0072; // 00 00 00 00
/*0076*/ int8 unknown0076; // seen 1 or 0
/*0077*/ int8 unknown0077; // seen 1 (always?)
/*0078*/ int8 unknown0078; // seen 0 (always?)
/*0079*/ int8 unknown0079; // seen 1 (always?)
/*0080*/ int8 unknown0080; // seen 0 (always?)
/*0081*/ int8 unknown0081; // seen 1 or 0 or rarely 2C or 90 or ED or 2D or A1
/*0082*/ uint8 unknown0082; // seen 0 or rarely FF or FE or 10 or 5A or 82
/*0083*/ uint8 unknown0083; // seen 0 or rarely 02 or 7C
/*0084*/ uint8 unknown0084[8]; // mostly 0s, the last 3 bytes are something tho
/*0092*/
};
struct DoorSpawns_Struct {
struct Door_Struct doors[0];
};
/*
OP Code: Op_ClickDoor
Size: 16
*/
struct ClickDoor_Struct {
/*000*/ int8 doorid;
/*001*/ int8 unknown001; // This may be some type of action setting
/*002*/ int8 unknown002; // This is sometimes set after a lever is closed
/*003*/ int8 unknown003; // Seen 0
/*004*/ int8 picklockskill;
/*005*/ int8 unknown005[3];
/*008*/ int32 item_id;
/*012*/ int16 player_id;
/*014*/ int8 unknown014[2];
/*016*/
};
struct MoveDoor_Struct {
int8 doorid;
int8 action;
};
struct BecomeNPC_Struct {
int32 id;
sint32 maxlevel;
};
struct Underworld_Struct {
float speed;
float y;
float x;
float z;
};
struct Resurrect_Struct {
int32 unknown00;
int16 zone_id;
int16 instance_id;
float y;
float x;
float z;
char your_name[64];
int32 unknown88;
char rezzer_name[64];
int32 spellid;
char corpse_name[64];
int32 action;
/* 228 */
};
struct SetRunMode_Struct {
int8 mode; //01=run 00=walk
int8 unknown[3];
};
// EnvDamage is EnvDamage2 without a few bytes at the end.
// Size: 37 bytes
struct EnvDamage2_Struct {
/*0000*/ int32 id;
/*0004*/ int16 unknown4;
/*0006*/ int32 damage;
/*0010*/ float unknown10; // New to Underfoot - Seen 1
/*0014*/ int8 unknown14[12];
/*0026*/ int8 dmgtype; // FA = Lava; FC = Falling
/*0027*/ int8 unknown27[4];
/*0031*/ int16 unknown31; // New to Underfoot - Seen 66
/*0033*/ int16 constant; // Always FFFF
/*0035*/ int16 unknown35;
/*0037*/
};
//Bazaar Stuff
enum {
BazaarTrader_StartTraderMode = 1,
BazaarTrader_EndTraderMode = 2,
BazaarTrader_UpdatePrice = 3,
BazaarTrader_EndTransaction = 4,
BazaarSearchResults = 7,
BazaarWelcome = 9,
BazaarBuyItem = 10,
BazaarTrader_ShowItems = 11,
BazaarSearchDone = 12,
BazaarTrader_CustomerBrowsing = 13
};
enum {
BazaarPriceChange_Fail = 0,
BazaarPriceChange_UpdatePrice = 1,
BazaarPriceChange_RemoveItem = 2,
BazaarPriceChange_AddItem = 3
};
struct BazaarWindowStart_Struct {
int8 Action;
int8 Unknown001;
int16 Unknown002;
};
struct BazaarWelcome_Struct {
BazaarWindowStart_Struct Beginning;
int32 Traders;
int32 Items;
int8 Unknown012[8];
};
struct BazaarSearch_Struct {
BazaarWindowStart_Struct Beginning;
int32 TraderID;
int32 Class_;
int32 Race;
int32 ItemStat;
int32 Slot;
int32 Type;
char Name[64];
int32 MinPrice;
int32 MaxPrice;
int32 Minlevel;
int32 MaxLlevel;
};
struct BazaarInspect_Struct{
int32 ItemID;
int32 Unknown004;
char Name[64];
};
struct NewBazaarInspect_Struct {
/*000*/ BazaarWindowStart_Struct Beginning;
/*004*/ char Name[64];
/*068*/ int32 Unknown068;
/*072*/ sint32 SerialNumber;
/*076*/ int32 Unknown076;
/*080*/ int32 SellerID;
/*084*/ int32 Unknown084;
};
struct BazaarReturnDone_Struct{
int32 Type;
int32 TraderID;
int32 Unknown008;
int32 Unknown012;
int32 Unknown016;
};
struct BazaarSearchResults_Struct {
/*000*/ BazaarWindowStart_Struct Beginning;
/*004*/ int32 SellerID;
/*008*/ char SellerName[64];
/*072*/ int32 NumItems;
/*076*/ int32 ItemID;
/*080*/ int32 SerialNumber;
/*084*/ int32 Unknown084;
/*088*/ char ItemName[64];
/*152*/ int32 Cost;
/*156*/ int32 ItemStat;
/*160*/
};
struct ServerSideFilters_Struct {
int8 clientattackfilters; // 0) No, 1) All (players) but self, 2) All (players) but group
int8 npcattackfilters; // 0) No, 1) Ignore NPC misses (all), 2) Ignore NPC Misses + Attacks (all but self), 3) Ignores NPC Misses + Attacks (all but group)
int8 clientcastfilters; // 0) No, 1) Ignore PC Casts (all), 2) Ignore PC Casts (not directed towards self)
int8 npccastfilters; // 0) No, 1) Ignore NPC Casts (all), 2) Ignore NPC Casts (not directed towards self)
};
/*
** Client requesting item statistics
** Size: 48 bytes
** Used In: OP_ItemLinkClick
** Last Updated: 2/15/2009
**
*/
struct ItemViewRequest_Struct {
/*000*/ uint32 item_id;
/*004*/ uint32 augments[5];
/*024*/ uint32 link_hash;
/*028*/ uint32 unknown028; //seems to always be 4 on SoF client
/*032*/ char unknown032[12]; //probably includes loregroup & evolving info. see Client::MakeItemLink() in zone/inventory.cpp:469
/*044*/ uint16 icon;
/*046*/ char unknown046[2];
};
/*
* Client to server packet
*/
struct PickPocket_Struct {
// Size 18
uint32 to;
uint32 from;
uint16 myskill;
uint8 type; // -1 you are being picked, 0 failed , 1 = plat, 2 = gold, 3 = silver, 4 = copper, 5 = item
uint8 unknown1; // 0 for response, unknown for input
uint32 coin;
uint8 lastsix[2];
};
/*
* Server to client packet
*/
struct sPickPocket_Struct {
// Size 28 = coin/fail
uint32 to;
uint32 from;
uint32 myskill;
uint32 type;
uint32 coin;
char itemname[64];
};
struct LogServer_Struct {
// Op_Code OP_LOGSERVER
/*000*/ uint32 unknown000;
/*004*/ uint8 enable_pvp;
/*005*/ uint8 unknown005;
/*006*/ uint8 unknown006;
/*007*/ uint8 unknown007;
/*008*/ uint8 enable_FV;
/*009*/ uint8 unknown009;
/*010*/ uint8 unknown010;
/*011*/ uint8 unknown011;
/*012*/ uint32 unknown012; // htonl(1) on live
/*016*/ uint32 unknown016; // htonl(1) on live
/*020*/ uint8 unknown020[12];
/*032*/ uint32 unknown032;
/*036*/ char worldshortname[32];
/*068*/ uint8 unknown064[32];
/*100*/ char unknown096[16]; // 'pacman' on live
/*116*/ char unknown112[16]; // '64.37,148,36' on live
/*132*/ uint8 unknown128[48];
/*180*/ uint32 unknown176; // htonl(0x00002695)
/*184*/ char unknown180[80]; // '[email protected]' on live
/*264*/ uint8 unknown260; // 0x01 on live
/*265*/ uint8 enablevoicemacros;
/*266*/ uint8 enablemail;
/*267*/ uint8 unknown263[41];
/*308*/
};
struct ApproveWorld_Struct {
// Size 544
// Op_Code OP_ApproveWorld
uint8 unknown544[544];
};
struct ClientError_Struct
{
/*00001*/ char type;
/*00001*/ char unknown0001[69];
/*00069*/ char character_name[64];
/*00134*/ char unknown134[192];
/*00133*/ char message[31994];
/*32136*/
};
struct MobHealth
{
/*0000*/ int8 hp; //health percent
/*0001*/ int16 id;//mobs id
};
struct Track_Struct {
int16 entityid;
int16 y;
int16 x;
int16 z;
};
struct Tracking_Struct {
Track_Struct Entrys[0];
};
// Looks like new tracking structures - Opcode: 0x57a7
struct Tracking_Struct_New {
int16 totalcount; // Total Count of mobs within tracking range
Track_Struct Entrys[0];
};
struct Track_Struct_New {
int16 entityid; // Entity ID
int16 unknown002; // 00 00
int32 unknown004; //
int8 level; // level of mob
int8 unknown009; // 01 maybe type of mob? player/npc?
char name[1]; // name of mob
};
/*
** ZoneServerInfo_Struct
** Zone server information
** Size: 130 bytes
** Used In: OP_ZoneServerInfo
**
*/
struct ZoneServerInfo_Struct
{
/*0000*/ char ip[128];
/*0128*/ uint16 port;
};
struct WhoAllPlayer{
int32 formatstring;
int32 pidstring;
char* name;
int32 rankstring;
char* guild;
int32 unknown80[2];
int32 zonestring;
int32 zone;
int32 class_;
int32 level;
int32 race;
char* account;
int32 unknown100;
};
struct WhoAllReturnStruct {
int32 id;
int32 playerineqstring;
char line[27];
int8 unknown35; //0A
int32 unknown36;//0s
int32 playersinzonestring;
int32 unknown44[2]; //0s
int32 unknown52;//1
int32 unknown56;//1
int32 playercount;//1
struct WhoAllPlayer player[0];
};
// The following four structs are the WhoAllPlayer struct above broken down
// for use in World ClientList::SendFriendsWho to accomodate the user of variable
// length strings within the struct above.
struct WhoAllPlayerPart1 {
int32 FormatMSGID;
int32 Unknown04;
int32 Unknown08;
char Name[1];
};
struct WhoAllPlayerPart2 {
int32 RankMSGID;
char Guild[1];
};
struct WhoAllPlayerPart3 {
int32 Unknown80[2];
int32 ZoneMSGID;
int32 Zone;
int32 Class_;
int32 Level;
int32 Race;
char Account[1];
};
struct WhoAllPlayerPart4 {
int32 Unknown100;
};
struct Trader_Struct {
int32 code;
int32 itemid[160];
int32 unknown;
int32 itemcost[80];
};
struct ClickTrader_Struct {
int32 code;
int32 unknown[161];//damn soe this is totally pointless :/ but at least your finally using memset! Good job :) -LE
int32 itemcost[80];
};
struct GetItems_Struct{
int32 items[80];
};
struct BecomeTrader_Struct{
int32 id;
int32 code;
};
struct Trader_ShowItems_Struct{
int32 code;
int32 traderid;
int32 unknown08[3];
};
struct TraderBuy_Struct {
/*000*/ int32 Action;
/*004*/ int32 Unknown004;
/*008*/ int32 Price;
/*012*/ int32 Unknown008; // Probably high order bits of a 64 bit price.
/*016*/ int32 TraderID;
/*020*/ char ItemName[64];
/*084*/ int32 Unknown076;
/*088*/ int32 ItemID;
/*092*/ int32 AlreadySold;
/*096*/ int32 Quantity;
/*100*/ int32 Unknown092;
/*104*/
};
struct TraderItemUpdate_Struct{
int32 unknown0;
int32 traderid;
int8 fromslot;
int8 toslot; //7?
int16 charges;
};
struct MoneyUpdate_Struct{
sint32 platinum;
sint32 gold;
sint32 silver;
sint32 copper;
};
//struct MoneyUpdate_Struct
//{
//*0000*/ uint32 spawn_id; // ***Placeholder
//*0004*/ uint32 cointype; // Coin Type
//*0008*/ uint32 amount; // Amount
//*0012*/
//};
struct TraderDelItem_Struct{
int32 slotid;
int32 quantity;
int32 unknown;
};
struct TraderClick_Struct{
int32 traderid;
int32 unknown4[2];
int32 approval;
};
struct FormattedMessage_Struct{
int32 unknown0;
int32 string_id;
int32 type;
char message[0];
//*0???*/ uint8 unknown0[8]; // ***Placeholder
};
struct SimpleMessage_Struct{
int32 string_id;
int32 color;
int32 unknown8;
};
struct GuildMemberEntry_Struct {
char name[1]; //variable length
int32 level; //network byte order
int32 banker; //1=yes, 0=no, network byte order
int32 class_; //network byte order
int32 rank; //network byte order
int32 time_last_on; //network byte order
int32 tribute_enable; //network byte order
int32 total_tribute; //total guild tribute donated, network byte order
int32 last_tribute; //unix timestamp
int32 unknown_one; //unknown, set to one. (network byte order)
char public_note[1]; //variable length.
int16 zoneinstance; //network byte order
int16 zone_id; //network byte order
/* 42 + strings */
};
struct GuildMembers_Struct { //just for display purposes, this is not actually used in the message encoding.
char player_name[1]; //variable length.
int32 count; //network byte order
GuildMemberEntry_Struct member[0];
};
struct GuildMOTD_Struct{
/*0000*/ int32 unknown0;
/*0004*/ char name[64];
/*0068*/ char setby_name[64];
/*0132*/ int32 unknown132;
/*0136*/ char motd[0]; //was 512
};
struct GuildURL_Struct{
/*0000*/ int32 unknown0; //index? seen server send 0 w/ the Guild URL, followed by 1 with nothing.
/*0004*/ int32 unknown4;
/*0008*/ int32 unknown8; //seen 7
/*0068*/ char setby_name[64];
/*0132*/ int32 unknown132; //seen 0x167
/*0136*/ char url[4080];
};
struct GuildMemberUpdate_Struct {
/*00*/ uint32 guild_id;
/*04*/ char member_name[64];
/*68*/ uint16 zone_id;
/*70*/ uint16 instance_id;
/*72*/ uint32 some_timestamp;
};
struct GuildMemberLevelUpdate_Struct {
/*00*/ uint32 guild_id;
/*04*/ char member_name[64];
/*68*/ uint32 level; //not sure
};
struct GuildUpdate_PublicNote{
int32 unknown0;
char name[64];
char target[64];
char note[100]; //we are cutting this off at 100, actually around 252
};
struct GuildDemoteStruct{
char name[64];
char target[64];
};
struct GuildRemoveStruct{
char target[64];
char name[64];
int32 unknown128;
int32 leaderstatus; //?
};
struct GuildMakeLeader{
char name[64];
char target[64];
};
struct BugStruct{
/*0000*/ char chartype[64];
/*0064*/ char name[96];
/*0160*/ char ui[128];
/*0288*/ float x;
/*0292*/ float y;
/*0296*/ float z;
/*0300*/ float heading;
/*0304*/ int32 unknown304;
/*0308*/ int32 type;
/*0312*/ char unknown312[2144];
/*2456*/ char bug[1024];
/*3480*/ char placeholder[2];
/*3482*/ char system_info[4098];
};
struct Make_Pet_Struct { //Simple struct for getting pet info
int8 level;
int8 class_;
int16 race;
int8 texture;
int8 pettype;
float size;
int8 type;
int32 min_dmg;
int32 max_dmg;
};
struct Ground_Spawn{
float max_x;
float max_y;
float min_x;
float min_y;
float max_z;
float heading;
char name[16];
int32 item;
int32 max_allowed;
int32 respawntimer;
};
struct Ground_Spawns {
struct Ground_Spawn spawn[50]; //Assigned max number to allow
};
struct PetitionBug_Struct{
int32 petition_number;
int32 unknown4;
char accountname[64];
int32 zoneid;
char name[64];
int32 level;
int32 class_;
int32 race;
int32 unknown152[3];
int32 time;
int32 unknown168;
char text[1028];
};
struct DyeStruct
{
union
{
struct
{
struct Color_Struct head;
struct Color_Struct chest;
struct Color_Struct arms;
struct Color_Struct wrists;
struct Color_Struct hands;
struct Color_Struct legs;
struct Color_Struct feet;
struct Color_Struct primary; // you can't actually dye this
struct Color_Struct secondary; // or this
}
dyes;
struct Color_Struct dye[9];
};
};
struct ApproveZone_Struct {
char name[64];
int32 zoneid;
int32 approve;
};
struct ZoneInSendName_Struct {
int32 unknown0;
char name[64];
char name2[64];
int32 unknown132;
};
struct ZoneInSendName_Struct2 {
int32 unknown0;
char name[64];
int32 unknown68[145];
};
static const uint32 MAX_TRIBUTE_TIERS = 10;
struct StartTribute_Struct {
int32 client_id;
int32 tribute_master_id;
int32 response;
};
struct TributeLevel_Struct {
uint32 level; //backwards byte order!
int32 tribute_item_id; //backwards byte order!
int32 cost; //backwards byte order!
};
struct TributeAbility_Struct {
int32 tribute_id; //backwards byte order!
int32 tier_count; //backwards byte order!
TributeLevel_Struct tiers[MAX_TRIBUTE_TIERS];
char name[0];
};
struct GuildTributeAbility_Struct {
uint32 guild_id;
TributeAbility_Struct ability;
};
struct SelectTributeReq_Struct {
int32 client_id; //? maybe action ID?
uint32 tribute_id;
int32 unknown8; //seen E3 00 00 00
};
struct SelectTributeReply_Struct {
int32 client_id; //echoed from request.
uint32 tribute_id;
char desc[0];
};
struct TributeInfo_Struct {
int32 active; //0 == inactive, 1 == active
uint32 tributes[MAX_PLAYER_TRIBUTES]; //-1 == NONE
int32 tiers[MAX_PLAYER_TRIBUTES]; //all 00's
int32 tribute_master_id;
};
struct TributeItem_Struct {
int32 slot;
int32 quantity;
int32 tribute_master_id;
sint32 tribute_points;
};
struct TributePoint_Struct {
sint32 tribute_points;
int32 unknown04;
sint32 career_tribute_points;
int32 unknown12;
};
struct TributeMoney_Struct {
int32 platinum;
int32 tribute_master_id;
sint32 tribute_points;
};
struct Split_Struct
{
uint32 platinum;
uint32 gold;
uint32 silver;
uint32 copper;
};
/*
** New Combine Struct
** Client requesting to perform a tradeskill combine
** Size: 4 bytes
** Used In: OP_TradeSkillCombine
** Last Updated: Oct-15-2003
**
*/
struct NewCombine_Struct {
/*00*/ sint16 container_slot;
/*02*/ char unknown02[2];
/*04*/
};
//client requesting favorite recipies
struct TradeskillFavorites_Struct {
uint32 object_type;
uint32 some_id;
uint32 favorite_recipes[500];
};
//search request
struct RecipesSearch_Struct {
uint32 object_type; //same as in favorites
uint32 some_id; //same as in favorites
uint32 mintrivial;
uint32 maxtrivial;
char query[56];
uint32 unknown4; //is set to 00 03 00 00
uint32 unknown5; //is set to 4C DD 12 00
/*80*/
};
//one sent for each item, from server in reply to favorites or search
struct RecipeReply_Struct {
uint32 object_type;
uint32 some_id; //same as in favorites
uint32 component_count;
uint32 recipe_id;
uint32 trivial;
char recipe_name[64];
/*84*/
};
//received and sent back as an ACK with different reply_code
struct RecipeAutoCombine_Struct {
uint32 object_type;
uint32 some_id;
uint32 unknown1; //echoed in reply
uint32 recipe_id;
uint32 reply_code; // 93 64 e1 00 (junk) in request
// 00 00 00 00 in successful reply
// f5 ff ff ff in 'you dont have all the stuff' reply
};
struct LevelAppearance_Struct { //Sends a little graphic on level up
int32 spawn_id;
int32 parm1;
int32 value1a;
int32 value1b;
int32 parm2;
int32 value2a;
int32 value2b;
int32 parm3;
int32 value3a;
int32 value3b;
int32 parm4;
int32 value4a;
int32 value4b;
int32 parm5;
int32 value5a;
int32 value5b;
/*64*/
};
struct MerchantList{
uint32 id;
uint32 slot;
uint32 item;
};
struct TempMerchantList{
uint32 npcid;
uint32 slot;
uint32 item;
uint32 charges; //charges/quantity
uint32 origslot;
};
struct FindPerson_Point {
float y;
float x;
float z;
};
struct FindPersonRequest_Struct
{
/*000*/ uint32 unknown000;
/*004*/ uint32 npc_id;
/*008*/ FindPerson_Point client_pos;
/*020*/ uint32 unknown020;
/*024*/
};
//variable length packet of points
struct FindPersonResult_Struct {
FindPerson_Point dest;
FindPerson_Point path[0]; //last element must be the same as dest
};
struct MobRename_Struct {
/*000*/ char old_name[64];
/*064*/ char old_name_again[64]; //not sure what the difference is
/*128*/ char new_name[64];
/*192*/ uint32 unknown192; //set to 0
/*196*/ uint32 unknown196; //set to 1
/*200*/
};
struct PlayMP3_Struct {
char filename[128];
};
//this is for custom title display in the skill window
struct TitleEntry_Struct {
uint32 skill_id;
uint32 skill_value;
char title[1];
};
struct Titles_Struct {
uint32 title_count;
TitleEntry_Struct titles[0];
};
//this is for title selection by the client
struct TitleListEntry_Struct {
uint32 unknown0; //title ID
char prefix[1]; //variable length, null terminated
char postfix[1]; //variable length, null terminated
};
struct TitleList_Struct {
uint32 title_count;
TitleListEntry_Struct titles[0]; //list of title structs
//uint32 unknown_ending; seen 0x7265, 0
};
struct SetTitle_Struct {
uint32 is_suffix; //guessed: 0 = prefix, 1 = suffix
uint32 title_id;
};
struct SetTitleReply_Struct {
uint32 is_suffix; //guessed: 0 = prefix, 1 = suffix
char title[32];
uint32 entity_id;
};
#if 0
// Old struct not used by Task System implementation but left for reference
struct TaskDescription_Struct {
/*000*/ uint32 activity_count; //not right.
/*004*/ uint32 taskid;
/*008*/ uint8 unk;
/*009*/ uint32 id3;
/*013*/ uint32 unknown13;
/*017*/ char name[1]; //variable length, 0 terminated
/*018*/ uint32 unknown18;
/*022*/ uint32 unknown22;
/*026*/ char desc[1]; //variable length, 0 terminated
/*027*/ uint32 reward_count; //not sure
/*031*/ uint32 unknown31;
/*035*/ uint32 unknown35;
/*039*/ uint16 unknown39;
/*041*/ char reward_link[1]; //variable length, 0 terminated
/*042*/ uint32 unknown43; //maybe crystal count?
};
#endif
struct TaskMemberList_Struct {
/*00*/ uint32 gopher_id;
/*04*/ uint32 unknown04;
/*08*/ uint32 member_count; //1 less than the number of members
/*12*/ char list_pointer[0];
/* list is of the form:
char member_name[1] //null terminated string
uint8 task_leader //boolean flag
*/
};
#if 0
// Old structs not used by Task System implentation but left for reference
struct TaskActivity_Struct {
/*000*/ uint32 activity_count; //not right
/*004*/ uint32 id3;
/*008*/ uint32 taskid;
/*012*/ uint32 activity_id;
/*016*/ uint32 unknown016;
/*020*/ uint32 activity_type;
/*024*/ uint32 unknown024;
/*028*/ uint32 unknown28;
/*032*/ char mob_name[1]; //variable length, 0 terminated
/*033*/ char item_name[1]; //variable length, 0 terminated
/*034*/ uint32 goal_count;
/*038*/ uint32 unknown38; //0xFFFFFFFF
/*042*/ uint32 unknown42; //0xFFFFFFFF
/*046*/ uint32 unknown46; //saw 0x151,0x156
/*050*/ uint32 unknown50; //saw 0x404,0
/*054*/ char activity_name[1]; //variable length, 0 terminated... commonly empty
/*055*/ uint32 done_count;
/*059*/ uint32 unknown59; //=1 except on unknown and terminal activities?
/*063*/
};
struct TaskHistoryEntry_Struct {
uint32 task_id;
char name[1];
uint32 completed_time;
};
struct TaskHistory_Struct {
uint32 completed_count;
TaskHistoryEntry_Struct entries[0];
};
#endif
struct AcceptNewTask_Struct {
uint32 unknown00;
uint32 task_id; //set to 0 for 'decline'
uint32 task_master_id; //entity ID
};
//was all 0's from client, server replied with same op, all 0's
struct CancelTask_Struct {
uint32 SequenceNumber;
uint32 unknown4; // Only seen 0x00000002
};
#if 0
// old struct, not used by Task System implementation but left for reference.
struct AvaliableTask_Struct {
uint32 task_index; //no idea, seen 0x1
uint32 task_master_id; //entity ID
uint32 task_id;
uint32 unknown012;
uint32 activity_count; //not sure, seen 2
char desc[1]; //variable length, 0 terminated
uint32 reward_platinum;//not sure on these
uint32 reward_gold;
uint32 reward_silver;
uint32 reward_copper;
char some_name[1]; //variable length, 0 terminated
uint8 unknown1;
uint32 unknown2; //0xFFFFFFFF
uint32 unknown3; //0xFFFFFFFF
uint32 unknown4; //seen 0x16
uint8 unknown5;
};
#endif
// Many of the Task System packets contain variable length strings, as well as variable numbers
// of records, hence splitting them into multiple structs (header, middle, trailer) etc.
//
struct AvailableTaskHeader_Struct {
uint32 TaskCount;
uint32 unknown1;
uint32 TaskGiver;
};
struct AvailableTaskData1_Struct {
uint32 TaskID;
uint32 unknown1;
uint32 TimeLimit;
uint32 unknown2;
};
struct AvailableTaskData2_Struct {
uint32 unknown1,unknown2,unknown3,unknown4;
};
struct AvailableTaskTrailer_Struct {
uint32 ItemCount;
uint32 unknown1, unknown2;
uint32 StartZone;
};
struct TaskDescriptionHeader_Struct {
uint32 SequenceNumber; // The order the tasks appear in the journal. 0 for first task, 1 for second, etc.
uint32 TaskID;
uint32 unknown2;
uint32 unknown3;
uint8 unknown4;
};
struct TaskDescriptionData1_Struct {
uint32 Duration;
uint32 unknown2;
uint32 StartTime;
};
struct TaskDescriptionData2_Struct {
uint32 RewardCount; // ??
uint32 unknown1;
uint32 unknown2;
uint16 unknown3;
//uint8 unknown4;
};
struct TaskDescriptionTrailer_Struct {
//uint16 unknown1; // 0x0012
uint32 Points;
};
struct TaskActivityHeader_Struct {
uint32 TaskSequenceNumber;
uint32 unknown2; // Seen 0x00000002
uint32 TaskID;
uint32 ActivityID;
uint32 unknown3;
uint32 ActivityType;
uint32 Optional;
uint32 unknown5;
};
struct TaskActivityData1_Struct {
uint32 GoalCount;
uint32 unknown1; // 0xffffffff
uint32 unknown2; // 0xffffffff
uint32 ZoneID; // seen 0x36
uint32 unknown3;
};
struct TaskActivityTrailer_Struct {
uint32 DoneCount;
uint32 unknown1; // Seen 1
};
// The Short_Struct is sent for tasks that are hidden and act as a placeholder
struct TaskActivityShort_Struct {
uint32 TaskSequenceNumber;
uint32 unknown2; // Seen 0x00000002
uint32 TaskID;
uint32 ActivityID;
uint32 unknown3;
uint32 ActivityType; // 0xffffffff for the short packet
uint32 unknown4;
};
struct TaskActivityComplete_Struct {
uint32 TaskIndex;
uint32 unknown2; // 0x00000002
uint32 unknown3;
uint32 ActivityID;
uint32 unknown4; // 0x00000001
uint32 unknown5; // 0x00000001
};
#if 0
// This is a dupe of the CancelTask struct
struct TaskComplete_Struct {
uint32 unknown00; // 0x00000000
uint32 unknown04; // 0x00000002
};
#endif
struct TaskHistoryRequest_Struct {
uint32 TaskIndex; // This is the sequence the task was sent in the Completed Tasks packet.
};
struct TaskHistoryReplyHeader_Struct {
uint32 TaskID;
uint32 ActivityCount;
};
struct TaskHistoryReplyData1_Struct {
uint32 ActivityType;
};
struct TaskHistoryReplyData2_Struct {
uint32 GoalCount;
uint32 unknown04; // 0xffffffff
uint32 unknown08; // 0xffffffff
uint32 ZoneID;
uint32 unknown16;
};
struct BankerChange_Struct {
uint32 platinum;
uint32 gold;
uint32 silver;
uint32 copper;
uint32 platinum_bank;
uint32 gold_bank;
uint32 silver_bank;
uint32 copper_bank;
};
struct LeadershipExpUpdate_Struct {
/*00*/ double group_leadership_exp;
/*08*/ uint32 group_leadership_points;
/*12*/ uint32 Unknown12;
/*16*/ double raid_leadership_exp;
/*24*/ uint32 raid_leadership_points;
};
struct UpdateLeadershipAA_Struct {
/*00*/ uint32 ability_id;
/*04*/ uint32 new_rank;
/*08*/ uint32 unknown08;
/*12*/
};
/**
* Leadership AA update
* Length: 32 Octets
* OpCode: LeadExpUpdate
*/
struct leadExpUpdateStruct {
/*0000*/ uint32 unknown0000; // All zeroes?
/*0004*/ uint32 group_leadership_exp; // Group leadership exp value
/*0008*/ uint32 group_leadership_points; // Unspent group points
/*0012*/ uint32 unknown0012; // Type?
/*0016*/ uint32 unknown0016; // All zeroes?
/*0020*/ uint32 raid_leadership_exp; // Raid leadership exp value
/*0024*/ uint32 raid_leadership_points; // Unspent raid points
/*0028*/ uint32 unknown0028;
};
struct RaidGeneral_Struct {
/*00*/ uint32 action;
/*04*/ char player_name[64];
/*68*/ uint32 unknown68;
/*72*/ char leader_name[64];
/*136*/ uint32 parameter;
};
struct RaidAddMember_Struct {
/*000*/ RaidGeneral_Struct raidGen; //param = (group num-1); 0xFFFFFFFF = no group
/*136*/ uint8 _class;
/*137*/ uint8 level;
/*138*/ uint8 isGroupLeader;
/*139*/ uint8 flags[5]; //no idea if these are needed...
};
struct RaidAdd_Struct {
/*000*/ uint32 action; //=0
/*004*/ char player_name[64]; //should both be the player's name
/*068*/ char leader_name[64];
/*132*/ uint8 _class;
/*133*/ uint8 level;
/*134*/ uint8 has_group;
/*135*/ uint8 unknown135; //seems to be 0x42 or 0
};
struct RaidCreate_Struct {
/*00*/ uint32 action; //=8
/*04*/ char leader_name[64];
/*68*/ uint32 leader_id;
};
struct RaidMemberInfo_Struct {
/*00*/ uint8 group_number;
/*01*/ char member_name[1]; //dyanmic length, null terminated '\0'
/*00*/ uint8 unknown00;
/*01*/ uint8 _class;
/*02*/ uint8 level;
/*03*/ uint8 is_raid_leader;
/*04*/ uint8 is_group_leader;
/*05*/ uint8 main_tank; //not sure
/*06*/ uint8 unknown06[5]; //prolly more flags
};
struct RaidDetails_Struct {
/*000*/ uint32 action; //=6,20
/*004*/ char leader_name[64];
/*068*/ uint32 unknown68[4];
/*084*/ LeadershipAA_Struct abilities; //ranks in backwards byte order
/*128*/ uint8 unknown128[142];
/*354*/ uint32 leader_id;
};
struct RaidMembers_Struct {
/*000*/ RaidDetails_Struct details;
/*358*/ uint32 member_count; //including leader
/*362*/ RaidMemberInfo_Struct members[1];
/*...*/ RaidMemberInfo_Struct empty; //seem to have an extra member with a 0 length name on the end
};
struct DynamicWall_Struct {
/*00*/ char name[32];
/*32*/ float y;
/*36*/ float x;
/*40*/ float z;
/*44*/ uint32 something;
/*48*/ uint32 unknown48; //0
/*52*/ uint32 one_hundred; //0x64
/*56*/ uint32 unknown56; //0
/*60*/ uint32 something2;
/*64*/ sint32 unknown64; //-1
/*68*/ uint32 unknown68; //0
/*72*/ uint32 unknown72; //0
/*76*/ uint32 unknown76; //0x100
/*80*/
};
enum { //bandolier actions
BandolierCreate = 0,
BandolierRemove = 1,
BandolierSet = 2
};
struct BandolierCreate_Struct {
/*00*/ uint32 action; //0 for create
/*04*/ uint8 number;
/*05*/ char name[32];
/*37*/ uint16 unknown37; //seen 0x93FD
/*39*/ uint8 unknown39; //0
};
struct BandolierDelete_Struct {
/*00*/ uint32 action;
/*04*/ uint8 number;
/*05*/ int8 unknown05[35];
};
struct BandolierSet_Struct {
/*00*/ uint32 action;
/*04*/ uint8 number;
/*05*/ int8 unknown05[35];
};
// Not 100% sure on this struct. Live as of 1/1/11 is different than UF. Seems to work 'OK'
struct Arrow_Struct
{
/*000*/ float src_y;
/*004*/ float src_x;
/*008*/ float src_z;
/*012*/ int8 unknown012[12];
/*024*/ float velocity; //4 is normal, 20 is quite fast
/*028*/ float launch_angle; //0-450ish, not sure the units, 140ish is straight
/*032*/ float tilt; //on the order of 125
/*036*/ int8 unknown036[8];
/*044*/ float arc;
/*048*/ uint32 source_id;
/*052*/ uint32 target_id; //entity ID
/*056*/ uint32 item_id;
/*060*/ uint8 unknown060[10];
/*070*/ uint8 unknown070;
/*071*/ uint8 item_type;
/*072*/ uint8 skill;
/*073*/ uint8 unknown073[13];
/*086*/ char model_name[30];
/*116*/
};
//made a bunch of trivial structs for stuff for opcode finder to use
struct Consent_Struct {
char name[1]; //always at least a null - was 1
};
struct AdventureMerchant_Struct {
uint32 unknown_flag; //seems to be 1
uint32 entity_id;
};
struct Save_Struct {
int8 unknown00[192];
int8 unknown0192[176];
};
struct GMToggle_Struct {
int8 unknown0[64];
uint32 toggle;
};
struct BuffFadeMsg_Struct {
uint32 color;
char msg[1]; //was 1
/*0???*/ uint8 paddingXXX[3]; // always 0's
};
struct UseAA_Struct {
int32 begin;
int32 ability;
int32 end;
};
struct AA_Ability {
/*00*/ int32 skill_id;
/*04*/ int32 base1;
/*08*/ int32 base2;
/*12*/ int32 slot;
/*16*/
};
struct SendAA_Struct {
/*0000*/ int32 id;
/*0004*/ int8 unknown004; // int32 unknown004; set to 1.
/*0005*/ int32 hotkey_sid;
/*0009*/ int32 hotkey_sid2;
/*0013*/ int32 title_sid;
/*0017*/ int32 desc_sid;
/*0021*/ int32 class_type;
/*0025*/ int32 cost;
/*0029*/ int32 seq;
/*0033*/ int32 current_level; //1s, MQ2 calls this AARankRequired
/*0037*/ int32 prereq_skill; //is < 0, abs() is category #
/*0041*/ int32 prereq_minpoints; //min points in the prereq
/*0045*/ int32 type;
/*0049*/ int32 spellid;
/*0053*/ int32 spell_type;
/*0057*/ int32 spell_refresh;
/*0061*/ int16 classes;
/*0063*/ int16 berserker; //seems to be 1 if its a berserker ability
/*0065*/ int32 max_level;
/*0069*/ int32 last_id;
/*0073*/ int32 next_id;
/*0077*/ int32 cost2;
/*0081*/ int8 unknown80[7];
/*0088*/ int32 aa_expansion;
/*0092*/ int32 special_category;
/*0096*/ int32 unknown0096;
/*0100*/ int32 total_abilities;
/*0104*/ AA_Ability abilities[0];
};
struct AA_List {
SendAA_Struct* aa[0];
};
struct AA_Action {
/*00*/ int32 action;
/*04*/ int32 ability;
/*08*/ int32 unknown08;
/*12*/ int32 exp_value;
};
struct AA_Skills { //this should be removed and changed to AA_Array
/*00*/ int32 aa_skill; // Total AAs Spent
/*04*/ int32 aa_value;
/*08*/ int32 unknown08;
};
struct AAExpUpdate_Struct {
/*00*/ int32 unknown00; //seems to be a value from AA_Action.ability
/*04*/ int32 aapoints_unspent;
/*08*/ int8 aaxp_percent; //% of exp that goes to AAs
/*09*/ int8 unknown09[3]; //live doesn't always zero these, so they arnt part of aaxp_percent
};
struct AltAdvStats_Struct {
/*000*/ uint32 experience;
/*004*/ uint16 unspent;
/*006*/ uint16 unknown006;
/*008*/ int8 percentage;
/*009*/ int8 unknown009[3];
};
struct PlayerAA_Struct { // Is this still used?
AA_Skills aa_list[MAX_PP_AA_ARRAY];
};
struct AATable_Struct {
/*00*/ sint32 aa_spent; // Total AAs Spent
/*04*/ sint32 aa_assigned; // Assigned: field in the AA window.
/*08*/ sint32 aa_spent3; // Unknown. Same as aa_spent in observed packets.
/*12*/ sint32 unknown012;
/*16*/ sint32 unknown016;
/*20*/ sint32 unknown020;
/*24*/ AA_Skills aa_list[MAX_PP_AA_ARRAY];
};
struct Weather_Struct {
uint32 val1; //generall 0x000000FF
uint32 type; //0x31=rain, 0x02=snow(i think), 0 = normal
uint32 mode;
};
struct ZoneInUnknown_Struct {
uint32 val1;
uint32 val2;
uint32 val3;
};
struct MobHealth_Struct {
uint16 entity_id;
uint8 hp;
};
struct AnnoyingZoneUnknown_Struct {
uint32 entity_id;
uint32 value; //always 4
};
struct LoadSpellSet_Struct {
uint8 spell[MAX_PP_MEMSPELL]; // 0 if no action
uint16 unknown2; // is this two more spell gems?
uint32 unknown; // there seems to be an extra field in this packet...
};
struct BlockedBuffs_Struct {
/*000*/ uint8 unknown000[80];
/*080*/ uint8 unknown081;
/*081*/ uint8 unknown082;
/*082*/ uint8 unknown083;
/*083*/ uint8 unknown084;
/*084*/ uint8 unknown085;
/*085*/ uint8 unknown086;
/*086*/ uint8 unknown087;
/*087*/ uint8 unknown088;
/*088*/
};
//Size 24 Bytes
struct WorldObfuscator_Struct
{
/*000*/ uint32 var1;
/*004*/ uint32 Unknown1;
/*008*/ uint32 Unknown2;
/*012*/ uint32 Unknown3;
/*016*/ uint32 var2;
/*020*/ uint32 Unknown4;
/*024*/
};
struct ExpansionInfo_Struct {
/*000*/ char Unknown000[64];
/*064*/ uint32 Expansions;
};
struct ApplyPoison_Struct {
uint32 inventorySlot;
uint32 success;
};
struct ItemVerifyRequest_Struct {
/*000*/ sint32 slot; // Slot being Right Clicked
/*004*/ uint32 target; // Target Entity ID
/*008*/
};
struct ItemVerifyReply_Struct {
/*000*/ sint32 slot; // Slot being Right Clicked
/*004*/ uint32 spell; // Spell ID to cast if different than item effect
/*008*/ uint32 target; // Target Entity ID
/*012*/
};
struct ItemSerializationHeader
{
/*000*/ uint32 stacksize;
/*004*/ uint32 unknown004;
/*008*/ uint32 slot;
/*012*/ uint32 price;
/*016*/ uint32 merchant_slot; //1 if not a merchant item
/*020*/ uint32 unknown020; //0
/*024*/ uint32 instance_id; //unique instance id if not merchant item, else is merchant slot
/*028*/ uint32 unknown028; //0
/*032*/ uint32 last_cast_time; // Unix Time from PP of last cast for this recast type if recast delay > 0
/*036*/ uint32 charges; //Total Charges an item has (-1 for unlimited)
/*040*/ uint32 inst_nodrop; // 1 if the item is no drop (attuned items)
/*044*/ uint32 unknown044; //0
/*048*/ uint32 unknown048; //0
/*052*/ uint32 unknown052; //0
/*056*/ uint32 unknown056; //0
/*060*/ uint8 unknown060; //0
/*061*/ uint8 unknown061; //0 - Add Evolving Item struct if this isn't set to 0?
/*062*/ uint8 unknown062; // New to Underfoot
/*063*/ uint8 ItemClass; //0, 1, or 2
};
struct ItemBodyStruct
{
uint32 id;
uint8 weight;
uint8 norent;
uint8 nodrop;
uint8 attune;
uint8 size;
uint32 slots;
uint32 price;
uint32 icon;
uint8 unknown1;
uint8 unknown2;
uint32 BenefitFlag;
uint8 tradeskills;
sint8 CR;
sint8 DR;
sint8 PR;
sint8 MR;
sint8 FR;
sint8 SVCorruption;
sint8 AStr;
sint8 ASta;
sint8 AAgi;
sint8 ADex;
sint8 ACha;
sint8 AInt;
sint8 AWis;
sint32 HP;
sint32 Mana;
uint32 Endur;
sint32 AC;
sint32 regen;
sint32 mana_regen;
sint32 end_regen;
uint32 Classes;
uint32 Races;
uint32 Deity;
sint32 SkillModValue;
uint32 unknown5;
uint32 SkillModType;
uint32 BaneDmgRace;
uint32 BaneDmgBody;
uint32 BaneDmgRaceAmt;
sint32 BaneDmgAmt;
uint8 Magic;
sint32 CastTime_;
uint32 ReqLevel;
uint32 RecLevel;
uint32 RecSkill;
uint32 BardType;
sint32 BardValue;
uint8 Light;
uint8 Delay;
uint8 ElemDmgType;
uint8 ElemDmgAmt;
uint8 Range;
uint32 Damage;
uint32 Color;
uint8 ItemType;
uint32 Material;
uint32 unknown7;
uint32 EliteMaterial;
float SellRate;
sint32 CombatEffects;
sint32 Shielding;
sint32 StunResist;
sint32 StrikeThrough;
sint32 ExtraDmgSkill;
sint32 ExtraDmgAmt;
sint32 SpellShield;
sint32 Avoidance;
sint32 Accuracy;
uint32 CharmFileID; //not sure the point of this; disables all stats on item if > 0
uint32 FactionMod1;
sint32 FactionAmt1;
uint32 FactionMod2;
sint32 FactionAmt2;
uint32 FactionMod3;
sint32 FactionAmt3;
uint32 FactionMod4;
sint32 FactionAmt4;
};
struct AugSlotStruct
{
uint32 type;
uint8 visible;
uint8 unknown;
};
struct ItemTertiaryBodyStruct
{
sint32 loregroup;
uint8 artifact;
uint8 summonedflag;
uint32 favor;
uint8 fvnodrop;
sint32 dotshield;
sint32 atk;
sint32 haste;
sint32 damage_shield;
uint32 guildfavor;
uint32 augdistil;
sint32 unknown3;
uint32 unknown4;
uint8 no_pet;
uint8 unknown5;
uint8 potion_belt_enabled;
uint32 potion_belt_slots;
uint32 stacksize;
uint8 no_transfer;
uint16 expendablearrow;
uint32 unknown8;
uint32 unknown9;
uint32 unknown10;
uint32 unknown11;
uint8 unknown12;
uint8 unknown13;
uint8 unknown14;
};
struct ClickEffectStruct
{
sint32 effect;
uint8 level2;
uint32 type;
uint8 level;
sint32 max_charges;
sint32 cast_time;
uint32 recast;
sint32 recast_type;
uint32 clickunk5;
//uint8 effect_string; //unused
//sint32 clickunk7;
};
struct ProcEffectStruct
{
uint32 effect;
uint8 level2;
uint32 type;
uint8 level;
uint32 unknown1; // poison?
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
uint32 procrate;
//uint8 effect_string;
//uint32 unknown5;
};
struct WornEffectStruct //worn, focus and scroll effect
{
uint32 effect;
uint8 level2;
uint32 type;
uint8 level;
uint32 unknown1;
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
uint32 unknown5;
//uint8 effect_string;
//uint32 unknown6;
};
struct ItemSecondaryBodyStruct{
uint32 augtype;
uint32 augrestrict;
AugSlotStruct augslots[5];
uint32 ldonpoint_type;
uint32 ldontheme;
uint32 ldonprice;
uint32 ldonsellbackrate;
uint32 ldonsold;
uint8 bagtype;
uint8 bagslots;
uint8 bagsize;
uint8 wreduction;
uint8 book;
uint8 booktype;
//sint32 filename; filename is either 0xffffffff/0x00000000 or the null term string ex: CREWizardNote\0
};
struct ItemQuaternaryBodyStruct
{
uint32 scriptfileid;
uint8 quest_item;
uint32 unknown15; //0xffffffff - Power Source Capacity?
uint32 Purity;
uint32 BackstabDmg;
uint32 DSMitigation;
sint32 HeroicStr;
sint32 HeroicInt;
sint32 HeroicWis;
sint32 HeroicAgi;
sint32 HeroicDex;
sint32 HeroicSta;
sint32 HeroicCha;
sint32 HeroicMR;
sint32 HeroicFR;
sint32 HeroicCR;
sint32 HeroicDR;
sint32 HeroicPR;
sint32 HeroicSVCorrup;
sint32 HealAmt;
sint32 SpellDmg;
sint32 clairvoyance;
uint8 unknown18; //Power Source Capacity or evolve filename?
uint32 evolve_string; // Some String, but being evolution related is just a guess
uint8 unknown19;
uint32 unknown20; // Bard Stuff?
uint32 unknown21;
uint32 unknown22;
uint32 subitem_count;
};
struct AugmentInfo_Struct
{
/*000*/ uint32 itemid; // id of the solvent needed
/*004*/ uint8 window; // window to display the information in
/*005*/ uint8 unknown005[71]; // total packet length 76, all the rest were always 00
/*076*/
};
struct VeteranRewardItem
{
/*000*/ int32 item_id;
/*004*/ int32 charges;
/*008*/ char item_name[64];
};
struct VeteranReward
{
/*000*/ int32 claim_id;
/*004*/ int32 number_available;
/*008*/ int32 claim_count;
/*012*/ VeteranRewardItem items[8];
};
struct ExpeditionEntryHeader_Struct
{
/*000*/ uint32 unknown000;
/*000*/ uint32 number_of_entries;
};
struct ExpeditionJoinPrompt_Struct
{
/*000*/ uint32 clientid;
/*004*/ uint32 unknown004;
/*008*/ char player_name[64];
/*072*/ char expedition_name[64];
};
struct ExpeditionExpireWarning
{
/*000*/ uint32 clientid;
/*004*/ uint32 unknown004;
/*008*/ uint32 minutes_remaining;
};
struct ExpeditionInfo_Struct
{
/*000*/ uint32 clientid;
/*004*/ uint32 unknown004;
/*008*/ uint32 unknown008;
/*012*/ uint32 max_players;
/*016*/ char expedition_name[128];
/*142*/ char leader_name[64];
};
struct ExpeditionCompassEntry_Struct
{
/*000*/ float unknown000; //seen *((uint32*)) = 1584791871
/*004*/ uint32 enabled; //guess
/*008*/ uint32 unknown008; //seen 1019
/*012*/ float y;
/*016*/ float x;
/*020*/ float z;
};
struct ExpeditionCompass_Struct
{
/*000*/ uint32 clientid;
/*004*/ uint32 count;
/*008*/ ExpeditionCompassEntry_Struct entries[0];
};
struct AltCurrencySelectItem_Struct {
uint32 merchant_entity_id;
uint32 slot_id;
uint32 unknown008;
uint32 unknown012;
uint32 unknown016;
uint32 unknown020;
uint32 unknown024;
uint32 unknown028;
uint32 unknown032;
uint32 unknown036;
uint32 unknown040;
uint32 unknown044;
uint32 unknown048;
uint32 unknown052;
uint32 unknown056;
uint32 unknown060;
uint32 unknown064;
uint32 unknown068;
uint32 unknown072;
uint32 unknown076;
};
struct AltCurrencySellItem_Struct {
/*000*/ uint32 merchant_entity_id;
/*004*/ uint32 slot_id;
/*006*/ uint32 charges;
/*010*/ uint32 cost;
};
struct AltCurrencyPopulateEntry_Struct
{
/*000*/ uint32 currency_number; //corresponds to a dbstr id as well, the string matches what shows up in the "alternate currency" tab.
/*004*/ uint32 unknown00; //always 1
/*008*/ uint32 currency_number2; //always same as currency number
/*012*/ uint32 item_id; //appears to be the item id
/*016*/ uint32 item_icon; //actual icon
/*020*/ uint32 stack_size; //most are set to 1000, the stack size for the item; should match db i think or there will be problems.
/*024*/ uint8 unknown024; //seen 0 and 1
};
struct AltCurrencyPopulate_Struct {
/*000*/ uint32 opcode; //8 for populate
/*004*/ uint32 count; //number of entries
/*008*/ AltCurrencyPopulateEntry_Struct entries[0];
};
}; //end namespace structs
}; //end namespace Underfoot
WARNING: NONE OF THESE HAVE BEEN TESTED... I JUST FOUND THEM AND DECIDED TO SHARE...

