| 
		
			| vesuvias | 02-18-2004 06:30 PM |  
 Fixed spellbar bug and luclin faces viewed by other clients
 Ok round two. I made just two changes this time. 
-Fixed luclin faces (face,beard,hair,etc) so that this information is now correctly being sent to 
the other clients. Before even though (after my last change) you could set your face correctly, no one else in the world was getting the correct information sent to thier clients. These changes should fix that.
 
-Fixed the last remenents of the spell bug I believe (ran solid for four hours as a necro without a single bugged casting). Turns out this last bug was directly related to fizzles (I bet if fizzle was in red as opposed to dark blue we could have correlated this earlier :) ). Fizzling crashed the spellar everytime (test it now by setting your channeling to zero and cast a few times, bye bye spellbar) and since its based on channelling you really never fizzled at high levels (so it appeared intermitent). Was a simple fix once I found it.
 
Ok this is a big long list of diffs because fixing luclin faces required that I add a beard variable to mob.h and a few of its methods (and lots of classes call or overide those methods). I also included all of the changes I made from my previous list because these diffs are agianst the current cvs (which my last round of changes aren't a part of yet).
 
I know 0.5.5 is right around the corner and some of this might (likely) change when we see it. If I had access to that code base I would be making these changes agianst it. Irregardless, when 0.5.5 gets here I may have to go back and do some of this work agian.
 
Hope this helps if even a little... I know my son enjoys not having to log out every five minutes because his spellbar was bugged ;-) 
 
Ves
 
you can get the changed files here 
Diffs to follow *edited to include context and player_corpse.cpp*
 
