PDA

View Full Version : PvP stats


Magoth78
11-12-2004, 11:27 PM
Hello,

I'm sorry to bother you with the PvP but is it possible to add some stats when a Player kills an other Player?

How I would see that:
- New table in the DB called: PvPstats
- Fields: Pwinner (the killer's name) Pwinguild (the killer's guild) Pwinlevel (level of the winner) Plooser (the looser) Ploosguild (the looser's guild) Plooslvl(level of the looser) Nkills (number of kills).

-> When player1(guild: Goodies) kills player2(guild: Shorties), it adds an entrie in the PvPstats table:
- players1|goodies|51|players2|shorties|51|1

This way, it would become possible to make some pvp stats :)

Thx,
Mag

Muuss
11-14-2004, 10:04 PM
This kind of implements would be nice to add for any PvP server. I m not sure of how much work it requires, but it seems than adding a simple query adding a row in a table when a player dies from another one might not be that hard. Exploiting that table from an external website, to make PvP rosters will be really valuable !
Tho, i would suggest a different table from Mag's one, instead of cumulating kills on the same record, i would just add 1 row per kill, with the date, so it could allow to make periodic stats instead of global ones!

Magoth78
08-19-2005, 12:02 AM
Hello there,

I'm sorry to bump my old post but I would like to know if it would be possible to add this feature?

Thx by advance,
Mag

fathernitwit
08-19-2005, 02:18 AM
anything is possible, but its not gunna get written by the core developers right now, we have a lot of higher priorities.

Magoth78
08-19-2005, 05:59 PM
Ok fnw, no probs.
I'll just wait then.

Mag

Magoth78
09-15-2005, 12:15 PM
I've learned c++ and coded it, so I don't need it anymore.

It's working well even if the code might be crappy :D

If anyone is interested by the code changes, I can give them np.

Mag

Dr Zauis
09-15-2005, 12:27 PM
"I've learned c++ and coded it, so I don't need it anymore."

Well Hello Albert Einstein! That was quick learning!

vRandom
09-15-2005, 12:28 PM
I would be interested in seeing the code. I'm curious if maybe it could be modified to count all kills a player does that way we could make a site similar to eq2's player profiling... number kills each player did, and what not...

just an idea...

vRandom

Magoth78
09-15-2005, 08:29 PM
"I've learned c++ and coded it, so I don't need it anymore."

Well Hello Albert Einstein! That was quick learning!


Quick yeah, but i dunno about how good is the code :D

Vrandom, once a player kills an other player , it add an entrie in the pvpstats table, in that way:
killID|Killername|killerlevel|killerguild|Looserna me|Looserlevel|Looserguild|PvPpoints|Timestamp

So you can see (using php by example):
- Daily, Weekly, Monthly: who is the best killer, which's the best guild, how many kills does have a player, who is the best target of a player, etc...
Also pvppoints are calculated depending of the levels and it also works for group kills.


Once I'll get to home, I'll show the code i've made.

Mag

Magoth78
09-15-2005, 11:06 PM
Last line of database.cpp

bool Database::UpdatePVPPoints(const char* killername, int klevel, int kguildid, const char* loosername, int llevel, int lguildid, int pvppoints)
{
// debug
printf("Starting the update...\n");
// end debug
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
int32 affected_rows = 0;
//printf("Variables ok...\n");
if (!RunQuery(query, MakeAnyLenString(&query,
"INSERT INTO pvpstats (killername,klevel,kguildid,loosername,llevel,lgui ldid,pvppoints) VALUES ('%s','%i','%i','%s','%i','%i','%i')",killername,klevel,kguildid,loosername,llevel,lgui ldid,pvppoints),
errbuf, 0, &affected_rows)); {
//printf("Error Updating the points......\n");
safe_delete_array(query);
return false;
}
//printf("UpdatePVPPoints: %s,%i,%i,%s,%i,%i,%i\n",killername,klevel,kguildid,loosername,llevel,lgui ldid,pvppoints);
safe_delete_array(query);
return true;
}



add this in database.h:

bool UpdatePVPPoints(const char* killername, int klevel, int kguildid, const char* loosername, int llevel, int lguildid, int pvppoints);


