View Single Post
  #2  
Old 04-09-2005, 09:06 PM
mollymillions's Avatar
mollymillions
Hill Giant
 
Join Date: May 2003
Posts: 176
Default

Code:
---------------------------------
insert \zone\net.cpp -line 200 ish
---------------------------------
	LogFile->write(EQEMuLog::Status, "Loading skill caps");
	database.LoadClassSkill(false);
	database.LoadClassSkill(true);
--------------------------------
replace \zone\mob.h -line 275 ish
--------------------------------
	int8			MaxSkill(int16 skillid, int16 class_, int16 race, int16 level);
	inline int8	MaxSkill(int16 skillid) { return MaxSkill(skillid, GetClass(), GetRace(), GetLevel()); }
 
--------------------------------------
replace \zone\maxskill.h -line 2050 ish
--------------------------------------
	int8 Mob::MaxSkill(int16 skillid, int16 class_, int16 Race, int16 level) {
		return database.GetMaxSkill(skillid, class_, race, level);
	}
 
-------------------------
insert \common\Database.h
-------------------------
#include "../common/classes.h"
#include "../common/races.h"
#include "../common/skills.h"
-----------------------------------------------
insert/replace \common\Database.h -line 500 ish
-----------------------------------------------
	int16 CalcSkill(int16 classraceid, int8 skillid, int8 startlevel, int8 endlevel, int16 skillcap, int16 increment, int16 skillvalue, bool RaceMode);
	void	LoadClassSkill(bool RaceMode);
	void	DumpSkills();
	int16 GetClassSkill(int8 skillid, int8 classid, int16 level);
	int16 GetRaceSkill(int8 skillid, int16 raceid, int16 level);
	int16 GetMaxSkill(int8 skillid, int8 class_, int16 race, int16 level);
	uint16 class_skill[PLAYER_CLASS_COUNT * (HIGHEST_SKILL+1) * (LEVEL_CAP+1)];
	uint16 race_skill[Count_Array_Race * (HIGHEST_SKILL+1) * (LEVEL_CAP+1)]; 
	int16 GetTrainlevel(int16 eqrace, int16 eqclass, int8 skill_id); 
 
