EQEmulator Forums

EQEmulator Forums (https://www.eqemulator.org/forums/index.php)
-   Support::Windows Servers (https://www.eqemulator.org/forums/forumdisplay.php?f=587)
-   -   Beards? (https://www.eqemulator.org/forums/showthread.php?t=33342)

Zothen 04-17-2011 08:29 AM

Beards?
 
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/projecteqem...s/Titanium.cpp

Here is what you would look at there:
Code:

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/projecteqem...nium_structs.h

Here is the struct Titanium uses (this should be the only thing you would need to modify):
Code:

/*
** 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/projecteqem...cket_structs.h

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

Code:

/*
** 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:

Code:

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

Quote:

Originally Posted by joligario (Post 198690)
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:
Code:

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

Quote:

Originally Posted by trevius (Post 198693)
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:
Code:

/*
** 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.


All times are GMT -4. The time now is 04:58 AM.

Powered by vBulletin®, Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.