// Radix 1996
// Site and player data on PKs
/* Basically break down killers by who they're killing (guilds, groups...)
I'm sure Anirudh would find a better way, but then nobody would
understand it. (:
Version 1.0
*/
/* mapping killer_data
([ "name" : time first logged in,
time this last touched,
({ site1, site2, ... }),
([ "guild_ob1" : ({ number killed,
avg total xp of vics / 1000,
avg level of vics,
}),
]),
([ "group_ob1" : ({ number killed,
avg total xp of vics / 1000,
avg level of vics,
}),
]),
([ "race_group_ob1" : ({ number killed,
avg total xp of vics / 1000,
avg level of vics,
})
])
])
*/
inherit "/std/object.c";
#define SAVE "/save/"
mapping killer_data;
mapping query_killer_data() { return killer_data; }
void load_this_ob() {
restore_object(SAVE+"pk");
}
void save_this_ob() {
save_object(SAVE+"pk",1);
}
void create()
{
::create();
killer_data = ([ ]);
load_this_ob();
}
void dest_me()
{
save_this_ob();
destruct(this_object());
}
int get_start_time(string name)
{
return "/secure/start_time"->query_start_time(name);
}
string *get_orgs(object pl)
{
return ({ pl->query_guild_ob(), pl->query_group_ob(),
pl->query_race_group_ob() });
}
// Called from /obj/handlers/death.c
void update_player_killed(object victim, object killer)
{
mixed tmp, tmp_org;
string *orgs;
int i, tmp_avg;
if(!victim || !killer) return;
if(wizardp(victim) || wizardp(killer)) return;
if("/global/omiq"->flag_in_progress()) return;
load_this_ob();
tmp = killer_data[killer->query_name()];
if(!tmp) tmp = allocate(6);
if(tmp[0] != get_start_time(killer->query_name()))
{
tmp = allocate(6);
tmp[0] = get_start_time(killer->query_name());
}
tmp[1] = time();
if(!tmp[2])
tmp[2] = ({ });
if(member_array(query_ip_number(killer),tmp[2]) == -1)
tmp[2] += ({ query_ip_number(killer) });
orgs = get_orgs(victim);
if(!tmp[3]) tmp[3] = ([ ]); // guilds
if(!tmp[4]) tmp[4] = ([ ]); // groups
if(!tmp[5]) tmp[5] = ([ ]); // race_groups
for(i=0; i<sizeof(orgs); i++)
{
if(!orgs[i]) continue;
tmp_org = tmp[3+i][orgs[i]];
if(!tmp_org)
{
tmp_org = allocate(3);
tmp_org[0] = 1;
tmp_org[1] = victim->query_total_xp() /1000;
tmp_org[2] = victim->query_level();
}
else
{
tmp_avg = tmp_org[0] * tmp_org[1] + victim->query_total_xp()/1000;
tmp_org[0] = tmp_org[0] + 1;
tmp_org[1] = tmp_avg / tmp_org[0];
tmp_avg = (tmp_org[0] -1) * tmp_org[2] + victim->query_level();
tmp_org[2] = tmp_avg / tmp_org[0];
}
tmp[3+i][orgs[i]] = tmp_org;
}/* for */
killer_data[killer->query_name()] = tmp;
save_this_ob();
return;
}/* update_player_killed */
// Called from /global/creator/cmds/info.c
void info_player(string name)
{
mixed tmp, org;
string *sites, *orgs;
string ret;
int i,j;
int totk, totxp, totl;
totk = totxp = totl = 0;
if(!name) return;
ret = "PK Data for "+capitalize(name)+"\n\n";
tmp = killer_data[name];
if(!tmp)
{
ret += "No data.\n\n";
this_player()->more_string(ret);
return;
}
sites = implode(tmp[2],"\n");
ret += "Last PKed on: "+ctime(tmp[1])+"\n";
ret += sprintf("Sites: %*#-s\n",this_player()->query_cols(),sites);
for(i=0; i<3; i++)
{
switch(i)
{
case(0) :
ret += sprintf("\n%-34s%12s%12s%10s\n","Guilds","# Killed",
"Avg Tot XP","Avg Level");
break;
case(1) :
ret += sprintf("\n%-35s\n","Groups");
break;
case(2) :
ret += sprintf("\n%-35s\n","Race Groups");
break;
}
orgs = keys(tmp[3+i]);
for(j=0; j<sizeof(orgs); j++)
{
org = tmp[3+i][orgs[j]];
if(!i)
{
totk += org[0];
totxp += org[0] * org[1];
totl += org[0] * org[2];
}
ret += sprintf("%-35O%10d%10d%9d\n",orgs[j],org[0],org[1],org[2]);
}
}
if(totk)
ret += "\nTOTAL PKed: "+totk+"\nAVG TOTAL XP of Vics: "+(totxp/totk);
if(totk)
ret += ", AVG LEVEL of Vics: "+(totl/totk)+"\n";
this_player()->more_string(ret);
return;
}
int total_pk_no(string name)
{
mapping guild_data;
string *gnames;
int i, total;
if(!killer_data[name]) return 0;
total = 0;
guild_data = killer_data[name][3];
gnames = keys(guild_data);
for(i=0;i<sizeof(gnames);i++)
{
total += guild_data[gnames[i]][0];
}
return total;
}
int avg_pk_level(string name)
{
mapping guild_data;
string *gnames;
int i, levels, people;
if(!killer_data[name]) return 0;
guild_data = killer_data[name][3];
gnames = keys(guild_data);
for(i=0;i<sizeof(gnames);i++)
{
people += guild_data[gnames[i]][0];
levels += (guild_data[gnames[i]][0] * guild_data[gnames[i]][2]);
}
return (levels / people);
}
int last_pk(string name)
{
if(killer_data[name])
return killer_data[name][1];
return 0;
}