--------------------------------------------
replace \common\Database.cpp -line 5670 ish
--------------------------------------------
int16 Database::GetTrainlevel(int16 eqrace, int16 eqclass, int8 skill_id) {
 
	//is the skill trainable? 
	if(GetMaxSkill(skill_id, eqclass, eqrace, LEVEL_CAP)==0)		
		return LEVEL_CAP+1; // Untrainable
 
	//skill is trainable so get the level? 
	for (int level = 1;level<LEVEL_CAP;level++) {
		if (GetMaxSkill(skill_id, eqclass, eqrace, level)>0) 
			return level;		 
	}
 
	//catch
	return LEVEL_CAP+1; // Untrainable 
}
-----------------
Insert \common\Database.cpp -line 6020 ish
-----------------
void Database::LoadClassSkill(bool RaceMode) {	 
	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;
	char* sql;
 
	int8 KEY_COUNT;
	int8 skill_level = 0, skill_formula = 0;		
	int8 skillid=255, newskillid=255; 
	int8 level=1, newlevel=0;
	int16 increment = 0, newincrement = 0, offset = 5;
	int16 skillvalue=0, skillcap = 0, newskillcap = 0;
	int16 classraceid=255, newclassraceid=255;
	if (RaceMode) {
		KEY_COUNT = Count_Array_Race-1;
		sql = "SELECT race, skill, level, formula, cap FROM raceskills ORDER BY race, skill, level";
	} else {
		KEY_COUNT = PLAYER_CLASS_COUNT;
		sql = "SELECT class, skill, level, formula, cap FROM classskills ORDER BY class, skill, level"; 
	}
 
	//Default all caps to 0 (todo: use calloc() to initialize the array with zeros)
	int16 ubound = (KEY_COUNT * (HIGHEST_SKILL+1) * (LEVEL_CAP+1));
	for (int16 i=0; i<ubound;i++) {
		if (RaceMode)
			race_skill[i]=0;	
		else
			class_skill[i]=0; 
	}
 
	if (database.RunQuery(query, MakeAnyLenString(&query, sql), errbuf, &result)) {	 
		safe_delete_array(query);
 
		while((row = mysql_fetch_row(result))) {							
 
			newclassraceid = atoi(row[0]);
			newskillid = atoi(row[1]);
			newlevel = atoi(row[2]);
			newincrement = atoi(row[3]);
			newskillcap = atoi(row[4]);
 
			if (RaceMode) 
				newclassraceid = (int16)GetArrayRace(newclassraceid);
			if (newlevel > LEVEL_CAP+1)
				newlevel = LEVEL_CAP+1;
 
			if ((newclassraceid != classraceid) || (newskillid != skillid)){
 
				//finalise the previous classskill							 
				if ((classraceid <= KEY_COUNT) && (skillid <= HIGHEST_SKILL) && (level >0) && (skillcap > 0)){									 
					skillvalue = CalcSkill(classraceid, skillid, level,(int8)(LEVEL_CAP+1), skillcap, increment, skillvalue, RaceMode);
				}
 
				offset = 5; //default formula offset
				increment = 0;
				skillcap = 0;
				skillvalue = 0;
				level = 1;			 
			}
			if ((newclassraceid < KEY_COUNT+1) && (newskillid < HIGHEST_SKILL+1)) {			 
 
				if (newlevel == 0){				 
 
					//write the start skill and get the formula offset				 
					CalcSkill(newclassraceid, newskillid, newlevel,(int8)(1), newskillcap, 0, newskillcap, RaceMode);
					offset = newincrement; 
					level = 0;
				}
				else if(level > 0){ 
					if (skillvalue == 0)						
						skillvalue = offset;
 
					skillvalue = CalcSkill(newclassraceid, newskillid, level, newlevel, skillcap, newincrement, skillvalue, RaceMode);				 
				} 
				skillcap = newskillcap;
				increment = newincrement;
				level = newlevel;
				classraceid = newclassraceid;
				skillid = newskillid;
			}					 
		}
		mysql_free_result(result);
 
		//finalise the previous class/race skill								
		if ((classraceid <= KEY_COUNT) && (skillid <= HIGHEST_SKILL) && (level >0) && (skillcap > 0))							 
			skillvalue = CalcSkill(classraceid, skillid, level,(int8)(LEVEL_CAP+1), skillcap, increment, skillvalue, RaceMode);
	}
	else
		LogFile->write(EQEMuLog::Error, "Error in LoadClassSkillCaps query %s: %s", query, errbuf);
 
	safe_delete_array(query);
}
int16 Database::CalcSkill(int16 classraceid, int8 skillid, int8 level, int8 endlevel, int16 skillcap, int16 increment, int16 skillvalue, bool RaceMode) {
 
	//All paramaters must be validated before the call 
	while(level < endlevel) { 
		skillvalue = skillvalue + increment;
		if (skillvalue > skillcap)
			skillvalue=skillcap;						
 
		if (RaceMode) 
			race_skill[(classraceid-1) * ((HIGHEST_SKILL+1) * (LEVEL_CAP+1)) + skillid * (LEVEL_CAP+1) + level] = skillvalue;			 
		else
			class_skill[(classraceid-1) * ((HIGHEST_SKILL+1) * (LEVEL_CAP+1)) + skillid * (LEVEL_CAP+1) + level] = skillvalue;					 
		level++;
	}
	return skillvalue;
}
int16 Database::GetClassSkill(int8 skillid, int8 classid, int16 level)
{
	if (classid > 0 && classid <= PLAYER_CLASS_COUNT && skillid >= 0 && skillid <= HIGHEST_SKILL && level >= 0 && level <= LEVEL_CAP) 
		return class_skill[(classid-1) * ((HIGHEST_SKILL+1) * (LEVEL_CAP+1)) + skillid * (LEVEL_CAP+1) + level];		
	else
		return 0;
}
int16 Database::GetRaceSkill(int8 skillid, int16 raceid, int16 level)
{
	(int16)raceid = GetArrayRace(raceid);
	if (raceid > 0 && raceid < Count_Array_Race && skillid >= 0 && skillid <= HIGHEST_SKILL && level >= 0 && level <= LEVEL_CAP) 
		return race_skill[(raceid-1) * ((HIGHEST_SKILL+1) * (LEVEL_CAP+1)) + skillid * (LEVEL_CAP+1) + level];
	else
		return 0;
}
int16 Database::GetMaxSkill(int8 skillid, int8 class_, int16 race, int16 level) {
 
	//Handle GM classes 
	if (class_>19)
		class_ = class_-19;
 
	int16 ClassSkill = database.GetClassSkill(skillid,class_,level);
	int16 RaceSkill = database.GetRaceSkill(skillid,race,level);	
 
	//Get the greater of the race or class cap 
	if (RaceSkill > ClassSkill) {
		if (RaceSkill > 252)
			RaceSkill = 252;
		return RaceSkill; 
	} else {
		if (ClassSkill > 252)
			ClassSkill = 252;
		return ClassSkill;
	}
} 
----------------------------
replace \zone\doors.cpp -line 180 ish
----------------------------
			else
			{ // door is locked, either no key works for it or player doesn't have the key - try to pick it
				if(sender->MaxSkill(35, sender->GetClass(), sender->GetRace(), sender->GetLevel())>0 && GetLockpick()!=0)
				{ // client has the lock pick skill and this lock can be picked

Last edited by mollymillions; 04-10-2005 at 10:01 AM..
Reply With Quote