Source code
Revision control
1
/***
2
*
3
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
4
*
5
* This product contains software technology licensed from Id
6
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
7
* All Rights Reserved.
8
*
9
* Use, distribution, and modification of this source code and/or resulting
10
* object code is restricted to non-commercial enhancements to products from
11
* Valve LLC. All other use, distribution, or modification is prohibited
12
* without written permission from Valve LLC.
13
*
14
****/
15
//=========================================================
16
// GameRules.cpp
17
//=========================================================
18
19
#include "extdll.h"
20
#include "util.h"
21
#include "cbase.h"
22
#include "player.h"
23
#include "weapons.h"
24
#include "gamerules.h"
25
#include "teamplay_gamerules.h"
26
#include "skill.h"
27
#include "game.h"
28
29
extern edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer );
30
31
DLL_GLOBAL CGameRules* g_pGameRules = NULL;
32
extern DLL_GLOBAL BOOL g_fGameOver;
33
extern int gmsgDeathMsg; // client dll messages
34
extern int gmsgMOTD;
35
36
int g_teamplay = 0;
37
38
//=========================================================
39
//=========================================================
40
BOOL CGameRules::CanHaveAmmo( CBasePlayer *pPlayer, const char *pszAmmoName, int iMaxCarry )
41
{
42
int iAmmoIndex;
43
44
if ( pszAmmoName )
45
{
46
iAmmoIndex = pPlayer->GetAmmoIndex( pszAmmoName );
47
48
if ( iAmmoIndex > -1 )
49
{
50
if ( pPlayer->AmmoInventory( iAmmoIndex ) < iMaxCarry )
51
{
52
// player has room for more of this type of ammo
53
return TRUE;
54
}
55
}
56
}
57
58
return FALSE;
59
}
60
61
//=========================================================
62
//=========================================================
63
edict_t *CGameRules :: GetPlayerSpawnSpot( CBasePlayer *pPlayer )
64
{
65
edict_t *pentSpawnSpot = EntSelectSpawnPoint( pPlayer );
66
67
pPlayer->pev->origin = VARS(pentSpawnSpot)->origin + Vector(0,0,1);
68
pPlayer->pev->v_angle = g_vecZero;
69
pPlayer->pev->velocity = g_vecZero;
70
pPlayer->pev->angles = VARS(pentSpawnSpot)->angles;
71
pPlayer->pev->punchangle = g_vecZero;
72
pPlayer->pev->fixangle = TRUE;
73
74
return pentSpawnSpot;
75
}
76
77
//=========================================================
78
//=========================================================
79
BOOL CGameRules::CanHavePlayerItem( CBasePlayer *pPlayer, CBasePlayerItem *pWeapon )
80
{
81
// only living players can have items
82
if ( pPlayer->pev->deadflag != DEAD_NO )
83
return FALSE;
84
85
if ( pWeapon->pszAmmo1() )
86
{
87
if ( !CanHaveAmmo( pPlayer, pWeapon->pszAmmo1(), pWeapon->iMaxAmmo1() ) )
88
{
89
// we can't carry anymore ammo for this gun. We can only
90
// have the gun if we aren't already carrying one of this type
91
if ( pPlayer->HasPlayerItem( pWeapon ) )
92
{
93
return FALSE;
94
}
95
}
96
}
97
else
98
{
99
// weapon doesn't use ammo, don't take another if you already have it.
100
if ( pPlayer->HasPlayerItem( pWeapon ) )
101
{
102
return FALSE;
103
}
104
}
105
106
// note: will fall through to here if GetItemInfo doesn't fill the struct!
107
return TRUE;
108
}
109
110
//=========================================================
111
// load the SkillData struct with the proper values based on the skill level.
112
//=========================================================
113
void CGameRules::RefreshSkillData ( void )
114
{
115
int iSkill;
116
117
iSkill = (int)CVAR_GET_FLOAT("skill");
118
g_iSkillLevel = iSkill;
119
120
if ( iSkill < 1 )
121
{
122
iSkill = 1;
123
}
124
else if ( iSkill > 3 )
125
{
126
iSkill = 3;
127
}
128
129
gSkillData.iSkillLevel = iSkill;
130
131
ALERT ( at_console, "\nGAME SKILL LEVEL:%d\n",iSkill );
132
133
//Agrunt
134
gSkillData.agruntHealth = GetSkillCvar( "sk_agrunt_health" );
135
gSkillData.agruntDmgPunch = GetSkillCvar( "sk_agrunt_dmg_punch");
136
137
// Apache
138
gSkillData.apacheHealth = GetSkillCvar( "sk_apache_health");
139
140
// Barney
141
gSkillData.barneyHealth = GetSkillCvar( "sk_barney_health");
142
143
// Big Momma
144
gSkillData.bigmommaHealthFactor = GetSkillCvar( "sk_bigmomma_health_factor" );
145
gSkillData.bigmommaDmgSlash = GetSkillCvar( "sk_bigmomma_dmg_slash" );
146
gSkillData.bigmommaDmgBlast = GetSkillCvar( "sk_bigmomma_dmg_blast" );
147
gSkillData.bigmommaRadiusBlast = GetSkillCvar( "sk_bigmomma_radius_blast" );
148
149
// Bullsquid
150
gSkillData.bullsquidHealth = GetSkillCvar( "sk_bullsquid_health");
151
gSkillData.bullsquidDmgBite = GetSkillCvar( "sk_bullsquid_dmg_bite");
152
gSkillData.bullsquidDmgWhip = GetSkillCvar( "sk_bullsquid_dmg_whip");
153
gSkillData.bullsquidDmgSpit = GetSkillCvar( "sk_bullsquid_dmg_spit");
154
155
// Gargantua
156
gSkillData.gargantuaHealth = GetSkillCvar( "sk_gargantua_health");
157
gSkillData.gargantuaDmgSlash = GetSkillCvar( "sk_gargantua_dmg_slash");
158
gSkillData.gargantuaDmgFire = GetSkillCvar( "sk_gargantua_dmg_fire");
159
gSkillData.gargantuaDmgStomp = GetSkillCvar( "sk_gargantua_dmg_stomp");
160
161
// Hassassin
162
gSkillData.hassassinHealth = GetSkillCvar( "sk_hassassin_health");
163
164
// Headcrab
165
gSkillData.headcrabHealth = GetSkillCvar( "sk_headcrab_health");
166
gSkillData.headcrabDmgBite = GetSkillCvar( "sk_headcrab_dmg_bite");
167
168
// Hgrunt
169
gSkillData.hgruntHealth = GetSkillCvar( "sk_hgrunt_health");
170
gSkillData.hgruntDmgKick = GetSkillCvar( "sk_hgrunt_kick");
171
gSkillData.hgruntShotgunPellets = GetSkillCvar( "sk_hgrunt_pellets");
172
gSkillData.hgruntGrenadeSpeed = GetSkillCvar( "sk_hgrunt_gspeed");
173
174
// Houndeye
175
gSkillData.houndeyeHealth = GetSkillCvar( "sk_houndeye_health");
176
gSkillData.houndeyeDmgBlast = GetSkillCvar( "sk_houndeye_dmg_blast");
177
178
// ISlave
179
gSkillData.slaveHealth = GetSkillCvar( "sk_islave_health");
180
gSkillData.slaveDmgClaw = GetSkillCvar( "sk_islave_dmg_claw");
181
gSkillData.slaveDmgClawrake = GetSkillCvar( "sk_islave_dmg_clawrake");
182
gSkillData.slaveDmgZap = GetSkillCvar( "sk_islave_dmg_zap");
183
184
// Icthyosaur
185
gSkillData.ichthyosaurHealth = GetSkillCvar( "sk_ichthyosaur_health");
186
gSkillData.ichthyosaurDmgShake = GetSkillCvar( "sk_ichthyosaur_shake");
187
188
// Leech
189
gSkillData.leechHealth = GetSkillCvar( "sk_leech_health");
190
191
gSkillData.leechDmgBite = GetSkillCvar( "sk_leech_dmg_bite");
192
193
// Controller
194
gSkillData.controllerHealth = GetSkillCvar( "sk_controller_health");
195
gSkillData.controllerDmgZap = GetSkillCvar( "sk_controller_dmgzap");
196
gSkillData.controllerSpeedBall = GetSkillCvar( "sk_controller_speedball");
197
gSkillData.controllerDmgBall = GetSkillCvar( "sk_controller_dmgball");
198
199
// Nihilanth
200
gSkillData.nihilanthHealth = GetSkillCvar( "sk_nihilanth_health");
201
gSkillData.nihilanthZap = GetSkillCvar( "sk_nihilanth_zap");
202
203
// Scientist
204
gSkillData.scientistHealth = GetSkillCvar( "sk_scientist_health");
205
206
// Snark
207
gSkillData.snarkHealth = GetSkillCvar( "sk_snark_health");
208
gSkillData.snarkDmgBite = GetSkillCvar( "sk_snark_dmg_bite");
209
gSkillData.snarkDmgPop = GetSkillCvar( "sk_snark_dmg_pop");
210
211
// Zombie
212
gSkillData.zombieHealth = GetSkillCvar( "sk_zombie_health");
213
gSkillData.zombieDmgOneSlash = GetSkillCvar( "sk_zombie_dmg_one_slash");
214
gSkillData.zombieDmgBothSlash = GetSkillCvar( "sk_zombie_dmg_both_slash");
215
216
//Turret
217
gSkillData.turretHealth = GetSkillCvar( "sk_turret_health");
218
219
// MiniTurret
220
gSkillData.miniturretHealth = GetSkillCvar( "sk_miniturret_health");
221
222
// Sentry Turret
223
gSkillData.sentryHealth = GetSkillCvar( "sk_sentry_health");
224
225
// PLAYER WEAPONS
226
227
// Crowbar whack
228
gSkillData.plrDmgCrowbar = GetSkillCvar( "sk_plr_crowbar");
229
230
// Glock Round
231
gSkillData.plrDmg9MM = GetSkillCvar( "sk_plr_9mm_bullet");
232
233
// 357 Round
234
gSkillData.plrDmg357 = GetSkillCvar( "sk_plr_357_bullet");
235
236
// MP5 Round
237
gSkillData.plrDmgMP5 = GetSkillCvar( "sk_plr_9mmAR_bullet");
238
239
// M203 grenade
240
gSkillData.plrDmgM203Grenade = GetSkillCvar( "sk_plr_9mmAR_grenade");
241
242
// Shotgun buckshot
243
gSkillData.plrDmgBuckshot = GetSkillCvar( "sk_plr_buckshot");
244
245
// Crossbow
246
gSkillData.plrDmgCrossbowClient = GetSkillCvar( "sk_plr_xbow_bolt_client");
247
gSkillData.plrDmgCrossbowMonster = GetSkillCvar( "sk_plr_xbow_bolt_monster");
248
249
// RPG
250
gSkillData.plrDmgRPG = GetSkillCvar( "sk_plr_rpg");
251
252
// Gauss gun
253
gSkillData.plrDmgGauss = GetSkillCvar( "sk_plr_gauss");
254
255
// Egon Gun
256
gSkillData.plrDmgEgonNarrow = GetSkillCvar( "sk_plr_egon_narrow");
257
gSkillData.plrDmgEgonWide = GetSkillCvar( "sk_plr_egon_wide");
258
259
// Hand Grendade
260
gSkillData.plrDmgHandGrenade = GetSkillCvar( "sk_plr_hand_grenade");
261
262
// Satchel Charge
263
gSkillData.plrDmgSatchel = GetSkillCvar( "sk_plr_satchel");
264
265
// Tripmine
266
gSkillData.plrDmgTripmine = GetSkillCvar( "sk_plr_tripmine");
267
268
// MONSTER WEAPONS
269
gSkillData.monDmg12MM = GetSkillCvar( "sk_12mm_bullet");
270
gSkillData.monDmgMP5 = GetSkillCvar ("sk_9mmAR_bullet" );
271
gSkillData.monDmg9MM = GetSkillCvar( "sk_9mm_bullet");
272
273
// MONSTER HORNET
274
gSkillData.monDmgHornet = GetSkillCvar( "sk_hornet_dmg");
275
276
// PLAYER HORNET
277
// Up to this point, player hornet damage and monster hornet damage were both using
278
// monDmgHornet to determine how much damage to do. In tuning the hivehand, we now need
279
// to separate player damage and monster hivehand damage. Since it's so late in the project, we've
280
// added plrDmgHornet to the SKILLDATA struct, but not to the engine CVar list, so it's inaccesible
281
// via SKILLS.CFG. Any player hivehand tuning must take place in the code. (sjb)
282
gSkillData.plrDmgHornet = 7;
283
284
285
// HEALTH/CHARGE
286
gSkillData.suitchargerCapacity = GetSkillCvar( "sk_suitcharger" );
287
gSkillData.batteryCapacity = GetSkillCvar( "sk_battery" );
288
gSkillData.healthchargerCapacity = GetSkillCvar ( "sk_healthcharger" );
289
gSkillData.healthkitCapacity = GetSkillCvar ( "sk_healthkit" );
290
gSkillData.scientistHeal = GetSkillCvar ( "sk_scientist_heal" );
291
292
// monster damage adj
293
gSkillData.monHead = GetSkillCvar( "sk_monster_head" );
294
gSkillData.monChest = GetSkillCvar( "sk_monster_chest" );
295
gSkillData.monStomach = GetSkillCvar( "sk_monster_stomach" );
296
gSkillData.monLeg = GetSkillCvar( "sk_monster_leg" );
297
gSkillData.monArm = GetSkillCvar( "sk_monster_arm" );
298
299
// player damage adj
300
gSkillData.plrHead = GetSkillCvar( "sk_player_head" );
301
gSkillData.plrChest = GetSkillCvar( "sk_player_chest" );
302
gSkillData.plrStomach = GetSkillCvar( "sk_player_stomach" );
303
gSkillData.plrLeg = GetSkillCvar( "sk_player_leg" );
304
gSkillData.plrArm = GetSkillCvar( "sk_player_arm" );
305
}
306
307
//=========================================================
308
// instantiate the proper game rules object
309
//=========================================================
310
311
CGameRules *InstallGameRules( void )
312
{
313
SERVER_COMMAND( "exec game.cfg\n" );
314
SERVER_EXECUTE( );
315
316
if ( !gpGlobals->deathmatch )
317
{
318
// generic half-life
319
g_teamplay = 0;
320
return new CHalfLifeRules;
321
}
322
else
323
{
324
if ( teamplay.value > 0 )
325
{
326
// teamplay
327
328
g_teamplay = 1;
329
return new CHalfLifeTeamplay;
330
}
331
if ((int)gpGlobals->deathmatch == 1)
332
{
333
// vanilla deathmatch
334
g_teamplay = 0;
335
return new CHalfLifeMultiplay;
336
}
337
else
338
{
339
// vanilla deathmatch??
340
g_teamplay = 0;
341
return new CHalfLifeMultiplay;
342
}
343
}
344
}
345
346
347