PDA

View Full Version : Filling out charProfileStruct



purple
04-03-2005, 06:50 PM
Unknowns in charProfileStruct make me sad. 4k unknowns in charProfileStruct really make me sad! I've done my best to fill in knowns in charProfileStruct when I've had time and I wanted to ask some help. I know a lot of you would help seq out if you could. Well here's your chance!

My current charProfileStruct is the following. I know this isn't what is in cvs and I haven't put out a patch with this in it. Don't cut and paste this into your everquest.h because it won't compile (since I've taken out aapoints because it didn't fit and was way off). When I put out a patch again, it will have this in it. It doesn't really make seq any better so don't worry about it! This is just in order to better understand the EQ net stream.



struct charProfileStruct
{
/*0000*/ uint32_t checksum; //
/*0004*/ char name[64]; // Name of player
/*0068*/ char lastName[32]; // Last name of player
/*0100*/ uint32_t gender; // Player Gender - 0 Male, 1 Female
/*0104*/ uint32_t race; // Player race
/*0108*/ uint32_t class_; // Player class
/*0112*/ uint32_t unknown0112; // *** Placeholder
/*0116*/ uint32_t level; // Level of player (might be one byte)
/*0120*/ uint32_t bind_zone_id[5]; // Bind info (zone, x, y, z, heading)
/*0140*/ float bind_x[5]; // 0 is normal bind
/*0160*/ float bind_y[5]; // 5 is some weird point in newbie zone
/*0180*/ float bind_z[5]; // (which is secondary bind for wiz/dru?)
/*0200*/ float bind_heading[5]; // Unused slots show newbie bind
/*0220*/ uint32_t deity; // deity
/*0224*/ int32_t guildID; // guildID
/*0228*/ uint32_t birthdayTime; // character birthday
/*0232*/ uint32_t lastSaveTime; // character last save time
/*0236*/ uint32_t timePlayedMin; // time character played
/*0240*/ uint8_t pvp; // 1=pvp, 0=not pvp
/*0241*/ uint8_t level1; // Level of Player
/*0242*/ uint8_t anon; // 2=roleplay, 1=anon, 0=not anon
/*0243*/ uint8_t gm; // 0=no, 1=yes
/*0244*/ int8_t guildstatus; // 0=member, 1=officer, 2=guildleader
/*0245*/ uint8_t unknown0245[55]; // *** Placeholder
/*0300*/ uint8_t haircolor; // Player hair color
/*0301*/ uint8_t beardcolor; // Player beard color
/*0302*/ uint8_t eyecolor1; // Player left eye color
/*0303*/ uint8_t eyecolor2; // Player right eye color
/*0304*/ uint8_t hairstyle; // Player hair style
/*0305*/ uint8_t beard; // Player beard type
/*0306*/ uint8_t unknown0302[6]; // *** Placeholder
/*0312*/ uint32_t item_material[9]; // Item texture/material of worn items
/*0348*/ uint8_t unknown0348[48]; // *** Placeholder
/*0396*/ Color_Struct item_tint[9]; // RR GG BB 00
/*0432*/ AA_Array aa_array[MAX_AA]; // AAs
/*1392*/ char servername[32]; // server the char was created on
/*1424*/ uint8_t unknown1452[68]; // *** Placeholder
/*1492*/ uint32_t exp; // Current Experience
/*1496*/ uint32_t unknown1496; // *** Placeholder
/*1500*/ uint32_t points; // Unspent Practice points
/*1504*/ uint32_t MANA; // Current MANA
/*1508*/ uint32_t curHp; // Current HP without +HP equipment
/*1512*/ uint32_t unknown1512; // 0x05
/*1516*/ uint32_t STR; // Strength
/*1520*/ uint32_t STA; // Stamina
/*1524*/ uint32_t CHA; // Charisma
/*1528*/ uint32_t DEX; // Dexterity
/*1532*/ uint32_t INT; // Intelligence
/*1536*/ uint32_t AGI; // Agility
/*1540*/ uint32_t WIS; // Wisdom
/*1544*/ uint8_t face; // Player face
/*1545*/ uint8_t unknown1545[47]; // *** Placeholder
/*1592*/ uint8_t languages[25]; // List of languages (MAX_KNOWN_LANGS)
/*1617*/ uint8_t unknown1617[7]; // All 0x00 (language buffer?)
/*1624*/ int32_t sSpellBook[400]; // List of the Spells in spellbook
/*3224*/ uint8_t unknown3224[448]; // all 0xff after last spell
/*3672*/ int32_t sMemSpells[9]; // List of spells memorized
/*3708*/ uint8_t unknown3708[32]; // *** Placeholder
/*3740*/ float x; // Players x position
/*3744*/ float y; // Players y position
/*3748*/ float z; // Players z position
/*3752*/ float heading; // Players heading
/*3756*/ uint8_t unknown3756[4]; // *** Placeholder
/*3760*/ uint32_t platinum; // Platinum Pieces on player
/*3764*/ uint32_t gold; // Gold Pieces on player
/*3768*/ uint32_t silver; // Silver Pieces on player
/*3772*/ uint32_t copper; // Copper Pieces on player
/*3776*/ uint32_t platinum_bank; // Platinum Pieces in Bank
/*3780*/ uint32_t gold_bank; // Gold Pieces in Bank
/*3784*/ uint32_t silver_bank; // Silver Pieces in Bank
/*3788*/ uint32_t copper_bank; // Copper Pieces in Bank
/*3792*/ uint32_t platinum_cursor; // Platinum Pieces on cursor
/*3796*/ uint32_t gold_cursor; // Gold Pieces on cursor
/*3800*/ uint32_t silver_cursor; // Silver Pieces on cursor
/*3804*/ uint32_t copper_cursor; // Copper Pieces on cursor
/*3808*/ uint32_t platinum_shared; // Shared platinum pieces
/*3812*/ uint8_t unknown3812[20]; // Unknown - all zero
/*3832*/ uint32_t skills[75]; // List of skills (MAX_KNOWN_SKILLS)
/*4132*/ uint8_t unknown4132[348]; // *** Placeholder
/*4480*/ uint32_t expAA; // Current AA experience
/*4484*/ uint8_t unknown4484[4]; // *** Placeholder
/*4488*/ uint32_t expansions; // Bitmask for expansions
/*4492*/ uint8_t unknown4492[20]; // *** Placeholder
/*4512*/ uint32_t hunger; // Food (ticks till next eat)
/*4516*/ uint32_t thirst; // Drink (ticks till next drink)
/*4520*/ uint8_t unknown4520[20]; // *** Placeholder
/*4540*/ uint16_t zoneId; // see zones.h
/*4542*/ uint16_t zoneInstance; // Instance id
/*4544*/ spellBuff buffs[MAX_BUFFS]; // Buffs currently on the player
/*4944*/ char groupMembers[MAX_GROUP_MEMBERS][64];// all the members in group, including self
/*5328*/ uint8_t unknown5328[668]; // *** Placeholder
/*5996*/ uint32_t ldon_guk_points; // Earned GUK points
/*6000*/ uint32_t ldon_mir_points; // Earned MIR points
/*6004*/ uint32_t ldon_mmc_points; // Earned MMC points
/*6008*/ uint32_t ldon_ruj_points; // Earned RUJ points
/*6012*/ uint32_t ldon_tak_points; // Earned TAK points
/*6016*/ uint32_t ldon_avail_points; // Available LDON points
/*6020*/ uint8_t unknown6020[112]; // *** Placeholder
/*6132*/ uint32_t tributeTime; // Time remaining on tribute (millisecs)
/*6136*/ uint32_t unknown6136; // *** Placeholder
/*6140*/ uint32_t careerTribute; // Total favor points for this char
/*6144*/ uint32_t unknown6144; // *** Placeholder
/*6148*/ uint32_t currentTribute; // Current tribute points
/*6152*/ uint32_t unknown6152; // *** Placeholder
/*6156*/ uint32_t tributeActive; // 0 = off, 1=on
/*6160*/ TributeStruct tributes[MAX_TRIBUTES]; // Current tribute loadout
/*6200*/ uint32_t disciplines[MAX_DISCIPLINES]; // Known disciplines
/*6400*/ uint8_t unknown6400[440]; // *** Placeholder
/*6840*/ uint32_t endurance; // Current endurance
/*6844*/ uint8_t unknown6844[276]; // *** Placeholder
/*7120*/ uint32_t airRemaining; // Air supply (seconds)
/*7124*/ uint8_t unknown7124[4608]; // *** Placeholder
/*11732*/ uint32_t aa_spent; // Number of spent AA points
/*11736*/ uint32_t unknown11736; // *** Placeholder
/*11740*/ uint32_t aa_unspent; // Unspent AA points
/*11744*/ uint8_t unknown11744[36]; // *** Placeholder
/*11780*/ BandolierStruct bandoliers[MAX_BANDOLIERS]; // bandolier contents
/*13060*/ uint8_t unknown13060[5120]; // *** Placeholder
/*18180*/ InlineItem potionBelt[MAX_POTIONS_IN_BELT]; // potion belt
/*18468*/ uint8_t unknown18468[28]; // *** Placeholder
}; /* 18496 */


