|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Support::General Support Post all topics here having to do with errors while trying to connect to an EQEMu server but not about the setup/running of the Server itself. |
05-05-2008, 10:26 PM
|
Sarnak
|
|
Join Date: Jan 2008
Posts: 62
|
|
Red Skill Caps
Searched the forums pretty thoroughly, this is the best post I could find that describes what I am experiencing..but no one replied to him. http://www.eqemulator.net/forums/sho...ght=skill+caps
So currently my server has a level cap of 60. Reading the skill_caps table, sk 1hs should skill to 260, however the client displays a red skill cap max of 225. The chat log keeps skilling up correctly past 225, but the players attack value does not increase accordingly, suggesting that anything past 225 is not taking effect. So it seems that it is more than a display issue.
Several skills are doing this. Weapon skills, casting schools, dodge, taunt, meditate, and probably more.
Server level cap is 60, and players may only achieve level 60, so nothing funny going on there.
Any idea why this is happening?
|
05-06-2008, 12:00 AM
|
|
Developer
|
|
Join Date: Aug 2006
Location: USA
Posts: 5,946
|
|
I have a post on another skills issue here:
http://www.eqemulator.net/forums/showthread.php?t=24808
Basically, my issue isn't the same as yours, but I figured they are sort of related lol. My problem is player skills not being displayed properly for characters over level 70.
I think I found somewhere in the source that sets caps for almost all skills. Though, I think they are supposed to be set in the skillcaps table now. Maybe that is what causes the skill caps in red problems. I will try to see if I can find that part of the source again maybe tomorrow and post it here if someone hasn't resolved your issue by then.
I am no coder, but most of the stuff seems simple enough to find if you read through the source. I just have no idea how to fix things yet lol.
|
05-06-2008, 02:52 AM
|
Sarnak
|
|
Join Date: Jan 2008
Posts: 62
|
|
Yeah I read yours, just related to this other guy's more. It just seems weird, I'm not doing anything out of the ordinary, so I'm not sure why the skills aren't functioning properly, seems everyone using the PEQ DB would be seeing the same thing, is this not true?
|
05-06-2008, 09:50 AM
|
Dragon
|
|
Join Date: Feb 2007
Posts: 659
|
|
I'm seeing the same thing on my server. My Ranger's archery is continually skilling up and is in the 270's now, but if I pull up the skills window it has 236 in the skills window.
|
05-06-2008, 11:55 AM
|
Banned
|
|
Join Date: Jan 2006
Location: /dev/null
Posts: 99
|
|
maybe not related but, .. i can skill up off green mobs also /ponder
|
|
|
|
05-06-2008, 02:10 PM
|
Hill Giant
|
|
Join Date: Jan 2008
Posts: 102
|
|
There is something to remember : although the EQEmu server can implement whatever it wants, the EQ client is kinda frozen. It is the Titanium client, and we do not own the source code for it. The good thing is that not many things are hard-wired in the client, but still some are.
HP/Mana/ATK/AC calculations are re-done on the client. It means the server and the client's view may differ unless the server code computes those values as the client does.
In the end, what the player sees in the EQ client for those values does not matter (let's say it's psychological). The server uses the values it computes for combat etc. Of course over time the server formulas have been tuned to match what the client thinks (based on the stuff equipped, the level, the class etc). For example (chosen at random !), you could code your server to consider that all halflings suck and have AC 0 for mitigation purposes even in full armor, and the client would still show you your great 2500 AC. You would still eat damage like a level 1 wizard, the server decides there.
From my experience the skill caps work in the same way : the client has its own view of what the skill caps are. The server can have another view, and it is this one that matters most of the time... Except in those few situations when the client has control, like when trying to pick locks, hide, equip two weapons : if your class/race/level cannot dual wield in Live EQ you will not be able to dual wield whatever the skill caps you have put in your server DB. The EQ client does not ask the server whether the character can equip two weapons, it considers it "knows" it all from the start.
Hence your "red skills". The EQ client will only abide by the skill caps that Live EQ had back then, at the time of Titanium. You can hit as if your 2-H Slash is 300 no problem but the client will show you 200 if it thinks it is your normal cap.
If someone could deny this I would be very happy, more freedom to us, but that is my experience with the Emu. A few things are hard-coded by the client, you have to live with them.
|
|
|
|
05-06-2008, 07:15 PM
|
Sarnak
|
|
Join Date: Jan 2008
Posts: 62
|
|
Excellent explanation Bulle, thank you. If that is indeed true, skill caps are working, just not displaying properly, so I can deal with that.
|
|
|
|
05-06-2008, 09:55 PM
|
|
Developer
|
|
Join Date: Aug 2006
Location: USA
Posts: 5,946
|
|
Ya, skill caps all seem to work properly server side. They just don't display right. You can use the #showstats command to see your AC going up when you defense skills over cap.
One thing I figured I would mention is that in the source, it looks like there are settings for max skills. I don't know if that is just old code that isn't used anymore since the skills table is where it is supposed to be set now. But, if you look at the zone/maxskill.h file in the source, you can see code that seems to be setting the max skills:
Code:
int16 Mob::MaxSkill_weapon(int16 skillid, int16 class_, int16 level) const{
if (skillid > HIGHEST_SKILL)
return 0;
int16 r_value = 0;
switch(skillid) {
case _1H_BLUNT:
case _2H_BLUNT:
case PIERCING:
case HAND_TO_HAND:
case _1H_SLASHING:
case _2H_SLASHING:{
switch (class_) {
// Pure melee classes
case WARRIOR: case WARRIORGM:{
r_value = 5 + (level*5);
if ( level < 51 && r_value > 200)
r_value = 200;
if ( level > 50 && r_value > 250 )
r_value = 250;
switch (skillid) {
case PIERCING:{
if ( r_value > 240 )
r_value = 240;
break;
}
case HAND_TO_HAND:{
if ( r_value > 100 )
r_value = 100;
break;
}
default: break;
}
break;
}
If this code is still used, I wonder if it might conflict with the skills table information. That is my best guess if the issue isn't client side.
|
|
|
|
05-07-2008, 02:47 AM
|
Hill Giant
|
|
Join Date: Jan 2008
Posts: 102
|
|
A quick grep showed this header file is not included in any other file anymore. Which means it is not used during compilation, ie everything in it is ignored in the current Emu. I guess it has been left there for reference purpose, or just because it has been forgotten. Or may be a dev is dearly attached to it and cannot get to the point of deleting it
|
05-07-2008, 02:53 AM
|
Hill Giant
|
|
Join Date: Jan 2008
Posts: 102
|
|
Funny thing is : client.h also declares MaxSkill_weapon but it is used nowhere either. Probably some left-over code too.
The current method used for getting the max skill is (tada !) : MaxSkill
Code:
int16 Client::MaxSkill(SkillType skillid, int16 class_, int16 level) const {
return(database.GetSkillCap(class_, skillid, level));
}
|
|
|
|
10-01-2009, 11:31 AM
|
Fire Beetle
|
|
Join Date: Nov 2006
Posts: 3
|
|
Sorry for the thread necro, but I'm getting strange results and am having trouble following this.
I found Client::MaxSkill, and it eventually inherits from the GetSkillCap function in common/database.cpp.
Code:
int8 Database::GetSkillCap(int8 skillid, int8 in_race, int8 in_class, int16 in_level)
{
int8 skill_level = 0, skill_formula = 0;
int16 base_cap = 0, skill_cap = 0, skill_cap2 = 0, skill_cap3 = 0;
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
int32 affected_rows = 0;
MYSQL_RES *result;
MYSQL_ROW row;
//Fetch the data from DB.
if (RunQuery(query, MakeAnyLenString(&query, "SELECT level, formula, pre50cap, post50cap, post60cap from skillcaps where skill = %i && class = %i", skillid, in_class), errbuf, &result, &affected_rows))
{
if (affected_rows != 0)
{
row = mysql_fetch_row(result);
skill_level = atoi(row[0]);
skill_formula = atoi(row[1]);
skill_cap = atoi(row[2]);
if (atoi(row[3]) > skill_cap)
skill_cap2 = (atoi(row[3])-skill_cap)/10; //Split the post-50 skill cap into difference between pre-50 cap and post-50 cap / 10 to determine amount of points per level.
skill_cap3 = atoi(row[4]);
}
delete[] query;
mysql_free_result(result);
}
int race_skill = GetRaceSkill(skillid,in_race);
if (race_skill > 0 && (race_skill > skill_cap || skill_cap == 0 || in_level < skill_level))
return race_skill;
if (skill_cap == 0) //Can't train this skill at all.
return 255; //Untrainable
if (in_level < skill_level)
return 254; //Untrained
//Determine pre-51 level-based cap
if (skill_formula > 0)
base_cap = in_level*skill_formula+skill_formula;
if (base_cap > skill_cap || skill_formula == 0)
base_cap = skill_cap;
//If post 50, add post 50 cap to base cap.
if (in_level > 50 && skill_cap2 > 0)
base_cap += skill_cap2*(in_level-50);
//No cap should ever go above its post50cap
if (skill_cap3 > 0 && base_cap > skill_cap3)
base_cap = skill_cap3;
//Base cap is now the max value at the person's level, return it!
return base_cap;
}
The first thing I noticed is that the number of arguments is wrong. Is this overloaded somewhere else that I didn't find?
On the assumption that this is the actual function being used, this code shouldn't work. At least in the peq database I'm running (rev974), there is no skillcaps table. I see a skill_caps table, but it has a different field structure.
I have a bot in PoK doing testing on this, and the script code fragment looks like this:
Code:
if($text=~/skills/i) {
quest::say("Very well, feel your skills increase!" );
my $count;
for ($count = 0; $count <= 74; $count++) {
if($client->CanHaveSkill($count)) {
quest::setskill($count,$client->MaxSkill($count));
}
}
}
Am I looking at the wrong implementation of this function?
|
|
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -4. The time now is 10:07 PM.
|
|
|
|
|
|
|
|
|
|
|
|
|