and in attack.cpp just after the lines:

// if(!IsLD())//Todo: make it so an LDed client leaves corpse if its enabled
// MakeCorpse(exploss);


add this:

if(GetGM() || !IsBecomeNPC() && other != NULL && other->IsClient())
// added GetGM() for debug purposes
{
const char* killername = other->GetName();
int klevel = other->GetLevel();
int kguildid = other->CastToClient()->GuildDBID();
const char* loosername = this->GetName();
int llevel = this->GetLevel();
int lguildid = this->CastToClient()->GuildDBID();
int pvppoints;
int diflevel = klevel - llevel;

if(diflevel >= 10)
pvppoints = 10;

if(diflevel < 10 && diflevel >= 7)
pvppoints = 25;

if(diflevel < 7 && diflevel >= 4)
pvppoints = 40;

if(diflevel < 4 && diflevel >= 1)
pvppoints = 50;

if(diflevel == 0)
pvppoints = 60;

if(diflevel <= -1 && diflevel > -4 )
pvppoints = 80;

if(diflevel <= -4 && diflevel > -7)
pvppoints = 100;

if(diflevel < -7)
pvppoints = 120;

if(kguildid == NULL){
kguildid = 0;
}
if(lguildid == NULL){
lguildid = 0;
}
//// let's calcul points of the group

if(other->CastToClient()->IsGrouped()) {
Group* group = entity_list.GetGroupByClient(other->CastToClient());
for(int i=0;i<MAX_GROUP_MEMBERS;i++) {
if(group->members[i] != NULL) {
Client* c = group->members[i]->CastToClient();
pvppoints = llevel / 4;
c->Message(0,"You have gained %i points in this fight!",pvppoints);
database.UpdatePVPPoints(c->GetName(),c->GetLevel(),c->GuildDBID(),loosername,llevel,lguildid,pvppoints);
}
}
}

else{
printf("Variables: killername = %s, klevel = %i, kguildid = %i, loosername = %s, llevel = %i, lguildid = %i, pvppoints = %i\n",
killername,klevel,kguildid,loosername,llevel,lguil did,pvppoints);

database.UpdatePVPPoints(killername,klevel,kguildi d,loosername,llevel,lguildid,pvppoints);
//LogFile->write(EQEMuLog::Error, "%i,%i,%i,%s,%i,%i,%i"), killerid,klevel,kguildid,looserid,llevel,lguildid, pvppoints;
other->CastToClient()->Message(0,"You have gained %i points in this fight!",pvppoints);
printf("PVP: %s has been killed by %s\n",loosername,killername);
//this->CastToClient()->Message(0,"You have been killed by an enemy. Xp lost!");
}



}

yes I know that the code is ugly, but my skills in c++ are still low :D


You will can notice that all pvppoints are previously declared. (it's what i wanted to do on empire). You can change them, or add a formula for the points check.

You will have to create a new table in your db called "pvpstats" with the columns: id(int(11)auto_increment), killername(varchar(64)),klevel(int(11)),kguilid(in t(11)),loosername(varchar(64)),llevel(int(11)),lgu ildid(int(11)),pvppoints(int(11)),date(timestamp(C URRENT_TIMESTAMP on update CURRENT_TIMESTAMP)).


Mag

vRandom
09-16-2005, 04:00 AM
Last line of database.cpp

yes I know that the code is ugly, but my skills in c++ are still low :D

Mag

np, my c++ skills are, humm, below that low you used, i just have a nack in figuring things out

Thanks for sharing, I'll see what I come up with later, got called to the office :( I hate the office....

Good job on the code Mag.
vRandom

cavedude
09-16-2005, 05:31 AM
OT but I bet my office is worse than yours :P One of my users somehow removed the root user from their Linux server. I told them not use root. I told them they would break it.... LOL

vRandom
09-16-2005, 05:43 AM
OT but I bet my office is worse than yours :P One of my users somehow removed the root user from their Linux server. I told them not use root. I told them they would break it.... LOL

LMAO, I totaly understand that one... my user did rm -fr in the root dir because it had to much stuff in it..... /sigh

vRandom