Additions to this over current cvs are mostly thanks to help from eqemu and then I spent time and verified them and made sure they aligned properly against live servers. You'll see that bandolier is in there and potion belt, hunger, thirst, personal tribute, etc. Some stuff that wasn't there before. But you'll also see that there are still a lot of unknowns!

What do I want with you? I'd like help two ways.

The first is just brainstorming. What kinds of things do you think need to be in there that aren't? You all play EQ (or did at one point). What is there that the client knows that might be missing in charProfileStruct? I know not all of you know how the EQ net stream works, so don't feel silly saying something that might be dumb. A lot of stuff is in other packets, even though it might make sense that it would be in charProfileStruct (which comes with OP_PlayerProfile).

For example, we spent a bit of time last week tracking down where percentage of experience you have assigned to AA is. It used to be in charProfileStruct, but it no longer is. It's sent in an OP_AAUpdate now. Or we spent some time figuring out where the origin point for you character is stored (it isn't, the server sends it to you when you use the origin AA). I don't expect you to track stuff down, I just want a nice list of things that people think might be in there to aid in figuring this stuff out.

For example, things that I think might be in there, but I haven't had the time or the means to determine:
- Pet info (buffs, name, items, etc.) since pets zone with you now
- Pocketed pet info from the AA that lets you store pets
- Spell cooldown (for example, how long will Divine Intervention be greyed out), maybe in the 32 bytes after memmed spells?
- Skill cooldown (for example, how long will LoH be greyed), maybe in the unknown after skills?
- Disc cooldown (for example, how long until weaponshield is usable again), maybe in the unknown after discs?
- AA cooldown (though this may be in separate opcodes, the AA stuff seems like its a mess over the wire)
- Title (apprentiece baker, etc.), though this used to be there after servername, it was removed. I wouldn't be surprised if the list of available titles comes across separately, but an id is sent in charProfileStruct somewhere
- Group Leader exp (total this point to set the bar)
- Group Leader AA information (current points and max points)
- Which Group Lead AAs you have
- Whether Leader AA is on/off
- Raid Leader exp (total this point to set the bar)
- Raid Leader AA information (current points and max points)
- Which Raid Lead AAs you have
- DoN radiant and ebon shards
- Wizard/Druid secondary bind point

