|
From: <iea...@us...> - 2008-06-22 03:02:12
|
Revision: 705
http://seq.svn.sourceforge.net/seq/?rev=705&view=rev
Author: ieatacid
Date: 2008-06-21 15:54:52 -0700 (Sat, 21 Jun 2008)
Log Message:
-----------
+ Updated version to 5.12.4.2
+ Fixed some net opcode handling (thanks to purple for all the help)
Modified Paths:
--------------
showeq/trunk/ChangeLog
showeq/trunk/conf/zoneopcodes.xml
showeq/trunk/configure.in
showeq/trunk/src/interface.cpp
showeq/trunk/src/packetformat.cpp
showeq/trunk/src/packetformat.h
showeq/trunk/src/packetstream.cpp
showeq/trunk/src/spawnshell.cpp
Modified: showeq/trunk/ChangeLog
===================================================================
--- showeq/trunk/ChangeLog 2008-06-11 21:31:38 UTC (rev 704)
+++ showeq/trunk/ChangeLog 2008-06-21 22:54:52 UTC (rev 705)
@@ -1,5 +1,10 @@
Version: $Id$ $Name$
+ieatacid (6/21/08)
+----------------
++ Updated version to 5.12.4.2
++ Fixed some net opcode handling (thanks to purple for all the help)
+
ieatacid (6/11/08)
----------------
+ Updated version to 5.12.4.1
Modified: showeq/trunk/conf/zoneopcodes.xml
===================================================================
--- showeq/trunk/conf/zoneopcodes.xml 2008-06-11 21:31:38 UTC (rev 704)
+++ showeq/trunk/conf/zoneopcodes.xml 2008-06-21 22:54:52 UTC (rev 705)
@@ -9,12 +9,12 @@
<opcode id="7901" name="OP_ZoneEntry" updated="01/17/08">
<comment>old ZoneEntryCode</comment>
<payload dir="client" typename="ClientZoneEntryStruct" sizechecktype="match"/>
- <payload dir="server" typename="ServerZoneEntryStruct" sizechecktype="none"/>
+ <payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="1900" name="OP_ZoneSpawns" updated="05/29/08">
+ <!--<opcode id="1900" name="OP_ZoneSpawns" updated="05/29/08">
<comment>old ZoneSpawnsCode</comment>
<payload dir="server" typename="spawnStruct" sizechecktype="none"/>
- </opcode>
+ </opcode>-->
<opcode id="6015" name="OP_TimeOfDay" updated="01/17/08">
<comment>old TimeOfDayCode</comment>
<payload dir="server" typename="timeOfDayStruct" sizechecktype="match"/>
Modified: showeq/trunk/configure.in
===================================================================
--- showeq/trunk/configure.in 2008-06-11 21:31:38 UTC (rev 704)
+++ showeq/trunk/configure.in 2008-06-21 22:54:52 UTC (rev 705)
@@ -2,7 +2,7 @@
dnl $Id$ $Name$
AC_PREREQ(2.59)
-AC_INIT(showeq, 5.12.4.1)
+AC_INIT(showeq, 5.12.4.2)
AC_CONFIG_SRCDIR(src/main.cpp)
AC_CANONICAL_SYSTEM
Modified: showeq/trunk/src/interface.cpp
===================================================================
--- showeq/trunk/src/interface.cpp 2008-06-11 21:31:38 UTC (rev 704)
+++ showeq/trunk/src/interface.cpp 2008-06-21 22:54:52 UTC (rev 705)
@@ -250,7 +250,7 @@
m_spells = new Spells(fileInfo.absFilePath());
// Create the EQStr storage
- m_eqStrings = new EQStr(8009); // increase if the number of stings exeeds
+ m_eqStrings = new EQStr(8009); // increase if the number of strings exeeds
// Create the Zone Manager
m_zoneMgr = new ZoneMgr(this, "zonemgr");
@@ -1930,7 +1930,7 @@
"spawnStruct", SZC_Match,
m_spawnShell, SLOT(newSpawn(const uint8_t*)));
m_packet->connect2("OP_ZoneEntry", SP_Zone, DIR_Server,
- "ServerZoneEntryStruct", SZC_None,
+ "uint8_t", SZC_None,
m_spawnShell, SLOT(zoneEntry(const uint8_t*, size_t)));
m_packet->connect2("OP_MobUpdate", SP_Zone, DIR_Server|DIR_Client,
"spawnPositionUpdate", SZC_Match,
@@ -1981,10 +1981,12 @@
m_packet->connect2("OP_CorpseLocResponse", SP_Zone, DIR_Server,
"corpseLocStruct", SZC_Match,
m_spawnShell, SLOT(corpseLoc(const uint8_t*)));
+#if 0 // No longer used as of 5-22-2008
m_packet->connect2("OP_ZoneSpawns", SP_Zone, DIR_Server,
"spawnStruct", SZC_None,
m_spawnShell, SLOT(zoneSpawns(const uint8_t*, size_t)));
-
+#endif
+
// connect the SpellShell slots to ZoneMgr signals
connect(m_zoneMgr, SIGNAL(zoneChanged(const QString&)),
m_spellShell, SLOT(zoneChanged()));
Modified: showeq/trunk/src/packetformat.cpp
===================================================================
--- showeq/trunk/src/packetformat.cpp 2008-06-11 21:31:38 UTC (rev 704)
+++ showeq/trunk/src/packetformat.cpp 2008-06-21 22:54:52 UTC (rev 705)
@@ -93,7 +93,7 @@
return *this;
}
-void EQProtocolPacket::init(uint8_t* packet, uint16_t length,
+void EQProtocolPacket::init(uint8_t* packet, uint32_t length,
bool copy, bool subpacket)
{
m_subpacket = subpacket;
Modified: showeq/trunk/src/packetformat.h
===================================================================
--- showeq/trunk/src/packetformat.h 2008-06-11 21:31:38 UTC (rev 704)
+++ showeq/trunk/src/packetformat.h 2008-06-21 22:54:52 UTC (rev 705)
@@ -96,7 +96,7 @@
m_subpacket(false)
{ }
- EQProtocolPacket(uint8_t* packet, uint16_t length,
+ EQProtocolPacket(uint8_t* packet, uint32_t length,
bool copy=false, bool subpacket=false)
{
init(packet, length, copy, subpacket);
@@ -172,7 +172,7 @@
// Payload is uncompressed (after decode is called) and aligned to the
// beginning of the payload (after net op, flags, seq if applicable)
uint8_t* payload() const { return m_payload; }
- uint16_t payloadLength() const { return m_payloadLength; }
+ uint32_t payloadLength() const { return m_payloadLength; }
// Raw Packet is compressed and aligned to the start of the net op. Length
// includes CRC if applicable.
@@ -183,24 +183,24 @@
// the beginning of what was decompressed. This is what is alloced if
// m_bAllocPayload is true.
uint8_t* rawPayload() const { return m_rawPayload; }
- uint16_t rawPayloadLength() const { return m_rawPayloadLength; }
+ uint32_t rawPayloadLength() const { return m_rawPayloadLength; }
protected:
void init();
- void init(uint8_t* packet, uint16_t length,
+ void init(uint8_t* packet, uint32_t length,
bool copy=false, bool subpacket=false);
private:
uint8_t* m_packet; // raw packet, untouched starting at net opcode
- uint16_t m_length; // raw packet length
+ uint32_t m_length; // raw packet length
uint16_t m_netOp; // protocol opcode
uint8_t m_flags; // protocol flags
uint8_t* m_payload; // packet payload. Aligned and uncompressed if necessary.
bool m_bAllocedPayload; // Whether payload was alloced or not
bool m_bDecoded; // Whether this packet has been decoded
- uint16_t m_payloadLength; // length of payload
+ uint32_t m_payloadLength; // length of payload
uint8_t* m_rawPayload; // decompressed but not aligned payload
- uint16_t m_rawPayloadLength; // length of raw payload
+ uint32_t m_rawPayloadLength; // length of raw payload
uint16_t m_arqSeq; // local copy to speed up comparisons
bool m_ownCopy;
bool m_subpacket;
Modified: showeq/trunk/src/packetstream.cpp
===================================================================
--- showeq/trunk/src/packetstream.cpp 2008-06-11 21:31:38 UTC (rev 704)
+++ showeq/trunk/src/packetstream.cpp 2008-06-21 22:54:52 UTC (rev 705)
@@ -21,19 +21,19 @@
// The following defines are used to diagnose packet handling behavior
// this define is used to diagnose packet processing (in processPacket mostly)
-//#define PACKET_PROCESS_DIAG 3
+// #define PACKET_PROCESS_DIAG 3
// this define is used to diagnose cache handling (in processPacket mostly)
-//#define PACKET_CACHE_DIAG 3
+// #define PACKET_CACHE_DIAG 3
// this define is used to debug packet info (in dispatchPacket mostly)
-//#define PACKET_INFO_DIAG 3
+// #define PACKET_INFO_DIAG 3
// this define is used to debug packet decode info (decompression)
-//#define PACKET_DECODE_DIAG 3
+// #define PACKET_DECODE_DIAG 3
// this define is used to debug sessions (request, response, disconnect)
-//#define PACKET_SESSION_DIAG 3
+// #define PACKET_SESSION_DIAG 3
// diagnose structure size changes
#define PACKET_PAYLOAD_SIZE_DIAG 1
@@ -720,7 +720,7 @@
// If original length is 0xff, it means it is a long one. The length
// is 2 bytes and next.
uint16_t longOne = eqntohuint16(subpacket);
-
+
// Move past the 2 byte length
subpacket += 2;
@@ -735,7 +735,7 @@
longOne--;
subOpCode = *(uint16_t*)(subpacket);
}
-
+
#if defined(PACKET_PROCESS_DIAG) && (PACKET_PROCESS_DIAG > 2)
seqDebug("EQPacket: unrolling length %d bytes from combined packet on stream %s (%d). Opcode %04x",
longOne, EQStreamStr[m_streamid], m_streamid, subOpCode);
@@ -877,12 +877,18 @@
dispatchPacket(&m_fragment.data()[3], m_fragment.size()-3,
fragOpCode, m_opcodeDB.find(fragOpCode));
}
+ else if (IS_NET_OPCODE(fragOpCode))
+ {
+#if defined(PACKET_PROCESS_DIAG) && (PACKET_PROCESS_DIAG > 1)
+ seqDebug("EQPacket: IS_NET_OPCODE(%04x), size = %d",fragOpCode,m_fragment.size());
+#endif
+ EQProtocolPacket spacket(m_fragment.data(), m_fragment.size(), false, true);
+ processPacket(spacket, true);
+ }
else
{
- dispatchPacket(&m_fragment.data()[2], m_fragment.size()-2,
- fragOpCode, m_opcodeDB.find(fragOpCode));
+ dispatchPacket(&m_fragment.data()[2], m_fragment.size()-2, fragOpCode, m_opcodeDB.find(fragOpCode));
}
-
m_fragment.reset();
}
}
Modified: showeq/trunk/src/spawnshell.cpp
===================================================================
--- showeq/trunk/src/spawnshell.cpp 2008-06-11 21:31:38 UTC (rev 704)
+++ showeq/trunk/src/spawnshell.cpp 2008-06-21 22:54:52 UTC (rev 705)
@@ -421,26 +421,63 @@
void SpawnShell::zoneSpawns(const uint8_t* data, size_t len)
{
- NetStream netStream(data,len);
- spawnStruct *spawn = new spawnStruct;
- int32_t spawnStructSize;
- uint16_t parm1;
+ int spawndatasize = len / sizeof(spawnStruct);
- while(!netStream.end())
- {
- memset(spawn,0,sizeof(spawnStruct));
- parm1=netStream.readUInt16NC();
- if(parm1==0x1ff)
- parm1=netStream.readUInt16NC();
+ const spawnStruct* zspawns = (const spawnStruct*)data;
- // skip 0x79 before name
- netStream.skipBytes(1);
+ for (int i = 0; i < spawndatasize; i++)
+ {
+#if 0
+ // Dump position updates for debugging spawn struct position changes
+ for (int j=54; j<70; i++)
+ {
+ printf("%.2x", zspawns[i][j]);
- spawnStructSize=fillSpawnStruct(spawn,netStream.pos(),len,false);
- newSpawn(*spawn);
- if(spawnStructSize)
- netStream.skipBytes(spawnStructSize);
- }
+ if ((j+1) % 8 == 0)
+ {
+ printf(" ");
+ }
+ else
+ {
+ printf(" ");
+ }
+ }
+ printf("\n");
+#endif
+
+#if 0
+ // Debug positioning without having to recompile everything...
+#pragma pack(1)
+struct pos
+{
+/*0002*/ signed padding0000:12; // ***Placeholder
+ signed deltaX:13; // change in x
+ signed padding0005:7; // ***Placeholder
+/*0006*/ signed deltaHeading:10;// change in heading
+ signed deltaY:13; // change in y
+ signed padding0006:9; // ***Placeholder
+/*0010*/ signed y:19; // y coord
+ signed animation:13; // animation
+/*0014*/ unsigned heading:12; // heading
+ signed x:19; // x coord
+ signed padding0014:1; // ***Placeholder
+/*0018*/ signed z:19; // z coord
+ signed deltaZ:13; // change in z
+/*0022*/
+};
+#pragma pack(0)
+ struct pos *p = (struct pos *)(data + i*sizeof(spawnStruct) + 151);
+ printf("[%.2x](%f, %f, %f), dx %f dy %f dz %f head %f dhead %f anim %d (%x, %x, %x, %x)\n",
+ zspawns[i].spawnId,
+ float(p->x)/8.0, float(p->y/8.0), float(p->z)/8.0,
+ float(p->deltaX)/4.0, float(p->deltaY)/4.0,
+ float(p->deltaZ)/4.0,
+ float(p->heading), float(p->deltaHeading),
+ p->animation, p->padding0000,
+ p->padding0005, p->padding0006, p->padding0014);
+#endif
+ newSpawn(zspawns[i]);
+ }
}
int32_t SpawnShell::fillSpawnStruct(spawnStruct *spawn, const uint8_t *data, size_t len, bool checkLen)
@@ -454,30 +491,20 @@
if(name.length())
strcpy(spawn->name,name.latin1());
-// seqDebug("name=%s",spawn->name);
spawn->spawnId=netStream.readUInt32NC();
-// seqDebug("id=%d (%x)",spawn->spawnId,spawn->spawnId);
spawn->level=netStream.readUInt8();
-// seqDebug("level=%d",spawn->level);
// skip the next 4 bytes
netStream.skipBytes(4);
spawn->NPC=netStream.readUInt8();
-// seqDebug("NPC=%d",spawn->NPC);
spawn->miscData=netStream.readUInt32NC();
spawn->otherData=netStream.readUInt8();
-// seqDebug("miscData: %x otherData: %x",spawn->miscData,spawn->otherData);
-
-// seqDebug("buyer=%d trader=%d TC=%d T=%d BB=%d LD=%d gen=%d anon=%d gm=%d invis=%d LFG=%d sneak=%d AFK=%d",
-// spawn->buyer,spawn->trader,spawn->targetcyclable,spawn->targetable,spawn->betabuffed,
-// spawn->linkdead,spawn->gender,spawn->anon,spawn->gm,spawn->invis,spawn->LFG,spawn->sneak,spawn->AFK);
-
// skip unknown3, unknown4
netStream.skipBytes(8);
@@ -514,15 +541,13 @@
netStream.skipBytes(13);
spawn->race=netStream.readUInt32NC();
-// seqDebug("race=%d",spawn->race);
spawn->charProperties=netStream.readUInt8();
-// seqDebug("charProperties=%d",spawn->charProperties);
if(spawn->charProperties)
{
spawn->bodytype=netStream.readUInt32NC();
-// seqDebug("bodytype=%d",spawn->bodytype);
+
for(i=1; i < spawn->charProperties; i++)
{
// extra character properties
@@ -531,7 +556,6 @@
}
spawn->curHp=netStream.readUInt8();
-// seqDebug("curHp=%d",spawn->curHp);
// skip hair and face stuff
netStream.skipBytes(18);
@@ -541,8 +565,6 @@
spawn->guildID=netStream.readUInt32NC();
spawn->guildstatus=netStream.readUInt32NC();
spawn->class_=netStream.readUInt8();
-// seqDebug("holding=%d deity=%d guildID=%d guildstatus=%d class_=%d",spawn->holding,
-// spawn->deity,spawn->guildID,spawn->guildstatus,spawn->class_);
netStream.skipBytes(1);
@@ -556,13 +578,11 @@
if(name.length())
{
strcpy(spawn->lastName,name.latin1());
-// seqDebug("surname=%s",spawn->lastName);
}
netStream.skipBytes(5);
spawn->petOwnerId=netStream.readUInt32NC();
-// seqDebug("petOwnerId=%d",spawn->petOwnerId);
netStream.skipBytes(25);
@@ -572,11 +592,6 @@
spawn->posData[3]=netStream.readUInt32NC();
spawn->posData[4]=netStream.readUInt32NC();
-// seqDebug("%x %x %x %x %x",spawn->posData[0],spawn->posData[1],spawn->posData[2],spawn->posData[3],spawn->posData[4]);
-// seqDebug("%d %d %d | %d %d %d | %d %d | %d",spawn->y>>3,spawn->x>>3,spawn->z>>3,
-// spawn->deltaY>>2,spawn->deltaX>>2,spawn->deltaZ>>2,
-// spawn->heading,spawn->deltaHeading,spawn->animation);
-
// skip color
netStream.skipBytes(36);
@@ -597,14 +612,12 @@
{
name=netStream.readText();
strcpy(spawn->title,name.latin1());
-// seqDebug("title=%s",spawn->title);
}
if(spawn->otherData & 8)
{
name=netStream.readText();
strcpy(spawn->suffix,name.latin1());
-// seqDebug("suffix=%s",spawn->suffix);
}
netStream.skipBytes(32);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|