EQEmulator Forums

EQEmulator Forums (https://www.eqemulator.org/forums/index.php)
-   Development::Server Code Submissions (https://www.eqemulator.org/forums/forumdisplay.php?f=669)
-   -   Quest Function get average level ind/group/raid (https://www.eqemulator.org/forums/showthread.php?t=26385)

Rocker8956 09-30-2008 07:53 PM

Quest Function get average level ind/group/raid
 
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
Code:

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
Code:

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

zone\questmgr.cpp
Append to the end
Code:

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
Code:

int getlevel(int charID, int type);
zone\perlparser.cpp
Insert at the end around line 1884
Code:

newXS(strcpy(buf, "getlevel"), XS__getlevel, file);
zone\perlparser.cpp
Insert around line 1758
Code:

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
Code:

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
Code:

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
Code:

uint16        GetAvgLevel();
zone\raids.cpp
Add to end
Code:

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
Code:

uint16        GetAvgLevel();
zone\perlparser.cpp
Find XS(XS__getlevel); replace function with
Code:

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
Code:

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
Code:

int getlevel(uint8 type);
common\database.cpp
The following can be removed
Code:

int Database::getCharLevel(int charID)
int Database::getRaidAvgLvl(int charID)
int Database::getGroupAvgLvl(int charID)

common\database.h
These can be removed
Code:

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



All times are GMT -4. The time now is 08:37 PM.

Powered by vBulletin®, Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.