- updates to g_combat.c

- moved some functions
- renamed some functions
This commit is contained in:
Walter Julius Hennecke 2014-03-19 00:44:36 +01:00
parent 23e8b41200
commit c40e76e9b4
23 changed files with 2179 additions and 2221 deletions

View file

@ -227,7 +227,7 @@ static void P_WorldEffects( gentity_t *ent ) {
// don't play a normal pain sound
ent->pain_debounce_time = level.time + 200;
G_Damage (ent, NULL, NULL, NULL, NULL,
G_Combat_Damage (ent, NULL, NULL, NULL, NULL,
ent->damage, DAMAGE_NO_ARMOR, MOD_WATER);
}
}
@ -245,12 +245,12 @@ static void P_WorldEffects( gentity_t *ent ) {
&& ent->pain_debounce_time < level.time ) {
if (ent->watertype & CONTENTS_LAVA) {
G_Damage (ent, NULL, NULL, NULL, NULL,
G_Combat_Damage (ent, NULL, NULL, NULL, NULL,
30*waterlevel, 0, MOD_LAVA);
}
if (ent->watertype & CONTENTS_SLIME) {
G_Damage (ent, NULL, NULL, NULL, NULL,
G_Combat_Damage (ent, NULL, NULL, NULL, NULL,
10*waterlevel, 0, MOD_SLIME);
}
}
@ -634,14 +634,10 @@ static qboolean bDetInit = qfalse;
//-----------------------------------------------------------------------------DECOY TEMP
extern qboolean FinishSpawningDecoy( gentity_t* ent, int32_t itemIndex );
//-----------------------------------------------------------------------------DECOY TEMP
void DetonateDetpack(gentity_t* ent);
#define DETPACK_DAMAGE 750
#define DETPACK_RADIUS 500
/**
* The detpack has been shot
*/
void detpack_shot( gentity_t* self, gentity_t* inflictor, gentity_t* attacker, int32_t damage, int32_t meansOfDeath )
{
int32_t i = 0;
@ -651,7 +647,7 @@ void detpack_shot( gentity_t* self, gentity_t* inflictor, gentity_t* attacker, i
self->takedamage = qfalse;
G_TempEntity(self->s.origin, EV_GRENADE_EXPLODE);
G_RadiusDamage( self->s.origin, self->parent?self->parent:self, DETPACK_DAMAGE*0.125, DETPACK_RADIUS*0.25,
G_Combat_RadiusDamage( self->s.origin, self->parent?self->parent:self, DETPACK_DAMAGE*0.125, DETPACK_RADIUS*0.25,
self, DAMAGE_ALL_TEAMS, MOD_DETPACK );
// we're blowing up cuz we've been shot, so make sure we remove ourselves
//from our parent's inventory (so to speak)
@ -871,8 +867,7 @@ static void DetpackBlammoThink(gentity_t* ent)
/**
* Detonate a detpack
*/
void DetonateDetpack(gentity_t *ent)
{
void DetonateDetpack(gentity_t *ent) {
// find all detpacks. the one whose parent is ent...blow up
gentity_t* detpack = NULL;
char* classname = BG_FindClassnameForHoldable(HI_DETPACK);
@ -898,7 +893,7 @@ void DetonateDetpack(gentity_t *ent)
detpack->takedamage = qfalse;
G_AddEvent(detpack, EV_DETPACK, 0);
G_RadiusDamage( detpack->s.origin, detpack->parent, DETPACK_DAMAGE, DETPACK_RADIUS,
G_Combat_RadiusDamage( detpack->s.origin, detpack->parent, DETPACK_DAMAGE, DETPACK_RADIUS,
detpack, DAMAGE_HALF_NOTLOS|DAMAGE_ALL_TEAMS, MOD_DETPACK );
// just turn the model invisible and let the entity think for a bit to deliver a shockwave
//G_FreeEntity(detpack);
@ -1061,7 +1056,7 @@ void ShieldTouch(gentity_t* self, gentity_t* other, trace_t* trace)
if ( other == NULL || other->client == NULL )
return;
if (IsAdmin(other) || (rpg_borgAdapt.integer && rpg_borgMoveThroughFields.integer != 0 && IsBorg(other))/*other->client->sess.sessionClass == PC_ADMIN*/ )
if (G_Client_IsAdmin(other) || (rpg_borgAdapt.integer && rpg_borgMoveThroughFields.integer != 0 && G_Client_IsBorg(other))/*other->client->sess.sessionClass == PC_ADMIN*/ )
{
ShieldGoNotSolid(self);
}
@ -1488,7 +1483,7 @@ void Decoy_CheckForSolidity( gentity_t *ent ) {
* Use function for decoy, removes it if activator is an player and admin
*/
void DecoyUse ( gentity_t *self, gentity_t *other, gentity_t *activator ) {
if ( activator == NULL || !IsAdmin( activator ) || activator->client == NULL )
if ( activator == NULL || !G_Client_IsAdmin( activator ) || activator->client == NULL )
return;
G_FreeEntity( self );
@ -1695,7 +1690,7 @@ static void ClientEvents( gentity_t *ent, int oldEventSequence ) {
damage = 0;
}
ent->pain_debounce_time = level.time + 200; // no normal pain sound
G_Damage (ent, NULL, NULL, NULL, NULL, damage, DAMAGE_ARMOR_PIERCING, MOD_FALLING);
G_Combat_Damage (ent, NULL, NULL, NULL, NULL, damage, DAMAGE_ARMOR_PIERCING, MOD_FALLING);
break;
@ -1846,7 +1841,7 @@ void G_ThrowWeapon( gentity_t *ent, char *txt )
item = BG_FindItemForWeapon( ps->weapon );
// admins don't lose weapon when thrown
if ( IsAdmin( ent ) == qfalse ) {
if ( G_Client_IsAdmin( ent ) == qfalse ) {
ps->ammo[ ps->weapon ] -= 1;
if (ps->ammo[ ps->weapon ] <= 0) {
ps->stats[STAT_WEAPONS] &= ~( 1 << ps->weapon );

View file

@ -2,8 +2,26 @@
#define _G_ACTIVE_H
#include "g_local.h"
/**
* @brief The detonation pack has been activated.
* @param self The detonation pack.
* @param inflictor The inflicting entity.
* @param attacker The attacking entity.
* @param damage Amount of damage.
* @param meansOfDeath The means of death.
*/
void detpack_shot( gentity_t* self, gentity_t* inflictor, gentity_t* attacker, int32_t damage, int32_t meansOfDeath );
/**
* @brief Places a decoy of the player.
* @param ent The player.
*/
qboolean PlaceDecoy(gentity_t *ent);
/**
* @brief Detonate a detonation pack.
* @param ent The detonation pack.
*/
void DetonateDetpack(gentity_t* ent);
#endif /* _G_ACTIVE_H */

View file

@ -2,6 +2,7 @@
#include "g_breakable.h"
#include "g_spawn.h"
#include "g_items.h"
#include "g_combat.h"
/**
* \brief A func_breakables health has sunk to or under zero
@ -64,7 +65,7 @@ void breakable_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker,
// Ok, we are allowed to explode, so do it now!
if ( (self->splashDamage > 0) && (self->splashRadius > 0) ) {
//fixme: what about chain reactions?
G_RadiusDamage( org, attacker, self->splashDamage, self->splashRadius, self, DAMAGE_RADIUS|DAMAGE_ALL_TEAMS, MOD_EXPLOSION );
G_Combat_RadiusDamage( org, attacker, self->splashDamage, self->splashRadius, self, DAMAGE_RADIUS|DAMAGE_ALL_TEAMS, MOD_EXPLOSION );
//explosion effect
te = G_TempEntity( org, EV_MISSILE_MISS );

View file

@ -1,8 +1,9 @@
#ifndef G_BREAKABLE_H_
#define G_BREAKABLE_H_
void breakable_use(gentity_t *self, gentity_t *other, gentity_t *activator);
void breakable_pain( gentity_t *self, gentity_t *attacker, int32_t damage );
void InitBBrush(gentity_t* ent);
void breakable_use(gentity_t* self, gentity_t* other, gentity_t* activator);
void breakable_pain(gentity_t* self, gentity_t* attacker, int32_t damage);
#endif /* G_BREAKABLE_H_ */

View file

@ -9,6 +9,7 @@
#include "g_spawn.h"
#include "g_items.h"
#include "g_lua.h"
#include "g_logger.h"
reconData_t g_reconData[MAX_RECON_NAMES]; //!< recon data for a limited ammount of clients
int32_t g_reconNum;
@ -472,7 +473,6 @@ void G_Client_SetViewAngle( gentity_t *ent, vec3_t angle ) {
G_Client_Respawn
================
*/
extern char *ClassNameForValue( pclass_t pClass );
void G_Client_Respawn( gentity_t *ent ) {
qboolean borg = qfalse;
gentity_t* tent = NULL;
@ -1168,7 +1168,7 @@ void G_Client_UserinfoChanged( int32_t clientNum ) {
s = va("n\\%s\\t\\%i\\p\\%i\\model\\%s\\hc\\%i\\w\\%i\\l\\%i\\age\\%s\\height\\%s\\weight\\%s\\race\\%s\\of\\%i\\admin\\%i",
pers->netname, sess->sessionTeam, sess->sessionClass, model,
pers->maxHealth, sess->wins, sess->losses, age,
sHeight, sWeight, race, modelOffset, ((int)IsAdmin(g_entities+clientNum)));
sHeight, sWeight, race, modelOffset, ((int)G_Client_IsAdmin(g_entities+clientNum)));
}
trap_SetConfigstring( CS_PLAYERS+clientNum, s );
@ -1344,7 +1344,7 @@ char* G_Client_Connect( int32_t clientNum, qboolean firstTime, qboolean isBot )
if ( changeRank ) {
ent->client->UpdateScore = qtrue;
SetScore( ent, tmpScore );
G_Client_SetScore( ent, tmpScore );
}
}
@ -1550,7 +1550,7 @@ void G_Client_Begin( int32_t clientNum, qboolean careAboutWarmup, qboolean isBot
client->ps.eFlags = flags;
client->UpdateScore = qtrue;
SetScore( ent, score );
G_Client_SetScore( ent, score );
// locate ent at a spawn point
G_Client_Spawn( ent, 0, qfalse );//RPG-X: RedTechie - Modifyed
@ -2229,7 +2229,7 @@ void G_Client_Disconnect( int32_t clientNum ) {
// They don't get to take powerups with them!
// Especially important for stuff like CTF flags
TossClientItems ( ent, qtrue );
G_Client_TossClientItems ( ent, qtrue );
}
G_LogPrintf( "ClientDisconnect: %i (%s)\n", clientNum, g_entities[clientNum].client->pers.ip );
@ -2285,7 +2285,7 @@ RPG-X | Phenix | 21/11/2004
* \author Ubergames - Phenix
* \date 21/11/2004
*/
qboolean IsAdmin( gentity_t *ent)
qboolean G_Client_IsAdmin( gentity_t *ent)
{
if ( ent == NULL ) {
return qfalse;
@ -2790,7 +2790,7 @@ void G_Client_UpdateSoundZones(void) {
if(strlen(supdate) != 0) {
Com_sprintf(supdate, sizeof(supdate), "%s\\c%d\\%d", supdate, i, zones[i]);
} else {
Com_sprintf(supdate, sizeof(supdate), "cd%\\%d", i, zones[i]);
Com_sprintf(supdate, sizeof(supdate), "c%d\\%d", i, zones[i]);
}
}
@ -2800,3 +2800,709 @@ void G_Client_UpdateSoundZones(void) {
}
}
}
void G_Client_SetScore(gentity_t* ent, int32_t score) {
G_Assert(ent, (void)0);
G_Assert(ent->client, (void)0);
if (!ent->client->UpdateScore) {
return;
}
ent->client->ps.persistant[PERS_SCORE] = score;
G_Client_CalculateRanks(qfalse);
// TiM: send the current scoring to all clients
SendScoreboardMessageToAllClients();
//RPG-X: RedTechie - Lets enable score updating without this scores will not be updated
ent->client->UpdateScore = qfalse;
}
void G_Client_TossClientItems(gentity_t* self, qboolean dis_con) {
double angle = 0;
int32_t i = 0;
int32_t times = 0;
gentity_t* drop = NULL;
playerState_t *ps = NULL;
gitem_t* item = NULL;
G_Assert(self, (void)0);
G_Assert(self->client, (void)0);
ps = &self->client->ps;
if ((self->flags & FL_CLOAK) != 0) {
// remove the invisible powerup if the player is cloaked.
//RPG-X: RedTechie - Also remove ghost
ps->powerups[PW_GHOST] = level.time;
ps->powerups[PW_INVIS] = level.time;
}
if ((self->flags & FL_FLY) != 0) {
// remove the flying powerup if the player is flying.
ps->powerups[PW_FLIGHT] = level.time;
}
//RPG-X | Phenix | 8/8/2004
if ((self->flags & FL_EVOSUIT) != 0) {
// remove the evosuit powerup
ps->powerups[PW_EVOSUIT] = level.time;
}
// drop all the powerups if not in teamplay
if (g_gametype.integer != GT_TEAM) {
angle = 45;
for (i = 1; i < PW_NUM_POWERUPS; i++) {
if (ps->powerups[i] > level.time) {
item = BG_FindItemForPowerup(i);
if (item == NULL) {
continue;
}
drop = Drop_Item(self, item, angle);
// decide how many seconds it has left
drop->count = (ps->powerups[i] - level.time) / 1000;
if (drop->count < 1) {
drop->count = 1;
}
angle += 45;
}
}
}
// RPG-X | Marcin | 30/12/2008
// ...
if (rpg_allowWeaponDrop.integer == 0 || rpg_dropOnDeath.integer == 0 || dis_con) {
return;
}
// Drop ALL weapons in inventory
for (i = 0; i < WP_NUM_WEAPONS; ++i) {
// these weapons should not be tossed (hand and null)
if (Max_Weapons[i] == NULL) {
continue;
}
//RPG-X | GSIO01 | 08/05/2009: let's make sure we only drop weapons the player has
item = NULL;
if (ps->ammo[i]) {
times = ps->ammo[i];
item = BG_FindItemForWeapon((weapon_t)i);
while (times-- > 0) { // the 'goes towards' operator :p
Drop_Item(self, item, 0);
}
}
}
// then remove weapons
for (i = 0; i < WP_NUM_WEAPONS; ++i) {
ps->stats[STAT_WEAPONS] &= ~i;
ps->ammo[i] = 0;
}
}
void body_die(gentity_t* self, gentity_t* inflictor, gentity_t* attacker, int32_t damage, int32_t meansOfDeath) {
int32_t contents = 0;
G_Assert(self, (void)0);
contents = trap_PointContents(self->r.currentOrigin, -1);
if (rpg_medicsrevive.integer == 1 && !(contents & CONTENTS_NODROP) && (meansOfDeath != MOD_TRIGGER_HURT)) {
if (self->health > GIB_HEALTH_IMPOSSIBLE) {
return;
}
} else {
if (self->health > GIB_HEALTH) {
return;
}
}
G_Combat_GibEntity(self, 0);
}
char* G_Client_ClassNameForValue(pclass_t pClass) {
static char buffer[MAX_QPATH];
char *ptr = NULL;
trap_Cvar_VariableStringBuffer(va("rpg_%sPass", g_classData[pClass].consoleName), buffer, sizeof(buffer));
ptr = buffer;
return ptr;
}
// these are just for logging, the client prints its own messages
char* modNames[MOD_MAX] = {
"MOD_UNKNOWN",
"MOD_WATER",
"MOD_SLIME",
"MOD_LAVA",
"MOD_CRUSH",
"MOD_TELEFRAG",
"MOD_FALLING",
"MOD_SUICIDE",
"MOD_TARGET_LASER",
"MOD_TRIGGER_HURT",
// Trek weapons
"MOD_PHASER",
"MOD_PHASER_ALT",
"MOD_CRIFLE",
"MOD_CRIFLE_SPLASH",
"MOD_CRIFLE_ALT",
"MOD_CRIFLE_ALT_SPLASH",
"MOD_IMOD",
"MOD_IMOD_ALT",
"MOD_SCAVENGER",
"MOD_SCAVENGER_ALT",
"MOD_SCAVENGER_ALT_SPLASH",
"MOD_STASIS",
"MOD_STASIS_ALT",
"MOD_GRENADE",
"MOD_GRENADE_ALT",
"MOD_GRENADE_SPLASH",
"MOD_GRENADE_ALT_SPLASH",
"MOD_TETRYON",
"MOD_TETRYON_ALT",
"MOD_DREADNOUGHT",
"MOD_DREADNOUGHT_ALT",
"MOD_QUANTUM",
"MOD_QUANTUM_SPLASH",
"MOD_QUANTUM_ALT",
"MOD_QUANTUM_ALT_SPLASH",
"MOD_DETPACK",
"MOD_SEEKER"
//expansion pack
"MOD_KNOCKOUT",
"MOD_ASSIMILATE",
"MOD_BORG",
"MOD_BORG_ALT",
"MOD_RESPAWN",
"MOD_EXPLOSION",
}; //must be kept up to date with bg_public, meansOfDeath_t
/*
==================
G_Client_Die
Heavly Modifyed By: RedTechie
RPG-X: Marcin: a little bit modified - 30/12/2008
==================
*/
void G_Client_Die(gentity_t* self, gentity_t* inflictor, gentity_t* attacker, int32_t damage, int32_t meansOfDeath) {
//---------------------
//RPG-X: RedTechie - Check to see if medics revive people and not respawn if true use my fake death insead :)
//---------------------
int32_t contents = 0;
G_Assert(self, (void)0);
G_Assert(self->client, (void)0);
//RPG-X: RedTechie - Make sure there not getting killed by a trigger kill or the medics wont be able to heal them
contents = trap_PointContents(self->r.currentOrigin, -1);
if (rpg_medicsrevive.integer == 1 && !(contents & CONTENTS_NODROP) && (meansOfDeath != MOD_TRIGGER_HURT)) {
char* classname = NULL;
char* killerName = NULL;
char* obit = NULL;
int32_t anim = 0;
int32_t killer = 0;
int32_t i = 0;
gentity_t* detpack = NULL;
gentity_t* ent = NULL;
playerState_t* ps = &self->client->ps;
//RPG-X: RedTechie - Blow up a detpack if some one placed it and died
classname = BG_FindClassnameForHoldable(HI_DETPACK);
if (classname != NULL) {
while ((detpack = G_Find(detpack, FOFS(classname), classname)) != NULL) {
if (detpack->parent == self) {
detpack->think = DetonateDetpack; // Detonate next think.
detpack->nextthink = level.time;
}
}
}
//RPG-X: Redtechie - Do some score keeping witch we commented out and log
if (attacker != NULL) {
killer = attacker->s.number;
if (attacker->client != NULL) {
killerName = attacker->client->pers.netname;
} else {
killerName = "<non-client>";
}
} else {
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if (killer < 0 || killer >= MAX_CLIENTS) {
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if (meansOfDeath < 0 || meansOfDeath >= sizeof(modNames) / sizeof(modNames[0])) {
obit = "<bad obituary>";
} else {
obit = modNames[meansOfDeath];
}
G_LogPrintf("Kill: %i %i %i: %s killed %s by %s\n", killer, self->s.number, meansOfDeath, killerName, self->client->pers.netname, obit);
G_LogWeaponKill(killer, meansOfDeath);
G_LogWeaponDeath(self->s.number, self->s.weapon);
if (attacker != NULL && attacker->client != NULL && attacker->inuse) {
G_LogWeaponFrag(killer, self->s.number);
}
if (meansOfDeath != MOD_RESPAWN && meansOfDeath != MOD_CUSTOM_DIE) {
// broadcast the death event to everyone
ent = G_TempEntity(self->r.currentOrigin, EV_OBITUARY);
ent->s.eventParm = meansOfDeath;
ent->s.otherEntityNum = self->s.number;
ent->s.otherEntityNum2 = killer;
ent->r.svFlags = SVF_BROADCAST; // send to everyone
}
self->enemy = attacker;
ps->persistant[PERS_KILLED]++;
if (self == attacker) {
self->client->pers.teamState.suicides++;
} else {
//RPG-X | Phenix | 06/04/2005
// N00b Protection, you kill two people and puff your auto n00b!
if (attacker != NULL) {
if (attacker->client != NULL) {
if (G_Client_IsAdmin(attacker) == qfalse) {
attacker->n00bCount++;
attacker->client->fraggerTime = level.time + (rpg_fraggerSpawnDelay.integer * 1000);
if (rpg_kickAfterXkills.integer < 1) {
trap_SendServerCommand(attacker - g_entities, va("print \"^7Server: You have been caught n00bing, you have been temporary put in the n00b class.\n\""));
} else {
trap_SendServerCommand(attacker - g_entities, va("print \"^7Server: You have been caught n00bing, %i more times and you will be kicked.\n\"", (rpg_kickAfterXkills.integer - attacker->n00bCount)));
}
if ((attacker->n00bCount >= rpg_kickAfterXkills.integer) && (rpg_kickAfterXkills.integer != 0)) {
trap_DropClient(attacker->s.number, "Kicked: Do Not N00b!");
} else {
for (i = 0; g_classData[i].consoleName[0] && i < MAX_CLASSES; i++) {
if (g_classData[i].isn00b) {
char conName[64];
trap_Cvar_VariableStringBuffer(va("rpg_%sPass", conName), conName, sizeof(conName));
Q_strncpyz(attacker->client->origClass, G_Client_ClassNameForValue(attacker->client->sess.sessionClass), sizeof(attacker->client->origClass));
attacker->client->n00bTime = level.time + 10000;
SetClass(attacker, conName, NULL, qfalse);
break;
}
}
}
}
}
}
}
//RPG-X: RedTechie no noclip
if (self->client->noclip) {
self->client->noclip = qfalse;
}
//RPG-X: RedTechie - Toss items
//RPG-X: Marcin - not when respawning - 30/12/2008
if (meansOfDeath != MOD_RESPAWN) {
G_Client_TossClientItems(self, qfalse);
}
ps->pm_type = PM_DEAD;
self->takedamage = qfalse;
ps->weapon = WP_0;
ps->weaponstate = WEAPON_READY;
self->r.contents = CONTENTS_CORPSE;
//-TiM
self->s.loopSound = 0;
self->r.maxs[2] = -8;
//RPG-X: RedTechie - Wait....forever
self->client->respawnTime = level.time + 1000000000;
//Play death sound
//RPG-X: RedTechie - No pain sound when they change class
if (meansOfDeath != MOD_RESPAWN) {
G_AddEvent(self, irandom(EV_DEATH1, EV_DEATH3), killer);
//if we died from falling, add a nice "splat' sound lol
if (meansOfDeath == MOD_FALLING) {
G_AddEvent(self, EV_SPLAT, killer);
}
}
//RPG-X : Model system - Death animations now based on vector hit
if (meansOfDeath == MOD_FALLING) {
anim = BOTH_FALLDEATH1LAND;
} else if (self->waterlevel == 3) {
anim = BOTH_FLOAT2;
} else {
if (meansOfDeath == MOD_PHASER || meansOfDeath == MOD_PHASER_ALT) {
if ((self->client->lasthurt_location & LOCATION_FRONT) != 0) {
anim = BOTH_DEATHBACKWARD1;
} else if ((self->client->lasthurt_location & LOCATION_BACK) != 0) {
anim = BOTH_DEATHFORWARD2;
} else if ((self->client->lasthurt_location & LOCATION_LEFT) != 0) {
anim = BOTH_DEATH2;
} else if ((self->client->lasthurt_location & LOCATION_RIGHT) != 0) {
anim = BOTH_DEATH2;
} else {
anim = BOTH_DEATH1;
}
} else {
if ((self->client->lasthurt_location & LOCATION_FRONT) != 0) {
anim = BOTH_DEATHBACKWARD2;
} else if ((self->client->lasthurt_location & LOCATION_BACK) != 0) {
anim = BOTH_DEATHFORWARD1;
} else if ((self->client->lasthurt_location & LOCATION_LEFT) != 0) {
anim = BOTH_DEATHFORWARD2;
} else if ((self->client->lasthurt_location & LOCATION_RIGHT) != 0) {
anim = BOTH_DEATHFORWARD2;
} else {
anim = BOTH_DEATH1;
}
}
}
//TiM
ps->stats[LEGSANIM] = ((ps->stats[LEGSANIM] & ANIM_TOGGLEBIT) ^ ANIM_TOGGLEBIT) | anim;
ps->stats[TORSOANIM] = ((ps->stats[TORSOANIM] & ANIM_TOGGLEBIT) ^ ANIM_TOGGLEBIT) | anim;
trap_LinkEntity(self);
BG_PlayerStateToEntityState(&self->client->ps, &self->s, qtrue);
G_Client_UserinfoChanged(self->s.clientNum);
ClientEndFrame(self);
G_Client_StoreClientInitialStatus(self);
//---------------------
//RPG-X: RedTechie - If it dose equal 0 use regular die
//---------------------
} else {
char* killerName = NULL;
char* obit = NULL;
char* classname = NULL;
int anim = 0;
int killer = 0;
int i = 0;
int BottomlessPitDeath = 0;
static int deathNum;
gentity_t* ent = NULL;
gentity_t* detpack = NULL;
playerState_t* ps = &self->client->ps;
if (ps->pm_type == PM_DEAD) {
return;
}
if (level.intermissiontime != 0) {
return;
}
//RPG-X: RedTechie - Trying to make sure player dies when there health is 1 without medics revive turned on
//RPG-X | Phenix | 05/04/2005 - Read learn that "=" sets where "==" is an if statement!!!
if (self->health == 1) {
self->health = 0;
}
ps->pm_type = PM_DEAD;
//need to copy health here because pm_type was getting reset to PM_NORMAL if ClientThink_real was called before the STAT_HEALTH was updated
ps->stats[STAT_HEALTH] = self->health;
// check if we are in a NODROP Zone and died from a TRIGGER HURT
// if so, we assume that this resulted from a fall to a "bottomless pit" and
// treat it differently...
//
// Any problems with other places in the code?
//
BottomlessPitDeath = 0; // initialize
contents = trap_PointContents(self->r.currentOrigin, -1);
if ((contents & CONTENTS_NODROP) != 0 && (meansOfDeath == MOD_TRIGGER_HURT)) {
BottomlessPitDeath = 1;
}
// similarly, if El Corpso here has already dropped a detpack, blow it up
classname = BG_FindClassnameForHoldable(HI_DETPACK);
if (classname) {
while ((detpack = G_Find(detpack, FOFS(classname), classname)) != NULL) {
if (detpack->parent == self) {
detpack->think = DetonateDetpack; // Detonate next think.
detpack->nextthink = level.time;
}
}
}
if (attacker != NULL) {
killer = attacker->s.number;
if (attacker->client != NULL) {
killerName = attacker->client->pers.netname;
} else {
killerName = "<non-client>";
}
} else {
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if (killer < 0 || killer >= MAX_CLIENTS) {
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if (meansOfDeath < 0 || meansOfDeath >= sizeof(modNames) / sizeof(modNames[0])) {
obit = "<bad obituary>";
} else {
obit = modNames[meansOfDeath];
}
G_LogPrintf("Kill: %i %i %i: %s killed %s by %s\n", killer, self->s.number, meansOfDeath, killerName, self->client->pers.netname, obit);
G_LogWeaponKill(killer, meansOfDeath);
G_LogWeaponDeath(self->s.number, self->s.weapon);
if (attacker != NULL && attacker->client != NULL && attacker->inuse) {
G_LogWeaponFrag(killer, self->s.number);
}
if (meansOfDeath != MOD_RESPAWN) {
// broadcast the death event to everyone
ent = G_TempEntity(self->r.currentOrigin, EV_OBITUARY);
ent->s.eventParm = meansOfDeath;
ent->s.otherEntityNum = self->s.number;
ent->s.otherEntityNum2 = killer;
ent->r.svFlags = SVF_BROADCAST; // send to everyone
}
self->enemy = attacker;
ps->persistant[PERS_KILLED]++;
if (self == attacker) {
self->client->pers.teamState.suicides++;
}
//RPG-X: Redtechie - No awards or score calculations
////////////////////////////////////////////////////////////////////////
if (attacker != NULL && attacker->client != NULL) {
if (attacker == self) {
if (meansOfDeath != MOD_RESPAWN) {//just changing class
G_Client_AddScore(attacker, -1);
}
} else {
attacker->client->pers.teamState.frags++;
G_Client_AddScore(attacker, 1);
// Check to see if the player is on a streak.
attacker->client->streakCount++;
attacker->client->lastKillTime = level.time;
}
} else {
if (meansOfDeath != MOD_RESPAWN) {//not just changing class
G_Client_AddScore(self, -1);
}
}
////////////////////////////////////////////////////////////////////////
//RPG-X: Redtechie - agian no need
// Add team bonuses
//Team_FragBonuses(self, inflictor, attacker);
// if client is in a nodrop area, don't drop anything (but return CTF flags!)
if ((contents & CONTENTS_NODROP) == 0 && meansOfDeath != MOD_SUICIDE && meansOfDeath != MOD_RESPAWN) {//action hero doesn't drop stuff
//don't drop stuff in specialty mode
if (meansOfDeath != MOD_RESPAWN) {
G_Client_TossClientItems(self, qfalse);
}
}
DeathmatchScoreboardMessage(self); // show scores
// send updated scores to any clients that are following this one,
// or they would get stale scoreboards
for (i = 0; i < level.maxclients; i++) {
gclient_t* client = NULL;
client = &level.clients[i];
if (client == NULL) {
continue;
}
if (client->pers.connected != CON_CONNECTED) {
continue;
}
if (client->sess.sessionTeam != TEAM_SPECTATOR) {
continue;
}
if (client->sess.spectatorClient == self->s.number) {
DeathmatchScoreboardMessage(g_entities + i);
}
}
self->takedamage = qtrue; // can still be gibbed
self->s.weapon = WP_0;
self->s.powerups = 0;
self->r.contents = CONTENTS_CORPSE;
self->s.loopSound = 0;
self->r.maxs[2] = -8;
// don't allow respawn until the death anim is done
// g_forcerespawn may force spawning at some later time
self->client->respawnTime = level.time + 1700;
// We always want to see the body for special animations, so make sure not to gib right away:
if (meansOfDeath == MOD_CRIFLE_ALT ||
meansOfDeath == MOD_DETPACK ||
meansOfDeath == MOD_QUANTUM_ALT ||
meansOfDeath == MOD_DREADNOUGHT_ALT ||
meansOfDeath == MOD_PHASER_ALT)//RPG-X: RedTechie - Added phaser alt disnt
{
self->health = 0;
}
//RPG-X : Model system - Death animations now based on vector hit
if (meansOfDeath == MOD_FALLING) {
anim = BOTH_FALLDEATH1LAND;
} else if (self->waterlevel == 3) {
anim = BOTH_FLOAT2;
} else {
if (meansOfDeath == MOD_PHASER || meansOfDeath == MOD_PHASER_ALT) {
if ((self->client->lasthurt_location & LOCATION_FRONT) != 0) {
anim = BOTH_DEATHBACKWARD1;
} else if ((self->client->lasthurt_location & LOCATION_BACK) != 0) {
anim = BOTH_DEATHFORWARD2;
} else if ((self->client->lasthurt_location & LOCATION_LEFT) != 0) {
anim = BOTH_DEATH2;
} else if ((self->client->lasthurt_location & LOCATION_RIGHT) != 0) {
anim = BOTH_DEATH2;
} else {
anim = BOTH_DEATH1;
}
} else {
if ((self->client->lasthurt_location & LOCATION_FRONT) != 0) {
anim = BOTH_DEATHBACKWARD2;
} else if ((self->client->lasthurt_location & LOCATION_BACK) != 0) {
anim = BOTH_DEATHFORWARD1;
} else if ((self->client->lasthurt_location & LOCATION_LEFT) != 0) {
anim = BOTH_DEATHFORWARD2;
} else if ((self->client->lasthurt_location & LOCATION_RIGHT) != 0) {
anim = BOTH_DEATHFORWARD2;
} else {
anim = BOTH_DEATH1;
}
}
}
ps->stats[LEGSANIM] = ((ps->stats[LEGSANIM] & ANIM_TOGGLEBIT) ^ ANIM_TOGGLEBIT) | anim;
ps->stats[TORSOANIM] = ((ps->stats[TORSOANIM] & ANIM_TOGGLEBIT) ^ ANIM_TOGGLEBIT) | anim;
if ((BottomlessPitDeath == 1) && (killer == ENTITYNUM_WORLD)) {
//G_AddEvent( self, EV_FALL_FAR, killer ); ?? Need to play falling SF now, or
// use designer trigger??
//FIXME: need *some* kind of death anim!
} else {
// normal death
switch (meansOfDeath) {
case MOD_PHASER_ALT: //RPG-X: RedTechie - Added better effect for alt phaser
if (rpg_phaserdisintegrates.integer == 1) {//RPG-X: RedTechie - Check to see if we want this
G_AddEvent(self, EV_DISINTEGRATION, killer);
ps->powerups[PW_DISINTEGRATE] = level.time + 100000;
VectorClear(ps->velocity);
self->takedamage = qfalse;
self->r.contents = 0;
}
break;
case MOD_CRIFLE_ALT:
break;
case MOD_QUANTUM_ALT:
G_AddEvent(self, EV_DISINTEGRATION2, killer);
ps->powerups[PW_EXPLODE] = level.time + 100000;
VectorClear(ps->velocity);
self->takedamage = qfalse;
self->r.contents = 0;
break;
case MOD_SCAVENGER_ALT:
case MOD_SCAVENGER_ALT_SPLASH:
case MOD_GRENADE:
case MOD_GRENADE_ALT:
case MOD_GRENADE_SPLASH:
case MOD_GRENADE_ALT_SPLASH:
case MOD_QUANTUM:
case MOD_QUANTUM_SPLASH:
case MOD_QUANTUM_ALT_SPLASH:
case MOD_DETPACK:
G_AddEvent(self, EV_EXPLODESHELL, killer);
ps->powerups[PW_EXPLODE] = level.time + 100000;
VectorClear(ps->velocity);
self->takedamage = qfalse;
self->r.contents = 0;
break;
case MOD_DREADNOUGHT:
case MOD_DREADNOUGHT_ALT:
G_AddEvent(self, EV_ARCWELD_DISINT, killer);
ps->powerups[PW_ARCWELD_DISINT] = level.time + 100000;
VectorClear(ps->velocity);
self->takedamage = qfalse;
self->r.contents = 0;
break;
case MOD_FALLING:
G_AddEvent(self, EV_SPLAT, killer);
break;
default:
G_AddEvent(self, irandom(EV_DEATH1, EV_DEATH3), killer);
break;
}
// the body can still be gibbed
self->die = body_die;
}
// globally cycle through the different death animations
deathNum = (deathNum + 1) % 3;
trap_LinkEntity(self);
}//RPG-X: RedTechie - End of my if statment for medics revive check
}//RPG-X: RedTechie - End of void
qboolean G_Client_IsBorg(gentity_t* ent) {
if (ent == NULL) {
return qfalse;
}
if (ent->client == NULL) {
return qfalse;
}
if (g_classData[ent->client->sess.sessionClass].isBorg) {
return qtrue;
} else {
return qfalse;
}
}

View file

@ -1,158 +1,201 @@
#ifndef _G_CLIENT_H
#define _G_CLIENT_H
#include "g_local.h"
/**
* Select a spawnpoint.
*
* \param avoidPoint Point to avoid.
* \param origin Origin.
* \param angles Angles.
*/
/*@shared@*/ /*@null@*/ gentity_t* G_Client_SelectSpawnPoint ( vec3_t avoidPoint, vec3_t origin, vec3_t angles );
/**
* Set the clients view angle.
*
* \param ent Entity for which to set view angle.
* \param angle New view angle.
*/
void G_Client_SetViewAngle( gentity_t* ent, vec3_t angle );
/**
* Respawn client.
*
* \param ent Client to respawn.
*/
void G_Client_Respawn(gentity_t *ent);
/**
* Init the body que.
*/
void G_Client_InitBodyQue(void);
//TiM - Delayed Transport Beam
void G_InitTransport( int32_t clientNum, vec3_t origin, vec3_t angles );
/**
* Pick a random team.
*
* \param ignoreClientNum Client to ignore.
* \return Random team.
*/
team_t G_Client_PickTeam( int32_t ignoreClientNum );
/**
* Clients user info changed.
*
* \param clientNum Client num.
*/
void G_Client_UserinfoChanged( int32_t clientNum );
/**
* Client connect.
*
* \param clientNum Client num.
* \param firstTime Indicate whether this was the first connect.
* \param isBot Indicate if bot or player.
*/
/*@shared@*/ char* G_Client_Connect( int32_t clientNum, qboolean firstTime, qboolean isBot );
/**
* Initialize client.
*
* \param clientNum Client num.
* \param careAboutWarmup Indicate whether to care about warm up.
* \param isBot Bot or client?
* \param first First time?
*/
void G_Client_Begin( int32_t clientNum, qboolean careAboutWarmup, qboolean isBot, qboolean first );
/**
* Store the clients initial status.
*
* \param ent The client.
*/
void G_Client_StoreClientInitialStatus( gentity_t* ent );
/**
* Spawn client.
*
* \param ent Client to spawn
* \param rpgx_spawn rpgx_spawn
* \param fromDeath Is this a spawn from death?
*/
void G_Client_Spawn( gentity_t* ent, int32_t rpgx_spawn, qboolean fromDeath );
/**
* Disconnect client.
*
* \param clientNum Client num.
*/
void G_Client_Disconnect( int32_t clientNum );
/**
* Check if player is an admin.
*
* \param ent the player
* \return Whether player is admin.
*/
qboolean IsAdmin( gentity_t* ent );
/**
* Get location message for a client.
*
* \param ent The client.
* \param loc Location char.
* \param loclen Length of location char.
* \return Indicates success or fail.
*/
qboolean G_Client_GetLocationMsg(gentity_t* ent, char* loc, int32_t loclen);
/**
* Check client statuses.
*/
void G_Client_CheckClientStatus(void);
/**
* Client command.
*
* \param clientNum Client num.
*/
void G_Client_Command( int clientNum );
/**
* Begin intermission.
*/
void G_Client_BeginIntermission(void);
/**
* Let the client die.
*
* \param self Client.
* \param inflictor Entity causing death.
* \param attacker Entity that made inflicotr cause death.
* \param damage ammount of demage
* \param mod means of death
*/
void G_Client_Die (gentity_t* self, gentity_t* inflictor, gentity_t* attacker, int damage, int mod);
/**
* Add score for the client.
*
* \param ent The client.
* \param score Ammount of score to add.
*/
void G_Client_AddScore( gentity_t* ent, int score );
/**
* Calculate clients ranks.
*
* \param fromExit From exit?
*/
void G_Client_CalculateRanks( qboolean fromExit );
extern clInitStatus_t clientInitialStatus[MAX_CLIENTS];
#ifndef _G_CLIENT_H
#define _G_CLIENT_H
#include "g_local.h"
#include "g_combat.h"
/**
* Select a spawnpoint.
*
* \param avoidPoint Point to avoid.
* \param origin Origin.
* \param angles Angles.
*/
/*@shared@*/ /*@null@*/ gentity_t* G_Client_SelectSpawnPoint ( vec3_t avoidPoint, vec3_t origin, vec3_t angles );
/**
* Set the clients view angle.
*
* \param ent Entity for which to set view angle.
* \param angle New view angle.
*/
void G_Client_SetViewAngle( gentity_t* ent, vec3_t angle );
/**
* Respawn client.
*
* \param ent Client to respawn.
*/
void G_Client_Respawn(gentity_t *ent);
/**
* Init the body que.
*/
void G_Client_InitBodyQue(void);
//TiM - Delayed Transport Beam
void G_InitTransport( int32_t clientNum, vec3_t origin, vec3_t angles );
/**
* Pick a random team.
*
* \param ignoreClientNum Client to ignore.
* \return Random team.
*/
team_t G_Client_PickTeam( int32_t ignoreClientNum );
/**
* Clients user info changed.
*
* \param clientNum Client num.
*/
void G_Client_UserinfoChanged( int32_t clientNum );
/**
* Client connect.
*
* \param clientNum Client num.
* \param firstTime Indicate whether this was the first connect.
* \param isBot Indicate if bot or player.
*/
/*@shared@*/ char* G_Client_Connect( int32_t clientNum, qboolean firstTime, qboolean isBot );
/**
* Initialize client.
*
* \param clientNum Client num.
* \param careAboutWarmup Indicate whether to care about warm up.
* \param isBot Bot or client?
* \param first First time?
*/
void G_Client_Begin( int32_t clientNum, qboolean careAboutWarmup, qboolean isBot, qboolean first );
/**
* Store the clients initial status.
*
* \param ent The client.
*/
void G_Client_StoreClientInitialStatus( gentity_t* ent );
/**
* Spawn client.
*
* \param ent Client to spawn
* \param rpgx_spawn rpgx_spawn
* \param fromDeath Is this a spawn from death?
*/
void G_Client_Spawn( gentity_t* ent, int32_t rpgx_spawn, qboolean fromDeath );
/**
* Disconnect client.
*
* \param clientNum Client num.
*/
void G_Client_Disconnect( int32_t clientNum );
/**
* Check if player is an admin.
*
* \param ent the player
* \return Whether player is admin.
*/
qboolean G_Client_IsAdmin( gentity_t* ent );
/**
* Get location message for a client.
*
* \param ent The client.
* \param loc Location char.
* \param loclen Length of location char.
* \return Indicates success or fail.
*/
qboolean G_Client_GetLocationMsg(gentity_t* ent, char* loc, int32_t loclen);
/**
* Check client statuses.
*/
void G_Client_CheckClientStatus(void);
/**
* Client command.
*
* \param clientNum Client num.
*/
void G_Client_Command( int clientNum );
/**
* Begin intermission.
*/
void G_Client_BeginIntermission(void);
/**
* Let the client die.
*
* \param self Client.
* \param inflictor Entity causing death.
* \param attacker Entity that made inflicotr cause death.
* \param damage ammount of demage
* \param mod means of death
*/
void G_Client_Die (gentity_t* self, gentity_t* inflictor, gentity_t* attacker, int damage, int mod);
/**
* Add score for the client.
*
* \param ent The client.
* \param score Ammount of score to add.
*/
void G_Client_AddScore( gentity_t* ent, int score );
/**
* Calculate clients ranks.
*
* \param fromExit From exit?
*/
void G_Client_CalculateRanks( qboolean fromExit );
/**
* Set the score for a client.
*
* \param ent The client.
* \param score New score for the client.
*/
void G_Client_SetScore(gentity_t *ent, int32_t score);
/**
* Toss the weapon and powerups for the killed player.
*
* \param self the client.
* \param Caused by disconnect?
*/
void G_Client_TossClientItems(gentity_t* self, qboolean dis_con);
/**
* Let a body die.
*
* \param self Self.
* \param inflictor entity that is causing the damage
* \param attacker entity that caused the inflictor to damage targ
* \param damage Amount of damage.
* \param meansOfDeath Means of death.
*/
void body_die(gentity_t* self, gentity_t* inflictor, gentity_t* attacker, int32_t damage, int32_t meansOfDeath);
/**
* \brief Gets the classname for a given player class.
* \param pClass The class.
*/
char* G_Client_ClassNameForValue(pclass_t pClass);
/**
* Checks if a player is in a Class that is borg.
* \param ent the player
*
* \author Ubergames - GSIO01
* \date 08/05/2009
*/
qboolean G_Client_IsBorg(gentity_t* ent);
extern clInitStatus_t clientInitialStatus[MAX_CLIENTS];
#endif /* _G_CLIENT_H */

View file

@ -86,7 +86,7 @@ static qboolean CheatsOk(gentity_t* ent) {
G_Assert(ent, qfalse);
if (g_cheats.integer == 0 || IsAdmin(ent) == qfalse) {
if (g_cheats.integer == 0 || G_Client_IsAdmin(ent) == qfalse) {
G_PrintfClient(ent, "You can't use cheats in a Roleplay Session!\n");
return qfalse;
}
@ -241,12 +241,12 @@ static void Cmd_Give_f(gentity_t *ent) {
client = ent->client;
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_GIVE) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_GIVE) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -436,12 +436,12 @@ static void Cmd_God_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_GOD) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_GOD) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -465,7 +465,7 @@ static void Cmd_Notarget_f(gentity_t* ent) {
G_Assert(ent, (void)0);
if (IsAdmin(ent) == qfalse) {
if (G_Client_IsAdmin(ent) == qfalse) {
return;
}
@ -489,12 +489,12 @@ static void Cmd_Noclip_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
trap_SendServerCommand(ent - g_entities, va("print \"ERROR: You are not logged in as an admin.\n\" "));
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_NOCLIP) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_NOCLIP) ) {
trap_SendServerCommand( ent-g_entities, va("print \"ERROR: You are not logged in as a user with the appropriate rights.\n\" ") );
return;
}
@ -791,17 +791,6 @@ qboolean SetTeam(gentity_t* ent, char* s) {
return qtrue;
}
char* ClassNameForValue(pclass_t pClass) {
static char buffer[MAX_QPATH];
char *ptr = NULL;
trap_Cvar_VariableStringBuffer(va("rpg_%sPass", g_classData[pClass].consoleName), buffer, sizeof(buffer));
ptr = buffer;
return ptr;
}
/*
=================
ValueNameForClass
@ -1172,12 +1161,12 @@ static void Cmd_Cloak_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_CLOAK) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_CLOAK) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n")
return;
}
@ -1220,12 +1209,12 @@ static void Cmd_EvoSuit_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
trap_SendServerCommand(ent - g_entities, va("print \"ERROR: You are not logged in as an admin.\n\" "));
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_EVOSUIT) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_EVOSUIT) ) {
trap_SendServerCommand( ent-g_entities, va("print \"ERROR: You are not logged in as a user with the appropriate rights.\n\" ") );
return;
}
@ -1259,12 +1248,12 @@ static void Cmd_Flight_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
trap_SendServerCommand(ent - g_entities, va("print \"ERROR: You are not logged in as an admin.\n\" "));
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FLIGHT) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FLIGHT) ) {
trap_SendServerCommand( ent-g_entities, va("print \"ERROR: You are not logged in as a user with the appropriate rights.\n\" ") );
return;
}
@ -1416,10 +1405,10 @@ static void G_SayTo(gentity_t* ent, gentity_t* other, int32_t mode, int32_t colo
sess = &ent->client->sess;
if (mode == SAY_CLASS && !OnSameClass(ent, other) && (IsAdmin(other) == qfalse)) {
if (mode == SAY_CLASS && !OnSameClass(ent, other) && (G_Client_IsAdmin(other) == qfalse)) {
return;
}
if (mode == SAY_ADMIN && (IsAdmin(other) == qfalse)) {
if (mode == SAY_ADMIN && (G_Client_IsAdmin(other) == qfalse)) {
return;
}
// no chatting to players in tournements
@ -1437,7 +1426,7 @@ static void G_SayTo(gentity_t* ent, gentity_t* other, int32_t mode, int32_t colo
//TiM : If admins want to not see broadcast messages, here's the check.
//trap_GetUserinfo( other->client->ps.clientNum, userInfo, sizeof( userInfo ) );
if ((mode == SAY_CLASS || mode == SAY_ADMIN) && (IsAdmin(other) && (other->client->noAdminChat == qtrue || rpg_respectPrivacy.integer > 0))) {
if ((mode == SAY_CLASS || mode == SAY_ADMIN) && (G_Client_IsAdmin(other) && (other->client->noAdminChat == qtrue || rpg_respectPrivacy.integer > 0))) {
return;
}
@ -1914,12 +1903,12 @@ static void Cmd_ForceVote_f(gentity_t* ent) {
client = ent->client;
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEVOTE) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEVOTE) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -1975,7 +1964,7 @@ static void Cmd_SetViewpos_f(gentity_t* ent) {
G_Assert(ent, (void)0);
if (g_cheats.integer == 0 && !IsAdmin(ent)) {
if (g_cheats.integer == 0 && !G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "Cheats are not enabled on this server.\n");
return;
}
@ -2014,12 +2003,12 @@ static void Cmd_ForceName_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEPARM) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEPARM) ) {
G_PrintfClient(ent,"ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -2093,12 +2082,12 @@ static void Cmd_ShakeCamera_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FX) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FX) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -2164,12 +2153,12 @@ static void Cmd_ForceClass_f(gentity_t* ent) {
}
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEPARM) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEPARM) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -2243,12 +2232,12 @@ static void Cmd_ForceKill_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEKILL) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEKILL) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -2387,12 +2376,12 @@ static void Cmd_ForceKillRadius_f(gentity_t* ent) {
//If client isn't in admin class, exit and disallow command.
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEKILL) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEKILL) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -2506,12 +2495,12 @@ static void Cmd_TargetKick_f(gentity_t* ent) {
//Disallow if not in admin class
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_KICK) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_KICK) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -2579,12 +2568,12 @@ static void Cmd_Drag_f(gentity_t* ent) {
//If client isn't in admin class, exit and disallow command.
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
trap_SendServerCommand(ent - g_entities, va("print \"ERROR: You are not logged in as an admin.\n\" "));
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DRAG) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DRAG) ) {
trap_SendServerCommand( ent-g_entities, va("print \"ERROR: You are not logged in as a user with the appropriate rights.\n\" ") );
return;
}
@ -2688,12 +2677,12 @@ static void Cmd_UnDrag_f(gentity_t* ent) {
//If client isn't in admin class, exit and disallow command.
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DRAG) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DRAG) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -2781,7 +2770,7 @@ void DragCheck(void) {
}
//If the starting admin is no longer in admin class:
if (IsAdmin(&g_entities[DragDat[i].AdminId]) == qfalse) {
if (G_Client_IsAdmin(&g_entities[DragDat[i].AdminId]) == qfalse) {
//Mark as non-dragging.
DragDat[i].AdminId = -1;
if (target && target->client)
@ -2841,12 +2830,12 @@ static void Cmd_disarm_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DISARM) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DISARM) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -2945,7 +2934,7 @@ static void Cmd_Rank_f(gentity_t* ent) {
}
if (!MaxRankHit) {
SetScore(ent, newScore);
G_Client_SetScore(ent, newScore);
trap_SendServerCommand(ent - g_entities, va("prank %s", g_rankNames[i].consoleName));
break;
} else {
@ -2959,7 +2948,7 @@ static void Cmd_Rank_f(gentity_t* ent) {
}
//Okay... we've hit the highest rank we're allowed to go. If the player tries to change their rank to above this, they'll be pwned lol
if (rpg_maxRank.string[0] != 0 && Q_stricmp(g_rankNames[i].consoleName, rpg_maxRank.string) == 0 && IsAdmin(ent)) {
if (rpg_maxRank.string[0] != 0 && Q_stricmp(g_rankNames[i].consoleName, rpg_maxRank.string) == 0 && G_Client_IsAdmin(ent)) {
MaxRankHit = qtrue;
}
}
@ -2967,7 +2956,7 @@ static void Cmd_Rank_f(gentity_t* ent) {
//if we didn't get find a matching name. >.<
if (newScore < 0) {
G_PrintfClient(ent, "This rank doesn't exist on this server!\n\n");
SetScore(ent, OldScore);
G_Client_SetScore(ent, OldScore);
return;
}
@ -2999,12 +2988,12 @@ static void Cmd_ForceRank_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEPARM) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEPARM) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -3043,7 +3032,7 @@ static void Cmd_ForceRank_f(gentity_t* ent) {
if (Q_stricmp(ArgStr, g_rankNames[i].consoleName) == 0) {
newScore = i;//1 << i;
SetScore(other, newScore);
G_Client_SetScore(other, newScore);
trap_SendServerCommand(other - g_entities, va("prank %s", g_rankNames[i].consoleName));
break;
}
@ -3052,7 +3041,7 @@ static void Cmd_ForceRank_f(gentity_t* ent) {
//if we didn't get find a matching name. >.<
if (newScore < 0) {
G_PrintfClient(ent, "This rank doesn't exist on this server!\n\n");
SetScore(other, OldScore);
G_Client_SetScore(other, OldScore);
return;
}
@ -3100,7 +3089,7 @@ static void Cmd_Admins_f(gentity_t* ent) {
Q_strncpyz(send, va("%s %s \n", send, target->client->pers.netname), sizeof(send));
}
if ((target->client->LoggedAsAdmin == qtrue) && (IsAdmin(ent) == qtrue)) {
if ((target->client->LoggedAsAdmin == qtrue) && (G_Client_IsAdmin(ent) == qtrue)) {
Q_strncpyz(send, va("%s %s (hidden) \n", send, target->client->pers.netname), sizeof(send));
}
}
@ -3141,7 +3130,7 @@ static void Cmd_AdminLogin_f(gentity_t* ent) {
trap_Cvar_VariableStringBuffer(va("rpg_%sPass", g_classData[j].consoleName), classPass, sizeof(classPass));
if (g_classData[j].isAdmin && Q_stricmp(classPass, arg) == 0) {
if (IsAdmin(ent) == qfalse) {
if (G_Client_IsAdmin(ent) == qfalse) {
ent->client->LoggedAsAdmin = qtrue;
G_PrintfClient(ent, "You are logged in as an admin.\n");
G_Client_UserinfoChanged(ent - g_entities);
@ -3193,12 +3182,12 @@ static void Cmd_Revive_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent) || rpg_medicsrevive.integer == 0) {
if (!G_Client_IsAdmin(ent) || rpg_medicsrevive.integer == 0) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_REVIVE) || rpg_medicsrevive.integer == 0 ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_REVIVE) || rpg_medicsrevive.integer == 0 ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -3351,12 +3340,12 @@ static void Cmd_n00b_f(gentity_t* ent) {
//If client isn'tin admin class, exit and disallow command.
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_NOOB) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_NOOB) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -3382,7 +3371,7 @@ static void Cmd_n00b_f(gentity_t* ent) {
char conName[15];
trap_Cvar_VariableStringBuffer(va("rpg_%sPass", g_classData[i].consoleName), conName, 15);
Q_strncpyz(target->client->origClass, ClassNameForValue(target->client->sess.sessionClass), sizeof(target->client->origClass));
Q_strncpyz(target->client->origClass, G_Client_ClassNameForValue(target->client->sess.sessionClass), sizeof(target->client->origClass));
target->client->n00bTime = level.time + (1000 * timeToBe);
SetClass(target, conName, NULL, qfalse);
break;
@ -3409,12 +3398,12 @@ static void Cmd_admin_message(gentity_t* ent) {
//If client isn't in admin class, exit and disallow command.
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_MESSAGE) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_MESSAGE) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -3457,12 +3446,12 @@ static void Cmd_ForceModel_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEPARM) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEPARM) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -3520,12 +3509,12 @@ static void Cmd_PlayMusic_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_MUSIC) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_MUSIC) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -3557,12 +3546,12 @@ static void Cmd_StopMusic_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_MUSIC) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_MUSIC) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -3583,12 +3572,12 @@ static void Cmd_PlaySound_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_MUSIC) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_MUSIC) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -3653,12 +3642,12 @@ static void Cmd_UseEnt_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_USEENT) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_USEENT) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -3735,12 +3724,12 @@ static void Cmd_EntList_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_USEENT) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_USEENT) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -3806,12 +3795,12 @@ static void Cmd_BeamToLoc_f(gentity_t* ent) {
//Has to be an admin.. if anyone had it, the brig would become useless.
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_BEAM) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_BEAM) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -3968,12 +3957,12 @@ static void Cmd_ForcePlayer_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEPARM) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FORCEPARM) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -4064,12 +4053,12 @@ static void Cmd_BeamToPlayer_f(gentity_t* ent) {
//Has to be an admin.. if anyone had it, the brig would become useless.
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_BEAM) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_BEAM) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -4529,12 +4518,12 @@ static void Cmd_fxGun_f(gentity_t* ent) {
}
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FX) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FX) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -4821,12 +4810,12 @@ static void Cmd_flushFX_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FX) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FX) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -4845,12 +4834,12 @@ static void Cmd_spawnChar_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_CHARS) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_CHARS) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -4882,12 +4871,12 @@ static void Cmd_fluchChars_f(gentity_t* ent) //GSIO01: fluch Chars ehhh? you kno
}
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_CHARS) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_CHARS) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -4941,7 +4930,7 @@ static void Cmd_flushDropped_f(gentity_t* ent) {
}
if (locEnt->classname != NULL && Q_strncmp(locEnt->classname, "weapon", 6) == 0) { // everything that begins with weapon_
if ((ans == qfalse || !IsAdmin(ent)) && locEnt->parent != ent) {
if ((ans == qfalse || !G_Client_IsAdmin(ent)) && locEnt->parent != ent) {
continue;
} else {
G_FreeEntity(locEnt);
@ -4974,12 +4963,12 @@ static void Cmd_Kick2_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_KICK) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_KICK) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -5053,12 +5042,12 @@ static void Cmd_ClampInfo_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_CLAMP) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_CLAMP) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -5157,7 +5146,7 @@ static void Cmd_Turbolift_f(gentity_t* ent) {
return;
}
if ((lift->flags & FL_LOCKED) != 0 && (!IsAdmin(ent))) {
if ((lift->flags & FL_LOCKED) != 0 && (!G_Client_IsAdmin(ent))) {
G_PrintfClient(ent, "Turbolift is offline.\n");
return;
}
@ -5282,7 +5271,7 @@ static void Cmd_MeActionLocal_f(gentity_t* ent) {
//Send message to admins warning about command being used.
//TiM - since double spamming is annoying, ensure that the target admin wants this alert
if (!OtherPlayer->client->noAdminChat && IsAdmin(OtherPlayer)) {
if (!OtherPlayer->client->noAdminChat && G_Client_IsAdmin(OtherPlayer)) {
G_PrintfClientAll("%s" S_COLOR_CYAN" (locally) " S_COLOR_WHITE "%s\n", ent->client->pers.netname, message);
}
@ -5372,12 +5361,12 @@ static void Cmd_lockDoor_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_LOCK) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_LOCK) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -5453,12 +5442,12 @@ static void Cmd_ffColor_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FFSTUFF) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FFSTUFF) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -5551,12 +5540,12 @@ static void Cmd_unlockAll_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_LOCK) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_LOCK) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -5613,12 +5602,12 @@ static void Cmd_lockAll_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_LOCK) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_LOCK) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -5648,12 +5637,12 @@ static void Cmd_changeFreq(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FFSTUFF) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_FFSTUFF) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -5700,12 +5689,12 @@ static void Cmd_alert_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_ALERT) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_ALERT) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -5782,12 +5771,12 @@ static void Cmd_zonelist_f(gentity_t* ent) {
gentity_t* zone = NULL;
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_SMS ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_SMS ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -5857,12 +5846,12 @@ static void Cmd_selfdestruct_f(gentity_t *ent) {
trap_Argv(5, arg8, sizeof(arg8));
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_SMS ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_SMS ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -5965,12 +5954,12 @@ static void Cmd_shipdamage_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_SMS ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_SMS ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6119,12 +6108,12 @@ static void Cmd_reloadtorpedos_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_SMS ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_SMS ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6189,12 +6178,12 @@ static void Cmd_torpedolist_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_SMS ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_SMS ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6237,12 +6226,12 @@ static void Cmd_admin_centerprint_f(gentity_t* ent) {
//If client isn't in admin class, exit and disallow command.
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_MESSAGE) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_MESSAGE) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6273,12 +6262,12 @@ static void Cmd_getBrushEntCount_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6300,12 +6289,12 @@ static void Cmd_listSPs(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6335,12 +6324,12 @@ static void Cmd_getEntInfo_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6385,12 +6374,12 @@ static void Cmd_getOrigin_f(gentity_t* ent) {
G_Assert(ent->client, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6437,12 +6426,12 @@ static void Cmd_getEntByTargetname_f(gentity_t *ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6482,12 +6471,12 @@ static void Cmd_getEntByTarget_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6528,12 +6517,12 @@ static void Cmd_getEntByBmodel_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6558,12 +6547,12 @@ static void Cmd_setOrigin(gentity_t *ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6606,12 +6595,12 @@ static void Cmd_flushTentities_f(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_TESS) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_TESS) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -6679,12 +6668,12 @@ static void Cmd_spawnTentity_f(gentity_t* ent) {
clientNum = ent->client->ps.clientNum;
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "ERROR: You are not logged in as an admin.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_TESS) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_TESS) ) {
G_PrintfClient(ent, "ERROR: You are not logged in as a user with the appropriate rights.\n");
return;
}
@ -7307,12 +7296,12 @@ static void Cmd_UiTransporterLoc_f(gentity_t* ent) {
if (locTarget != NULL) {
if (locTarget->sound1to2 == 0) {
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
G_PrintfClient(ent, "Destination is a restricted location.\n");
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_BEAM) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_BEAM) ) {
G_PrintfClient(ent, "Destination is a restricted location.\n");
return;
}
@ -7460,7 +7449,7 @@ static void Cmd_SqlUserAdd_f(gentity_t* ent) {
return;
}
if(!IsAdmin(ent)) {
if(!G_Client_IsAdmin(ent)) {
return;
}
@ -7500,7 +7489,7 @@ static void Cmd_SqlUserMod_f(gentity_t* ent) {
return;
}
if(!IsAdmin(ent)) {
if(!G_Client_IsAdmin(ent)) {
return;
}
@ -7554,12 +7543,12 @@ static void Cmd_findEntitiesInRadius(gentity_t* ent) {
G_Assert(ent, (void)0);
#ifndef SQL
if (!IsAdmin(ent)) {
if (!G_Client_IsAdmin(ent)) {
trap_SendServerCommand(ent - g_entities, va("print \"ERROR: You are not logged in as an admin.\n\" "));
return;
}
#else
if ( !IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
if ( !G_Client_IsAdmin( ent ) || !G_Sql_UserDB_CheckRight(ent->client->uid, SQLF_DEBUG ) ) {
trap_SendServerCommand(ent - g_entities, va("print \"ERROR: You are not logged in as a user with the appropriate rights.\n\" "));
return;
}

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,81 @@
#ifndef G_COMBAT_H_
#define G_COMBAT_H_
#include "g_local.h"
qboolean IsBorg( gentity_t* ent ); //GSIO01 | 08/05/2009
#ifndef G_COMBAT_H_
#define G_COMBAT_H_
#include "g_local.h"
// damage flags
#define DAMAGE_RADIUS 0x00000001 //!< damage was indirect
#define DAMAGE_NO_ARMOR 0x00000002 //!< armor (shields) do not protect from this damage
#define DAMAGE_NO_KNOCKBACK 0x00000008 //!< do not affect velocity, just view angles
#define DAMAGE_NO_PROTECTION 0x00000020 //!< armor, shields, invulnerability, and godmode have no effect
#define DAMAGE_NOT_ARMOR_PIERCING 0x00000000 //!< trek: shields fully protect from this damage (for clarity)
#define DAMAGE_ARMOR_PIERCING 0x00000040 //!< trek: shields don't fully protect from this damage
#define DAMAGE_NO_INVULNERABILITY 0x00000080 //!< trek: invulnerability doesn't event protect from this damage
#define DAMAGE_HALF_NOTLOS 0x00000100 //!< trek: radius damage still does 1/2 damage to ents that do not have LOS to explosion org but are in radius
#define DAMAGE_ALL_TEAMS 0x00000200 //!< trek: damage ignores teamdamage settings
/**
* Damage all entities around an origin in a specified radius.
*
* \return Hit a client?
* \param origin Origin.
* \param attacker Attacker.
* \param damage Amount much damage.
* \param radius Radius.
* \param ignore Entity to ignore.
* \param dflags Damage flags.
* \param mod Means of death.
* \todo Replace ignore entity by list of entites.
*/
qboolean G_Combat_RadiusDamage(vec3_t origin, gentity_t* attacker, double damage, double radius, gentity_t* ignore, int32_t dflags, int32_t mod);
/**
* Repairs repairable entities.
*
* \param ent The player.
* \param tr_ent Entity to repair.
* \param rate Rate to repair with.
* \author Ubergames - GSIO01
* \date 09/05/2009
*/
void G_Combat_Repair(gentity_t* ent, gentity_t* tr_ent, double rate);
/**
* @brief Throws gibs and entity.
* @param self The entity.
* @param killer The killer.
*/
void G_Combat_GibEntity(gentity_t* self, int32_t killer);
/**
* brief Damage an entity.
*
* \param targ entity that is being damaged
* \param inflictor entity that is causing the damage
* \param attacker entity that caused the inflictor to damage targ
* \param dir direction of the attack for knockback
* \param point point at which the damage is being inflicted, used for headshots
* \param damage amount of damage being inflicted
* \param knockback force to be applied against targ as a result of the damage
* \param dflags these flags are used to control how G_Damage works
* \param mod means of death
*
* Damage flags:
* DAMAGE_RADIUS damage was indirect (from a nearby explosion)
* DAMAGE_NO_ARMOR armor does not protect from this damage
* DAMAGE_NO_KNOCKBACK do not affect velocity, just view angles
* DAMAGE_NO_PROTECTION kills godmode, armor, everything
*/
void G_Combat_Damage(gentity_t* targ, /*@null@*/ gentity_t* inflictor, /*@null@*/ gentity_t* attacker, /*@null@*/ vec3_t dir, /*@null@*/ vec3_t point, int32_t damage, int32_t dflags, int32_t mod);
/**
* \brief Returns qtrue if the inflictor can directly damage the target.
* Used for explosions and melee attacks.
*
* \param targ the target
* \param origin the origin
* \return qtrue if the inflictor can directly damage the target. Used for explosions and melee attacks.
*/
qboolean G_Combat_CanDamage(gentity_t* targ, vec3_t origin);
#endif /* G_COMBAT_H_ */

View file

@ -3,6 +3,7 @@
#include "g_local.h"
#include "g_spawn.h"
#include "g_logger.h"
#include "g_combat.h"
#define SPARK_STARTOFF 1
/*QUAKED fx_spark (0 0 1) (-8 -8 -8) (8 8 8) STARTOFF
@ -165,7 +166,7 @@ static void steam_think( gentity_t *ent )
gentity_t *victim = &g_entities[trace.entityNum];
if ( (victim != NULL) && victim->takedamage )
{
G_Damage( victim, ent, ent->activator, temp, trace.endpos, ent->damage, 0, MOD_LAVA );
G_Combat_Damage( victim, ent, ent->activator, temp, trace.endpos, ent->damage, 0, MOD_LAVA );
}
}
}
@ -334,7 +335,7 @@ static void bolt_think( gentity_t *ent )
gentity_t *victim = &g_entities[trace.entityNum];
if ( (victim != NULL) && (victim->takedamage == qtrue) )
{
G_Damage( victim, ent, ent->activator, temp, trace.endpos, ent->damage, 0, MOD_PHASER_ALT );
G_Combat_Damage( victim, ent, ent->activator, temp, trace.endpos, ent->damage, 0, MOD_PHASER_ALT );
}
}
}
@ -620,7 +621,7 @@ static void surface_explosion_use( gentity_t *self, /*@unused@*/ gentity_t *othe
G_AddEvent( self, EV_FX_SURFACE_EXPLOSION, 0 );
if ( self->splashDamage != 0 ) {
G_RadiusDamage( self->r.currentOrigin, self, (float)self->splashDamage, (float)self->splashRadius, self, DAMAGE_RADIUS|DAMAGE_ALL_TEAMS, MOD_EXPLOSION );
G_Combat_RadiusDamage( self->r.currentOrigin, self, (float)self->splashDamage, (float)self->splashRadius, self, DAMAGE_RADIUS|DAMAGE_ALL_TEAMS, MOD_EXPLOSION );
}
}
@ -894,7 +895,7 @@ static void electrical_explosion_use( gentity_t *self, /*@unused@*/ gentity_t *o
if ( self->splashDamage != 0 )
{
G_RadiusDamage( self->s.origin, self, (float)self->splashDamage, (float)self->splashRadius, self, 0, MOD_EXPLOSION );
G_Combat_RadiusDamage( self->s.origin, self, (float)self->splashDamage, (float)self->splashRadius, self, 0, MOD_EXPLOSION );
}
}
@ -1618,7 +1619,7 @@ static void forge_bolt_think( gentity_t *ent )
gentity_t *victim = &g_entities[trace.entityNum];
if ( victim != NULL && victim->takedamage == qtrue )
{
G_Damage( victim, ent, ent->activator, temp, trace.endpos, ent->damage, 0, MOD_LAVA );
G_Combat_Damage( victim, ent, ent->activator, temp, trace.endpos, ent->damage, 0, MOD_LAVA );
}
}
}
@ -1763,7 +1764,7 @@ static void plasma_think( gentity_t *ent )
gentity_t *victim = &g_entities[trace.entityNum];
if ( victim != NULL && victim->takedamage == qtrue )
{
G_Damage( victim, ent, ent->activator, temp, trace.endpos, ent->damage, 0, MOD_LAVA );
G_Combat_Damage( victim, ent, ent->activator, temp, trace.endpos, ent->damage, 0, MOD_LAVA );
}
}
}
@ -1896,7 +1897,7 @@ static void stream_think( gentity_t *ent )
gentity_t *victim = &g_entities[trace.entityNum];
if ( victim != NULL && victim->takedamage == qtrue )
{
G_Damage( victim, ent, ent->activator, temp, trace.endpos, ent->damage, 0, MOD_LAVA );
G_Combat_Damage( victim, ent, ent->activator, temp, trace.endpos, ent->damage, 0, MOD_LAVA );
}
}
}

View file

@ -185,7 +185,7 @@ static char* Padd_Get( gentity_t* key, gentity_t* who )
//Inform admins
for ( j = 0; j < level.maxclients; ++j ) {
gentity_t *player = &g_entities[j];
if ( (player != NULL) && (!player->client->noAdminChat) && IsAdmin( player ) && (rpg_respectPrivacy.integer == 0) && (player != who) && (paddData[i].value[0] != 0) ) {
if ( (player != NULL) && (!player->client->noAdminChat) && G_Client_IsAdmin( player ) && (rpg_respectPrivacy.integer == 0) && (player != who) && (paddData[i].value[0] != 0) ) {
trap_SendServerCommand( player-g_entities, va("print \"%s" S_COLOR_CYAN" (picked up by %s" S_COLOR_CYAN ") " S_COLOR_WHITE "%s\n\"", paddData[i].owner, who->client->pers.netname, paddData[i].value ) );
}
}
@ -567,7 +567,7 @@ static void Touch_Item (gentity_t* ent, gentity_t* other, trace_t* trace) {
// the same pickup rules are used for client side and server side
if ( !BG_CanItemBeGrabbed( &ent->s, &other->client->ps, Max_Weapon(other->client->ps.weapon) )
&& IsAdmin( other ) == qfalse )
&& G_Client_IsAdmin( other ) == qfalse )
{
return;
}
@ -630,7 +630,7 @@ static void Touch_Item (gentity_t* ent, gentity_t* other, trace_t* trace) {
// fire item targets
G_UseTargets (ent, other);
if ( rpg_weaponsStay.integer == 1 && IsAdmin( ent->parent ) == qtrue && IsAdmin( other ) == qfalse ) {
if ( rpg_weaponsStay.integer == 1 && G_Client_IsAdmin( ent->parent ) == qtrue && G_Client_IsAdmin( other ) == qfalse ) {
return;
}

View file

@ -564,14 +564,6 @@ typedef struct {
#define MAX_VOTE_COUNT 3
/**
* Set the score for a client.
*
* \param ent The client.
* \param score New score for the client.
*/
void SetScore( gentity_t *ent, int score );
/**
* \brief client data that stays across multiple respawns,
*
@ -1250,96 +1242,6 @@ int G_GetEntityByBmodel(char* bmodel,list_p entities);
*/
void AddRemap(const char* oldShader, const char* newShader, float timeOffset);
//
// g_combat.c
//
/**
* Returns qtrue if the inflictor can directly damage the target. Used for
* explosions and melee attacks.
*
* \param targ the target
* \param origin the origin
* \return qtrue if the inflictor can directly damage the target. Used for explosions and melee attacks.
*/
qboolean CanDamage (gentity_t* targ, vec3_t origin);
/**
* Damage an entity.
*
* \param targ entity that is being damaged
* \param inflictor entity that is causing the damage
* \param attacker entity that caused the inflictor to damage targ
* \param dir direction of the attack for knockback
* \param point point at which the damage is being inflicted, used for headshots
* \param damage amount of damage being inflicted
* \param knockback force to be applied against targ as a result of the damage
* \param dflags these flags are used to control how G_Damage works
* \param mod means of death
*
* Damage flags:
* DAMAGE_RADIUS damage was indirect (from a nearby explosion)
* DAMAGE_NO_ARMOR armor does not protect from this damage
* DAMAGE_NO_KNOCKBACK do not affect velocity, just view angles
* DAMAGE_NO_PROTECTION kills godmode, armor, everything
*/
void G_Damage (gentity_t* targ, /*@null@*/ gentity_t* inflictor, /*@null@*/ gentity_t* attacker, /*@null@*/ vec3_t dir, /*@null@*/ vec3_t point, int damage, int dflags, int mod);
/**
* Damage all entities around an origin in a specified radius.
*
* \return Hit a client?
* \param origin Origin.
* \param attacker Attacker.
* \param damage Amount much damage.
* \param radius Radius.
* \param ignore Entity to ignore.
* \param dflags Damage flags.
* \param mod Means of death.
* \todo Replace ignore entity by list of entites.
*/
qboolean G_RadiusDamage (vec3_t origin, gentity_t* attacker, float damage, float radius, gentity_t* ignore, int dflags, int mod);
/**
* Let a body die.
*
* \param self Self.
* \param inflictor entity that is causing the damage
* \param attacker entity that caused the inflictor to damage targ
* \param damage Amount of damage.
* \param meansOfDeath Means of death.
*/
void body_die( gentity_t* self, gentity_t* inflictor, gentity_t* attacker, int damage, int meansOfDeath );
/**
* Toss the weapon and powerups for the killed player.
*
* \param self the client.
* \param Caused by disconnect?
*/
void TossClientItems( gentity_t* self, qboolean dis_con );
/**
* Repairs repairable entities.
*
* \param ent The player.
* \param tr_ent Entity to repair.
* \param rate Rate to repair with.
* \author Ubergames - GSIO01
* \date 09/05/2009
*/
void G_Repair(gentity_t* ent, gentity_t* tr_ent, float rate);
// damage flags
#define DAMAGE_RADIUS 0x00000001 // damage was indirect
#define DAMAGE_NO_ARMOR 0x00000002 // armor (shields) do not protect from this damage
#define DAMAGE_NO_KNOCKBACK 0x00000008 // do not affect velocity, just view angles
#define DAMAGE_NO_PROTECTION 0x00000020 // armor, shields, invulnerability, and godmode have no effect
#define DAMAGE_NOT_ARMOR_PIERCING 0x00000000 // trek: shields fully protect from this damage (for clarity)
#define DAMAGE_ARMOR_PIERCING 0x00000040 // trek: shields don't fully protect from this damage
#define DAMAGE_NO_INVULNERABILITY 0x00000080 // trek: invulnerability doesn't event protect from this damage
#define DAMAGE_HALF_NOTLOS 0x00000100 // trek: radius damage still does 1/2 damage to ents that do not have LOS to explosion org but are in radius
#define DAMAGE_ALL_TEAMS 0x00000200 // trek: damage ignores teamdamage settings
//
// g_missile.c
//

View file

@ -5,6 +5,7 @@
#include "g_spawn.h"
#include "g_missile.h"
#include "g_logger.h"
#include "g_combat.h"
#define MISSILE_PRESTEP_TIME 50
@ -65,7 +66,7 @@ static void TouchStickyGrenade(gentity_t* ent, gentity_t* other, trace_t* trace)
G_Assert(ent, (void)0);
G_Assert(other, (void)0);
if (IsAdmin( other ) == qfalse) {
if (G_Client_IsAdmin( other ) == qfalse) {
if (other->takedamage) {
if (ent->parent != other) {
ent->touch = 0;
@ -118,7 +119,7 @@ void tripwireThink ( gentity_t* ent ) {
//RPG-X: RedTechie - Admin Class go threw
//RPG-X: J2J - Mistake made here, was checking if the _owner_ was in admin at the time, not the player tripping the mine, FIXED.
if (IsAdmin( traceEnt ) == qfalse) {
if (G_Client_IsAdmin( traceEnt ) == qfalse) {
grenadeSpewShrapnel( ent );
}
}
@ -271,7 +272,7 @@ void G_Missile_Impact( gentity_t* ent, trace_t* trace ) {
{
//RPG-X: - Our forcefield killer :D
if(((other->classname != NULL && !Q_stricmp(other->classname, "holdable_shield")))){
if(IsAdmin(ent->parent)){
if(G_Client_IsAdmin(ent->parent)){
G_FreeEntity(ent);
G_Active_ShieldRemove(other);
@ -321,7 +322,7 @@ void G_Missile_Impact( gentity_t* ent, trace_t* trace ) {
{
flags |= DAMAGE_ARMOR_PIERCING;
}
G_Damage (other, ent, &g_entities[ent->r.ownerNum], velocity,
G_Combat_Damage (other, ent, &g_entities[ent->r.ownerNum], velocity,
ent->s.origin, ent->damage,
flags, ent->methodOfDeath);
}
@ -351,7 +352,7 @@ void G_Missile_Impact( gentity_t* ent, trace_t* trace ) {
// splash damage (doesn't apply to person directly hit)
if ( ent->splashDamage > 0 ) {
G_RadiusDamage( trace->endpos, ent->parent, ent->splashDamage, ent->splashRadius, other, 0, ent->splashMethodOfDeath );
G_Combat_RadiusDamage( trace->endpos, ent->parent, ent->splashDamage, ent->splashRadius, other, 0, ent->splashMethodOfDeath );
}
trap_LinkEntity( ent );
@ -389,7 +390,7 @@ void G_ExplodeMissile( gentity_t* ent ) {
// splash damage
if ( ent->splashDamage > 0 ) {
G_RadiusDamage( ent->r.currentOrigin, ent->parent, ent->splashDamage, ent->splashRadius, NULL, 0, ent->splashMethodOfDeath );
G_Combat_RadiusDamage( ent->r.currentOrigin, ent->parent, ent->splashDamage, ent->splashRadius, NULL, 0, ent->splashMethodOfDeath );
}
trap_LinkEntity( ent );
@ -414,7 +415,7 @@ static void G_RunStuckMissile( gentity_t* ent )
if ( (VectorCompare( vec3_origin, other->s.pos.trDelta ) == 0 && other->s.pos.trType != TR_STATIONARY) ||
(VectorCompare( vec3_origin, other->s.apos.trDelta ) == 0 && other->s.apos.trType != TR_STATIONARY) )
{//thing I stuck to is moving or rotating now, kill me
G_Damage( ent, other, other, NULL, NULL, 99999, 0, MOD_CRUSH );
G_Combat_Damage( ent, other, other, NULL, NULL, 99999, 0, MOD_CRUSH );
G_LogFuncEnd();
return;

View file

@ -4,5 +4,6 @@
#include "g_local.h"
void G_Missile_Impact( gentity_t *ent, trace_t *trace);
void tripwireThink(gentity_t* ent);
#endif /* G_MISSILE_H_ */

View file

@ -227,7 +227,7 @@ static qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, genti
if ( notMoving && check->s.eFlags&EF_MISSILE_STICK )
{//special case hack for sticky things
//destroy it
G_Damage( check, pusher, pusher, NULL, NULL, 99999, 0, MOD_CRUSH );
G_Combat_Damage( check, pusher, pusher, NULL, NULL, 99999, 0, MOD_CRUSH );
continue;
}
@ -263,7 +263,7 @@ static qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, genti
// bobbing entities are instant-kill and never get blocked
if ( pusher->s.pos.trType == TR_SINE || pusher->s.apos.trType == TR_SINE ) {
G_Damage( check, pusher, pusher, NULL, NULL, 99999, 0, MOD_CRUSH );
G_Combat_Damage( check, pusher, pusher, NULL, NULL, 99999, 0, MOD_CRUSH );
continue;
}
@ -812,7 +812,7 @@ void G_Mover_UseBinaryMover( gentity_t *ent, gentity_t *other, gentity_t *activa
//GSIO01 | 09/05/2009: do engage if door is admin only and player isn admin
if(((ent->type == ENT_FUNC_DOOR) && ((ent->spawnflags & 128) != 0))
|| ((ent->type == ENT_FUNC_DOOR_ROTATING) && ((ent->spawnflags & 64) != 0))) {
if((activator != NULL) && !IsAdmin(activator)) {
if((activator != NULL) && !G_Client_IsAdmin(activator)) {
return;
}
}
@ -1172,7 +1172,7 @@ void Blocked_Door( gentity_t *ent, gentity_t *other ) {
}
if ( ent->damage ) {
G_Damage( other, ent, ent, NULL, NULL, ent->damage, 0, MOD_CRUSH );
G_Combat_Damage( other, ent, ent, NULL, NULL, ent->damage, 0, MOD_CRUSH );
}
if ( ((ent->spawnflags & 4) != 0) || ((ent->type == ENT_FUNC_DOOR_ROTATING) && ((ent->spawnflags & 2) != 0)) ) { // GSIO01: added support for fucn_door_roating
return; // crushers don't reverse
@ -2328,8 +2328,8 @@ static void forcefield_touch( gentity_t *ent, gentity_t *other, trace_t *trace )
ent->r.svFlags &= ~SVF_NOCLIENT;
ent->s.eFlags &= ~EF_NODRAW;
if ( ((ent->spawnflags & 4) && IsAdmin(other)) ||
((rpg_borgAdapt.integer && rpg_borgMoveThroughFields.integer && IsBorg(other) && !(ent->spawnflags & 256))) )
if ( ((ent->spawnflags & 4) && G_Client_IsAdmin(other)) ||
((rpg_borgAdapt.integer && rpg_borgMoveThroughFields.integer && G_Client_IsBorg(other) && !(ent->spawnflags & 256))) )
{
FieldGoNotSolid( ent );
}
@ -2356,7 +2356,7 @@ static void forcefield_touch( gentity_t *ent, gentity_t *other, trace_t *trace )
if ( ent->damage )
{
G_Damage (other, ent, ent, NULL, NULL, ent->damage, 0, MOD_FORCEFIELD);
G_Combat_Damage (other, ent, ent, NULL, NULL, ent->damage, 0, MOD_FORCEFIELD);
}
ent->nextthink = level.time+ent->soundPos2;

View file

@ -375,7 +375,7 @@ static void target_laser_think (/*@shared@*/ gentity_t *self) {
if ( tr.entityNum != 0 ) {
// hurt it if we can
G_Damage ( &g_entities[tr.entityNum], self, self->activator, self->movedir,
G_Combat_Damage ( &g_entities[tr.entityNum], self, self->activator, self->movedir,
tr.endpos, self->damage, DAMAGE_NO_KNOCKBACK, MOD_TARGET_LASER);
}
@ -640,7 +640,7 @@ none
*/
static void target_kill_use( /*@shared@*/ /*@unused@*/ gentity_t *self, /*@shared@*/ /*@unused@*/ gentity_t *other, /*@shared@*/ gentity_t *activator ) {
if(activator != NULL) {
G_Damage ( activator, NULL, NULL, NULL, NULL, 100000, DAMAGE_NO_PROTECTION, MOD_TELEFRAG);
G_Combat_Damage ( activator, NULL, NULL, NULL, NULL, 100000, DAMAGE_NO_PROTECTION, MOD_TELEFRAG);
}
}
@ -3039,7 +3039,7 @@ void target_selfdestruct_think(gentity_t *ent) {
//Loop trough all clients on the server.
while((client = G_Find( client, FOFS( classname ), "player" ))!= NULL){
if (client->client->nokilli != 1)
G_Damage (client, ent, ent, 0, 0, 999999, 0, MOD_TRIGGER_HURT); //maybe a new message ala "[Charname] did not abandon ship."
G_Combat_Damage (client, ent, ent, 0, 0, 999999, 0, MOD_TRIGGER_HURT); //maybe a new message ala "[Charname] did not abandon ship."
}
//we may go this way once more so clear clients back.
client = NULL;
@ -3368,7 +3368,7 @@ void target_shiphealth_die(/*@shared@*/ gentity_t *ent){
//Loop trough all clients on the server.
while((client = G_Find( client, FOFS( classname ), "player" )) != NULL){
if (client->client && client->client->nokilli != 1) {
G_Damage (client, ent, ent, 0, 0, 999999, 0, MOD_TRIGGER_HURT); //maybe a new message ala "[Charname] did not abandon ship."
G_Combat_Damage (client, ent, ent, 0, 0, 999999, 0, MOD_TRIGGER_HURT); //maybe a new message ala "[Charname] did not abandon ship."
}
}
//we may go this way once more so clear clients back.

View file

@ -812,7 +812,7 @@ static void hurt_touch( gentity_t* self, gentity_t* other, trace_t* trace ) {
}
if((self->spawnflags & 64) != 0) {
if(IsAdmin(other)) {
if(G_Client_IsAdmin(other)) {
G_LocLogger(LL_DEBUG, "admins are protected\n");
G_LogFuncEnd();
return;
@ -855,7 +855,7 @@ static void hurt_touch( gentity_t* self, gentity_t* other, trace_t* trace ) {
dflags = 0;
}
G_Damage (other, self, self, NULL, NULL, self->damage, dflags, MOD_TRIGGER_HURT);
G_Combat_Damage (other, self, self, NULL, NULL, self->damage, dflags, MOD_TRIGGER_HURT);
G_LogFuncEnd();
}

View file

@ -2,6 +2,7 @@
#include "g_spawn.h"
#include "g_items.h"
#include "g_logger.h"
#include "g_combat.h"
#define ARM_ANGLE_RANGE 60
#define HEAD_ANGLE_RANGE 90
@ -72,7 +73,7 @@ static void turret_die ( gentity_t* self, gentity_t* inflictor, gentity_t* attac
if ( (self->splashDamage > 0) && (self->splashRadius > 0) )
{
/* FIXME: specify type of explosion? (barrel, electrical, etc.) */
G_RadiusDamage( self->r.currentOrigin, attacker, self->splashDamage, self->splashRadius, activator, DAMAGE_RADIUS, MOD_EXPLOSION );
G_Combat_RadiusDamage( self->r.currentOrigin, attacker, self->splashDamage, self->splashRadius, activator, DAMAGE_RADIUS, MOD_EXPLOSION );
te = G_TempEntity( self->r.currentOrigin, EV_MISSILE_MISS );
VectorSet( dir, 0, 0, 1 );
@ -1062,7 +1063,7 @@ static void laser_arm_fire (gentity_t* ent)
gentity_t *hapless_victim = &g_entities[trace.entityNum];
if ( hapless_victim && hapless_victim->takedamage && ent->damage )
{
G_Damage( hapless_victim, ent, ent->nextTrain->activator, fwd, trace.endpos, ent->damage, DAMAGE_ALL_TEAMS, 1 );
G_Combat_Damage( hapless_victim, ent, ent->nextTrain->activator, fwd, trace.endpos, ent->damage, DAMAGE_ALL_TEAMS, 1 );
}
}
}

View file

@ -124,7 +124,7 @@ void func_usable_use (gentity_t* self, gentity_t* other, gentity_t* activator)
/* RPG-X | GSIO01 | 09/05/2009: */
if ((self->spawnflags & USABLE_ADMIN_ONLY) != 0) { /* ADMINS_ONLY */
if (!IsAdmin(activator)) {
if (!G_Client_IsAdmin(activator)) {
G_Logger(LL_DEBUG, "activator not a player or not admin\n");
G_LogFuncEnd();
return;

View file

@ -9,6 +9,7 @@
#include "g_local.h"
#include "g_lua.h"
#include "g_logger.h"
#include "g_combat.h"
/**
* \brief Data structure for a singele shader remap.
@ -827,7 +828,7 @@ void G_KillBox (gentity_t* ent) {
}
/* nail it */
G_Damage ( hit, ent, ent, NULL, NULL,
G_Combat_Damage ( hit, ent, ent, NULL, NULL,
100000, DAMAGE_NO_PROTECTION, MOD_TELEFRAG);
}

View file

@ -10,6 +10,7 @@
#include "g_missile.h"
#include "g_logger.h"
#include "g_lua.h"
#include "g_combat.h"
#define MAX_BEAM_HITS 4
@ -176,9 +177,9 @@ static void WP_FireHyperspanner(gentity_t* ent, qboolean alt_fire) {
/* call G_Repair */
if(alt_fire) {
G_Repair(ent, nearest, HYPERSPANNER_ALT_RATE * modifier);
G_Combat_Repair(ent, nearest, HYPERSPANNER_ALT_RATE * modifier);
} else {
G_Repair(ent, nearest, HYPERSPANNER_RATE * modifier);
G_Combat_Repair(ent, nearest, HYPERSPANNER_RATE * modifier);
}
validEnts.clear(&validEnts);
@ -289,10 +290,10 @@ static void WP_FirePhaser( gentity_t* ent, qboolean alt_fire )
if (damage > 0) {
if ( alt_fire ) {
G_Damage( traceEnt, ent, ent, forward, tr.endpos, damage,
G_Combat_Damage( traceEnt, ent, ent, forward, tr.endpos, damage,
DAMAGE_NO_KNOCKBACK | DAMAGE_NOT_ARMOR_PIERCING, MOD_PHASER_ALT );
} else {
G_Damage( traceEnt, ent, ent, forward, tr.endpos, damage,
G_Combat_Damage( traceEnt, ent, ent, forward, tr.endpos, damage,
DAMAGE_NO_KNOCKBACK | DAMAGE_ARMOR_PIERCING, MOD_PHASER );
}
}
@ -432,7 +433,7 @@ static void WP_FireCompressionRifle ( gentity_t* ent, qboolean alt_fire )
}
if (damage > 0) {
G_Damage( traceEnt, ent, ent, forward, tr.endpos, damage,
G_Combat_Damage( traceEnt, ent, ent, forward, tr.endpos, damage,
DAMAGE_NO_KNOCKBACK | DAMAGE_ARMOR_PIERCING, MOD_CRIFLE_ALT ); /* GSIO01: was MOD_PHASER */
}
}
@ -582,7 +583,7 @@ static void WP_FireDisruptor( gentity_t* ent, qboolean alt_fire )
}
if (damage > 0) {
G_Damage( traceEnt, ent, ent, forward, tr.endpos, damage,
G_Combat_Damage( traceEnt, ent, ent, forward, tr.endpos, damage,
DAMAGE_NO_KNOCKBACK | DAMAGE_ARMOR_PIERCING, MOD_STASIS ); /* GSIO01: was MOD_TETRION_ALT */
}
}
@ -634,7 +635,7 @@ static void grenadeExplode( gentity_t* ent )
/* splash damage (doesn't apply to person directly hit) */
if ( ent->splashDamage > 0 ) {
G_RadiusDamage( pos, ent->parent, ent->splashDamage, ent->splashRadius, NULL, 0, ent->splashMethodOfDeath );
G_Combat_RadiusDamage( pos, ent->parent, ent->splashDamage, ent->splashRadius, NULL, 0, ent->splashMethodOfDeath );
}
G_FreeEntity( ent );
@ -659,7 +660,7 @@ void grenadeSpewShrapnel( gentity_t* ent )
tent->s.eventParm = DirToByte(ent->pos1);
// just do radius dmg for altfire
G_RadiusDamage( ent->r.currentOrigin, ent->parent, ent->splashDamage, ent->splashRadius,
G_Combat_RadiusDamage( ent->r.currentOrigin, ent->parent, ent->splashDamage, ent->splashRadius,
ent, 0, ent->splashMethodOfDeath );
G_FreeEntity(ent);
@ -819,7 +820,7 @@ static void WP_FireGrenade( gentity_t* ent, qboolean alt_fire )
VectorCopy( start, grenade->pos2 );
} else {
/* RPG-X: RedTechie - Check to see if there admin if so grant them effects gun */
if( IsAdmin(ent) && (rpg_effectsgun.integer == 1)) {
if( G_Client_IsAdmin(ent) && (rpg_effectsgun.integer == 1)) {
VectorMA (muzzle, MAXRANGE_CRIFLE, forward, end);
trap_Trace (&tr, muzzle, NULL, NULL, end, ent->s.number, MASK_SHOT );
@ -1039,7 +1040,7 @@ static void WP_FireTR116Bullet( gentity_t* ent, vec3_t start, vec3_t dir ) {
G_Assert(traceEnt, (void)0);
if ( traceEnt->takedamage && (rpg_dmgFlags.integer & 4) != 0) {
G_Damage( traceEnt, ent, ent, dir, tr.endpos, TETRION_DAMAGE, 0, MOD_TETRION_ALT );
G_Combat_Damage( traceEnt, ent, ent, dir, tr.endpos, TETRION_DAMAGE, 0, MOD_TETRION_ALT );
}
}
@ -1646,7 +1647,7 @@ static void WP_TricorderScan (gentity_t* ent, qboolean alt_fire)
}
/* Fix - Changed || to && in the below if statement! */
if ( IsAdmin( ent ) == qfalse ) {
if ( G_Client_IsAdmin( ent ) == qfalse ) {
G_Logger(LL_DEBUG, "player not an admin\n");
G_LogFuncEnd();
return;
@ -1756,7 +1757,7 @@ static void WP_SprayVoyagerHypo( gentity_t* ent, qboolean alt_fire )
memset(&tr, 0, sizeof(trace_t));
trap_Trace ( &tr, muzzle, mins, maxs, end, ent->s.number, MASK_OPAQUE|CONTENTS_BODY|CONTENTS_ITEM|CONTENTS_CORPSE ); /*MASK_SHOT*/
if(rpg_effectsgun.integer == 1 && IsAdmin(ent) && alt_fire == qtrue && ent->s.weapon == WP_12) {
if(rpg_effectsgun.integer == 1 && G_Client_IsAdmin(ent) && alt_fire == qtrue && ent->s.weapon == WP_12) {
if(RPGEntityCount != ENTITYNUM_MAX_NORMAL-20){
t_ent = G_TempEntity( muzzle, EV_HYPO_PUFF );
t_ent->s.eventParm = qfalse; /* TiM: Event parm is holding a qboolean value for color of spray */
@ -1871,7 +1872,7 @@ void FireWeapon( gentity_t* ent, qboolean alt_fire )
WP_FireCompressionRifle( ent, alt_fire );
break;
case WP_1:
if ( IsAdmin( ent ) && alt_fire )
if ( G_Client_IsAdmin( ent ) && alt_fire )
WP_FireGrenade( ent, qfalse );
break;
case WP_4:

View file

@ -1,483 +1,484 @@
// game lib for lua
#include "g_lua.h"
#ifdef G_LUA
/***
This module provides access to some of the servers functionality.
@module game
*/
/***
Prints text to the servers console.
@function Print
@param test Text to print.
*/
static int Game_Print(lua_State *L) {
int i;
char buf[MAX_STRING_CHARS];
int n = lua_gettop(L);
memset(buf, 0, sizeof(buf));
lua_getglobal(L, "tostring");
LUA_DEBUG("BEGIN - game.Print");
for(i = 1; i <= n; i++)
{
const char *s;
lua_pushvalue(L, -1);
lua_pushvalue(L, i);
lua_call(L, 1, 1);
s = lua_tostring(L, -1);
if(s == NULL)
{
LUA_DEBUG("ERROR - game.Print - no string");
return 1;
}
Q_strcat(buf, sizeof(buf), s);
lua_pop(L, 1);
}
G_Printf("%s\n", buf);
LUA_DEBUG("END - game.Print");
return 0;
}
/***
Prints text to the center of the screen of the client with client number clientNum. If clientNum is -1 the text gets printed for all clients.
@function CenterPrint
@param clientNum Client number.
@param text Text to print.
*/
static int Game_CenterPrint(lua_State *L) {
int i;
char buf[MAX_STRING_CHARS];
int n = lua_gettop(L);
int clNum = luaL_checknumber(L, 1);
memset(buf, 0, sizeof(buf));
lua_getglobal(L, "tostring");
LUA_DEBUG("BEGIN - game.CenterPrint");
for(i = 1; i < n; i++)
{
const char *s;
lua_pushvalue(L, -1);
lua_pushvalue(L, i);
lua_call(L, 1, 1);
s = lua_tostring(L, 2);
if(s == NULL)
{
LUA_DEBUG("ERROR - game.CenterPrint - no string");
lua_pushboolean(L, qfalse);
return 1;
}
Q_strcat(buf, sizeof(buf), s);
lua_pop(L, 1);
}
trap_SendServerCommand(clNum, va("servercprint \"" S_COLOR_WHITE "%s\n\"", buf));
LUA_DEBUG("END - game.CenterPrint");
lua_pushboolean(L, qtrue);
return 1;
}
/***
Prints text to the clients console that has the client number clientNum. If clientNum is -1 the text gets printed to all clients consoles.
@function ClientPrint
@param clientNum Client number.
@param text Text to print.
*/
static int Game_ClientPrint(lua_State *L) {
int i;
char buf[MAX_STRING_CHARS];
int n = lua_gettop(L);
int clNum = luaL_checknumber(L, 1);
gentity_t *player;
memset(buf, 0, sizeof(buf));
lua_getglobal(L, "tostring");
LUA_DEBUG("BEGIN - game.ClientPrint");
for(i = 1; i < n; i++) {
const char *s;
lua_pushvalue(L, -1);
lua_pushvalue(L, i);
lua_call(L, 1, 1);
s = lua_tostring(L, 2);
if(s == NULL)
{
LUA_DEBUG("BEGIN - game.ClientPrint - no string");
lua_pushboolean(L, qfalse);
return 1;
}
Q_strcat(buf, sizeof(buf), s);
lua_pop(L, 1);
}
if(clNum != -1) {
player = &g_entities[clNum];
if(player && player->client) {
G_PrintfClient(player, "%s", buf);
}
} else {
G_PrintfClientAll("%s", buf);
}
LUA_DEBUG("END - game.ClientPrint");
lua_pushboolean(L, qtrue);
return 1;
}
/***
Prints text to the lower right corner of the screen of the client with client number clientNum. If clientNum is -1 the text gets printed for all clients.
@functiton MessagePrint
@param clientNum Client number.
@param text Text tp print.
*/
static int Game_MessagePrint(lua_State *L) {
int i;
char buf[MAX_STRING_CHARS];
int n = lua_gettop(L);
int clNum = luaL_checknumber(L, 1);
memset(buf, 0, sizeof(buf));
lua_getglobal(L, "tostring");
LUA_DEBUG("BEGIN - game.MessagePrint");
for(i = 1; i < n; i++)
{
const char *s;
lua_pushvalue(L, -1);
lua_pushvalue(L, i);
lua_call(L, 1, 1);
s = lua_tostring(L, 2);
if(s == NULL)
{
LUA_DEBUG("ERROR - game.MessagePrint - no string");
lua_pushboolean(L, qfalse);
return 1;
}
Q_strcat(buf, sizeof(buf), s);
lua_pop(L, 1);
}
trap_SendServerCommand(clNum, va("servermsg \"" S_COLOR_WHITE "%s\n\"", buf));
LUA_DEBUG("END - game.MessagePrint");
lua_pushboolean(L, qfalse);
return 1;
}
/***
Sets a global Lua variable which is called name to value. Creates a new global variable if a variable of name does not exist. Value can be of any type.
@function SetGlobal
@param name Name of global variable.
@param value New value for global variable.
*/
static int Game_SetGlobal(lua_State *L) {
char *name;
LUA_DEBUG("BEGIN - game.SetGlobal");
name = (char *)luaL_checkstring(L, 1);
if(name == NULL) {
LUA_DEBUG("ERROR - game.SetGlobal - name NULL");
lua_pushboolean(L, qfalse);
return 0;
}
lua_pushvalue(L, 2);
lua_setglobal(L, name);
LUA_DEBUG("END - game.SetGlobal");
lua_pushboolean(L, qtrue);
return 0;
}
/***
Returns the value of the global variable name. Returns nil if the variable does not exist.
@function GetGlobal
@param name Name of Global variable.
@return value of Global variable.
*/
static int Game_GetGlobal(lua_State *L) {
char *name;
LUA_DEBUG("BEGIN - game.SetGlobal");
name = (char *)luaL_checkstring(L, 1);
if(name == NULL) {
LUA_DEBUG("ERROR - game.SetGlobal - name NULL");
lua_pushnil(L);
return 0;
}
lua_getglobal(L, name);
LUA_DEBUG("END - game.SetGlobal");
return 1;
}
// Alert-Stuff... I don't know. I feel like removing this and stick to the entity spawning and setup.
// game.AlertSetup(entity ent, string greentarget, string yellowtarget, string redtarget, string bluetarget,
// string greensound, string yellowsound, string redsound, string bluesound, integer mode)
static int Game_AlertSetup(lua_State *L) {
LUA_DEBUG("BEGIN - game.AlertSetup");
if(luaAlertState != NULL) {
LUA_DEBUG("ERROR - game.AlertSetup - luaArlterState != NULL");
lua_pushboolean(L, 0);
return 1;
}
luaAlertState = (luaAlertState_t *)malloc(sizeof(luaAlertState_t));
if(luaAlertState == NULL) {
LUA_DEBUG("ERROR - game.AlertSetup - luaAlertState NULL");
lua_pushboolean(L, 0);
return 1;
}
luaAlertState->targets[0] = (char *)luaL_checkstring(L, 1);
luaAlertState->targets[1] = (char *)luaL_checkstring(L, 2);
luaAlertState->targets[2] = (char *)luaL_checkstring(L, 3);
luaAlertState->targets[3] = (char *)luaL_checkstring(L, 4);
luaAlertState->sounds[0] = (char *)luaL_checkstring(L, 5);
luaAlertState->sounds[1] = (char *)luaL_checkstring(L, 6);
luaAlertState->sounds[2] = (char *)luaL_checkstring(L, 7);
luaAlertState->sounds[3] = (char *)luaL_checkstring(L, 8);
luaAlertState->mode = luaL_checkint(L, 9);
luaAlertState->cond = 0;
LUA_DEBUG("END - game.AlertSetup");
lua_pushboolean(L, 1);
return 1;
}
static int Game_AlertAddShader(lua_State *L) {
int cond;
char *shader;
LUA_DEBUG("BEGIN - game.AlertAddShader");
if(luaAlertState == NULL) {
LUA_DEBUG("ERROR - game.AlertAddShader - luaAlertShader NULL");
lua_pushboolean(L, 0);
return 1;
}
cond = luaL_checkint(L, 1);
if(cond < 0 || cond > 3) {
LUA_DEBUG("ERROR - game.AlertAddShader - cond out of range");
lua_pushboolean(L, 0);
return 1;
}
shader = (char *)luaL_checkstring(L, 2);
if(shader == NULL) {
LUA_DEBUG("ERROR - game.AlertAddShader - shader NULL");
lua_pushboolean(L, 0);
return 1;
}
if((strlen(shader) + 1) > MAX_QPATH) {
LUA_DEBUG("ERROR - game.AlertAddShader - strlen(shader)+1 > MAX_QPATH");
lua_pushboolean(L, 0);
return 1;
}
if(luaAlertState->shaders[cond] == NULL) {
luaAlertState->shaders[cond] = (char *)malloc(sizeof(char) * (strlen(shader) + 1));
if(luaAlertState->shaders[cond] == NULL) {
LUA_DEBUG("ERROR - game.AlertAddShader - alloc failed");
lua_pushboolean(L, 0);
return 1;
}
strncpy(luaAlertState->shaders[cond], shader, sizeof(luaAlertState->shaders[cond]));
} else {
void *tmp = realloc(luaAlertState->shaders[cond], sizeof(char) * (strlen(luaAlertState->shaders[cond]) +
strlen(shader) + 1));
if(tmp == NULL){
LUA_DEBUG("ERROR - game.AlertAddShader - realloc failed");
lua_pushboolean(L, 0);
return 1;
}
luaAlertState->shaders[cond] = tmp;
Com_sprintf(luaAlertState->shaders[cond], sizeof(luaAlertState->shaders[cond]), "%s\n%s", luaAlertState->shaders[cond], shader);
}
lua_pushboolean(L, 1);
LUA_DEBUG("END - game.AlertAddShader");
return 1;
}
// game.Alert(entity ent, integer target, boolean silent)
static int Game_Alert(lua_State *L) {
/*lent_t *lent;
int current, target;
qboolean silent;*/
return 0;
}
/***
Get the current level time in milliseconds. Level time is the time since level start.
@function LevelTime
@return Level time in milliseconds.
*/
static int Game_Leveltime(lua_State * L)
{
LUA_DEBUG("BEGIN - game.Leveltime");
lua_pushinteger(L, level.time);
LUA_DEBUG("INFO - game.Leveltime - start/return: leveltime=%d", level.time);
LUA_DEBUG("BEGIN - game.Leveltime");
return 1;
}
/***
Damage and player or entity.
@function Damage
@param target Target entity.
@param inflictor Inflicting entity. Can be nil.
@param attacker Attacking entity. Can be nil.
@param direction Direction of knockback. Can be nil.
@param point Point where the damage is inflicted. Can be nil.
@param damage Ammount of damage.
@param dflags Damage flags.
@param mod Means of death.
@return Success or fail.
*/
static int Game_Damage(lua_State *L) {
lent_t *lent;
gentity_t *targ = NULL, *inflictor = NULL, *attacker = NULL;
vec_t *dir = NULL, *point = NULL;
int damage = 0, dflags = 0, mod = 0;
LUA_DEBUG("BEGIN - game.Damage");
lent = Lua_GetEntity(L, 1);
if(lent == NULL || lent->e == NULL) {
LUA_DEBUG("ERROR - game.Damage - entity NULL");
lua_pushboolean(L, qfalse);
return 1;
}
targ = lent->e;
if(!lua_isnil(L, 2)) {
lent = Lua_GetEntity(L, 2);
if(lent && lent->e) {
inflictor = lent->e;
}
}
if(!lua_isnil(L, 3)) {
lent = Lua_GetEntity(L, 3);
if(lent && lent->e) {
attacker = lent->e;
}
}
if(!lua_isnil(L, 4)) {
dir = Lua_GetVector(L, 4);
}
if(!lua_isnil(L, 5)) {
point = Lua_GetVector(L, 5);
}
damage = (int)luaL_checknumber(L, 6);
dflags = (int)luaL_checknumber(L, 7);
mod = (int)luaL_checknumber(L, 8);
G_Damage(targ, inflictor, attacker, dir, point, damage, dflags, mod);
lua_pushboolean(L, qtrue);
LUA_DEBUG("END - game.Damage");
return 1;
}
/***
Repair an entity.
@function Repair
@param target Target entity.
@param rate Repair rate.
@return Success or fail.
*/
static int Game_Repair(lua_State *L) {
lent_t *lent;
float rate;
LUA_DEBUG("BEGIN - game.Repair");
lent = Lua_GetEntity(L, 1);
if(lent == NULL || lent->e == NULL) {
LUA_DEBUG("ERROR - game.Repair - entity NULL");
lua_pushboolean(L, qfalse);
return 1;
}
rate = (float)luaL_checknumber(L, 2);
G_Repair(lent->e, NULL, rate); // FIXME ... trance ent?
LUA_DEBUG("END - game.Repair");
lua_pushboolean(L, qtrue);
return 1;
}
static const luaL_Reg lib_game[] = {
{ "Damage", Game_Damage },
{ "Repair", Game_Repair },
{ "Print", Game_Print },
{ "MessagePrint", Game_MessagePrint },
{ "CenterPrint", Game_CenterPrint },
{ "ClientPrint", Game_ClientPrint },
{ "GetTime", Game_Leveltime },
{ "AlertSetup", Game_AlertSetup },
{ "AlertAddShader", Game_AlertAddShader },
{ "Alert", Game_Alert },
{ "SetGlobal", Game_SetGlobal },
{ "GetGlobal", Game_GetGlobal },
{ NULL, NULL }
};
int Luaopen_Game(lua_State *L) {
luaL_register(L, "game", lib_game);
lua_pushliteral(L, "_GAMEVERSION");
lua_pushliteral(L, GAMEVERSION);
return 1;
}
#endif
// game lib for lua
#include "g_lua.h"
#include "g_combat.h"
#ifdef G_LUA
/***
This module provides access to some of the servers functionality.
@module game
*/
/***
Prints text to the servers console.
@function Print
@param test Text to print.
*/
static int Game_Print(lua_State *L) {
int i;
char buf[MAX_STRING_CHARS];
int n = lua_gettop(L);
memset(buf, 0, sizeof(buf));
lua_getglobal(L, "tostring");
LUA_DEBUG("BEGIN - game.Print");
for(i = 1; i <= n; i++)
{
const char *s;
lua_pushvalue(L, -1);
lua_pushvalue(L, i);
lua_call(L, 1, 1);
s = lua_tostring(L, -1);
if(s == NULL)
{
LUA_DEBUG("ERROR - game.Print - no string");
return 1;
}
Q_strcat(buf, sizeof(buf), s);
lua_pop(L, 1);
}
G_Printf("%s\n", buf);
LUA_DEBUG("END - game.Print");
return 0;
}
/***
Prints text to the center of the screen of the client with client number clientNum. If clientNum is -1 the text gets printed for all clients.
@function CenterPrint
@param clientNum Client number.
@param text Text to print.
*/
static int Game_CenterPrint(lua_State *L) {
int i;
char buf[MAX_STRING_CHARS];
int n = lua_gettop(L);
int clNum = luaL_checknumber(L, 1);
memset(buf, 0, sizeof(buf));
lua_getglobal(L, "tostring");
LUA_DEBUG("BEGIN - game.CenterPrint");
for(i = 1; i < n; i++)
{
const char *s;
lua_pushvalue(L, -1);
lua_pushvalue(L, i);
lua_call(L, 1, 1);
s = lua_tostring(L, 2);
if(s == NULL)
{
LUA_DEBUG("ERROR - game.CenterPrint - no string");
lua_pushboolean(L, qfalse);
return 1;
}
Q_strcat(buf, sizeof(buf), s);
lua_pop(L, 1);
}
trap_SendServerCommand(clNum, va("servercprint \"" S_COLOR_WHITE "%s\n\"", buf));
LUA_DEBUG("END - game.CenterPrint");
lua_pushboolean(L, qtrue);
return 1;
}
/***
Prints text to the clients console that has the client number clientNum. If clientNum is -1 the text gets printed to all clients consoles.
@function ClientPrint
@param clientNum Client number.
@param text Text to print.
*/
static int Game_ClientPrint(lua_State *L) {
int i;
char buf[MAX_STRING_CHARS];
int n = lua_gettop(L);
int clNum = luaL_checknumber(L, 1);
gentity_t *player;
memset(buf, 0, sizeof(buf));
lua_getglobal(L, "tostring");
LUA_DEBUG("BEGIN - game.ClientPrint");
for(i = 1; i < n; i++) {
const char *s;
lua_pushvalue(L, -1);
lua_pushvalue(L, i);
lua_call(L, 1, 1);
s = lua_tostring(L, 2);
if(s == NULL)
{
LUA_DEBUG("BEGIN - game.ClientPrint - no string");
lua_pushboolean(L, qfalse);
return 1;
}
Q_strcat(buf, sizeof(buf), s);
lua_pop(L, 1);
}
if(clNum != -1) {
player = &g_entities[clNum];
if(player && player->client) {
G_PrintfClient(player, "%s", buf);
}
} else {
G_PrintfClientAll("%s", buf);
}
LUA_DEBUG("END - game.ClientPrint");
lua_pushboolean(L, qtrue);
return 1;
}
/***
Prints text to the lower right corner of the screen of the client with client number clientNum. If clientNum is -1 the text gets printed for all clients.
@functiton MessagePrint
@param clientNum Client number.
@param text Text tp print.
*/
static int Game_MessagePrint(lua_State *L) {
int i;
char buf[MAX_STRING_CHARS];
int n = lua_gettop(L);
int clNum = luaL_checknumber(L, 1);
memset(buf, 0, sizeof(buf));
lua_getglobal(L, "tostring");
LUA_DEBUG("BEGIN - game.MessagePrint");
for(i = 1; i < n; i++)
{
const char *s;
lua_pushvalue(L, -1);
lua_pushvalue(L, i);
lua_call(L, 1, 1);
s = lua_tostring(L, 2);
if(s == NULL)
{
LUA_DEBUG("ERROR - game.MessagePrint - no string");
lua_pushboolean(L, qfalse);
return 1;
}
Q_strcat(buf, sizeof(buf), s);
lua_pop(L, 1);
}
trap_SendServerCommand(clNum, va("servermsg \"" S_COLOR_WHITE "%s\n\"", buf));
LUA_DEBUG("END - game.MessagePrint");
lua_pushboolean(L, qfalse);
return 1;
}
/***
Sets a global Lua variable which is called name to value. Creates a new global variable if a variable of name does not exist. Value can be of any type.
@function SetGlobal
@param name Name of global variable.
@param value New value for global variable.
*/
static int Game_SetGlobal(lua_State *L) {
char *name;
LUA_DEBUG("BEGIN - game.SetGlobal");
name = (char *)luaL_checkstring(L, 1);
if(name == NULL) {
LUA_DEBUG("ERROR - game.SetGlobal - name NULL");
lua_pushboolean(L, qfalse);
return 0;
}
lua_pushvalue(L, 2);
lua_setglobal(L, name);
LUA_DEBUG("END - game.SetGlobal");
lua_pushboolean(L, qtrue);
return 0;
}
/***
Returns the value of the global variable name. Returns nil if the variable does not exist.
@function GetGlobal
@param name Name of Global variable.
@return value of Global variable.
*/
static int Game_GetGlobal(lua_State *L) {
char *name;
LUA_DEBUG("BEGIN - game.SetGlobal");
name = (char *)luaL_checkstring(L, 1);
if(name == NULL) {
LUA_DEBUG("ERROR - game.SetGlobal - name NULL");
lua_pushnil(L);
return 0;
}
lua_getglobal(L, name);
LUA_DEBUG("END - game.SetGlobal");
return 1;
}
// Alert-Stuff... I don't know. I feel like removing this and stick to the entity spawning and setup.
// game.AlertSetup(entity ent, string greentarget, string yellowtarget, string redtarget, string bluetarget,
// string greensound, string yellowsound, string redsound, string bluesound, integer mode)
static int Game_AlertSetup(lua_State *L) {
LUA_DEBUG("BEGIN - game.AlertSetup");
if(luaAlertState != NULL) {
LUA_DEBUG("ERROR - game.AlertSetup - luaArlterState != NULL");
lua_pushboolean(L, 0);
return 1;
}
luaAlertState = (luaAlertState_t *)malloc(sizeof(luaAlertState_t));
if(luaAlertState == NULL) {
LUA_DEBUG("ERROR - game.AlertSetup - luaAlertState NULL");
lua_pushboolean(L, 0);
return 1;
}
luaAlertState->targets[0] = (char *)luaL_checkstring(L, 1);
luaAlertState->targets[1] = (char *)luaL_checkstring(L, 2);
luaAlertState->targets[2] = (char *)luaL_checkstring(L, 3);
luaAlertState->targets[3] = (char *)luaL_checkstring(L, 4);
luaAlertState->sounds[0] = (char *)luaL_checkstring(L, 5);
luaAlertState->sounds[1] = (char *)luaL_checkstring(L, 6);
luaAlertState->sounds[2] = (char *)luaL_checkstring(L, 7);
luaAlertState->sounds[3] = (char *)luaL_checkstring(L, 8);
luaAlertState->mode = luaL_checkint(L, 9);
luaAlertState->cond = 0;
LUA_DEBUG("END - game.AlertSetup");
lua_pushboolean(L, 1);
return 1;
}
static int Game_AlertAddShader(lua_State *L) {
int cond;
char *shader;
LUA_DEBUG("BEGIN - game.AlertAddShader");
if(luaAlertState == NULL) {
LUA_DEBUG("ERROR - game.AlertAddShader - luaAlertShader NULL");
lua_pushboolean(L, 0);
return 1;
}
cond = luaL_checkint(L, 1);
if(cond < 0 || cond > 3) {
LUA_DEBUG("ERROR - game.AlertAddShader - cond out of range");
lua_pushboolean(L, 0);
return 1;
}
shader = (char *)luaL_checkstring(L, 2);
if(shader == NULL) {
LUA_DEBUG("ERROR - game.AlertAddShader - shader NULL");
lua_pushboolean(L, 0);
return 1;
}
if((strlen(shader) + 1) > MAX_QPATH) {
LUA_DEBUG("ERROR - game.AlertAddShader - strlen(shader)+1 > MAX_QPATH");
lua_pushboolean(L, 0);
return 1;
}
if(luaAlertState->shaders[cond] == NULL) {
luaAlertState->shaders[cond] = (char *)malloc(sizeof(char) * (strlen(shader) + 1));
if(luaAlertState->shaders[cond] == NULL) {
LUA_DEBUG("ERROR - game.AlertAddShader - alloc failed");
lua_pushboolean(L, 0);
return 1;
}
strncpy(luaAlertState->shaders[cond], shader, sizeof(luaAlertState->shaders[cond]));
} else {
void *tmp = realloc(luaAlertState->shaders[cond], sizeof(char) * (strlen(luaAlertState->shaders[cond]) +
strlen(shader) + 1));
if(tmp == NULL){
LUA_DEBUG("ERROR - game.AlertAddShader - realloc failed");
lua_pushboolean(L, 0);
return 1;
}
luaAlertState->shaders[cond] = tmp;
Com_sprintf(luaAlertState->shaders[cond], sizeof(luaAlertState->shaders[cond]), "%s\n%s", luaAlertState->shaders[cond], shader);
}
lua_pushboolean(L, 1);
LUA_DEBUG("END - game.AlertAddShader");
return 1;
}
// game.Alert(entity ent, integer target, boolean silent)
static int Game_Alert(lua_State *L) {
/*lent_t *lent;
int current, target;
qboolean silent;*/
return 0;
}
/***
Get the current level time in milliseconds. Level time is the time since level start.
@function LevelTime
@return Level time in milliseconds.
*/
static int Game_Leveltime(lua_State * L)
{
LUA_DEBUG("BEGIN - game.Leveltime");
lua_pushinteger(L, level.time);
LUA_DEBUG("INFO - game.Leveltime - start/return: leveltime=%d", level.time);
LUA_DEBUG("BEGIN - game.Leveltime");
return 1;
}
/***
Damage and player or entity.
@function Damage
@param target Target entity.
@param inflictor Inflicting entity. Can be nil.
@param attacker Attacking entity. Can be nil.
@param direction Direction of knockback. Can be nil.
@param point Point where the damage is inflicted. Can be nil.
@param damage Ammount of damage.
@param dflags Damage flags.
@param mod Means of death.
@return Success or fail.
*/
static int Game_Damage(lua_State *L) {
lent_t *lent;
gentity_t *targ = NULL, *inflictor = NULL, *attacker = NULL;
vec_t *dir = NULL, *point = NULL;
int damage = 0, dflags = 0, mod = 0;
LUA_DEBUG("BEGIN - game.Damage");
lent = Lua_GetEntity(L, 1);
if(lent == NULL || lent->e == NULL) {
LUA_DEBUG("ERROR - game.Damage - entity NULL");
lua_pushboolean(L, qfalse);
return 1;
}
targ = lent->e;
if(!lua_isnil(L, 2)) {
lent = Lua_GetEntity(L, 2);
if(lent && lent->e) {
inflictor = lent->e;
}
}
if(!lua_isnil(L, 3)) {
lent = Lua_GetEntity(L, 3);
if(lent && lent->e) {
attacker = lent->e;
}
}
if(!lua_isnil(L, 4)) {
dir = Lua_GetVector(L, 4);
}
if(!lua_isnil(L, 5)) {
point = Lua_GetVector(L, 5);
}
damage = (int)luaL_checknumber(L, 6);
dflags = (int)luaL_checknumber(L, 7);
mod = (int)luaL_checknumber(L, 8);
G_Combat_Damage(targ, inflictor, attacker, dir, point, damage, dflags, mod);
lua_pushboolean(L, qtrue);
LUA_DEBUG("END - game.Damage");
return 1;
}
/***
Repair an entity.
@function Repair
@param target Target entity.
@param rate Repair rate.
@return Success or fail.
*/
static int Game_Repair(lua_State *L) {
lent_t *lent;
float rate;
LUA_DEBUG("BEGIN - game.Repair");
lent = Lua_GetEntity(L, 1);
if(lent == NULL || lent->e == NULL) {
LUA_DEBUG("ERROR - game.Repair - entity NULL");
lua_pushboolean(L, qfalse);
return 1;
}
rate = (float)luaL_checknumber(L, 2);
G_Combat_Repair(lent->e, NULL, rate); // FIXME ... trance ent?
LUA_DEBUG("END - game.Repair");
lua_pushboolean(L, qtrue);
return 1;
}
static const luaL_Reg lib_game[] = {
{ "Damage", Game_Damage },
{ "Repair", Game_Repair },
{ "Print", Game_Print },
{ "MessagePrint", Game_MessagePrint },
{ "CenterPrint", Game_CenterPrint },
{ "ClientPrint", Game_ClientPrint },
{ "GetTime", Game_Leveltime },
{ "AlertSetup", Game_AlertSetup },
{ "AlertAddShader", Game_AlertAddShader },
{ "Alert", Game_Alert },
{ "SetGlobal", Game_SetGlobal },
{ "GetGlobal", Game_GetGlobal },
{ NULL, NULL }
};
int Luaopen_Game(lua_State *L) {
luaL_register(L, "game", lib_game);
lua_pushliteral(L, "_GAMEVERSION");
lua_pushliteral(L, GAMEVERSION);
return 1;
}
#endif

View file

@ -1,122 +1,123 @@
// lua library for weapons
#include "g_lua.h"
#ifdef G_LUA
/***
A module for everything converning weapons.
@module weapons
*/
#include "g_weapon.h"
/***
Get the forward vector.
@function GetForward
@return Forward vector.
*/
static int weapon_GetForward(lua_State *L) {
Lua_PushVector(L, forward);
return 1;
}
/***
Get the right vector.
@function GetRight.
@return Right vector.
*/
static int weapon_GetRight(lua_State *L) {
Lua_PushVector(L, right);
return 1;
}
/***
Get the up vector.
@function GetUp
@return Up vector.
*/
static int weapon_GetUp(lua_State *L) {
Lua_PushVector(L, up);
return 1;
}
/***
Get the muzzle point.
@function GetMuzzle
@return Muzzle point.
*/
static int weapon_GetMuzzle(lua_State *L) {
Lua_PushVector(L, muzzle);
return 1;
}
/***
Do damage to an entity.
@function Damage
@param target Target entity.
@param inflictor Inflicting entity. Can be nil.
@param attacker Attacking entity. Can be nil.
@param dir Direction for knockback. Can be nil.
@param point Point. Can be nil.
@param damage Ammount of damage.
@param dflags Damage flags.
@param mod Means of death.
@return Success or failure.
*/
static int weapon_Damage(lua_State *L) {
lent_t* lent;
gentity_t* target = NULL;
gentity_t* inflictor = NULL;
gentity_t* attacker = NULL;
vec_t *dir, *point;
int damage, dflags, mod;
lent = Lua_GetEntity(L, 1);
if(lent == NULL || lent->e == NULL) {
lua_pushboolean(L, qfalse);
return 0;
}
target = Lua_GetEntity(L, 1)->e;
lent = Lua_GetEntity(L, 2);
if(lent != NULL && lent->e != NULL) {
inflictor = lent->e;
}
lent = Lua_GetEntity(L, 3);
if(lent != NULL && lent->e != NULL) {
attacker = lent->e;
}
dir = Lua_GetVector(L, 4);
point = Lua_GetVector(L, 5);
damage = (int)luaL_checknumber(L, 6);
dflags = (int)luaL_checknumber(L, 7);
mod = (int)luaL_checknumber(L, 8);
G_Damage(target, inflictor, attacker, dir, point, damage, dflags, mod);
lua_pushboolean(L, qtrue);
return 0;
}
static const luaL_Reg lib_weapons[] = {
{ "GetForward", weapon_GetForward },
{ "GetRight", weapon_GetRight },
{ "GetUp", weapon_GetUp },
{ "GetMuzzle", weapon_GetMuzzle },
{ "Damage", weapon_Damage },
{ NULL, NULL }
};
int Luaopen_Weapons(lua_State *L) {
luaL_register(L, "weapons", lib_weapons);
return 1;
}
#endif
// lua library for weapons
#include "g_lua.h"
#ifdef G_LUA
/***
A module for everything converning weapons.
@module weapons
*/
#include "g_weapon.h"
#include "g_combat.h"
/***
Get the forward vector.
@function GetForward
@return Forward vector.
*/
static int weapon_GetForward(lua_State *L) {
Lua_PushVector(L, forward);
return 1;
}
/***
Get the right vector.
@function GetRight.
@return Right vector.
*/
static int weapon_GetRight(lua_State *L) {
Lua_PushVector(L, right);
return 1;
}
/***
Get the up vector.
@function GetUp
@return Up vector.
*/
static int weapon_GetUp(lua_State *L) {
Lua_PushVector(L, up);
return 1;
}
/***
Get the muzzle point.
@function GetMuzzle
@return Muzzle point.
*/
static int weapon_GetMuzzle(lua_State *L) {
Lua_PushVector(L, muzzle);
return 1;
}
/***
Do damage to an entity.
@function Damage
@param target Target entity.
@param inflictor Inflicting entity. Can be nil.
@param attacker Attacking entity. Can be nil.
@param dir Direction for knockback. Can be nil.
@param point Point. Can be nil.
@param damage Ammount of damage.
@param dflags Damage flags.
@param mod Means of death.
@return Success or failure.
*/
static int weapon_Damage(lua_State *L) {
lent_t* lent;
gentity_t* target = NULL;
gentity_t* inflictor = NULL;
gentity_t* attacker = NULL;
vec_t *dir, *point;
int damage, dflags, mod;
lent = Lua_GetEntity(L, 1);
if(lent == NULL || lent->e == NULL) {
lua_pushboolean(L, qfalse);
return 0;
}
target = Lua_GetEntity(L, 1)->e;
lent = Lua_GetEntity(L, 2);
if(lent != NULL && lent->e != NULL) {
inflictor = lent->e;
}
lent = Lua_GetEntity(L, 3);
if(lent != NULL && lent->e != NULL) {
attacker = lent->e;
}
dir = Lua_GetVector(L, 4);
point = Lua_GetVector(L, 5);
damage = (int)luaL_checknumber(L, 6);
dflags = (int)luaL_checknumber(L, 7);
mod = (int)luaL_checknumber(L, 8);
G_Combat_Damage(target, inflictor, attacker, dir, point, damage, dflags, mod);
lua_pushboolean(L, qtrue);
return 0;
}
static const luaL_Reg lib_weapons[] = {
{ "GetForward", weapon_GetForward },
{ "GetRight", weapon_GetRight },
{ "GetUp", weapon_GetUp },
{ "GetMuzzle", weapon_GetMuzzle },
{ "Damage", weapon_Damage },
{ NULL, NULL }
};
int Luaopen_Weapons(lua_State *L) {
luaL_register(L, "weapons", lib_weapons);
return 1;
}
#endif