Log in

View Full Version : Beards?


Zothen
04-17-2011, 08:29 AM
Hail EQEmu Community!

First, thanks for all the effort on the project, its simply awesome and being a true nostalgic, I really appreciate it

Now to my problem:

I managed to set up a server and its working pretty well so far. But strangely, whenever I create a character with a beard, the beard doesnt seem to be saved. Is there a fix or am I doing something wrong (or both) ?

I compiled the latest source codes, sourced in the latest sql updates.

Thanks in advance,
Nils

trevius
04-18-2011, 08:10 AM
Hmm, maybe there is an issue with the structure between the character select creation part and the in game beard fields. Which client are you on? Also, have you tried using the face button while in game to see if it saves the correct beard or not? You will need to zone after changing it to be sure.

Zothen
04-18-2011, 09:14 AM
Using the Titanium client.

Changing the face ingame works like a charm. Havent zoned after the change, but back in char selection, the changes are displayed correctly.

trevius
04-18-2011, 10:33 AM
I am not sure if the Titanium char select structs are 100% or not. The newer SoF+ clients should be though, I think. If it shows correctly at char select now, maybe there is some issue with the char creation portion on Titanium. I don't have much urge to work on older client structs like that anymore, but if someone else figures it out, I am sure it can be corrected on the SVN.

revloc02c
04-18-2011, 11:21 AM
I can confirm that the beard does not save correctly on the Titanium char select screen but changing it in game works fine.

I don't blame you for not wanting to work on older clients, but it's no biggie. The work around is just making the adjustment in game--not a big deal.

Zothen
04-18-2011, 11:21 AM
I am a programmer myself, so if you could give me a hint which cpp-files I should have a look at, I would do so.

trevius
04-19-2011, 03:41 AM
Here are the 3 main files related to structs and Titanium:

http://code.google.com/p/projecteqemu/source/browse/trunk/EQEmuServer/common/patches/Titanium.cpp

Here is what you would look at there:
DECODE(OP_CharacterCreate) {
DECODE_LENGTH_EXACT(structs::CharCreate_Struct);
SETUP_DIRECT_DECODE(CharCreate_Struct, structs::CharCreate_Struct);
IN(class_);
IN(beardcolor);
IN(beard);
IN(haircolor);
IN(gender);
IN(race);
IN(start_zone);
IN(hairstyle);
IN(deity);
IN(STR);
IN(STA);
IN(AGI);
IN(DEX);
IN(WIS);
IN(INT);
IN(CHA);
IN(face);
IN(eyecolor1);
IN(eyecolor2);
FINISH_DIRECT_DECODE();
}


http://code.google.com/p/projecteqemu/source/browse/trunk/EQEmuServer/common/patches/Titanium_structs.h

Here is the struct Titanium uses (this should be the only thing you would need to modify):
/*
** Character Creation struct
** Length: 140 Bytes
** OpCode: 0x0113
*/
struct CharCreate_Struct
{
/*0000*/ int32 class_;
/*0004*/ int32 haircolor; // Might be hairstyle
/*0008*/ int32 beardcolor; // Might be beard
/*0012*/ int32 beard; // Might be beardcolor
/*0016*/ int32 gender;
/*0020*/ int32 race;
/*0024*/ int32 start_zone;
// 0 = odus
// 1 = qeynos
// 2 = halas
// 3 = rivervale
// 4 = freeport
// 5 = neriak
// 6 = gukta/grobb
// 7 = ogguk
// 8 = kaladim
// 9 = gfay
// 10 = felwithe
// 11 = akanon
// 12 = cabalis
// 13 = shar vahl
/*0028*/ int32 hairstyle; // Might be haircolor
/*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 unknown0076; // Could be face
/*0080*/
};

http://code.google.com/p/projecteqemu/source/browse/trunk/EQEmuServer/common/eq_packet_structs.h

Here is the main struct for the emu that Titanium uses to decode to:

