PDA

View Full Version : Quest Function get average level ind/group/raid


Rocker8956
09-30-2008, 07:53 PM
Below is some code to add a quest function that gets the average level of a character, group, or raid.

I tested it on my server and everything worked.

Anyhow here is the code. Let me know how it works. Hopefully I did not miss anything.

Zone\database.cpp
Append to the end
int Database::getCharLevel(int charID)
{
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
int level = 0;

if (RunQuery(query, MakeAnyLenString(&query, "SELECT level FROM character_ WHERE id=%i", charID), errbuf, &result))
{
if (mysql_num_rows(result) == 1)
{
row = mysql_fetch_row(result);
level=atoi(row[0]);
safe_delete_array(query);
mysql_free_result(result);
return level;
}
else
{
cerr << "Error in getCharLevel query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
mysql_free_result(result);
return level; // This would return zero
}
}
else
{
cerr << "Error in getCharLevel query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
return level; // This would return zero
}
}

int Database::getRaidAvgLvl(int charID)
{
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
int raidid = 0;
double levelHolder = 0;

// Find out what raid the character is in
if (RunQuery(query, MakeAnyLenString(&query, "SELECT raidid from raid_members where charid=%i", charID), errbuf, &result))
{
if (mysql_num_rows(result) == 1)
{
row = mysql_fetch_row(result);
raidid=atoi(row[0]);
mysql_free_result(result);
safe_delete_array(query);
// Select the character IDs of the characters in the raid
if (RunQuery(query, MakeAnyLenString(&query, "SELECT charid from raid_members where raidid=%i", raidid), errbuf, &result))
{
int i = 0; // track number of characters
while((row = mysql_fetch_row(result)))
{
levelHolder = levelHolder + getCharLevel(atoi(row[0]));
i++;
}
levelHolder = ((levelHolder/i)+.5); // total levels divided by num of characters
safe_delete_array(query);
mysql_free_result(result);
return (int(levelHolder));
}
else
{
safe_delete_array(query);
mysql_free_result(result);
return 0;
}
}
else
{
safe_delete_array(query);
mysql_free_result(result);
return 0;
}
}
else
{
printf("Unable to get raid id: %s\n",errbuf);
mysql_free_result(result);
safe_delete_array(query);
return 0;
}
}
int Database::getGroupAvgLvl(int charID)
{
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
int groupid = 0;
double levelHolder = 0;

// Find out what group the character is in
if (RunQuery(query, MakeAnyLenString(&query, "SELECT groupid from group_id where charid=%i", charID), errbuf, &result))
{
if (mysql_num_rows(result) == 1)
{
row = mysql_fetch_row(result);
groupid=atoi(row[0]);
mysql_free_result(result);
safe_delete_array(query);
// Select the character IDs of the characters in the group
if (RunQuery(query, MakeAnyLenString(&query, "SELECT charid FROM group_id WHERE groupid=%i", groupid), errbuf, &result))
{
int i = 0; // track number of characters
while((row = mysql_fetch_row(result)))
{
levelHolder = levelHolder + getCharLevel(atoi(row[0]));
i++;
}
levelHolder = ((levelHolder/i)+.5); // total levels divided by num of characters

safe_delete_array(query);
mysql_free_result(result);
return (int(levelHolder));
}
else
{
safe_delete_array(query);
mysql_free_result(result);
return 0;
}
}
else
{
safe_delete_array(query);
mysql_free_result(result);
return 0;
}
}
else
{
printf("Unable to get group id: %s\n",errbuf);
mysql_free_result(result);
safe_delete_array(query);
return 0;
}
}


zone\database.h
Insert around line 202

int getCharLevel(int charID);
int getRaidAvgLvl(int charID);
int getGroupAvgLvl(int charID);


zone\questmgr.cpp
Append to the end

int QuestManager::getlevel(int charID, int type)
{
if (type == 0)
{
return (database.getCharLevel(charID));
}
else if(type == 1)
{
return (database.getGroupAvgLvl(charID));

}
else if(type == 2)
{
return database.getRaidAvgLvl(charID);
}
else if(type == 3)
{
if(database.getRaidAvgLvl(charID) > 0)
{
return (database.getRaidAvgLvl(charID));
}
else if(database.getGroupAvgLvl(charID) > 0)
{
return (database.getGroupAvgLvl(charID));
}
else
return (database.getCharLevel(charID));
}
else
return 0;
}


zone\questmgr.h
Insert around line 149

int getlevel(int charID, int type);


zone\perlparser.cpp
Insert at the end around line 1884

newXS(strcpy(buf, "getlevel"), XS__getlevel, file);


zone\perlparser.cpp
Insert around line 1758