I'm sure there's stuff I'm missing too. Any ideas you might have are very welcome.

Some of that I can verify myself, but some of that I can't. For example, I don't have a pet class, let alone one with pocket pet AA. I don't have a wizard or druid with secondary bind AA. This brings me to the second way you can help out.

If you have a character who can test some of this stuff out, you can send me logs and I can use them to figure out things. For example, if you're a druid with secondary bind, you can log a zone, set your bind point, then zone again. I can use this to figure out if secondary bind is in charProfileStruct and where.

All you'd need to do this is:
1) tcpdump -i eth0 -s0 -w secondbind.log 'udp && host 192.168.1.52' (of course replace eth0 with your ethernet device, secondbind.log with whatever you want to call the log, and replace 192.168.1.52 with the ip of your eq machine). You must do this as root.
2) Do your test (zone, set your secondary bind, zone again)
3) Control-C the tcpdump to stop it
4) Zip up the log please with gzip secondbind.log
5) Email the log to seqdump at gmail.com
6) In the email, include what you did (in this case, that you zoned into PoT, set your secondary bind point to be right outside the Plane of Air in PoT, then zoned back into PoK)

Right now, the two biggest things I'd like to see are pocketed pets (with buffs and items if you can) and secondary bind points. There may be more things I'll be interested in at some point, but those are the big two.

Please only send me a log if you trust me with it. If you send me a log, I will know what server you are on and what your player name is. That is important information. If you don't feel comfortable sending this to me, DON'T DO IT. I will not give anyone your log. I won't use the information from the log for anything, other than to improve our understanding of the EQ net stream. Also, please do not include you logging into EQ in your log. I don't want your password at all. Log into EQ, then start the tcpdump, then zone.

purple
04-03-2005, 07:11 PM
Yeah, ok, so Radiant and Ebon shards were obvious once I actually looked for them. So sue me!

BlueAdept
04-03-2005, 07:45 PM
Heh. I had spent some time and corrected some of the structure about 6 months ago (additional unknowns have been added since then). I fixed what I could but there was a lot left to do (and now even more). I never could figure out the AA though.

I only have one char with a pet but dont have suspend minion aa so no go from me on that. I also only have one char with AA so I dont have a lot to compare to.

I'll also look at the structure again and see what I can figure out when I get some time. Im also going to have to try to remember how I did it back then.

Oh yea, I renewed my account again a week ago.

elf
04-06-2005, 05:15 PM
I'm browsing from a windoze box durring class, so I don't have any of the source in front of me, but could
/*5328*/ uint8_t unknown5328[668]; // *** Placeholder

be raid members? How many uint8_t is a character, enough that 668 could hold 72 raid members information. Wouldn't even have to hold that much, since HP and pet info isn't available on the raid window. Just raid and group leader flags, looter flag, name, along note strings and raid motd string now.

Or am I way out in left field, and raid members are stored at 4944 in that large array?

purple
04-06-2005, 05:31 PM
It looks like the raid comes along with an OP_RaidJoin on zoning, so it's outside of charProfileStruct. Good idea though. I had to check an old dump I had to see how it worked, but turns out not to be in charProfileStruct.

uint8_t = char = 1 byte. Character names are 64 characters.

elf
04-06-2005, 08:23 PM
edit: okay, needs to read the discovered codes closer.