/*
** Character Creation struct
** Length: 140 Bytes
** OpCode: 0x0113
*/
struct CharCreate_Struct
{
/*0000*/ int32 class_;
/*0004*/ int32 haircolor; // Might be hairstyle
/*0008*/ int32 beardcolor; // Might be beard
/*0012*/ int32 beard; // Might be beardcolor
/*0016*/ int32 gender;
/*0020*/ int32 race;
/*0024*/ int32 start_zone;
// 0 = odus
// 1 = qeynos
// 2 = halas
// 3 = rivervale
// 4 = freeport
// 5 = neriak
// 6 = gukta/grobb
// 7 = ogguk
// 8 = kaladim
// 9 = gfay
// 10 = felwithe
// 11 = akanon
// 12 = cabalis
// 13 = shar vahl
/*0028*/ int32 hairstyle; // Might be haircolor
/*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 drakkin_heritage; // added for SoF
/*0080*/ int32 drakkin_tattoo; // added for SoF
/*0084*/ int32 drakkin_details; // added for SoF
/*0088*/
};

As you can see, there are some comments about hair and beard and colors related to them that might be in the wrong spots. It probably wouldn't be too hard to test each out and correct it. Since all clients have to decode this, you would only need to adjust the Titanium struct, not the eq_structs.h file.If you do get the corrections made, feel free to share them so they can be corrected on the SVN. We always welcome new programmers to help out around here :)

Zothen
04-19-2011, 04:18 AM
Thanks alot Trevius, will check it out.

Zothen
04-19-2011, 05:53 AM
Your hint was absolutely correct. To make creating chars with beards work properly using the Titanium client, you need to change the following file to:


struct CharCreate_Struct
{
/*0000*/ int32 class_;
/*0004*/ int32 haircolor; // Its REALLY the hairstyle (confirmed)
/*0008*/ int32 beard; // THIS is the beard!
/*0012*/ int32 beardcolor; // And THIS is the beardcolor
/*0016*/ int32 gender;
/*0020*/ int32 race;
/*0024*/ int32 start_zone;
// 0 = odus
// 1 = qeynos
// 2 = halas
// 3 = rivervale
// 4 = freeport
// 5 = neriak
// 6 = gukta/grobb
// 7 = ogguk
// 8 = kaladim
// 9 = gfay
// 10 = felwithe
// 11 = akanon
// 12 = cabalis
// 13 = shar vahl
/*0028*/ int32 hairstyle; // This IS the haircolor. (confirmed)
/*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 unknown0076; // Could be face
/*0080*/
};


Thanks again for the help! :)

EDIT: Wait! Theres an issue with the hair color now...dont know if its old or new. Stand by, checking...

EDIT2: False alarm it seems. I think the Titanium character editor got some strange issues itself. Tested a dwarf and browsing through the beards rightward I wasnt able to choose a shaved model. It works browsing leftward. Then there seem to be 2 black colors, while chosing the 2nd black results in a different color after the creation process. However, nothing to be done about that, at least not by me ;)

joligario
04-19-2011, 06:38 AM
It was mentioned that SoF+ were good on beards. Do they not use the same character create struct?

Secrets
04-19-2011, 07:05 AM
It was mentioned that SoF+ were good on beards. Do they not use the same character create struct?

They don't. Not sure why either. I will confirm this with IDA then commit it.

trevius
04-19-2011, 07:20 AM
SoF+ had a lot of struct changes. The main difference here would be the addition of Drakkin. Other than that, they are basically the same. The SoF struct is below and confirms the swap of beard and beardcolor that Zothen confirmed. It makes sense for them to match up for that portion. Derision, KLS, myself and a few others did a ton of work on the SoF+ structures to make sure they were as accurate as possible. Some of the Titanium structs were updated at that time as well (like the illusion struct), but not very many of them.

SoF Struct:

/*
** 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*/
};

Secrets
04-19-2011, 07:33 AM
SoF+ had a lot of struct changes. The main difference here would be the addition of Drakkin. Other than that, they are basically the same. The SoF struct is below and confirms the swap of beard and beardcolor that Zothen confirmed. It makes sense for them to match up for that portion. Derision, KLS, myself and a few others did a ton of work on the SoF+ structures to make sure they were as accurate as possible. Some of the Titanium structs were updated at that time as well (like the illusion struct), but not very many of them.

SoF Struct:

/*
** 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*/
};

It's very possible that is the correct version of the char creation struct. Maybe the unknown in titanium is the tutorial flag? I didn't look that far into it besides assembly :P

trevius
04-19-2011, 08:40 AM
Yeah, I would think it probably is the Tutorial field. Though, I thought tutorial already worked properly at character creation on Titanium. It would definitely make sense and could be tested easy enough.