XS(XS__getlevel);
XS(XS__getlevel)
{
dXSARGS;
if (items != 2)
Perl_croak(aTHX_ "Usage: getlevel(charid, type)");

int RETVAL;
dXSTARG;

int charid = (int)SvIV(ST(0));
int type = (int)SvIV(ST(1));

RETVAL = quest_manager.getlevel(charid, type);
XSprePUSH; PUSHu((IV)RETVAL);

XSRETURN(1);
}


Format for quest function - quest::getlevel(charid, type)
Types
0 = self
1 = group - if in group returns average level of group (if character is not in group this will return zero)
2 = raid - if in raid returns average level of raid (if character in not in raid this will return zero)
3 = If in raid then raid, if not in raid then group, if not in group then self


Simple quest script to show how it works

sub EVENT_SAY {
$charid = 0;
$charid = $client->CharacterID();
$level = 0;
if($text=~/Hail/i){
quest::say("Greetings traveler, Do you want to know you average level?"); }
if($text=~/yes/i){
quest::say("Oh wonderful! Do you want to know the average level of yourself, group, or raid?"); }
if($text=~/self/i){
$level = quest::getlevel($charid, 0);
quest::say("Your level is $level.");}
if($text=~/group/i){
$level = quest::getlevel($charid, 1);
quest::say("Your group average level is $level."); }
if($text=~/raid/i){
$level = quest::getlevel($charid, 2);
quest::say("Your raid average level is $level."); }
if($text=~/guess/i){
$level = quest::getlevel($charid, 3);
quest::say("I guess your level is $level."); }
}

Rocker8956
10-12-2008, 02:37 PM
I rewrote the getlevel quest command so it does less accessing of the database.
This also changes the syntax to
quest::getlevel(type)

zone\groups.cpp
Add at end
uint16 Group::GetAvgLevel()
{
double levelHolder = 0;
uint8 i = 0;
uint8 numMem = 0;
while(i < MAX_GROUP_MEMBERS)
{
if (members[i])
{
numMem++;
levelHolder = levelHolder + (members[i]->GetLevel());
}
i++;
}
levelHolder = ((levelHolder/numMem)+.5); // total levels divided by num of characters
return (uint16(levelHolder));
}

zone\groups.h
Around line 94 Insert
uint16 GetAvgLevel();

zone\raids.cpp
Add to end
uint16 Raid::GetAvgLevel()
{
double levelHolder = 0;
uint8 i = 0;
uint8 numMem = 0;
while(i < MAX_RAID_MEMBERS)
{
if(strlen(members[i].membername))
{
levelHolder = levelHolder + members[i].level;
numMem++;
}
i++;
}
levelHolder = ((levelHolder/(numMem))+.5); // total levels divided by num of characters
return (uint16(levelHolder));
}

zone\raids.h
Near line 126 Insert
uint16 GetAvgLevel();

zone\perlparser.cpp
Find XS(XS__getlevel); replace function with
XS(XS__getlevel);
XS(XS__getlevel)
{
dXSARGS;
if (items != 1)
Perl_croak(aTHX_ "Usage: getlevel(type)");

int RETVAL;
dXSTARG;

int type = (int)SvIV(ST(0));

RETVAL = quest_manager.getlevel(type);
XSprePUSH; PUSHu((IV)RETVAL);

XSRETURN(1);
}

zone\questmgr.cpp
Find QuestManager::getlevel replace entire function with
int QuestManager::getlevel(uint8 type)
{
if (type == 0)
{
return (initiator->GetLevel());
}
else if(type == 1)
{
Group *g = entity_list.GetGroupByClient(initiator);
if (g != NULL)
return (g->GetAvgLevel());
else
return 0;
}
else if(type == 2)
{
Raid *r = entity_list.GetRaidByClient(initiator);
if (r != NULL)
return (r->GetAvgLevel());
else
return 0;
}
else if(type == 3)
{
Raid *r = entity_list.GetRaidByClient(initiator);
if(r != NULL)
{
return (r->GetAvgLevel());
}
Group *g = entity_list.GetGroupByClient(initiator);
if(g != NULL)
{
return (g->GetAvgLevel());
}
else
return (initiator->GetLevel());
}
else
return 0;
}

zone\questmgr.h
Find int getlevel replace it with
int getlevel(uint8 type);

common\database.cpp
The following can be removed
int Database::getCharLevel(int charID)
int Database::getRaidAvgLvl(int charID)
int Database::getGroupAvgLvl(int charID)

common\database.h
These can be removed
int getCharLevel(int charID);
int getRaidAvgLvl(int charID);
int getGroupAvgLvl(int charID);