|
From: <xer...@us...> - 2026-07-30 00:29:22
|
Revision: 1685
http://sourceforge.net/p/seq/svn/1685
Author: xerxes00
Date: 2026-07-30 00:29:19 +0000 (Thu, 30 Jul 2026)
Log Message:
-----------
EQ Legends 2026-07-29 patch: opcode rotation + position struct updates
- 0729 zone opcode rotation
- everquest.h: 0729 position / self-state / heading struct layouts
- player.cpp, spawnshell.cpp: read positions through the updated structs
- s_everquest.h: register the new structs
Modified Paths:
--------------
showeq/branches/showeqlegends/conf/zoneopcodes.xml
showeq/branches/showeqlegends/src/everquest.h
showeq/branches/showeqlegends/src/player.cpp
showeq/branches/showeqlegends/src/s_everquest.h
showeq/branches/showeqlegends/src/spawnshell.cpp
Modified: showeq/branches/showeqlegends/conf/zoneopcodes.xml
===================================================================
--- showeq/branches/showeqlegends/conf/zoneopcodes.xml 2026-07-29 18:42:09 UTC (rev 1684)
+++ showeq/branches/showeqlegends/conf/zoneopcodes.xml 2026-07-30 00:29:19 UTC (rev 1685)
@@ -16,97 +16,82 @@
-->
<!-- Critical opcodes used directly by ShowEQ -->
- <opcode id="50e5" name="OP_PlayerProfile" priority="10" updated="07/28/26">
- <comment>CharProfileCode</comment>
+ <opcode id="014a" name="OP_PlayerProfile" priority="10" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="5c7f" name="OP_ZoneEntry" priority="10" updated="07/28/26">
- <comment>ZoneEntryCode</comment>
+ <opcode id="5aaf" name="OP_ZoneEntry" priority="10" updated="07/29/26">
<payload dir="client" typename="ClientZoneEntryStruct" sizechecktype="match"/>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="7377" name="OP_TimeOfDay" priority="3" updated="07/28/26">
+ <opcode id="5920" name="OP_TimeOfDay" priority="3" updated="07/29/26">
<payload dir="server" typename="timeOfDayStruct" sizechecktype="match"/>
</opcode>
- <opcode id="47f2" name="OP_NewZone" priority="10" updated="07/28/26">
- <comment>NewZoneCode</comment>
+ <opcode id="0a2e" name="OP_NewZone" priority="10" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="3f1b" name="OP_SpawnDoor" priority="9" updated="07/28/26">
+ <opcode id="1e04" name="OP_SpawnDoor" priority="9" updated="07/29/26">
<payload dir="server" typename="doorStruct" sizechecktype="modulus"/>
</opcode>
- <opcode id="5331" name="OP_GroundSpawn" priority="9" updated="07/28/26">
- <comment>MakeDropCode</comment>
+ <opcode id="5784" name="OP_GroundSpawn" priority="9" updated="07/29/26">
<payload dir="server" typename="makeDropStruct" sizechecktype="none"/>
</opcode>
- <opcode id="0834" name="OP_SendZonePoints" priority="5" updated="07/28/26">
- <comment>Coords in a zone that will port you to another zone</comment>
+ <opcode id="3b84" name="OP_SendZonePoints" priority="5" updated="07/29/26">
<payload dir="server" typename="zonePointsStruct" sizechecktype="none"/>
</opcode>
- <opcode id="1d38" name="OP_AAExpUpdate" priority="4" updated="07/28/26">
+ <opcode id="3b21" name="OP_AAExpUpdate" priority="4" updated="07/29/26">
+ <comment>AA exp + unassigned points</comment>
<payload dir="server" typename="altExpUpdateStruct" sizechecktype="match"/>
</opcode>
- <opcode id="5abf" name="OP_ExpUpdate" priority="4" updated="07/28/26">
+ <opcode id="28d4" name="OP_ExpUpdate" priority="4" updated="07/29/26">
<payload dir="server" typename="expUpdateStruct" sizechecktype="match"/>
</opcode>
- <opcode id="70c5" name="OP_GuildMOTD" priority="2" updated="07/28/26">
- <comment>GuildMOTD</comment>
+ <opcode id="7e2a" name="OP_GuildMOTD" priority="2" updated="07/29/26">
<payload dir="server" typename="guildMOTDStruct" sizechecktype="none"/>
</opcode>
- <opcode id="5bfd" name="OP_ClientUpdate" priority="10" updated="07/28/26">
- <comment>Position updates</comment>
+ <opcode id="5380" name="OP_ClientUpdate" priority="10" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
<payload dir="client" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="26d8" name="OP_MobUpdate" priority="10" updated="07/28/26">
- <comment>MobUpdateCode</comment>
+ <opcode id="4eda" name="OP_MobUpdate" priority="10" updated="07/29/26">
<payload dir="both" typename="spawnPositionUpdate" sizechecktype="none"/>
</opcode>
- <opcode id="1856" name="OP_DeleteSpawn" priority="10" updated="07/28/26">
- <comment>DeleteSpawnCode</comment>
+ <opcode id="1f3d" name="OP_DeleteSpawn" priority="10" updated="07/29/26">
<payload dir="both" typename="deleteSpawnStruct" sizechecktype="match"/>
</opcode>
- <opcode id="27cb" name="OP_RemoveSpawn" priority="10" updated="07/28/26">
- <comment>Remove spawn from zone</comment>
+ <opcode id="0113" name="OP_RemoveSpawn" priority="10" updated="07/29/26">
<payload dir="both" typename="removeSpawnStruct" sizechecktype="none"/>
</opcode>
- <opcode id="4a78" name="OP_WearChange" priority="2" updated="07/28/26">
+ <opcode id="4155" name="OP_WearChange" priority="2" updated="07/29/26">
<priorityNote>stock handler no-op; id mapped for log id only</priorityNote>
- <comment>SpawnUpdateCode</comment>
<payload dir="both" typename="SpawnUpdateStruct" sizechecktype="match"/>
</opcode>
- <opcode id="384f" name="OP_SpawnAppearance" priority="10" updated="07/28/26">
- <comment>SpawnAppearanceCode</comment>
+ <opcode id="03f8" name="OP_SpawnAppearance" priority="10" updated="07/29/26">
<payload dir="both" typename="spawnEventEQLStruct" sizechecktype="match"/>
</opcode>
- <opcode id="17a1" name="OP_Stamina" priority="4" updated="07/28/26">
+ <opcode id="03ce" name="OP_Stamina" priority="4" updated="07/29/26">
+ <comment>food/water ticks</comment>
<payload dir="server" typename="staminaStruct" sizechecktype="match"/>
</opcode>
- <opcode id="3139" name="OP_HPUpdate" priority="10" updated="07/28/26">
- <comment>NpcHpUpdateCode Update HP % of a PC or NPC</comment>
+ <opcode id="50c2" name="OP_HPUpdate" priority="10" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="0aa2" name="OP_GuildMemberUpdate" priority="3" updated="07/28/26">
+ <opcode id="16d9" name="OP_GuildMemberUpdate" priority="3" updated="07/29/26">
<payload dir="server" typename="GuildMemberUpdate" sizechecktype="match"/>
</opcode>
- <opcode id="23ee" name="OP_ClickObject" priority="9" updated="07/28/26">
- <comment>Server removing a ground drop (pickup)</comment>
+ <opcode id="4ee1" name="OP_ClickObject" priority="9" updated="07/29/26">
<payload dir="server" typename="remDropStruct" sizechecktype="match"/>
</opcode>
- <opcode id="50e8" name="OP_Action" priority="7" updated="07/28/26">
- <comment>Spells cast etc</comment>
+ <opcode id="130a" name="OP_Action" priority="7" updated="07/29/26">
<payload dir="both" typename="actionStruct" sizechecktype="match"/>
<payload dir="both" typename="actionAltStruct" sizechecktype="match"/>
</opcode>
- <opcode id="7df9" name="OP_Action2" priority="7" updated="07/28/26">
- <comment>Combat actions i.e. bash, kick etc</comment>
+ <opcode id="0ed3" name="OP_Action2" priority="7" updated="07/29/26">
<payload dir="both" typename="action2Struct" sizechecktype="match"/>
</opcode>
- <opcode id="64c4" name="OP_Consider" priority="9" updated="07/28/26">
- <comment>Consider request/response</comment>
+ <opcode id="53f1" name="OP_Consider" priority="9" updated="07/29/26">
<payload dir="both" typename="considerStruct" sizechecktype="match"/>
</opcode>
- <opcode id="3897" name="OP_TargetMouse" priority="9" updated="07/28/26">
+ <opcode id="784e" name="OP_TargetMouse" priority="9" updated="07/29/26">
<comment>Targeting a spawn via mouse</comment>
<payload dir="both" typename="clientTargetStruct" sizechecktype="match"/>
</opcode>
@@ -114,93 +99,78 @@
<comment>Spawns getting renamed after initial NewSpawn</comment>
<payload dir="server" typename="spawnRenameStruct" sizechecktype="match"/>
</opcode>
- <opcode id="5201" name="OP_Illusion" priority="8" updated="07/28/26">
- <comment>Spawn being illusioned (changing forms)</comment>
+ <opcode id="4037" name="OP_Illusion" priority="8" updated="07/29/26">
<payload dir="both" typename="spawnIllusionStruct" sizechecktype="match"/>
</opcode>
- <opcode id="3360" name="OP_ZoneChange" priority="10" updated="07/28/26">
+ <opcode id="07b6" name="OP_ZoneChange" priority="10" updated="07/29/26">
<priorityNote>server never sends it; handler only sets m_zoning</priorityNote>
- <comment>old ZoneChangeCode</comment>
<payload dir="both" typename="zoneChangeEQLStruct" sizechecktype="match"/>
</opcode>
- <opcode id="63c6" name="OP_GroupInvite" priority="4" updated="07/28/26">
- <comment>You invite someone while ungrouped or get invited by someone ungrouped</comment>
+ <opcode id="0cb5" name="OP_GroupInvite" priority="4" updated="07/29/26">
<payload dir="both" typename="groupInviteStruct" sizechecktype="match"/>
</opcode>
- <opcode id="7a77" name="OP_GroupCancelInvite" priority="4" updated="07/28/26">
+ <opcode id="70a8" name="OP_GroupCancelInvite" priority="4" updated="07/29/26">
<priorityNote>single sample; reason byte unverified</priorityNote>
- <comment>Declining to join a group</comment>
<payload dir="both" typename="groupDeclineStruct" sizechecktype="none"/>
</opcode>
- <opcode id="4e40" name="OP_GroupFollow" priority="4" updated="07/28/26">
+ <opcode id="6711" name="OP_GroupFollow" priority="4" updated="07/29/26">
<payload dir="server" typename="groupFollowStruct" sizechecktype="match"/>
</opcode>
- <opcode id="68d3" name="OP_GroupUpdate" priority="6" updated="07/28/26">
+ <opcode id="09ec" name="OP_GroupUpdate" priority="6" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="216d" name="OP_GroupDisband" priority="4" updated="07/28/26">
+ <opcode id="587b" name="OP_GroupDisband" priority="4" updated="07/29/26">
<payload dir="server" typename="groupDisbandStruct" sizechecktype="match"/>
</opcode>
- <opcode id="18e2" name="OP_GroupLeader" priority="4" updated="07/28/26">
+ <opcode id="5767" name="OP_GroupLeader" priority="4" updated="07/29/26">
<priorityNote>single sample; unconfirmed on /makeleader</priorityNote>
<payload dir="server" typename="groupLeaderChangeStruct" sizechecktype="none"/>
</opcode>
- <opcode id="122f" name="OP_Buff" priority="6" updated="07/28/26">
+ <opcode id="272c" name="OP_Buff" priority="6" updated="07/29/26">
<priorityNote>client dir = memorize/forget, consumed silently</priorityNote>
- <comment>old BuffDropCode</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
<payload dir="client" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="2c36" name="OP_BeginCast" priority="5" updated="07/28/26">
+ <opcode id="4970" name="OP_BeginCast" priority="5" updated="07/29/26">
<payload dir="both" typename="beginCastStruct" sizechecktype="none"/>
</opcode>
- <opcode id="155e" name="OP_CastSpell" priority="5" updated="07/28/26">
+ <opcode id="224f" name="OP_CastSpell" priority="5" updated="07/29/26">
<payload dir="both" typename="startCastStruct" sizechecktype="match"/>
</opcode>
- <opcode id="4459" name="OP_SwapSpell" priority="3" updated="07/28/26">
- <comment>TradeSpellBookSlotsCode</comment>
+ <opcode id="0386" name="OP_SwapSpell" priority="3" updated="07/29/26">
<payload dir="both" typename="tradeSpellBookSlotsStruct" sizechecktype="match"/>
</opcode>
- <opcode id="5503" name="OP_InspectAnswer" priority="3" updated="07/28/26">
- <comment>InspectDataCode</comment>
+ <opcode id="104d" name="OP_InspectAnswer" priority="3" updated="07/29/26">
<payload dir="server" typename="inspectDataStruct" sizechecktype="match"/>
</opcode>
- <opcode id="6d34" name="OP_Emote" priority="4" updated="07/28/26">
- <comment>EmoteTextCode</comment>
+ <opcode id="185c" name="OP_Emote" priority="4" updated="07/29/26">
<payload dir="both" typename="emoteTextStruct" sizechecktype="none"/>
</opcode>
- <opcode id="72cb" name="OP_SimpleMessage" priority="4" updated="07/28/26">
- <comment>SimpleMessageCode</comment>
+ <opcode id="0c5f" name="OP_SimpleMessage" priority="4" updated="07/29/26">
<payload dir="server" typename="simpleMessageStruct" sizechecktype="match"/>
</opcode>
- <opcode id="06f1" name="OP_FormattedMessage" priority="4" updated="07/28/26">
- <comment>FormattedMessageCode i.e. pet dismissed etc</comment>
+ <opcode id="7445" name="OP_FormattedMessage" priority="4" updated="07/29/26">
<payload dir="server" typename="formattedMessageStruct" sizechecktype="none"/>
</opcode>
- <opcode id="37fa" name="OP_CommonMessage" priority="9" updated="07/28/26">
- <comment>ChannelMessageCode i.e. /tell /ooc /shout etc</comment>
+ <opcode id="419f" name="OP_CommonMessage" priority="9" updated="07/29/26">
<payload dir="both" typename="channelMessageStruct" sizechecktype="none"/>
</opcode>
- <opcode id="4e60" name="OP_SpecialMesg" priority="4" updated="07/28/26">
- <comment>Communicate textual info to client including hail responses etc</comment>
+ <opcode id="6ee3" name="OP_SpecialMesg" priority="4" updated="07/29/26">
<payload dir="server" typename="specialMessageStruct" sizechecktype="none"/>
</opcode>
- <opcode id="05b1" name="OP_RandomReq" priority="2" updated="07/28/26">
+ <opcode id="612d" name="OP_RandomReq" priority="2" updated="07/29/26">
<payload dir="client" typename="randomReqStruct" sizechecktype="none"/>
</opcode>
- <opcode id="79a0" name="OP_RandomReply" priority="2" updated="07/28/26">
+ <opcode id="5d02" name="OP_RandomReply" priority="2" updated="07/29/26">
<payload dir="server" typename="randomStruct" sizechecktype="match"/>
</opcode>
- <opcode id="492d" name="OP_ConsentResponse" priority="3" updated="07/28/26">
- <comment>Server replying with consent information after /consent</comment>
+ <opcode id="3ed1" name="OP_ConsentResponse" priority="3" updated="07/29/26">
<payload dir="server" typename="consentResponseStruct" sizechecktype="match"/>
</opcode>
- <opcode id="3991" name="OP_DenyResponse" priority="3" updated="07/28/26">
- <comment>Server replying with deny information after /deny</comment>
+ <opcode id="3a86" name="OP_DenyResponse" priority="3" updated="07/29/26">
<payload dir="server" typename="consentResponseStruct" sizechecktype="match"/>
</opcode>
- <opcode id="2b95" name="OP_ManaChange" priority="5" updated="07/28/26">
- <comment>Mana change. Bards send this up with no size. Casters receive this for mana updates.</comment>
+ <opcode id="3b08" name="OP_ManaChange" priority="5" updated="07/29/26">
<payload dir="server" typename="manaDecrementStruct" sizechecktype="match"/>
</opcode>
<opcode id="ffff" name="OP_MoneyOnCorpse" priority="4" updated="07/19/23">
@@ -207,14 +177,12 @@
<comment>MoneyOnCorpseCode</comment>
<payload dir="server" typename="moneyOnCorpseStruct" sizechecktype="match"/>
</opcode>
- <opcode id="0462" name="OP_SkillUpdate" priority="5" updated="07/28/26">
+ <opcode id="1ee1" name="OP_SkillUpdate" priority="5" updated="07/29/26">
<priorityNote>prior id 0dc7 was the zone-in bulk dump (OOB crash); bounds guard kept</priorityNote>
- <comment>Skill up code</comment>
<payload dir="server" typename="skillIncStruct" sizechecktype="match"/>
</opcode>
- <opcode id="70c6" name="OP_LevelUpdate" priority="8" updated="07/28/26">
+ <opcode id="485a" name="OP_LevelUpdate" priority="8" updated="07/29/26">
<priorityNote>single sample</priorityNote>
- <comment>LevelUpUpdateCode</comment>
<payload dir="server" typename="levelUpUpdateStruct" sizechecktype="none"/>
</opcode>
<opcode id="ffff" name="OP_CorpseLocResponse" priority="2" updated="12/12/12">
@@ -223,37 +191,31 @@
</opcode>
<!-- Not necessary for SEQ to run but here to name packets in logs. -->
- <opcode id="1160" name="OP_Logout" priority="3" updated="07/28/26">
+ <opcode id="30ce" name="OP_Logout" priority="3" updated="07/29/26">
<priorityNote>handler wired DIR_Client only</priorityNote>
- <comment>Camp/logout handshake</comment>
<payload dir="both" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="652b" name="OP_Animation" priority="0" updated="07/28/26">
+ <opcode id="486e" name="OP_Animation" priority="0" updated="07/29/26">
<priorityNote>noHandler</priorityNote>
- <comment>spawnId + action + value; fires per spawn animation</comment>
<payload dir="both" typename="spawnAnimationStruct" sizechecktype="none"/>
</opcode>
- <opcode id="3fb1" name="OP_InspectRequest" priority="0" updated="07/28/26">
+ <opcode id="6426" name="OP_InspectRequest" priority="0" updated="07/29/26">
<priorityNote>noHandler</priorityNote>
<payload dir="client" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="7199" name="OP_LootMessageEQL" priority="4" updated="07/28/26">
- <comment>Loot-and-sell message</comment>
+ <opcode id="482e" name="OP_LootMessageEQL" priority="4" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="03c3" name="OP_MoneyUpdateEQL" priority="4" updated="07/28/26">
- <comment>Running money total [plat,gold,silver,copper]</comment>
+ <opcode id="64a2" name="OP_MoneyUpdateEQL" priority="4" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="157b" name="OP_GuildsInZoneList" priority="8" updated="07/28/26">
- <comment>Listing of guild names present in the current zone. Generally seen on zoning</comment>
+ <opcode id="6540" name="OP_GuildsInZoneList" priority="8" updated="07/29/26">
<payload dir="server" typename="guildsInZoneListStruct" sizechecktype="none"/>
</opcode>
- <opcode id="63a5" name="OP_NewGuildInZone" priority="8" updated="07/28/26">
- <comment>An additional guild name has appeared in the current zone. Seen when a guilded player enters the current zone</comment>
+ <opcode id="4c75" name="OP_NewGuildInZone" priority="8" updated="07/29/26">
<payload dir="server" typename="newGuildInZoneStruct" sizechecktype="none"/>
</opcode>
- <opcode id="767d" name="OP_Find" priority="0" updated="07/28/26">
+ <opcode id="0ad1" name="OP_Find" priority="0" updated="07/29/26">
<priorityNote>noHandler</priorityNote>
<payload dir="client" typename="uint8_t" sizechecktype="none"/>
</opcode>
@@ -262,49 +224,41 @@
Using these marks unknown opcodes in logs for easier reading -->
<!-- Below are unverified -->
- <opcode id="2a24" name="OP_SendAATable" priority="5" updated="07/28/26">
- <comment>AA definition table</comment>
+ <opcode id="43f1" name="OP_SendAATable" priority="5" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="6ec9" name="OP_HideCorpse" priority="0" updated="07/28/26">
+ <opcode id="1368" name="OP_HideCorpse" priority="0" updated="07/29/26">
<priorityNote>noHandler</priorityNote>
<payload dir="client" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="6323" name="OP_SelfPosEQL" priority="10" updated="07/28/26">
- <comment>Client self-position</comment>
+ <opcode id="16ac" name="OP_SelfPosEQL" priority="10" updated="07/29/26">
<payload dir="client" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="3e7b" name="OP_NpcMoveUpdate" priority="10" updated="07/28/26">
- <comment>Position updates</comment>
+ <opcode id="2f15" name="OP_NpcMoveUpdate" priority="10" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="2087" name="OP_Death" priority="7" updated="07/28/26">
+ <opcode id="6737" name="OP_Death" priority="7" updated="07/29/26">
<priorityNote>also fires on corpse decay</priorityNote>
- <comment>old NewCorpseCode</comment>
<payload dir="server" typename="newCorpseStruct" sizechecktype="match"/>
</opcode>
- <opcode id="58ab" name="OP_DeathEQL" priority="3" updated="07/28/26">
- <comment>Death/combat subcode channel</comment>
+ <opcode id="35f6" name="OP_DeathEQL" priority="3" updated="07/29/26">
<payload dir="both" typename="deathRecordEQLStruct" sizechecktype="none"/>
</opcode>
- <opcode id="6e10" name="OP_GuildMemberList" priority="3" updated="07/28/26">
+ <opcode id="56ef" name="OP_GuildMemberList" priority="3" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="7bda" name="OP_BuffList" priority="6" updated="07/28/26">
- <comment>Per-spawn buff list</comment>
+ <opcode id="7e11" name="OP_BuffList" priority="6" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="4c71" name="OP_LoadoutSwapEQL" priority="3" updated="07/28/26">
- <comment>Loadout-swap self refresh</comment>
+ <opcode id="8758" name="OP_LoadoutSwapEQL" priority="3" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="2a6f" name="OP_LootDrops" priority="4" updated="07/28/26">
+ <opcode id="3989" name="OP_LootDrops" priority="4" updated="07/29/26">
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="2216" name="OP_DzSwitchInfoEQL" priority="3" updated="07/28/26">
+ <opcode id="01fb" name="OP_DzSwitchInfoEQL" priority="3" updated="07/29/26">
<priorityNote>wired but untested on Legends</priorityNote>
- <comment>Dynamic-zone switch info</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
@@ -1213,11 +1167,11 @@
<comment>SpellFadeCode</comment>
<payload dir="both" typename="spellFadedStruct" sizechecktype="none"/>
</opcode>
- <opcode id="0b49" name="OP_Stance" priority="0" updated="07/28/26">
+ <opcode id="2865" name="OP_Stance" priority="0" updated="07/29/26">
<priorityNote>noHandler</priorityNote>
<payload dir="both" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="2ae5" name="OP_Invocation" priority="0" updated="07/28/26">
+ <opcode id="6d48" name="OP_Invocation" priority="0" updated="07/29/26">
<priorityNote>noHandler</priorityNote>
<payload dir="both" typename="uint8_t" sizechecktype="none"/>
</opcode>
Modified: showeq/branches/showeqlegends/src/everquest.h
===================================================================
--- showeq/branches/showeqlegends/src/everquest.h 2026-07-29 18:42:09 UTC (rev 1684)
+++ showeq/branches/showeqlegends/src/everquest.h 2026-07-30 00:29:19 UTC (rev 1685)
@@ -1161,31 +1161,23 @@
struct
{
- // 2026-07-07 EQL layout: z, x, y are the low 19 bits of
- // three consecutive words, world value = field >> 3 (live
- // 19-bit convention). x/y keep the EQ Legends transposed
- // naming so setPos receives the same world axes as before.
- // The high 13 bits of each coord word are presumed deltas
- // but are unvalidated; heading/animation/pitch positions
- // in words 3-4 are unmapped (0x6000/0 observed) - all are
- // zeroed at consumption in spawn.cpp until wire-mapped.
- // EQ Legends 2026-07-28 posData layout (spawnshell skips the
- // one leading junk word, then reads these 5). word0 and
- // word3 carry the two horizontal coords; assigning y to
- // word0 and x to word3 rotates the dots to align with the
- // zone map (the reverse assignment came out 90 deg off).
- signed y:19; // y coord (EQ Legends x/y transposed) - word0
- signed deltaY:13; // presumed change in y (unvalidated)
+ // EQ Legends 2026-07-29 posData: low 19 bits of three
+ // consecutive words, field >> 3. Field names keep the EQL
+ // transposed convention consumed by setPos in spawn.cpp.
+ // High 13 bits presumed deltas (unvalidated); words 3-4
+ // unmapped and zeroed at consumption.
+ signed z:19;
+ signed deltaZ:13;
- signed z:19; // z coord (loc value 1) - word1
- signed deltaZ:13; // presumed change in z (unvalidated)
+ signed y:19;
+ signed deltaY:13;
- signed padCoord:32; // gap word (0 observed) - word2
+ signed x:19;
+ signed deltaX:13;
- signed x:19; // x coord (EQ Legends x/y transposed) - word3
- signed deltaX:13; // presumed change in x (unvalidated)
+ signed padCoord:32;
- unsigned heading:12; // word4 (unmapped/zeroed)
+ unsigned heading:12;
unsigned padding00:20;
};
@@ -1599,15 +1591,16 @@
struct playerPosUpdateEQLStruct
{
/*0000*/ uint32_t spawnId;
-/*0004*/ uint32_t unknown0004;
-/*0008*/ signed x:19; // map-X coord, >>3 to Spawn units (bit64)
+/*0004*/ signed z:19; // >>3 - EQL 0729 layout
+ signed deltaZ:13;
+/*0008*/ signed x:19; // >>3
signed deltaX:13;
-/*0012*/ signed z:19; // z coord, >>3 (bit96)
- signed deltaZ:13;
-/*0016*/ uint32_t unknown0016; // heading/animation region
-/*0020*/ signed y:19; // map-Y coord, >>3 (bit160)
+/*0012*/ signed y:19; // >>3
signed deltaY:13;
-/*0024*/
+/*0016*/ uint32_t unknown0016;
+/*0020*/ uint32_t unknown0020;
+/*0024*/ uint32_t unknown0024;
+/*0028*/
};
/*
@@ -2643,6 +2636,40 @@
/*0038*/
};
+// EQ Legends 2026-07-29 client self-state on the c2s OP_ClientUpdate
+// 42-byte record - freshest self position + facing (EQ h2048).
+// A 44-byte variant exists; trailing bytes are tolerated.
+struct eqlClientUpdateSelfStruct
+{
+/*0000*/ uint32_t seq;
+/*0004*/ uint16_t unknown0004;
+/*0006*/ float unknown0006;
+/*0010*/ float y;
+/*0014*/ uint32_t unknown0014;
+/*0018*/ float unknown0018;
+/*0022*/ float x;
+/*0026*/ uint16_t heading;
+/*0028*/ uint16_t unknown0028;
+/*0030*/ float unknown0030;
+/*0034*/ float z;
+/*0038*/ uint8_t tail[4];
+/*0042*/
+};
+
+// EQ Legends c2s self-position sample - 17-byte records tiled from
+// offset 0 in the OP_SelfPosEQL stream. The freshest plausible record
+// is the current position.
+struct eqlSelfPosRecord
+{
+/*0000*/ float y;
+/*0004*/ float x;
+/*0008*/ float z;
+/*0012*/ uint8_t flag;
+/*0013*/ uint16_t counter;
+/*0015*/ uint16_t seq;
+/*0017*/
+};
+
/*
** Spawn Appearance
** Length: 8 Octets
Modified: showeq/branches/showeqlegends/src/player.cpp
===================================================================
--- showeq/branches/showeqlegends/src/player.cpp 2026-07-29 18:42:09 UTC (rev 1684)
+++ showeq/branches/showeqlegends/src/player.cpp 2026-07-30 00:29:19 UTC (rev 1685)
@@ -967,10 +967,8 @@
uint16_t lastCtr = 0;
for (size_t off = 0; off + 17 <= len; off += 17)
{
- float tx, ty, tz;
- memcpy(&tx, data + off, 4);
- memcpy(&ty, data + off + 4, 4);
- memcpy(&tz, data + off + 8, 4);
+ const eqlSelfPosRecord* r = (const eqlSelfPosRecord*)(data + off);
+ float tx = r->y, ty = r->x, tz = r->z;
if (tx > -100000.0f && tx < 100000.0f &&
ty > -100000.0f && ty < 100000.0f &&
tz > -10000.0f && tz < 10000.0f &&
@@ -977,7 +975,7 @@
(tx != 0.0f || ty != 0.0f))
{
fx = tx; fy = ty; fz = tz; found = true;
- memcpy(&lastCtr, data + off + 13, 2);
+ lastCtr = r->counter;
}
}
if (!found)
@@ -992,17 +990,14 @@
uint16_t backCtr = 0;
for (size_t off = 0; off + 17 <= len; off += 17)
{
- float tx, ty, tz;
- memcpy(&tx, data + off, 4);
- memcpy(&ty, data + off + 4, 4);
- memcpy(&tz, data + off + 8, 4);
+ const eqlSelfPosRecord* r = (const eqlSelfPosRecord*)(data + off);
+ float tx = r->y, ty = r->x, tz = r->z;
if (!(tx > -100000.0f && tx < 100000.0f &&
ty > -100000.0f && ty < 100000.0f &&
tz > -10000.0f && tz < 10000.0f &&
(tx != 0.0f || ty != 0.0f)))
continue;
- uint16_t tctr;
- memcpy(&tctr, data + off + 13, 2);
+ uint16_t tctr = r->counter;
uint16_t age = (uint16_t)(lastCtr - tctr);
if (age >= 250 && age < 5000)
{
@@ -1049,17 +1044,14 @@
uint16_t shortCtr = 0;
for (size_t off = 0; off + 17 <= len; off += 17)
{
- float tx, ty, tz;
- memcpy(&tx, data + off, 4);
- memcpy(&ty, data + off + 4, 4);
- memcpy(&tz, data + off + 8, 4);
+ const eqlSelfPosRecord* r = (const eqlSelfPosRecord*)(data + off);
+ float tx = r->y, ty = r->x, tz = r->z;
if (!(tx > -100000.0f && tx < 100000.0f &&
ty > -100000.0f && ty < 100000.0f &&
tz > -10000.0f && tz < 10000.0f &&
(tx != 0.0f || ty != 0.0f)))
continue;
- uint16_t tctr;
- memcpy(&tctr, data + off + 13, 2);
+ uint16_t tctr = r->counter;
uint16_t age = (uint16_t)(lastCtr - tctr);
if (age >= 80 && age < 250)
{
@@ -1338,10 +1330,8 @@
bool plausible = false;
for (size_t off = 0; off + 17 <= len; off += 17)
{
- float ty, tx, tz;
- memcpy(&ty, data + off, 4);
- memcpy(&tx, data + off + 4, 4);
- memcpy(&tz, data + off + 8, 4);
+ const eqlSelfPosRecord* r = (const eqlSelfPosRecord*)(data + off);
+ float ty = r->y, tx = r->x, tz = r->z;
bool ok =
(tx == 0.0f || (fabsf(tx) >= 0.001f && fabsf(tx) < 100000.0f)) &&
(ty == 0.0f || (fabsf(ty) >= 0.001f && fabsf(ty) < 100000.0f)) &&
@@ -1350,7 +1340,7 @@
if (ok)
{
wy = ty; wx = tx; wz = tz;
- memcpy(&lastCtr, data + off + 13, 2);
+ lastCtr = r->counter;
plausible = true;
}
}
@@ -1384,27 +1374,16 @@
return;
}
- // The 42-byte self-state (client dir; live analog of the
- // pre-patch 0x0b03 42B struct). Layout, wire-validated 2026-07-08
- // against a controlled facing test and a tracked run:
- // u32 seq @0, u16 zero @4, float @6 (turn-rate-like, unconsumed),
- // float map-Y @10, u32 heading @14 in EQ h2048 units (0 = north,
- // counterclockwise, wraps at 2048 - the stock convention),
- // float map-X @18, u8 moving-flag @22 (0x18 moving, 0 at rest),
- // float @26 (velocity-like, unconsumed), float Z @30, tail @34.
- // Position here is the freshest on the wire (~0.3s, 1 Hz standing,
- // faster while turning); the record flushes above are 1.5-2s stale
- // and act as backfill only. NOTE: this packet was silently dropped
- // until the OP_ClientUpdate connect2/XML payload mismatch was fixed
- // (2026-07-08) - that outage is why its fields were long believed
- // frozen. A 44B variant exists; trailing bytes are tolerated.
+ // The 42-byte client self-state (live analog of the pre-patch 0x0b03
+ // 42B struct); field layout lives in eqlClientUpdateSelfStruct. Position
+ // here is the freshest on the wire; the record flushes above are staler
+ // backfill. A 44B variant exists; trailing bytes are tolerated.
if (len < 42 || len > 46)
return;
- float wy2, wx2, wz2;
- memcpy(&wy2, data + 10, 4);
- memcpy(&wx2, data + 18, 4);
- memcpy(&wz2, data + 30, 4);
+ const eqlClientUpdateSelfStruct* ss =
+ (const eqlClientUpdateSelfStruct*)data;
+ float wy2 = ss->y, wx2 = ss->x, wz2 = ss->z;
bool posOk =
(fabsf(wx2) >= 0.001f && fabsf(wx2) < 100000.0f) &&
(fabsf(wy2) >= 0.001f && fabsf(wy2) < 100000.0f) &&
@@ -1429,8 +1408,7 @@
}
}
- uint32_t hword;
- memcpy(&hword, data + 14, 4);
+ uint32_t hword = ss->heading;
if (hword > 2047)
return;
Modified: showeq/branches/showeqlegends/src/s_everquest.h
===================================================================
--- showeq/branches/showeqlegends/src/s_everquest.h 2026-07-29 18:42:09 UTC (rev 1684)
+++ showeq/branches/showeqlegends/src/s_everquest.h 2026-07-30 00:29:19 UTC (rev 1685)
@@ -112,6 +112,8 @@
AddStruct(playerSpawnPosStruct);
AddStruct(playerSelfPosStruct);
AddStruct(eqlClientSelfPosStruct);
+AddStruct(eqlClientUpdateSelfStruct);
+AddStruct(eqlSelfPosRecord);
AddStruct(spawnAppearanceStruct);
AddStruct(bindWoundStruct);
AddStruct(inspectedStruct);
Modified: showeq/branches/showeqlegends/src/spawnshell.cpp
===================================================================
--- showeq/branches/showeqlegends/src/spawnshell.cpp 2026-07-29 18:42:09 UTC (rev 1684)
+++ showeq/branches/showeqlegends/src/spawnshell.cpp 2026-07-30 00:29:19 UTC (rev 1685)
@@ -823,13 +823,8 @@
spawn->equipment[8].equip0 = netStream.readUInt32NC();
}
- // 2026-07-07 EQL patch inserted 8 bytes here, between the equipment
- // block and the position words (content unidentified - possibly the
- // relocated heading/animation fields; word values 0x6000/0 observed).
- // One leading junk word precedes the coordinate block; skip it, then
- // read the 5-word posData block (X, Z, pad, Y, heading) whose layout
- // lives in spawnStruct. Byte count matches the prior skip8+read4.
- netStream.skipBytes(4);
+ // EQ Legends: posData block starts immediately after the equipment
+ // block. The 5-word block's layout lives in spawnStruct.
for (int i = 0; i < 5; ++i)
spawn->posData[i] = netStream.readUInt32NC();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|