spells.cpp
 
	Code: 
 Index: spells.cpp===================================================================
 RCS file: /cvsroot/eqemu/eqemu/eqemu/Source/zone/spells.cpp,v
 retrieving revision 1.1.1.13
 diff -c -r1.1.1.13 spells.cpp
 *** spells.cpp        7 Feb 2004 21:34:24 -0000        1.1.1.13
 --- spells.cpp        19 Feb 2004 05:22:07 -0000
 ***************
 *** 399,405 ****
 if(slot <= 8 && !CheckFizzle(spell_id))
 {
 int fizzle_msg = IsBardSong(spell_id) ? MISS_NOTE : SPELL_FIZZLE;
 !                 InterruptSpell(fizzle_msg, 0x121);
 
 // fizzle 1/4 the mana away
 if(IsClient())
 --- 399,405 ----
 if(slot <= 8 && !CheckFizzle(spell_id))
 {
 int fizzle_msg = IsBardSong(spell_id) ? MISS_NOTE : SPELL_FIZZLE;
 !                 InterruptSpell(fizzle_msg, 0x121,spell_id);
 
 // fizzle 1/4 the mana away
 if(IsClient())
 client.cpp
 
	Code: 
 Index: client.cpp===================================================================
 RCS file: /cvsroot/eqemu/eqemu/eqemu/Source/zone/client.cpp,v
 retrieving revision 1.1.1.12
 diff -c -r1.1.1.12 client.cpp
 *** client.cpp        6 Feb 2004 23:32:59 -0000        1.1.1.12
 --- client.cpp        16 Feb 2004 18:41:44 -0000
 ***************
 *** 116,125 ****
 0,        // wis
 0,        // cha
 0xff,        // Luclin Hair Colour
 !         0xff,        // Luclin Beard
 0xff,        // Luclin Eye1
 0xff,        // Luclin Eye2
 0xff,        // Luclin Hair Style
 0xff,        // Luclin Face
 0xff,        // AA Title
 1, // fixedz
 --- 116,126 ----
 0,        // wis
 0,        // cha
 0xff,        // Luclin Hair Colour
 !         0xff,        // Luclin Beard Color
 0xff,        // Luclin Eye1
 0xff,        // Luclin Eye2
 0xff,        // Luclin Hair Style
 +         0xff,        // Luclin Beard
 0xff,        // Luclin Face
 0xff,        // AA Title
 1, // fixedz
 client_process.cpp
 
	Code: 
 Index: client_process.cpp===================================================================
 RCS file: /cvsroot/eqemu/eqemu/eqemu/Source/zone/client_process.cpp,v
 retrieving revision 1.1.1.12
 diff -c -r1.1.1.12 client_process.cpp
 *** client_process.cpp        7 Feb 2004 21:34:11 -0000        1.1.1.12
 --- client_process.cpp        19 Feb 2004 23:56:37 -0000
 ***************
 *** 1604,1631 ****
 int8 minlevel = 0;
 sint8 myerror=ZONE_ERROR_NOTREADY;
 char target_zone[32] = {0};
 if (zc->zoneID != 0 && dead)
 {
 ! #ifdef GUILDWARS
 !                                         if(animation > 65 && admin<80 && CheckCheat()){
 !                                                 if(cheater || cheatcount>0){
 !                                                         Message(15,"Cheater log updated...yup your busted,its not nice to cheat.");
 !                                                         char descript[50]={0};
 !                                                         sprintf(descript,"%s: %i","Death zone cheat");
 !                                                         database.logevents(this->AccountName(),this->AccountID(),admin,this->GetName(),"none","Death zone cheat",descript,15);
 !                                                         if(cheater==false){
 !                                                                 worldserver.SendEmoteMessage(0,0,0,13,"<Cheater Locator> We have found a cheater.  %s (Acct: %s) was just caught hacking, please show them what we think of hackers...",this->GetName(),this->AccountName());
 !                                                                 cheater=true;
 }
 !                                                         cheatcount=0;
 }
 -                                                 else
 -                                                         cheatcount++;
 }
 - #else
 -                                         break;
 #endif
 !                                         }
 if (zc->zoneID == 0){
 if(strlen(zonesummon_name)==0)//Player Died
 strcpy(target_zone, zone->GetShortName());
 --- 1604,1631 ----
 int8 minlevel = 0;
 sint8 myerror=ZONE_ERROR_NOTREADY;
 char target_zone[32] = {0};
 +
 + #ifdef GUILDWARS
 if (zc->zoneID != 0 && dead)
 {
 !                                                 if(animation > 65 && admin<80 && CheckCheat()){
 !                                                         if(cheater || cheatcount>0){
 !                                                                 Message(15,"Cheater log updated...yup your busted,its not nice to cheat.");
 !                                                                 char descript[50]={0};
 !                                                                 sprintf(descript,"%s: %i","Death zone cheat");
 !                                                                 database.logevents(this->AccountName(),this->AccountID(),admin,this->GetName(),"none","Death zone cheat",descript,15);
 !                                                                 if(cheater==false){
 !                                                                         worldserver.SendEmoteMessage(0,0,0,13,"<Cheater Locator> We have found a cheater.  %s (Acct: %s) was just caught hacking, please show them what we think of hackers...",this->GetName(),this->AccountName());
 !                                                                         cheater=true;
 !                                                                 }
 !                                                                 cheatcount=0;
 }
 !                                                         else
 !                                                                 cheatcount++;
 }
 }
 #endif
 !
 if (zc->zoneID == 0){
 if(strlen(zonesummon_name)==0)//Player Died
 strcpy(target_zone, zone->GetShortName());
 ***************
 *** 1649,1658 ****
 zonesummon_ignorerestrictions = 0;
 
 ZonePoint* zone_point = zone->GetClosestZonePoint(x_pos, y_pos, z_pos, zc->zoneID);
 !
 !                                         tarx=zonesummon_x;
 !                                         tary=zonesummon_y;
 !                                         tarz=zonesummon_z;
 
 // -1, -1, -1 = code for zone safe point
 if ((x_pos == -1 && y_pos == -1 && (z_pos == -1 || z_pos == -10)) ||
 --- 1649,1656 ----
 zonesummon_ignorerestrictions = 0;
 
 ZonePoint* zone_point = zone->GetClosestZonePoint(x_pos, y_pos, z_pos, zc->zoneID);
 !                                         //zone debugging
 !                                         ZonePoint* zp = zone_point;
 
 // -1, -1, -1 = code for zone safe point
 if ((x_pos == -1 && y_pos == -1 && (z_pos == -1 || z_pos == -10)) ||
 ***************
 *** 1666,1676 ****
 zonesummon_z = -2;
 }
 // -3 -3 -3 = bind point
 !                                         else if (zonesummon_x == -3 && zonesummon_y == -3 && (zonesummon_z == -3 || zonesummon_z == -30) && database.GetZoneName(m_pp.bind_zone_id)) {
 !                                                 strcpy(target_zone, database.GetZoneName(m_pp.bind_zone_id));
 !                                                 tarx = m_pp.bind_x;
 !                                                 tary = m_pp.bind_y;
 !                                                 tarz = m_pp.bind_z;
 zonesummon_x = -2;
 zonesummon_y = -2;
 zonesummon_z = -2;
 --- 1664,1678 ----
 zonesummon_z = -2;
 }
 // -3 -3 -3 = bind point
 !                                         else if (zonesummon_x == -3 && zonesummon_y == -3 && (zonesummon_z == -3 || zonesummon_z == -30)) {
 !                                                 if (database.GetZoneName(m_pp.bind_zone_id)){
 !                                                         //zoneing to bind point
 !                                                         strcpy(target_zone, database.GetZoneName(m_pp.bind_zone_id));
 !                                                         tarx = m_pp.bind_x;
 !                                                         tary = m_pp.bind_y;
 !                                                         tarz = m_pp.bind_z;
 !
 !                                                 } //else bind point isn't set and we will zone to the zone safe point
 zonesummon_x = -2;
 zonesummon_y = -2;
 zonesummon_z = -2;
 ***************
 *** 1690,1712 ****
 tarz=GetZ();
 else
 tarz = zone_point->target_z;
 !                                                 tarheading = zone_point->target_heading;
 }
 // if not -2 -2 -2, zone to these coords. -2, -2, -2 = not a zonesummon zonerequest
 else if (!(zonesummon_x == -2 && zonesummon_y == -2 && (zonesummon_z == -2 || zonesummon_z == -20))) {
 tarx = zonesummon_x;
 tary = zonesummon_y;
 tarz = zonesummon_z;
 zonesummon_x = -2;
 zonesummon_y = -2;
 zonesummon_z = -2;
 }
 !                                         else {
 cout << "WARNING: No target coords for this zone in DB found" << endl;
 cout << "Zoning to safe coords: " << target_zone << " (" << database.GetZoneID(target_zone) << ")" << ", x=" << tarx << ", y=" << tary << ", z=" << tarz << endl;
 !                                                 tarx=-1;
 !                                                 tary=-1;
 !                                                 tarz=-1;
 zonesummon_x = -2;
 zonesummon_y = -2;
 zonesummon_z = -2;
 --- 1692,1716 ----
 tarz=GetZ();
 else
 tarz = zone_point->target_z;
 !                                                 tarheading = zone_point->target_heading;
 }
 // if not -2 -2 -2, zone to these coords. -2, -2, -2 = not a zonesummon zonerequest
 else if (!(zonesummon_x == -2 && zonesummon_y == -2 && (zonesummon_z == -2 || zonesummon_z == -20))) {
 +
 tarx = zonesummon_x;
 tary = zonesummon_y;
 tarz = zonesummon_z;
 +
 zonesummon_x = -2;
 zonesummon_y = -2;
 zonesummon_z = -2;
 }
 !                                         else {
 cout << "WARNING: No target coords for this zone in DB found" << endl;
 cout << "Zoning to safe coords: " << target_zone << " (" << database.GetZoneID(target_zone) << ")" << ", x=" << tarx << ", y=" << tary << ", z=" << tarz << endl;
 !                                                 //tarx=-1;
 !                                                 //tary=-1;
 !                                                 //tarz=-1;
 zonesummon_x = -2;
 zonesummon_y = -2;
 zonesummon_z = -2;
 ***************
 *** 1716,1722 ****
 myerror = ZONE_ERROR_NOEXPERIENCE;
 
 APPLAYER* outapp = NULL;
 !                                         if (target_zone[0] != 0 && admin >= minstatus && GetLevel() >= minlevel) {
 LogFile->write(EQEMuLog::Status, "Zoning '%s' to: %s (%i) x=%f, y=%f, z=%f",
 m_pp.name, target_zone, database.GetZoneID(target_zone),
 tarx, tary, tarz);
 --- 1720,1726 ----
 myerror = ZONE_ERROR_NOEXPERIENCE;
 
 APPLAYER* outapp = NULL;
 !                                         if (target_zone[0] != 0 && admin >= minstatus && GetLevel() >= minlevel) {
 LogFile->write(EQEMuLog::Status, "Zoning '%s' to: %s (%i) x=%f, y=%f, z=%f",
 m_pp.name, target_zone, database.GetZoneID(target_zone),
 tarx, tary, tarz);
 ***************
 *** 1734,1740 ****
 
 Save();
 
 !                                                 if (m_pp.zone_id == zone->GetZoneID()) {
 // No need to ask worldserver if we're zoning to ourselves (most
 // likely to a bind point), also fixes a bug since the default response was failure
 APPLAYER* outapp = new APPLAYER(OP_ZoneChange,sizeof(ZoneChange_Struct));
 --- 1738,1744 ----
 
 Save();
 
 !                                                 if (m_pp.zone_id == zone->GetZoneID()) {
 // No need to ask worldserver if we're zoning to ourselves (most
 // likely to a bind point), also fixes a bug since the default response was failure
 APPLAYER* outapp = new APPLAYER(OP_ZoneChange,sizeof(ZoneChange_Struct));
 ***************
 *** 1747,1752 ****
 --- 1751,1758 ----
 zone->StartShutdownTimer(AUTHENTICATION_TIMEOUT * 1000);
 }
 else {
 +                                                         //zoneing to another zone so we need to the let the world server
 +                                                         //handle things with the client for a while
 ServerPacket* pack = new ServerPacket(ServerOP_ZoneToZoneRequest, sizeof(ZoneToZone_Struct));
 ZoneToZone_Struct* ztz = (ZoneToZone_Struct*) pack->pBuffer;
 ztz->response = 0;
 ***************
 *** 1760,1767 ****
 safe_delete(pack);
 }
 }
 !                                         else {
 !                                                 LogFile->write(EQEMuLog::Error, "Zone %i is not available", zc->zoneID);
 
 outapp = new APPLAYER(OP_ZoneChange, sizeof(ZoneChange_Struct));
 ZoneChange_Struct *zc2 = (ZoneChange_Struct*)outapp->pBuffer;
 --- 1766,1773 ----
 safe_delete(pack);
 }
 }
 !                                         else {
 !                                                 LogFile->write(EQEMuLog::Error, "Zone %i is not available because target wasn't found or character insufficent level", zc->zoneID);
 
 outapp = new APPLAYER(OP_ZoneChange, sizeof(ZoneChange_Struct));
 ZoneChange_Struct *zc2 = (ZoneChange_Struct*)outapp->pBuffer;
 ***************
 *** 3558,3565 ****
 m_pp.eyecolor2        = fc->eyecolor2;
 m_pp.hairstyle        = fc->hairstyle;
 m_pp.face                = fc->face;
 !                                         //m_pp.beard        = fc->?;
 !                                         //m_pp.?                = fc->woad;
 
 Save();
 SimpleMessage_StringID(13,FACE_ACCEPTED);
 --- 3564,3570 ----
 m_pp.eyecolor2        = fc->eyecolor2;
 m_pp.hairstyle        = fc->hairstyle;
 m_pp.face                = fc->face;
 !                                         m_pp.beard                = fc->beard;
 
 Save();
 SimpleMessage_StringID(13,FACE_ACCEPTED);
 ***************
 *** 4821,4826 ****
 --- 4826,4832 ----
 eyecolor2        = m_pp.eyecolor2;
 hairstyle        = m_pp.hairstyle;
 luclinface        = m_pp.face;
 +         beard                = m_pp.beard;
 m_pp.hunger_level = 6000;
 m_pp.thirst_level = 6000;
 //aa_title        = m_pp.aa_title;
  mob.cpp
 
	Code: 
 Index: mob.cpp===================================================================
 RCS file: /cvsroot/eqemu/eqemu/eqemu/Source/zone/mob.cpp,v
 retrieving revision 1.1.1.10
 diff -c -r1.1.1.10 mob.cpp
 *** mob.cpp        7 Feb 2004 21:34:05 -0000        1.1.1.10
 --- mob.cpp        19 Feb 2004 05:52:01 -0000
 ***************
 *** 84,90 ****
 int8        in_eyecolor1, // the eyecolors always seem to be the same, maybe left and right eye?
 int8        in_eyecolor2,
 int8        in_hairstyle,
 !                  int8        in_luclinface, // and beard
 int8        in_aa_title,
 float        in_fixed_z,
 int16        in_d_meele_texture1,
 --- 84,91 ----
 int8        in_eyecolor1, // the eyecolors always seem to be the same, maybe left and right eye?
 int8        in_eyecolor2,
 int8        in_hairstyle,
 !                  int8        in_beard, // and beard
 !                  int8        in_luclinface,
 int8        in_aa_title,
 float        in_fixed_z,
 int16        in_d_meele_texture1,
 ***************
 *** 146,151 ****
 --- 147,154 ----
 eyecolor1        = in_eyecolor1;
 eyecolor2        = in_eyecolor2;
 hairstyle        = in_hairstyle;
 +         beard                = in_beard;
 +         luclinface        = in_luclinface;
 if(in_aa_title>0)
 aa_title        = in_aa_title;
 else
 ***************
 *** 533,539 ****
 }
 
 void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
 !     strcpy(ns->spawn.name, name);
 if(IsClient())
 strncpy(ns->spawn.last_name,lastname,32);
 ns->spawn.heading        = heading;
 --- 536,542 ----
 }
 
 void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
 !         strcpy(ns->spawn.name, name);
 if(IsClient())
 strncpy(ns->spawn.last_name,lastname,32);
 ns->spawn.heading        = heading;
 ***************
 *** 552,585 ****
 ns->spawn.level                = level;
 ns->spawn.deity                = deity;
 ns->spawn.animation        = 0;
 !         ns->spawn.light                = light;
 ns->spawn.invis                = IsInvisible(ForWho);
 ns->spawn.npc                = IsClient() ? 0 : 1;
 ns->spawn.pet_owner_id        = ownerid;
 !         if(hairstyle>0)
 ns->spawn.hairstyle                = hairstyle;
 else
 ns->spawn.hairstyle                =0xFF;
 !         if(haircolor>0)
 ns->spawn.haircolor                = haircolor;
 else
 ns->spawn.haircolor                =0xFF;
 !         ns->spawn.beard                = 0xFF; // where is the beard?
 !         if(beardcolor>0)
 ns->spawn.beardcolor        = beardcolor;
 else
 ns->spawn.beardcolor        =0xFF;
 
 !         if(eyecolor1>0)
 ns->spawn.eyecolor1                = eyecolor1;
 else
 ns->spawn.eyecolor1                = 0xFF;
 !         if(eyecolor2>0)
 ns->spawn.eyecolor2                = eyecolor2;
 else
 ns->spawn.eyecolor2                = 0xFF;
 !         ns->spawn.hairstyle                = hairstyle;
 !         ns->spawn.face                        = 0;
 if(helmtexture>0 && helmtexture<255){
 ns->spawn.equipment[0]        = helmtexture;
 ns->spawn.helm=helmtexture;
 --- 555,597 ----
 ns->spawn.level                = level;
 ns->spawn.deity                = deity;
 ns->spawn.animation        = 0;
 ! //        ns->spawn.light                = light; //not really sure where light is now in the struct
 ns->spawn.invis                = IsInvisible(ForWho);
 ns->spawn.npc                = IsClient() ? 0 : 1;
 ns->spawn.pet_owner_id        = ownerid;
 !         if(hairstyle>0 || IsClient())//only clients can actually have a valid hairstyle
 ns->spawn.hairstyle                = hairstyle;
 else
 ns->spawn.hairstyle                =0xFF;
 !         if(haircolor>0 || IsClient())
 ns->spawn.haircolor                = haircolor;
 else
 ns->spawn.haircolor                =0xFF;
 !         if(beard>0 || IsClient())
 !                 ns->spawn.beard                = beard;
 !         else
 !                 ns->spawn.beard                =0xFF;
 !         if(beardcolor>0 || IsClient())
 ns->spawn.beardcolor        = beardcolor;
 else
 ns->spawn.beardcolor        =0xFF;
 
 !         if(eyecolor1>0 || IsClient())
 ns->spawn.eyecolor1                = eyecolor1;
 else
 ns->spawn.eyecolor1                = 0xFF;
 !         if(eyecolor2>0 || IsClient())
 ns->spawn.eyecolor2                = eyecolor2;
 else
 ns->spawn.eyecolor2                = 0xFF;
 !         if (IsClient())
 !                 ns->spawn.face = luclinface;
 !         else
 !                 ns->spawn.face = 0;
 !         ns->spawn.unknown143[0] = 0xff;//this used to be labeled beard.. if its not FF it will turn
 !                                                                    //mob invis
 !
 !
 if(helmtexture>0 && helmtexture<255){
 ns->spawn.equipment[0]        = helmtexture;
 ns->spawn.helm=helmtexture;
 ***************
 *** 881,887 ****
 //SendPosUpdate(1);
 }
 
 ! void Mob::SendIllusionPacket(int16 in_race, int8 in_gender, int16 in_texture, int16 in_helmtexture, int8 in_haircolor, int8 in_beardcolor, int8 in_eyecolor1, int8 in_eyecolor2, int8 in_hairstyle, int8 in_luclinface, int8 in_aa_title) {
 if (in_race == 0) {
 this->race = GetBaseRace();
 if (in_gender == 0xFFFF)
 --- 893,899 ----
 //SendPosUpdate(1);
 }
 
 ! void Mob::SendIllusionPacket(int16 in_race, int8 in_gender, int16 in_texture, int16 in_helmtexture, int8 in_haircolor, int8 in_beardcolor, int8 in_eyecolor1, int8 in_eyecolor2, int8 in_hairstyle, int8 in_luclinface, int8 in_beard,int8 in_aa_title) {
 if (in_race == 0) {
 this->race = GetBaseRace();
 if (in_gender == 0xFFFF)
 ***************
 *** 940,945 ****
 --- 952,958 ----
 this->eyecolor2 = in_eyecolor2;
 this->hairstyle = in_hairstyle;
 this->luclinface = in_luclinface;
 +                 this->beard = in_beard;
 this->aa_title = in_aa_title;
 }
 else {
 ***************
 *** 947,954 ****
 this->beardcolor = 0xFF;
 this->eyecolor1 = 0xFF;
 this->eyecolor2 = 0xFF;
 !                 this->hairstyle = 0xFF;
 this->luclinface = 0xFF;
 this->aa_title = 0xFF;
 }
 APPLAYER* outapp = new APPLAYER(OP_Illusion, sizeof(Illusion_Struct));
 --- 960,968 ----
 this->beardcolor = 0xFF;
 this->eyecolor1 = 0xFF;
 this->eyecolor2 = 0xFF;
 !                 this->hairstyle        = 0xFF;
 this->luclinface = 0xFF;
 +                 this->beard        = 0xFF;
 this->aa_title = 0xFF;
 }
 APPLAYER* outapp = new APPLAYER(OP_Illusion, sizeof(Illusion_Struct));
 mob.h
 
	Code: 
 Index: mob.h===================================================================
 RCS file: /cvsroot/eqemu/eqemu/eqemu/Source/zone/mob.h,v
 retrieving revision 1.1.1.7
 diff -c -r1.1.1.7 mob.h
 *** mob.h        7 Feb 2004 21:33:53 -0000        1.1.1.7
 --- mob.h        19 Feb 2004 05:37:36 -0000
 ***************
 *** 214,221 ****
 int8        in_eyecolor1, // the eyecolors always seem to be the same, maybe left and right eye?
 int8        in_eyecolor2,
 int8        in_hairstyle,
 !                 int8        in_title, //Face Overlay? (barbarian only)
 !                 int8        in_luclinface, // and beard);
 float        in_fixedZ,
 int16        in_d_meele_texture1,
 int16        in_d_meele_texture2,
 --- 214,222 ----
 int8        in_eyecolor1, // the eyecolors always seem to be the same, maybe left and right eye?
 int8        in_eyecolor2,
 int8        in_hairstyle,
 !                 int8        in_beard,
 !                 int8        in_luclinface,
 !                 int8        in_aa_title,
 float        in_fixedZ,
 int16        in_d_meele_texture1,
 int16        in_d_meele_texture2,
 ***************
 *** 441,447 ****
 inline bool        IsCasting() { return (bool) (casting_spell_id != 0); }
 int16        CastingSpellID() { return casting_spell_id; }
 
 !         void        SendIllusionPacket(int16 in_race, int8 in_gender = 0xFF, int16 in_texture = 0xFFFF, int16 in_helmtexture = 0xFFFF, int8 in_haircolor = 0xFF, int8 in_beardcolor = 0xFF, int8 in_eyecolor1 = 0xFF, int8 in_eyecolor2 = 0xFF, int8 in_hairstyle = 0xFF, int8 in_luclinface = 0xFF, int8 in_title = 0xFF);
 void        SendAppearancePacket(int32 type, int32 value, bool WholeZone = true, bool iIgnoreSelf = false);
 void        SetAppearance(int8 app, bool iIgnoreSelf = true);
 inline const int8&        GetAppearance()                                { return appearance; }
 --- 442,448 ----
 inline bool        IsCasting() { return (bool) (casting_spell_id != 0); }
 int16        CastingSpellID() { return casting_spell_id; }
 
 !         void        SendIllusionPacket(int16 in_race, int8 in_gender = 0xFF, int16 in_texture = 0xFFFF, int16 in_helmtexture = 0xFFFF, int8 in_haircolor = 0xFF, int8 in_beardcolor = 0xFF, int8 in_eyecolor1 = 0xFF, int8 in_eyecolor2 = 0xFF, int8 in_hairstyle = 0xFF, int8 in_luclinface = 0xFF, int8 in_beard = 0xFF, int8 in_aa_title = 0xFF);
 void        SendAppearancePacket(int32 type, int32 value, bool WholeZone = true, bool iIgnoreSelf = false);
 void        SetAppearance(int8 app, bool iIgnoreSelf = true);
 inline const int8&        GetAppearance()                                { return appearance; }
 ***************
 *** 717,722 ****
 --- 718,724 ----
 int8        eyecolor2;
 int8        hairstyle;
 int8        luclinface; // and beard
 +         int8        beard;
 int8        aa_title;
 
 int16        rune;
 npc.cpp
 
	Code: 
 Index: npc.cpp===================================================================
 RCS file: /cvsroot/eqemu/eqemu/eqemu/Source/zone/npc.cpp,v
 retrieving revision 1.1.1.7
 diff -c -r1.1.1.7 npc.cpp
 *** npc.cpp        6 Feb 2004 23:32:55 -0000        1.1.1.7
 --- npc.cpp        16 Feb 2004 18:41:45 -0000
 ***************
 *** 93,98 ****
 --- 93,99 ----
 d->eyecolor1,
 d->eyecolor2,
 d->hairstyle,
 +           d->beard,
 d->luclinface,
 d->aa_title,
 d->fixedZ,
 PlayerCorpse.cpp
 
	Code: 
 Index: PlayerCorpse.cpp===================================================================
 RCS file: /cvsroot/eqemu/eqemu/eqemu/Source/zone/PlayerCorpse.cpp,v
 retrieving revision 1.1.1.7
 diff -c -r1.1.1.7 PlayerCorpse.cpp
 *** PlayerCorpse.cpp        6 Feb 2004 23:33:06 -0000        1.1.1.7
 --- PlayerCorpse.cpp        16 Feb 2004 18:42:08 -0000
 ***************
 *** 99,105 ****
 // Mongrel: added see_invis and see_invis_undead
 Corpse::Corpse(NPC* in_npc, ItemList** in_itemlist, int32 in_npctypeid, NPCType** in_npctypedata, int32 in_decaytime)
 : Mob("Unnamed_Corpse","",0,0,in_npc->GetGender(),in_npc->GetRace(),in_npc->GetClass(),0//bodytype added
 !        ,in_npc->GetDeity(),in_npc->GetLevel(),in_npc->GetNPCTypeID(),0,in_npc->GetSize(),0,0,in_npc->GetHeading(),in_npc->GetX(),in_npc->GetY(),in_npc->GetZ(),0,0,in_npc->GetTexture(),in_npc->GetHelmTexture(),0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,1,0,0,0,0,0)
 {
 pIsChanged = false;
 p_PlayerCorpse = false;
 --- 99,105 ----
 // Mongrel: added see_invis and see_invis_undead
 Corpse::Corpse(NPC* in_npc, ItemList** in_itemlist, int32 in_npctypeid, NPCType** in_npctypedata, int32 in_decaytime)
 : Mob("Unnamed_Corpse","",0,0,in_npc->GetGender(),in_npc->GetRace(),in_npc->GetClass(),0//bodytype added
 !        ,in_npc->GetDeity(),in_npc->GetLevel(),in_npc->GetNPCTypeID(),0,in_npc->GetSize(),0,0,in_npc->GetHeading(),in_npc->GetX(),in_npc->GetY(),in_npc->GetZ(),0,0,in_npc->GetTexture(),in_npc->GetHelmTexture(),0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,1,0,0,0,0,0)
 {
 pIsChanged = false;
 p_PlayerCorpse = false;
 ***************
 *** 148,154 ****
 // Mongrel: added see_invis and see_invis_undead
 Corpse::Corpse(Client* client, PlayerProfile_Struct* pp, sint32 in_rezexp, int8 iCorpseLevel)
 : Mob("Unnamed_Corpse","",0,0,client->GetGender(),client->GetRace(),client->GetClass(), 0, // bodytype added
 !         client->GetDeity(),client->GetLevel(),0,0, client->GetSize(), 0, 0,client->GetHeading(),client->GetX(),client->GetY(),client->GetZ(),0,0,client->GetTexture(),client->GetHelmTexture(),0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,1,0,0,0,0,0)
 {
 pIsChanged                = true;
 NPCTypedata                = 0;
 --- 148,154 ----
 // Mongrel: added see_invis and see_invis_undead
 Corpse::Corpse(Client* client, PlayerProfile_Struct* pp, sint32 in_rezexp, int8 iCorpseLevel)
 : Mob("Unnamed_Corpse","",0,0,client->GetGender(),client->GetRace(),client->GetClass(), 0, // bodytype added
 !         client->GetDeity(),client->GetLevel(),0,0, client->GetSize(), 0, 0,client->GetHeading(),client->GetX(),client->GetY(),client->GetZ(),0,0,client->GetTexture(),client->GetHelmTexture(),0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,1,0,0,0,0,0)
 {
 pIsChanged                = true;
 NPCTypedata                = 0;
 ***************
 *** 215,221 ****
 // To be called from LoadFromDBData
 // Mongrel: added see_invis and see_invis_undead
 Corpse::Corpse(int32 in_dbid, int32 in_charid, char* in_charname, ItemList* in_itemlist, int32 in_copper, int32 in_silver, int32 in_gold, int32 in_plat, float in_x, float in_y, float in_z, float in_heading, float in_size, int8 in_gender, int16 in_race, int8 in_class, int8 in_deity, int8 in_level, int8 in_texture, int8 in_helmtexture,int32 in_rezexp)
 !  : Mob("Unnamed_Corpse","",0,0,in_gender, in_race, in_class, 0, in_deity, in_level,0,0, in_size, 0, 0, in_heading, in_x, in_y, in_z,0,0,in_texture,in_helmtexture,0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,1,0,0,0,0,0)
 {
 pIsChanged = false;
 NPCTypedata = 0;
 --- 215,221 ----
 // To be called from LoadFromDBData
 // Mongrel: added see_invis and see_invis_undead
 Corpse::Corpse(int32 in_dbid, int32 in_charid, char* in_charname, ItemList* in_itemlist, int32 in_copper, int32 in_silver, int32 in_gold, int32 in_plat, float in_x, float in_y, float in_z, float in_heading, float in_size, int8 in_gender, int16 in_race, int8 in_class, int8 in_deity, int8 in_level, int8 in_texture, int8 in_helmtexture,int32 in_rezexp)
 !  : Mob("Unnamed_Corpse","",0,0,in_gender, in_race, in_class, 0, in_deity, in_level,0,0, in_size, 0, 0, in_heading, in_x, in_y, in_z,0,0,in_texture,in_helmtexture,0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,1,0,0,0,0,0)
 {
 pIsChanged = false;
 NPCTypedata = 0;
 zonedump.h
 
	Code: 
 Index: zonedump.h===================================================================
 RCS file: /cvsroot/eqemu/eqemu/eqemu/Source/zone/zonedump.h,v
 retrieving revision 1.1.1.3
 diff -c -r1.1.1.3 zonedump.h
 *** zonedump.h        6 Feb 2004 23:32:30 -0000        1.1.1.3
 --- zonedump.h        16 Feb 2004 13:56:30 -0000
 ***************
 *** 79,84 ****
 --- 79,85 ----
 int8        eyecolor2;
 int8        hairstyle;
 int8        luclinface; // and beard);
 +         int8        beard;
 int8        aa_title;
 int8    banish;
 int16        min_dmg;
 database.cpp
 
	Code: 
 Index: database.cpp===================================================================
 RCS file: /cvsroot/eqemu/eqemu/eqemu/Source/common/database.cpp,v
 retrieving revision 1.1.1.11
 diff -c -r1.1.1.11 database.cpp
 *** database.cpp        6 Feb 2004 23:33:28 -0000        1.1.1.11
 --- database.cpp        15 Feb 2004 05:36:33 -0000
 ***************
 *** 1161,1170 ****
 cs->level[char_num]                = pp->level;
 cs->class_[char_num]        = pp->class_;
 cs->race[char_num]                = pp->race;
 !                                 cs->gender[char_num]        = pp->gender;
 !                                 cs->face[char_num]                = pp->face;
 cs->deity[char_num]                = pp->deity;
 cs->zone[char_num]                = GetZoneID(row[2]);
 
 // Character's equipped items
 // @merth: Haven't done bracer01/bracer02 yet.
 --- 1161,1177 ----
 cs->level[char_num]                = pp->level;
 cs->class_[char_num]        = pp->class_;
 cs->race[char_num]                = pp->race;
 !                                 cs->gender[char_num]        = pp->gender;
 cs->deity[char_num]                = pp->deity;
 cs->zone[char_num]                = GetZoneID(row[2]);
 +                                 cs->face[char_num]                = pp->face;
 +                                 cs->haircolor[char_num] = pp->haircolor;
 +                                 cs->beardcolor[char_num]= pp->beardcolor;
 +                                 cs->eyecolor2[char_num] = pp->eyecolor2;
 +                                 cs->eyecolor1[char_num] = pp->eyecolor1;
 +                                 cs->hair[char_num]                = pp->hairstyle;
 +                                 cs->beard[char_num]                = pp->beard;
 +
 
 // Character's equipped items
 // @merth: Haven't done bracer01/bracer02 yet.
 ***************
 *** 6548,6559 ****
 return true;}
 
 bool Database::GetStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc){
 !         cout<<"Choice:"<<in_cc->start_zone<<endl;
 char errbuf[MYSQL_ERRMSG_SIZE];
 char *query = 0;
 MYSQL_RES *result;
 MYSQL_ROW row;
 ! if (RunQuery(query, MakeAnyLenString(&query, "SELECT x,y,z,zone_id,bind_id FROM start_zones WHERE player_choice=%i and player_class=%i and player_deity=%i and player_race=%i", in_cc->start_zone, in_cc->class_, in_cc->deity, in_cc->race), errbuf, &result)) {
 safe_delete_array(query);
 if (mysql_num_rows(result) != 0) {
 row = mysql_fetch_row(result);
 --- 6555,6567 ----
 return true;}
 
 bool Database::GetStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc){
 !         //cout<<"Choice:"<<in_cc->start_zone<<" Class:"<<in_cc->class_<<" Race:"<<in_cc->race<<" Diety:"<<in_cc->deity<<endl;
 char errbuf[MYSQL_ERRMSG_SIZE];
 char *query = 0;
 MYSQL_RES *result;
 MYSQL_ROW row;
 !         int qLen = MakeAnyLenString(&query, "SELECT x,y,z,zone_id,bind_id,bind_x,bind_y,bind_z FROM start_zones WHERE (player_choice=%i OR  player_choice=-1) and (player_class=%i OR player_class=-1) and (player_deity=%i OR player_deity=-1) and (player_race=%i OR player_race=-1) ORDER BY select_rank DESC", in_cc->start_zone, in_cc->class_, in_cc->deity, in_cc->race);
 ! if (RunQuery(query,qLen,errbuf,&result)) {
 safe_delete_array(query);
 if (mysql_num_rows(result) != 0) {
 row = mysql_fetch_row(result);
 ***************
 *** 6561,6577 ****
 in_pp->x = atoi(row[1]);
 in_pp->z = atoi(row[2]);
 in_pp->zone_id = atoi(row[3]);
 !          in_pp->bind_zone_id = atoi(row[4]);
 mysql_free_result(result);
 return true;
 }
 else {
 !                         LogFile->write(EQEMuLog::Error, "Database: could not find start_zones entry in database. Using Defaults..");
 }
 mysql_free_result(result);
 }
 else {
 !                 LogFile->write(EQEMuLog::Error, "Database: could not find start_zones table in database. Using Defaults..");
 safe_delete_array(query);
 }
 in_pp->x = 0; in_pp->y = 0; in_pp->z = 0;
 --- 6569,6612 ----
 in_pp->x = atoi(row[1]);
 in_pp->z = atoi(row[2]);
 in_pp->zone_id = atoi(row[3]);
 !          in_pp->bind_zone_id = atoi(row[4]);
 !                  //if we haven't set a bind_zone_id lets set it to the starting zone
 !                  if (in_pp->bind_zone_id ==0) in_pp->bind_zone_id = in_pp->zone_id;
 !                  in_pp->bind_x = atof(row[5]);
 !                  in_pp->bind_y = atof(row[6]);
 !                  in_pp->bind_z = atof(row[7]);
 !                  //if bind x,y,z are all 0 then we need as a default to use the safe point
 !                  //for the bound zone
 !                  if (in_pp->bind_x ==0 && in_pp->bind_y ==0 && in_pp->bind_z ==0){
 !                         char *query2 = 0;
 !                         MYSQL_RES *result2;
 !                         MYSQL_ROW row2;
 !                         if (RunQuery(query2, MakeAnyLenString(&query2, "SELECT safe_x,safe_y,safe_z FROM zone WHERE zoneidnumber=%i",in_pp->bind_zone_id), errbuf, &result2)) {
 !                                 if (mysql_num_rows(result2) != 0) {
 !                                         row2 = mysql_fetch_row(result2);
 !                                         in_pp->bind_x = atof(row[0]);
 !                                         in_pp->bind_y = atof(row[1]);
 !                                         in_pp->bind_z = atof(row[2]);
 !                                 }
 !                                 mysql_free_result(result2);
 !                         } else {
 !                                 safe_delete_array(query2);
 !                                 LogFile->write(EQEMuLog::Error, "Database: could not find a zone entry in database for the starting bound zone.");
 !                         }
 !
 !                  }
 mysql_free_result(result);
 return true;
 }
 else {
 !                   LogFile->write(EQEMuLog::Error, "Database: could not find a start_zones entry in database for this choice,class,race,diety. Using Defaults..");
 !
 }
 mysql_free_result(result);
 }
 else {
 !                 LogFile->write(EQEMuLog::Error, errbuf);
 !                 LogFile->write(EQEMuLog::Error, "Database: SQL Error. Using Defaults..");
 safe_delete_array(query);
 }
 in_pp->x = 0; in_pp->y = 0; in_pp->z = 0;
 eq_packet_structs.h
 
	Code: 
 Index: eq_packet_structs.h===================================================================
 RCS file: /cvsroot/eqemu/eqemu/eqemu/Source/common/eq_packet_structs.h,v
 retrieving revision 1.1.1.10
 diff -c -r1.1.1.10 eq_packet_structs.h
 *** eq_packet_structs.h        7 Feb 2004 21:34:35 -0000        1.1.1.10
 --- eq_packet_structs.h        19 Feb 2004 06:07:34 -0000
 ***************
 *** 148,154 ****
 /*1120*/        Color_Struct        cs_colors[10][9];        // Characters Equipment Colors (RR GG BB 00)
 /*1480*/        int32        deity[10];                        // Characters Deity
 /*1520*/        int32        melee[2][10];                // Characters primary and secondary IDFile number
 ! /*1600*/        int8        unknown1600[60];        // ***Placeholder
 };
 
 /*
 --- 148,159 ----
 /*1120*/        Color_Struct        cs_colors[10][9];        // Characters Equipment Colors (RR GG BB 00)
 /*1480*/        int32        deity[10];                        // Characters Deity
 /*1520*/        int32        melee[2][10];                // Characters primary and secondary IDFile number
 ! /*1600*/        int8        haircolor[10];
 ! /*1610*/        int8    beardcolor[10];
 ! /*1620*/        int8        eyecolor2[10];
 ! /*1630*/        int8    eyecolor1[10];
 ! /*1640*/        int8        hair[10];
 ! /*1650*/        int8    beard[10];
 };
 
 /*
 ***************
 *** 601,609 ****
 {
 /*0000*/        int32        class_; //guess
 /*0004*/        char        name[64];
 !         /*0068*/        int32        haircolor; //guess
 !         /*0072*/        int32        eyecolor1; //guess
 !         /*0076*/        int32        eyecolor2; //guess
 /*0080*/        sint32        gender;
 /*0084*/        sint32        race;
 /*0088*/        sint32        start_zone;
 --- 606,614 ----
 {
 /*0000*/        int32        class_; //guess
 /*0004*/        char        name[64];
 !         /*0068*/        int32        haircolor;
 !         /*0072*/        int32        beard;
 !         /*0076*/        int32        beardcolor;
 /*0080*/        sint32        gender;
 /*0084*/        sint32        race;
 /*0088*/        sint32        start_zone;
 ***************
 *** 635,643 ****
 /*0116*/        sint32        WIS;
 /*0120*/        sint32        INT;
 /*0124*/        sint32        CHA;
 ! /*0128*/        int32        beard;//guess
 ! /*0132*/        int32        beardcolor;//guess
 ! /*0136*/        int32        face;
 /*0140*/
 };
 
 --- 640,648 ----
 /*0116*/        sint32        WIS;
 /*0120*/        sint32        INT;
 /*0124*/        sint32        CHA;
 ! /*0128*/        int32   face;
 ! /*0132*/        int32        eyecolor1;//its possiable we could have these switched
 ! /*0136*/        int32        eyecolor2;//since setting one sets the other we really can't check
 /*0140*/
 };
 
 ***************
 *** 824,831 ****
 struct Spawn_Struct
 {
 /*000*/        int8        npc;        // 0=player,1=npc,2=pc corpse,3=npc corpse,4=???,5=unknown spawn,10=self
 ! /*001*/        int8        eyecolor1;                        // Player left eye color
 ! /*002*/        int8        eyecolor2;                        // Player right eye color
 /*003*/        int8        aa_title; // 0=none, 1=general, 2=archtype, 3=class
 /*004*/        int32        dye_rgb[7];                         // armor dye colors
 /*032*/ int8        unknown001[11];
 --- 829,836 ----
 struct Spawn_Struct
 {
 /*000*/        int8        npc;        // 0=player,1=npc,2=pc corpse,3=npc corpse,4=???,5=unknown spawn,10=self
 ! /*001*/        int8        beard;
 ! /*002*/        int8        beardcolor;
 /*003*/        int8        aa_title; // 0=none, 1=general, 2=archtype, 3=class
 /*004*/        int32        dye_rgb[7];                         // armor dye colors
 /*032*/ int8        unknown001[11];
 ***************
 *** 840,849 ****
 // horse: 0=brown, 1=white, 2=black, 3=tan
 };
 /*049*/ int32        race; // race
 ! /*053*/ int8        beard; // Player beard style
 /*054*/ char        name[64]; // name
 ! /*118*/ int8        haircolor; // hair color
 ! /*119*/ int8        light; // 0=visible,1=invisible
 /*120*/ int8        invis;
 /*121*/ int8        max_hp; // max hp
 /*122*/ int8        pvp; // 0=Not pvp,1=pvp
 --- 845,854 ----
 // horse: 0=brown, 1=white, 2=black, 3=tan
 };
 /*049*/ int32        race; // race
 ! /*053*/ int8        eyecolor1;
 /*054*/ char        name[64]; // name
 ! /*118*/ int8        eyecolor2;
 ! /*119*/ int8        face; //light was replaced by face here not sure where light is now
 /*120*/ int8        invis;
 /*121*/ int8        max_hp; // max hp
 /*122*/ int8        pvp; // 0=Not pvp,1=pvp
 ***************
 *** 858,867 ****
 sint32        deltaZ:13;
 /*137*/ sint32        deltaY:13;
 sint32        z:19;
 ! /*141*/ int8        beardcolor;
 ! /*142*/ int8        hairstyle;
 ! /*143*/ int8        face;
 ! /*144*/ int8        unknown141[7];
 /*151*/ float        size; // Size
 /*155*/ int8        helm;
 /*156*/ float        runspeed; //
 --- 863,871 ----
 sint32        deltaZ:13;
 /*137*/ sint32        deltaY:13;
 sint32        z:19;
 ! /*141*/ int8        hairstyle;
 ! /*142*/ int8        haircolor;
 ! /*143*/ int8        unknown143[8];
 /*151*/ float        size; // Size
 /*155*/ int8        helm;
 /*156*/ float        runspeed; //
 ***************
 *** 1841,1848 ****
 /*002*/        int8        eyecolor1; // the eyecolors always seem to be the same, maybe left and right eye?
 /*003*/        int8        eyecolor2;
 /*004*/        int8        hairstyle;
 ! /*005*/        int8        woad; //Face Overlay? (barbarian only)
 ! /*006*/        int8        face; // and beard
 };
 
 /*
 --- 1845,1854 ----
 /*002*/        int8        eyecolor1; // the eyecolors always seem to be the same, maybe left and right eye?
 /*003*/        int8        eyecolor2;
 /*004*/        int8        hairstyle;
 ! /*005*/        int8        beard; //this is beard not woad
 ! /*006*/        int8        face; //there are only 10 faces for barbs changing woad just
 !                                           //increase the face value by ten so if there were 8 woad
 !                                           //designs then there would be 80 barb faces
 };
 
 /*
 |