mirror of
https://github.com/alliedmodders/amxmodx.git
synced 2024-12-27 23:35:36 +03:00
294 lines
4.8 KiB
C++
Executable File
294 lines
4.8 KiB
C++
Executable File
// 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.
|
|
//
|
|
// 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
|
|
|
|
#include "amxmodx.h"
|
|
#include "newmenus.h"
|
|
// *****************************************************
|
|
// class CPlayer
|
|
// *****************************************************
|
|
|
|
void CPlayer::Init(edict_t* e, int i)
|
|
{
|
|
index = i;
|
|
pEdict = e;
|
|
initialized = false;
|
|
ingame = false;
|
|
authorized = false;
|
|
disconnecting = false;
|
|
teamIdsInitialized = false;
|
|
|
|
current = 0;
|
|
teamId = -1;
|
|
deaths = 0;
|
|
aiming = 0;
|
|
menu = 0;
|
|
keys = 0;
|
|
menuexpire = 0.0;
|
|
newmenu = -1;
|
|
|
|
death_weapon = nullptr;
|
|
name = nullptr;
|
|
ip = nullptr;
|
|
team = nullptr;
|
|
}
|
|
|
|
void CPlayer::Disconnect()
|
|
{
|
|
ingame = false;
|
|
initialized = false;
|
|
authorized = false;
|
|
disconnecting = false;
|
|
teamIdsInitialized = false;
|
|
|
|
if (Menu *pMenu = get_menu_by_id(newmenu))
|
|
pMenu->Close(index);
|
|
|
|
List<ClientCvarQuery_Info *>::iterator iter, end=queries.end();
|
|
for (iter=queries.begin(); iter!=end; iter++)
|
|
{
|
|
unregisterSPForward((*iter)->resultFwd);
|
|
delete [] (*iter)->params;
|
|
delete (*iter);
|
|
}
|
|
queries.clear();
|
|
|
|
menu = 0;
|
|
newmenu = -1;
|
|
}
|
|
|
|
void CPlayer::PutInServer()
|
|
{
|
|
playtime = gpGlobals->time;
|
|
ingame = true;
|
|
}
|
|
|
|
int CPlayer::NextHUDChannel()
|
|
{
|
|
int ilow = 1;
|
|
|
|
for (int i=ilow+1; i<=4; i++)
|
|
{
|
|
if (channels[i] < channels[ilow])
|
|
ilow = i;
|
|
}
|
|
|
|
return ilow;
|
|
}
|
|
|
|
bool CPlayer::Connect(const char* connectname, const char* ipaddress)
|
|
{
|
|
name = connectname;
|
|
ip = ipaddress;
|
|
time = gpGlobals->time;
|
|
death_killer = 0;
|
|
menu = 0;
|
|
newmenu = -1;
|
|
|
|
memset(flags, 0, sizeof(flags));
|
|
memset(weapons, 0, sizeof(weapons));
|
|
|
|
initialized = true;
|
|
authorized = false;
|
|
|
|
for (int i=0; i<=4; i++)
|
|
{
|
|
channels[i] = 0.0f;
|
|
hudmap[i] = 0;
|
|
}
|
|
|
|
List<ClientCvarQuery_Info *>::iterator iter, end=queries.end();
|
|
for (iter=queries.begin(); iter!=end; iter++)
|
|
{
|
|
unregisterSPForward((*iter)->resultFwd);
|
|
delete [] (*iter)->params;
|
|
delete (*iter);
|
|
}
|
|
queries.clear();
|
|
|
|
const char* authid = GETPLAYERAUTHID(pEdict);
|
|
|
|
if ((authid == 0) || (*authid == 0) || (strcmp(authid, "STEAM_ID_PENDING") == 0))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
// *****************************************************
|
|
// class Grenades
|
|
// *****************************************************
|
|
|
|
void Grenades::put(edict_t* grenade, float time, int type, CPlayer* player)
|
|
{
|
|
Obj* a = new Obj;
|
|
if (a == 0) return;
|
|
a->player = player;
|
|
a->grenade = grenade;
|
|
a->time = gpGlobals->time + time;
|
|
a->type = type;
|
|
a->next = head;
|
|
head = a;
|
|
}
|
|
|
|
bool Grenades::find(edict_t* enemy, CPlayer** p, int& type)
|
|
{
|
|
bool found = false;
|
|
Obj** a = &head;
|
|
|
|
while (*a)
|
|
{
|
|
if ((*a)->time > gpGlobals->time)
|
|
{
|
|
if ((*a)->grenade == enemy)
|
|
{
|
|
found = true;
|
|
(*p) = (*a)->player;
|
|
type = (*a)->type;
|
|
}
|
|
} else {
|
|
Obj* b = (*a)->next;
|
|
delete *a;
|
|
*a = b;
|
|
continue;
|
|
}
|
|
a = &(*a)->next;
|
|
}
|
|
|
|
return found;
|
|
}
|
|
|
|
void Grenades::clear()
|
|
{
|
|
while (head)
|
|
{
|
|
Obj* a = head->next;
|
|
delete head;
|
|
head = a;
|
|
}
|
|
}
|
|
|
|
// *****************************************************
|
|
// class XVars
|
|
// *****************************************************
|
|
|
|
void XVars::clear()
|
|
{
|
|
delete[] head;
|
|
head = 0;
|
|
num = 0;
|
|
size = 0;
|
|
}
|
|
|
|
int XVars::put(AMX* p, cell* v)
|
|
{
|
|
for (int a = 0; a < num; ++a)
|
|
{
|
|
if ((head[a].amx == p) && (head[a].value == v))
|
|
return a;
|
|
}
|
|
|
|
if ((num >= size) && realloc_array(size ? (size * 2) : 8))
|
|
return -1;
|
|
|
|
head[num].value = v;
|
|
head[num].amx = p;
|
|
|
|
return num++;
|
|
}
|
|
|
|
int XVars::realloc_array(int nsize)
|
|
{
|
|
XVarEle* me = new XVarEle[nsize];
|
|
|
|
if (me)
|
|
{
|
|
for (int a = 0 ; a < num; ++a)
|
|
me[a] = head[a];
|
|
|
|
delete[] head;
|
|
head = me;
|
|
size = nsize;
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
// *****************************************************
|
|
// class TeamIds
|
|
// *****************************************************
|
|
|
|
TeamIds::TeamIds() { head = 0; newTeam = 0; }
|
|
|
|
TeamIds::~TeamIds()
|
|
{
|
|
while (head)
|
|
{
|
|
TeamEle* a = head->next;
|
|
delete head;
|
|
head = a;
|
|
}
|
|
}
|
|
|
|
void TeamIds::registerTeam(const char* n, int s)
|
|
{
|
|
TeamEle** a = &head;
|
|
|
|
while (*a)
|
|
{
|
|
if (strcmp((*a)->name.chars(),n) == 0)
|
|
{
|
|
if (s != -1)
|
|
{
|
|
(*a)->id = s;
|
|
newTeam &= ~(1<<(*a)->tid);
|
|
}
|
|
|
|
return;
|
|
}
|
|
a = &(*a)->next;
|
|
}
|
|
|
|
*a = new TeamEle(n, s);
|
|
|
|
if (*a == 0)
|
|
return;
|
|
|
|
newTeam |= (1<<(*a)->tid);
|
|
}
|
|
|
|
int TeamIds::findTeamId(const char* n)
|
|
{
|
|
TeamEle* a = head;
|
|
|
|
while (a)
|
|
{
|
|
if (!stricmp(a->name.chars(), n))
|
|
return a->id;
|
|
a = a->next;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int TeamIds::findTeamIdCase(const char* n)
|
|
{
|
|
TeamEle* a = head;
|
|
|
|
while (a)
|
|
{
|
|
if (!strcmp(a->name.chars(), n))
|
|
return a->id;
|
|
a = a->next;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
char TeamIds::TeamEle::uid = 0;
|