2014-08-04 10:55:54 +00:00
|
|
|
// vim: set ts=4 sw=4 tw=99 noet:
|
|
|
|
//
|
|
|
|
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
|
|
|
|
// Copyright (C) The AMX Mod X Development Team.
|
|
|
|
// Copyright (C) 2004 Lukasz Wlasinski.
|
|
|
|
//
|
|
|
|
// This software is licensed under the GNU General Public License, version 3 or higher.
|
|
|
|
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
|
|
|
|
// https://alliedmods.net/amxmodx-license
|
|
|
|
|
|
|
|
//
|
|
|
|
// TSX Module
|
|
|
|
//
|
2004-06-28 13:57:10 +00:00
|
|
|
|
|
|
|
#include "CMisc.h"
|
|
|
|
#include "tsx.h"
|
|
|
|
|
|
|
|
// *****************************************************
|
|
|
|
// class CPlayer
|
|
|
|
// *****************************************************
|
|
|
|
|
2006-02-26 08:11:25 +00:00
|
|
|
void CPlayer::Disconnect()
|
|
|
|
{
|
2004-06-28 13:57:10 +00:00
|
|
|
if ( ignoreBots(pEdict) || !isModuleActive() ) // ignore if he is bot and bots rank is disabled or module is paused
|
|
|
|
return;
|
|
|
|
rank->updatePosition( &life );
|
|
|
|
ingame = false;
|
|
|
|
}
|
2006-02-26 08:11:25 +00:00
|
|
|
void CPlayer::PutInServer()
|
|
|
|
{
|
2004-06-28 13:57:10 +00:00
|
|
|
restartStats();
|
|
|
|
ingame = true;
|
|
|
|
|
|
|
|
killingSpree = 0;
|
|
|
|
items = 0;
|
|
|
|
lastFrag = 0;
|
|
|
|
lastKill = 0.0;
|
|
|
|
is_specialist = 0;
|
|
|
|
|
|
|
|
//debug
|
|
|
|
frags = 0;
|
|
|
|
|
|
|
|
if ( ignoreBots(pEdict) )
|
|
|
|
return;
|
|
|
|
|
|
|
|
const char* unique;
|
|
|
|
const char* name = STRING(pEdict->v.netname);
|
2007-06-22 15:35:46 +00:00
|
|
|
bool isip = false;
|
2004-06-28 13:57:10 +00:00
|
|
|
switch((int)tsstats_rank->value) {
|
|
|
|
case 1:
|
|
|
|
if ( (unique = GETPLAYERAUTHID(pEdict)) == 0 )
|
|
|
|
unique = name; // failed to get authid
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
unique = ip;
|
2007-06-22 15:35:46 +00:00
|
|
|
isip = true;
|
2004-06-28 13:57:10 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
unique = name;
|
|
|
|
}
|
2007-06-22 15:35:46 +00:00
|
|
|
if ( ( rank = g_rank.findEntryInRank( unique , name , isip) ) == 0 )
|
2004-06-28 13:57:10 +00:00
|
|
|
ingame = false;
|
|
|
|
}
|
2006-02-26 08:11:25 +00:00
|
|
|
void CPlayer::Connect(const char* ippp)
|
|
|
|
{
|
2004-06-28 13:57:10 +00:00
|
|
|
strcpy(ip,ippp);
|
2007-06-22 15:35:46 +00:00
|
|
|
// Strip the port from the ip
|
|
|
|
for (size_t i = 0; i < sizeof(ip); i++)
|
|
|
|
{
|
|
|
|
if (ip[i] == ':')
|
|
|
|
{
|
|
|
|
ip[i] = '\0';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-06-28 13:57:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CPlayer::restartStats(bool all)
|
|
|
|
{
|
|
|
|
if ( all ) memset(weapons,0,sizeof(weapons));
|
|
|
|
memset(weaponsRnd,0,sizeof(weaponsRnd)); //DEC-Weapon (Round) stats
|
|
|
|
memset(attackers,0,sizeof(attackers));
|
|
|
|
memset(victims,0,sizeof(victims));
|
2019-10-29 20:48:31 +00:00
|
|
|
life = {};
|
2004-06-28 13:57:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CPlayer::Init( int pi, edict_t* pe )
|
|
|
|
{
|
|
|
|
pEdict = pe;
|
|
|
|
index = pi;
|
|
|
|
current = 0;
|
|
|
|
clearStats = 0.0f;
|
|
|
|
ingame = false;
|
|
|
|
}
|
|
|
|
|
2006-02-26 08:11:25 +00:00
|
|
|
void CPlayer::saveKill(CPlayer* pVictim, int wweapon, int hhs, int ttk)
|
|
|
|
{
|
2004-06-28 13:57:10 +00:00
|
|
|
|
|
|
|
if ( ignoreBots(pEdict,pVictim->pEdict) )
|
|
|
|
return;
|
|
|
|
|
|
|
|
pVictim->attackers[index].name = (char*)weaponData[wweapon].name;
|
|
|
|
pVictim->attackers[index].kills++;
|
|
|
|
pVictim->attackers[index].hs += hhs;
|
|
|
|
pVictim->attackers[index].tks += ttk;
|
|
|
|
pVictim->attackers[0].kills++;
|
|
|
|
pVictim->attackers[0].hs += hhs;
|
|
|
|
pVictim->attackers[0].tks += ttk;
|
|
|
|
pVictim->weapons[pVictim->current].deaths++;
|
|
|
|
pVictim->weapons[0].deaths++;
|
|
|
|
pVictim->life.deaths++;
|
|
|
|
|
|
|
|
|
|
|
|
pVictim->weaponsRnd[pVictim->current].deaths++; // DEC-Weapon (round) stats
|
|
|
|
pVictim->weaponsRnd[0].deaths++; // DEC-Weapon (round) stats
|
|
|
|
|
|
|
|
int vi = pVictim->index;
|
|
|
|
victims[vi].name = (char*)weaponData[wweapon].name;
|
|
|
|
victims[vi].deaths++;
|
|
|
|
victims[vi].hs += hhs;
|
|
|
|
victims[vi].tks += ttk;
|
|
|
|
victims[0].deaths++;
|
|
|
|
victims[0].hs += hhs;
|
|
|
|
victims[0].tks += ttk;
|
|
|
|
|
|
|
|
|
|
|
|
weaponsRnd[wweapon].kills++; // DEC-Weapon (round) stats
|
|
|
|
weaponsRnd[wweapon].hs += hhs; // DEC-Weapon (round) stats
|
|
|
|
weaponsRnd[wweapon].tks += ttk; // DEC-Weapon (round) stats
|
|
|
|
weaponsRnd[0].kills++; // DEC-Weapon (round) stats
|
|
|
|
weaponsRnd[0].hs += hhs; // DEC-Weapon (round) stats
|
|
|
|
weaponsRnd[0].tks += ttk; // DEC-Weapon (round) stats
|
|
|
|
|
|
|
|
weapons[wweapon].kills++;
|
|
|
|
weapons[wweapon].hs += hhs;
|
|
|
|
weapons[wweapon].tks += ttk;
|
|
|
|
weapons[0].kills++;
|
|
|
|
weapons[0].hs += hhs;
|
|
|
|
weapons[0].tks += ttk;
|
|
|
|
life.kills++;
|
|
|
|
life.hs += hhs;
|
|
|
|
life.tks += ttk;
|
|
|
|
}
|
|
|
|
|
2006-02-26 08:11:25 +00:00
|
|
|
void CPlayer::saveHit(CPlayer* pVictim, int wweapon, int ddamage, int bbody)
|
|
|
|
{
|
2004-06-28 13:57:10 +00:00
|
|
|
|
|
|
|
if ( ignoreBots(pEdict,pVictim->pEdict) )
|
|
|
|
return;
|
|
|
|
|
|
|
|
pVictim->attackers[index].hits++;
|
|
|
|
pVictim->attackers[index].damage += ddamage;
|
|
|
|
pVictim->attackers[index].bodyHits[bbody]++;
|
|
|
|
pVictim->attackers[0].hits++;
|
|
|
|
pVictim->attackers[0].damage += ddamage;
|
|
|
|
pVictim->attackers[0].bodyHits[bbody]++;
|
|
|
|
|
|
|
|
int vi = pVictim->index;
|
|
|
|
victims[vi].hits++;
|
|
|
|
victims[vi].damage += ddamage;
|
|
|
|
victims[vi].bodyHits[bbody]++;
|
|
|
|
victims[0].hits++;
|
|
|
|
victims[0].damage += ddamage;
|
|
|
|
victims[0].bodyHits[bbody]++;
|
|
|
|
|
|
|
|
weaponsRnd[wweapon].hits++; // DEC-Weapon (round) stats
|
|
|
|
weaponsRnd[wweapon].damage += ddamage; // DEC-Weapon (round) stats
|
|
|
|
weaponsRnd[wweapon].bodyHits[bbody]++; // DEC-Weapon (round) stats
|
|
|
|
weaponsRnd[0].hits++; // DEC-Weapon (round) stats
|
|
|
|
weaponsRnd[0].damage += ddamage; // DEC-Weapon (round) stats
|
|
|
|
weaponsRnd[0].bodyHits[bbody]++; // DEC-Weapon (round) stats
|
|
|
|
|
|
|
|
weapons[wweapon].hits++;
|
|
|
|
weapons[wweapon].damage += ddamage;
|
|
|
|
weapons[wweapon].bodyHits[bbody]++;
|
|
|
|
weapons[0].hits++;
|
|
|
|
weapons[0].damage += ddamage;
|
|
|
|
weapons[0].bodyHits[bbody]++;
|
|
|
|
|
|
|
|
life.hits++;
|
|
|
|
life.damage += ddamage;
|
|
|
|
life.bodyHits[bbody]++;
|
|
|
|
}
|
|
|
|
|
2006-02-26 08:11:25 +00:00
|
|
|
void CPlayer::saveShot(int weapon)
|
|
|
|
{
|
2004-06-28 13:57:10 +00:00
|
|
|
|
|
|
|
if ( ignoreBots(pEdict) )
|
|
|
|
return;
|
|
|
|
|
|
|
|
victims[0].shots++;
|
|
|
|
weapons[weapon].shots++;
|
|
|
|
weapons[0].shots++;
|
|
|
|
life.shots++;
|
|
|
|
weaponsRnd[weapon].shots++; // DEC-Weapon (round) stats
|
|
|
|
weaponsRnd[0].shots++; // DEC-Weapon (round) stats
|
|
|
|
}
|
|
|
|
|
2006-02-26 08:11:25 +00:00
|
|
|
void CPlayer::SetOffsetF(int offs, float val)
|
|
|
|
{
|
|
|
|
*((float *)pEdict->pvPrivateData + offs) = val;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CPlayer::SetOffset(int offs, int val)
|
|
|
|
{
|
|
|
|
*((int *)pEdict->pvPrivateData + offs) = val;
|
|
|
|
}
|
|
|
|
|
|
|
|
float CPlayer::GetOffsetF(int offs)
|
|
|
|
{
|
|
|
|
return *((float *)pEdict->pvPrivateData + offs);
|
|
|
|
}
|
|
|
|
|
|
|
|
int CPlayer::GetOffset(int offs)
|
|
|
|
{
|
|
|
|
return *((int *)pEdict->pvPrivateData + offs);
|
|
|
|
}
|
|
|
|
|
|
|
|
float CPlayer::GetTime()
|
|
|
|
{
|
|
|
|
return GetOffsetF(TSX_TIME_OFFSET);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CPlayer::SetMoney(int money)
|
|
|
|
{
|
|
|
|
SetOffset(TSX_MONEY_OFFSET, money);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CPlayer::SetSlots(int slots)
|
|
|
|
{
|
|
|
|
SetOffset(TSX_SLOTS_OFFSET, slots);
|
|
|
|
}
|
|
|
|
|
|
|
|
int CPlayer::GetSlots()
|
|
|
|
{
|
|
|
|
return GetOffset(TSX_SLOTS_OFFSET);
|
|
|
|
}
|
|
|
|
|
|
|
|
|