purple
04-06-2005, 08:25 PM
AA is already known in there (expAA is exp points in this point, aa_spent = total AA you've spent, aa_unspent = unspent points you have, aa_array is the AA you have).

BlueAdept
04-07-2005, 07:53 AM
AA is already known in there (expAA is exp points in this point, aa_spent = total AA you've spent, aa_unspent = unspent points you have, aa_array is the AA you have).

Yes there is AA stuff in there, but from what I remember it doesn't match up correctly.

purple
04-07-2005, 07:55 AM
I fixed it. It should line up ok in 5.0.0.19 against live.

purple
04-07-2005, 05:32 PM
So far from my original list with the help of eqemu people, I've gotten the following placed into charProfileStruct:
- Spell cooldown (for example, how long will Divine Intervention be greyed out)
- Group Leader exp (total this point to set the bar)
- Group Leader AA information (current points)
- Which Group Lead AAs you have
- Raid Leader exp (total this point to set the bar)
- Raid Leader AA information (current points)
- Which Raid Lead AAs you have
- DoN radiant and ebon shards

I'm pretty sure normal pet info is not in charProfileStruct also:
- Pet info (buffs, name, items, etc.) since pets zone with you now

So that leaves to be verified from my original list:
- Pocketed pet info from the AA that lets you store pets
- Skill cooldown (for example, how long will LoH be greyed), maybe in the unknown after skills?
- Disc cooldown (for example, how long until weaponshield is usable again), maybe in the unknown after discs?
- AA cooldown (though this may be in separate opcodes, the AA stuff seems like its a mess over the wire)
- Title (apprentiece baker, etc.), though this used to be there after servername, it was removed. I wouldn't be surprised if the list of available titles comes across separately, but an id is sent in charProfileStruct somewhere
- Whether Leader AA is on/off
- Wizard/Druid secondary bind point

Moving right along!

BlueAdept
04-07-2005, 07:51 PM
Nice work. Unfortuantely I cant help on most of them.

I will see if I can find the pet info though.

BlueAdept
04-07-2005, 10:52 PM
Anyone have any idea what OP 0900 is? It seems to echo the data that is being sent to the client.

Pets seem to be coming up as the new spawn op code. fff9 Edit: After looking at this, it seems pets are treated as NPCs. I have not found a structure for them except for when you cast a buff on them.

Tribue item list seem to be op 123e

Title List (all titles like master tinkerer or master jeweler are in this op code) seem to be 642c I dont know where it is yet of when you assign one to yourself.

Petition structure seems to be on op 186e

Edit:
It looks like op 0e4a is when you cast a new spell on a pet. Possibly the display of the buff in the pet window.

BlueAdept
04-08-2005, 02:25 PM
A while back, someone gave me a perl script to format out the player structure so it is a bit more readable. I updated it so it works with live code.

structvis.pl



#!/usr/bin/perl -w

use strict;

my $charProfile = << 'END'
/*
** Player Profile
** Length: 18496 Octets
** OpCode: CharProfileCode
*/

struct charProfileStruct
{
/*0000*/ uint32_t checksum; //
/*0004*/ char name[64]; // Name of player
/*0068*/ char lastName[32]; // Last name of player
/*0100*/ uint32_t gender; // Player Gender - 0 Male, 1 Female
/*0104*/ uint32_t race; // Player race
/*0108*/ uint32_t class_; // Player class
/*0112*/ uint32_t unknown0112; // *** Placeholder
/*0116*/ uint32_t level; // Level of player (might be one byte)
/*0120*/ uint32_t bind_zone_id[5]; // Bind info (zone, x, y, z, heading)
/*0140*/ float bind_x[5]; // 0 is normal bind
/*0160*/ float bind_y[5]; // 5 is some weird point in newbie zone
/*0180*/ float bind_z[5]; // (which is secondary bind for wiz/dru?)
/*0200*/ float bind_heading[5]; // Unused slots show newbie bind
/*0220*/ uint32_t deity; // deity
/*0224*/ int32_t guildID; // guildID
/*0228*/ uint32_t birthdayTime; // character birthday
/*0232*/ uint32_t lastSaveTime; // character last save time
/*0236*/ uint32_t timePlayedMin; // time character played
/*0240*/ uint8_t pvp; // 1=pvp, 0=not pvp
/*0241*/ uint8_t level1; // Level of Player
/*0242*/ uint8_t anon; // 2=roleplay, 1=anon, 0=not anon
/*0243*/ uint8_t gm; // 0=no, 1=yes
/*0244*/ int8_t guildstatus; // 0=member, 1=officer, 2=guildleader
/*0245*/ uint8_t unknown0245[55]; // *** Placeholder
/*0300*/ uint8_t haircolor; // Player hair color
/*0301*/ uint8_t beardcolor; // Player beard color
/*0302*/ uint8_t eyecolor1; // Player left eye color
/*0303*/ uint8_t eyecolor2; // Player right eye color
/*0304*/ uint8_t hairstyle; // Player hair style
/*0305*/ uint8_t beard; // Player beard type
/*0306*/ uint8_t unknown0302[6]; // *** Placeholder
/*0312*/ uint32_t item_material[9]; // Item texture/material of worn items
/*0348*/ uint8_t unknown0348[48]; // *** Placeholder
/*0396*/ Color_Struct item_tint[9]; // RR GG BB 00
/*0432*/ AA_Array aa_array[MAX_AA]; // AAs
/*1392*/ char servername[32]; // server the char was created on
/*1424*/ uint8_t unknown1452[68]; // *** Placeholder
/*1492*/ uint32_t exp; // Current Experience
/*1496*/ uint32_t unknown1496; // *** Placeholder
/*1500*/ uint32_t points; // Unspent Practice points
/*1504*/ uint32_t MANA; // Current MANA
/*1508*/ uint32_t curHp; // Current HP without +HP equipment
/*1512*/ uint32_t unknown1512; // 0x05
/*1516*/ uint32_t STR; // Strength
/*1520*/ uint32_t STA; // Stamina
/*1524*/ uint32_t CHA; // Charisma
/*1528*/ uint32_t DEX; // Dexterity
/*1532*/ uint32_t INT; // Intelligence
/*1536*/ uint32_t AGI; // Agility
/*1540*/ uint32_t WIS; // Wisdom
/*1544*/ uint8_t face; // Player face
/*1545*/ uint8_t unknown1545[47]; // *** Placeholder
/*1592*/ uint8_t languages[25]; // List of languages (MAX_KNOWN_LANGS)
/*1617*/ uint8_t unknown1617[7]; // All 0x00 (language buffer?)
/*1624*/ int32_t sSpellBook[400]; // List of the Spells in spellbook
/*3224*/ uint8_t unknown3224[448]; // all 0xff after last spell
/*3672*/ int32_t sMemSpells[9]; // List of spells memorized
/*3708*/ uint8_t unknown3708[32]; // *** Placeholder
/*3740*/ float x; // Players x position
/*3744*/ float y; // Players y position
/*3748*/ float z; // Players z position
/*3752*/ float heading; // Players heading
/*3756*/ uint8_t unknown3756[4]; // *** Placeholder
/*3760*/ uint32_t platinum; // Platinum Pieces on player
/*3764*/ uint32_t gold; // Gold Pieces on player
/*3768*/ uint32_t silver; // Silver Pieces on player
/*3772*/ uint32_t copper; // Copper Pieces on player
/*3776*/ uint32_t platinum_bank; // Platinum Pieces in Bank
/*3780*/ uint32_t gold_bank; // Gold Pieces in Bank
/*3784*/ uint32_t silver_bank; // Silver Pieces in Bank
/*3788*/ uint32_t copper_bank; // Copper Pieces in Bank
/*3792*/ uint32_t platinum_cursor; // Platinum Pieces on cursor
/*3796*/ uint32_t gold_cursor; // Gold Pieces on cursor
/*3800*/ uint32_t silver_cursor; // Silver Pieces on cursor
/*3804*/ uint32_t copper_cursor; // Copper Pieces on cursor
/*3808*/ uint32_t platinum_shared; // Shared platinum pieces
/*3812*/ uint8_t unknown3812[20]; // Unknown - all zero
/*3832*/ uint32_t skills[75]; // List of skills (MAX_KNOWN_SKILLS)
/*4132*/ uint8_t unknown4132[348]; // *** Placeholder
/*4480*/ uint32_t expAA; // Current AA experience
/*4484*/ uint8_t unknown4484[4]; // *** Placeholder
/*4488*/ uint32_t expansions; // Bitmask for expansions
/*4492*/ uint8_t unknown4492[20]; // *** Placeholder
/*4512*/ uint32_t hunger; // Food (ticks till next eat)
/*4516*/ uint32_t thirst; // Drink (ticks till next drink)
/*4520*/ uint8_t unknown4520[20]; // *** Placeholder
/*4540*/ uint16_t zoneId; // see zones.h
/*4542*/ uint16_t zoneInstance; // Instance id
/*4544*/ spellBuff buffs[MAX_BUFFS]; // Buffs currently on the player
/*4944*/ char groupMembers[MAX_GROUP_MEMBERS][64];// all the members in group, including self
/*5328*/ uint8_t unknown5328[668]; // *** Placeholder
/*5996*/ uint32_t ldon_guk_points; // Earned GUK points
/*6000*/ uint32_t ldon_mir_points; // Earned MIR points
/*6004*/ uint32_t ldon_mmc_points; // Earned MMC points
/*6008*/ uint32_t ldon_ruj_points; // Earned RUJ points
/*6012*/ uint32_t ldon_tak_points; // Earned TAK points
/*6016*/ uint32_t ldon_avail_points; // Available LDON points
/*6020*/ uint8_t unknown6020[112]; // *** Placeholder
/*6132*/ uint32_t tributeTime; // Time remaining on tribute (millisecs)
/*6136*/ uint32_t unknown6136; // *** Placeholder
/*6140*/ uint32_t careerTribute; // Total favor points for this char
/*6144*/ uint32_t unknown6144; // *** Placeholder
/*6148*/ uint32_t currentTribute; // Current tribute points
/*6152*/ uint32_t unknown6152; // *** Placeholder
/*6156*/ uint32_t tributeActive; // 0 = off, 1=on
/*6160*/ TributeStruct tributes[MAX_TRIBUTES]; // Current tribute loadout
/*6200*/ uint32_t disciplines[MAX_DISCIPLINES]; // Known disciplines
/*6400*/ uint8_t unknown6400[440]; // *** Placeholder
/*6840*/ uint32_t endurance; // Current endurance
/*6844*/ uint8_t unknown6844[276]; // *** Placeholder
/*7120*/ uint32_t airRemaining; // Air supply (seconds)
/*7124*/ uint8_t unknown7124[4608]; // *** Placeholder
/*11732*/ uint32_t aa_spent; // Number of spent AA points
/*11736*/ uint32_t unknown11736; // *** Placeholder
/*11740*/ uint32_t aa_unspent; // Unspent AA points
/*11744*/ uint8_t unknown11744[36]; // *** Placeholder
/*11780*/ BandolierStruct bandoliers[MAX_BANDOLIERS]; // bandolier contents
/*13060*/ uint8_t unknown13060[5120]; // *** Placeholder
/*18180*/ InlineItem potionBelt[MAX_POTIONS_IN_BELT]; // potion belt
/*18468*/ uint8_t unknown18468[8]; // *** Placeholder
/*18476*/ uint32_t currentRadCrystals; // Current count of radiant crystals
/*18480*/ uint32_t careerRadCrystals; // Total count of radiant crystals ever
/*18484*/ uint32_t currentEbonCrystals;// Current count of ebon crystals
/*18488*/ uint32_t careerEbonCrystals; // Total count of ebon crystals ever
/*18492*/ uint32_t unknown18492; // *** Placeholder
}; /* 18496 */

END
;

# load struct
my @struct = ();

while ($charProfile =~ /^(.*)$/mcg) {
my $line = $1;
if ($line =~ /^.*\s(\S+)\s+(\S+)\;/) {
my $type = $1;
my $name = $2;
push(@struct, { 'name' => $name, 'type' => $type } );
}
}

# load data
my @data = ();

open(PACKET, "./packet.txt");
while (my $line = <PACKET>) {
if ($line =~ /^\d+ \| ([0-9a-f ]+?) \|/) {
$line = $1;
while ($line =~ /([0-9a-f]{2})/mcg) {
push(@data, hex($1));
}
}
}
close(PACKET);

print "Loaded ". ($#data + 1) ." bytes.\n";


# fill in struct
my $offset = 0;
foreach my $i (0..$#struct) {
my $type = $struct[$i]{'type'};
my $name = $struct[$i]{'name'};
my $alen = 0;
my $size = 0;

if ($name =~ /(\S+)\[([0-9]+)\]/) {
$name = $1;
$alen = $2 - 1;
}

if ($alen > 0) {
printf("%04d: %s\t%s[%d]: ", $offset, $type, $name, $alen + 1);
} else {
printf("%04d: %s\t%s: ", $offset, $type, $name);
}

if ($type eq "uint8_t") {
$size = 1;
foreach my $j (0..$alen) {
print unpack("C", pack("C", $data[$offset + $j * $size])) ." ";
}

} elsif ($type eq "uint16_t") {
$size = 2;
foreach my $j (0..$alen) {
print unpack("S", pack("CC", $data[$offset + $j * $size], $data[$offset + 1 + $j * $size])) ." ";
}

} elsif ($type eq "uint32_t") {
if ($name eq "disciplines[MAX_DISCIPLINES]") {
$alen = 50 - 1;
$size = 4;
} else {
$size = 4;
foreach my $j (0..$alen) {
print unpack("L", pack("CCCC", $data[$offset + $j * $size], $data[$offset + 1 + $j * $size],
$data[$offset + 2 + $j * $size], $data[$offset + 3 + $j * $size])) ." ";
}
}
} elsif ($type eq "int8_t") {
$size = 1;
foreach my $j (0..$alen) {
print unpack("c", pack("C", $data[$offset + $j * $size])) ." ";
}

} elsif ($type eq "int16_t") {
$size = 2;
foreach my $j (0..$alen) {
print unpack("s", pack("CC", $data[$offset + $j * $size], $data[$offset + 1 + $j * $size])) ." ";
}

} elsif ($type eq "int32_t") {
$size = 4;
foreach my $j (0..$alen) {
print unpack("l", pack("CCCC", $data[$offset + $j * $size], $data[$offset + 1 + $j * $size],
$data[$offset + 2 + $j * $size], $data[$offset + 3 + $j * $size])) ." ";
}

} elsif ($type eq "float") {
$size = 4;
foreach my $j (0..$alen) {
my $num = pack("CCCC", $data[$offset + 0], $data[$offset + 1],
$data[$offset + 2], $data[$offset + 3]);

print unpack("f", $num) ." ";
}

} elsif ($type eq "char") {
if ($name eq "groupMembers[MAX_GROUP_MEMBERS]") {
$alen = 6 - 1;
$size = 64;
} else {
foreach my $j (0..$alen) {
if ($data[$offset + $j] > 0x1f && $data[$offset + $j] < 0x80) {
printf("%c", $data[$offset+$j]);
} else {
print ".";
}
}
$size = 1;
}
} elsif ($type eq "Color_Struct") {
# B R G A
$size = 4;

} elsif ($type eq "AA_Array") {
# AA value
$alen = 120 - 1;
$size = 8;

} elsif ($type eq "spellBuff") {
# slotid level effect spellid padding duration unknown
$alen = 25 - 1;
$size = 16;

} elsif ($name eq "groupMembers") {
# Group members
$alen = 6 - 1;
$size = 64;

} elsif ($type eq "TributeStruct") {
# Group Members
$alen = 5 - 1;
$size = 8;

} elsif ($type eq "BandolierStruct") {
# Bandolier Structure
$alen = 4 - 1;
$size = 320;

} elsif ($type eq "InlineItem") {
# Potion Belt
$alen = 4 - 1;
$size = 72;

} else {
die "Unknown type: $type\n";

}

print "\n";

$offset += ($size * ($alen + 1));
}

printf("%04d: END\n", $offset);


I had to do some updating to it, but I'm not a perl programmer. It works but isn't done right.

How to use it:

Go to Network
Then to OpCode Monitor
OpCode Monitoring and click on it.
It will open a window asking what to monitor. Put in this 2fee:PlayerProfile:3:1 and hit ok.
Then in the OpCode Monitor menu check Log Monitored OpCode Matches and then go into Log Filename... in the same menu and specify a name for the file.

Log into everquest do something you want to find and zone and camp.

You will now have 2 Player Profiles in the file you named. You will be splitting the file and remove the extra text until you get down to the first part of the profile (down to the 000 part) copy the text between the 000 and the last line of the profile structure (currently 18480) and paste it into a new file. Do the same thing for the bottom profile. Now we get to run it through the script.

cp the first file to packet.txt and then type (make sure you can execute your perl script!) ./structvis.pl > filenametosaveto.txt

It will read the packet.txt and output it to the file you named. Now do it again for the other profile structure you did. Copy it to packet.txt, run structvis.pl and save it to a different file name. Now you can open both and compare the changes. It just makes reading it a little easier.

purple
04-08-2005, 04:44 PM
0900 is a net opcode. Do you have raw turned on and maybe are just being confused by the raw vs decoded packets in the log file? The 0900 will come out as the raw then the appropriate decoded application level packet will come out as decoded.

Cryonic
04-09-2005, 01:14 AM
structvis.pl sounds like one of Ksmith's scripts.

BlueAdept
04-09-2005, 06:55 AM
Could have been. I was given it about a year ago and I really can't remember who sent it to me. Who ever it was deserved the credit for it. It works fairly well. I only did minor tweaking to get it to work with the current.

purple
04-09-2005, 08:07 AM
It's ksmith's yeah. I use it too.

Glee
04-09-2005, 04:55 PM
Here's lots of random things. I'm sure most of these things aren't there, but worth a try.



Vision Type (normal/infra/ultra)
Level of intoxication
See invis / Enduring breath
Time remaining on LDoN mission
LDoN task info (number of items left to collect, etc)
All DoN task info: players in task, average level, time remaining, reward, etc
Whether or not you are keyed/flagged for certain zones
Tracking info for certain quests. For instance, you have to have epic 1.0 before certain NPCs will talk to you for epic 1.5. You can't repeat some quests because the NPC knows you did it already (the 6th anniversary quest for example).
Veteran rewards (for next patch)
How long until account expires
Language customer speaks (for foreign language servers)
Sony vs. Ubisoft customer
Status of petitions and /report
Whether or not you have unread storyline messages
In-game email waiting
Name of person (or people) who sent you tells so you can /reply. Don't forget about cross-server tells.
If multiple tell windows are open, which player is associated with each window
Channels the player has joined
Number and location of corpses in the world
Guildwar info
How brightly worn items "glow"
Legend's subscriber or not, SOE all access pass subscriber or not
Items on cursor (other than money)
Whether a reward has been /claim'ed
Buffs on group members (for inspect buffs AA)
Whether you have gotten the bonus AA points for PoP flags (saying 'tell stories' to that dwarf in PoK). Also, info that Seer tells you when you unlock memories and do guided meditation.
Who can loot in the raid you're in
The last page viewed in spellbook, so if you open the book again you go back to that page.
Saved spell lists
List of keys on keyring
High score on /gems maybe, hah
Whether you have AFK or LFG tags on
Who you have consented, including group/guild/raid. Who has consented you.
TGB on or off
Whether or not you are on a horse (with type / speed of horse).
Whether you are walking or running
Whether or not you are ducked
Time logged in for current session
Current AC and Attack rating
Number of potions consumed recently (game prevents you from using too many potions in a short period of time).
Various PvP stats. I don't play on the PvP server, so I'm not sure exactly what is there. Stuff like kill streaks, death streaks, infamy, etc.
The city the player started in.
Whether /autosplit is on or off
Various commands to try and see if they change anything. Taken from http://eqforums.station.sony.com/eq/board/message?board.id=Veterans&message.id=49623

/assist on/off
/combatmusic on/off
/filter on/off
/serverfilter on/off
/toggleinspect on/off
/dopropertinting on/off
/hitsmode
/hidecorpse
/shownames
/mixahead
/dynamiclighting
/safelock [WORD] -- sets password on UI, type /safelock [WORD] again to release
/showgrass

Glee
04-10-2005, 04:58 AM
I tried the structvis.pl tool, and like it a lot. Here are some things I found:


/*0252*/ uint8_t beer; // Level of intoxication
/*4444*/ uint8_t autosplit; // Is autosplit on
/*4456*/ uint32_t unknown_counter; // Counting something, goes up by 2 every time you zone
/*4492*/ uint8_t potion; // Counter for potion toxicity


The beer counter goes up by roughly 10 for every beer consumed, up to 200. This is with max alcohol tolerance. The potion counter went up by 3 for ever invis potion I consumed. I didn't try other potions, so I can't say if they are on the same counter. The unknown_counter went up by 2 every time I zoned, but it went up by a few when I just sat afk for a long time. Older characters have higher numbers, so this isn't reset when you log out.

And here are some things that appear not to be there:


Vision type (tried with / without vision enhancing item, no change)
AFK tag makes no change
LFG tag makes no change
TGB setting makes no change
Walking / running makes no change
Ducking makes no change
Items on cursor other than money makes no change

BlueAdept
04-10-2005, 09:02 AM
Thanks for the help Glee.

I should have asked ksmith before I posted his code though. I posted it before I even thought about it. If he wants me to remove it I will, but as we have seen, it has already brought someone else into helping figure out the unknowns.

BlueAdept
04-10-2005, 09:10 AM
The unknown_counter went up by 2 every time I zoned, but it went up by a few when I just sat afk for a long time. Older characters have higher numbers, so this isn't reset when you log out.

Maybe that number is the birthday counter?

With the regen changes there might be a regen counter, I know the longer you sit, the higher your regen gets. I'm not sure how to check that though since the player struct is only sent on zoning. I am also curious how the "regen pool" works in DON's guild hall. Since I don't have that, I won't be able to do anything about it.

purple
04-10-2005, 10:41 AM
Played time is already known. I've tried to figure out what that counter is, but couldn't come up with anything.

hp and mana regen is handled on the server side and the client is just updated frequently on hp and mana changes. I'd imagine the pool in the guild hall is mostly server side as well.

Thanks for those new ones, Glee. I added them to my charProfileStruct.

purple
04-10-2005, 06:35 PM
4480 and 4496 make no sense to me whatsoever. They stay the same in all my recent logs (march, april), but if I look back to february and january, it has changed a couple times. Maybe it has to do with patches? The data itself doesn't make sense either really. At first I thought it might be a timestamp, but it's not.

purple
04-12-2005, 06:09 PM
The new suffix is after title which is after servername.

Also on the list of stuff to figure out, how skills over 255 work.

Tor K'tal
04-15-2005, 02:30 AM
Are the ability timers in there?
Slam, Kick, Bash, Hide, Sneak, etc etc

What about AA abilities that are on Timers?
Canni 5, Divine Arbitration, Aera Taunt, etc etc

Personaly opinion SOE should allow you to incorperate those timers into your UI without have to use MQ or other 3rd party add ons. Maybe they do but I haven't found a listing of what to throw in the XML to show it on the screen.

~ TK

purple
04-15-2005, 06:46 AM
Those are on my list to verify still. I haven't gotten around to it yet. They are "Skill cooldown" and "AA cooldown" on my list.

BlueAdept
04-15-2005, 08:09 AM
I have one AA that has a timer. I tried it several time, but didn't see anything.

tanner
05-11-2005, 09:43 PM
Time to re-open this old thread. :-) Probably not the right thing to do on patch day, but...

First question, can the eqem collector's logs be used instead of tcpdump? I'd like to get 2 birds with 1 stone, if possible.

How about these things as potential unknowns:

- If you are in trader mode
- If you are in barter mode
- Items/prices your trader is selling
- Buy lines for barter
- Profanity filter
- Keys on key ring (ala /keys)
- Training points
- Hide traders

I've know setup EQ1 sensors (aka cheap laptops) so I can sniff packets while I play for the itemcolllector, the eqemucollector, and seq.

Let me know if there is anything specific you want me to try to log, I'll start with attempting to capture some of the stuff purple has identified in the previous postings.

tanner
05-12-2005, 12:05 AM
How to use it:

Go to Network
Then to OpCode Monitor
OpCode Monitoring and click on it.
It will open a window asking what to monitor. Put in this 2fee:PlayerProfile:3:1 and hit ok.
Then in the OpCode Monitor menu check Log Monitored OpCode Matches and then go into Log Filename... in the same menu and specify a name for the file..

Camped, zone, multiple times, never get a log file.

I do get

Info: OpCode monitoring has been DISABLED...
Info: OpCode monitoring ENABLED...
Info: Using list: 2fee:PlayerProfile:3:1
Debug: opcode=2fee name='PlayerProfile' dir=3 known=1
Info: OpCode monitoring is now ENABLED...
Using list: 2fee:PlayerProfile:3:1

in the console.

Any advise on what I am doing wrong?

purple
05-12-2005, 05:14 AM
Yeah, 2fee isn't OP_PlayerProfile anymore. It's 1f1c right now.

Halfoak
05-14-2005, 09:39 AM
I am not totally sure of what else you maybe looking for on struct changes.. I have noticed something tho while playing..

The Veteran rewards: they all have timers so not sure if any of those will show up, along with those is the 2 free pets they are there, but do not show up as pets..

Another thing is that on my casting timer(screen) it is now displaying the name of the spell being casted. I am not sure if that could make a difference on our side or not.

Anyways I will keep looking.. I tried to get my log to work but I can not even get that to come up..

Halfoak

QuerySEQ
05-15-2005, 07:04 AM
I tried the structvis.pl tool, and like it a lot. Here are some things I found:


/*0252*/ uint8_t beer; // Level of intoxication
/*4444*/ uint8_t autosplit; // Is autosplit on
/*4456*/ uint32_t unknown_counter; // Counting something, goes up by 2 every time you zone

/*4492*/ uint8_t potion; // Counter for potion toxicity


The unknown_counter went up by 2 every time I zoned, but it went up by a few when I just sat afk for a long time. Older characters have higher numbers, so this isn't reset when you log out.




That Unknown_counter might be counting save information. Try on a lower level character, I betcha that counter goes up more frequently if you are AFK, and also go up by 2. when you zone. (Saving.....Save Successful)

I was watching that one too.