Go Back   EQEmulator Home > EQEmulator Forums > Development > Development: Custom Code

Development: Custom Code This is for code thatdoes not emulate live and wont be added to the official code.

Reply
 
Thread Tools Display Modes
  #1  
Old 12-28-2018, 11:14 PM
phate8908
Fire Beetle
 
Join Date: Dec 2018
Posts: 12
Default Fix for leveling past level 86

there is currently a bug where if your character is past level 86 and gains exp then it will automaticly be reset back to 86. reason for this is a buffer overflow on the pull of character data from your database to the zone client
this little patch is ment to fix this

with a lot of testing i was able to reach the 112 without having buffer overflow issues, currently live is at 110 so, i see no real need to raise level beyond that

Converts UINT32 -> char array to be readable
Code:
@@ -475,10 +475,16 @@ const char *ConvertArray(int input, char *returnchar)
 {
 	sprintf(returnchar, "%i", input);
 	return returnchar;
 }
 
+const char *ConvertArrayU(uint32 input, char *returnchar)
+{
+	sprintf(returnchar, "%u", input);
+	return returnchar;
+}
+
 const char *ConvertArrayF(float input, char *returnchar)
 {
 	sprintf(returnchar, "%0.2f", input);
 	return returnchar;
 }
@@ -491,6 +497,6 @@ bool isAlphaNumeric(const char *text)
 			(text[charIndex] < '0' || text[charIndex] > '9'))
 			return false;
 	}
 
 	return true;
-}
\ No newline at end of file
+}
this is only seeable by gms when they gain experience as a gm... so its not really needed unless your having issues and want to debug things
Code:
@@ -46,10 +46,11 @@ bool isAlphaNumeric(const char *text);
 bool strn0cpyt(char* dest, const char* source, uint32 size);
 char *CleanMobName(const char *in, char *out);
 char *RemoveApostrophes(const char *s);
 char* strn0cpy(char* dest, const char* source, uint32 size);
 const char *ConvertArray(int input, char *returnchar);
+const char *ConvertArrayU(uint32 input, char *returnchar);
 const char *ConvertArrayF(float input, char *returnchar);
 const char *MakeLowerString(const char *source);
 int MakeAnyLenString(char** ret, const char* format, ...);
 uint32 AppendAnyLenString(char** ret, uint32* bufsize, uint32* strlen, const char* format, ...);
 uint32 hextoi(const char* num);
This is mostly a sanity check, if the add_exp float for some reason does buffer over flow, lets not allow it to buffer overflow the character and send it back to level 1
Code:
@@ -443,11 +443,11 @@ void Client::CalculateExp(uint32 in_add_exp, uint32 &add_exp, uint32 &add_aaxp,
 		if (zone->IsHotzone())
 		{
 			totalmod += RuleR(Zone, HotZoneBonus);
 		}
 
-		add_exp = uint32(float(add_exp) * totalmod * zemmod);
+		if (float(add_exp) >= 0.0f) add_exp = uint32(float(add_exp) * totalmod * zemmod);
 
 		//if XP scaling is based on the con of a monster, do that now.
 		if (RuleB(Character, UseXPConScaling))
 		{
 			if (conlevel != 0xFF && !resexp)
@@ -756,11 +756,11 @@ void Client::SetEXP(uint32 set_exp, uint32 set_aaxp, bool isrezzexp) {
 
 	if (admin>=100 && GetGM()) {
 		char val1[20]={0};
 		char val2[20]={0};
 		char val3[20]={0};
-		Message_StringID(MT_Experience, GM_GAINXP, ConvertArray(set_aaxp,val1),ConvertArray(set_exp,val2),ConvertArray(GetEXPForLevel(GetLevel()+1),val3));	//[GM] You have gained %1 AXP and %2 EXP (%3).
+		Message_StringID(MT_Experience, GM_GAINXP, ConvertArrayU(set_aaxp, val1), ConvertArrayU(set_exp, val2), ConvertArray(GetEXPForLevel(GetLevel() + 1), val3));	//[GM] You have gained %1 AXP and %2 EXP (%3).
 	}
 }
 
 void Client::SetLevel(uint8 set_level, bool command)
 {
this is the currently broken pull from the database that is normally only converted to a int, we are changing it to be converted into a long long, it being a long long will allow it to be converted to a UINT32 without any data loss
Code:
@@ -1114,11 +1114,11 @@ bool ZoneDatabase::LoadCharacterData(uint32 character_id, PlayerProfile_Struct*
 		pp->ability_number = atoi(row[r]); r++;									 // "ability_number,            "
 		pp->ability_time_minutes = atoi(row[r]); r++;							 // "ability_time_minutes,      "
 		pp->ability_time_hours = atoi(row[r]); r++;								 // "ability_time_hours,        "
 		strcpy(pp->title, row[r]); r++;											 // "title,                     "
 		strcpy(pp->suffix, row[r]); r++;										 // "suffix,                    "
-		pp->exp = atoi(row[r]); r++;											 // "exp,                       "
+		pp->exp = atoll(row[r]); r++;											 // "exp,                       "
 		pp->points = atoi(row[r]); r++;											 // "points,                    "
 		pp->mana = atoi(row[r]); r++;											 // "mana,                      "
 		pp->cur_hp = atoi(row[r]); r++;											 // "cur_hp,                    "
 		pp->STR = atoi(row[r]); r++;											 // "str,                       "
 		pp->STA = atoi(row[r]); r++;											 // "sta,                       "
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

   

All times are GMT -4. The time now is 02:13 PM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3