mirror of
https://git.code.sf.net/p/quake/game-source
synced 2024-11-29 15:12:00 +00:00
264 lines
5.2 KiB
C++
264 lines
5.2 KiB
C++
#include "common.qh"
|
|
|
|
#include "misc.qh"
|
|
#include "override.qh"
|
|
|
|
#include "mapents.qh"
|
|
|
|
#include "mdl.qh"
|
|
#include "mdl_player.qh"
|
|
#include "mdl_void.qh"
|
|
|
|
#include "act_player.qh"
|
|
#include "act_dead.qh"
|
|
|
|
#include "equip.qh"
|
|
#include "items.qh"
|
|
#include "menu.qh"
|
|
|
|
#include "weapon.qh"
|
|
#include "server.qh"
|
|
#include "damage.qh"
|
|
|
|
#include "teleport.qh"
|
|
|
|
void ()
|
|
client_init =
|
|
{
|
|
precache_model ("progs/player.mdl");
|
|
precache_model ("progs/eyes.mdl");
|
|
};
|
|
|
|
// This is the first function called by C code for a new player.
|
|
void ()
|
|
SetNewParms =
|
|
{
|
|
parm1 = CONFIG_START_CURRENCY;
|
|
|
|
parm2 = parm3 = parm4 = parm5 = 0;
|
|
|
|
parm6 = CONFIG_START_HEALTH + CONFIG_START_ARMOR * 999;
|
|
parm7 = CONFIG_START_ARMOR_TYPE;
|
|
parm8 = CONFIG_MAX_HEALTH + CONFIG_MAX_ARMOR * 999;
|
|
|
|
parm9 = CONFIG_START_SHELLS + CONFIG_START_NAILS * 999;
|
|
parm10 = CONFIG_START_ROCKETS + CONFIG_START_CELLS * 999;
|
|
parm11 = CONFIG_MAX_SHELLS + CONFIG_MAX_NAILS * 999;
|
|
parm12 = CONFIG_MAX_ROCKETS + CONFIG_MAX_CELLS * 999;
|
|
|
|
parm15 = weapon_player_parm1_default ();
|
|
parm16 = EQUIP_STATE_CHOOSE;
|
|
};
|
|
|
|
void ()
|
|
SetDeadParms =
|
|
{
|
|
SetNewParms();
|
|
};
|
|
|
|
// Called when about to change maps
|
|
void ()
|
|
SetChangeParms =
|
|
{
|
|
/* Currency */
|
|
parm1 = self.currency;
|
|
|
|
/* Purchased items */
|
|
parm2 = self.itemfield_1;
|
|
parm3 = self.itemfield_2;
|
|
parm4 = self.itemfield_3;
|
|
parm5 = self.itemfield_4;
|
|
|
|
/* Health and such */
|
|
if (self.health < 0)
|
|
self.health = 0;
|
|
|
|
parm6 = self.health + self.armorvalue * 999;
|
|
parm7 = self.armortype;
|
|
parm8 = self.max_health + self.max_armor * 999;
|
|
|
|
/* Ammo */
|
|
parm9 = self.ammo_shells + self.ammo_nails * 999;
|
|
parm10 = self.ammo_rockets + self.ammo_cells * 999;
|
|
parm11 = self.max_ammo_shells + self.max_ammo_nails * 999;
|
|
parm12 = self.max_ammo_rockets + self.max_ammo_cells * 999;
|
|
|
|
/* Wheeee */
|
|
parm15 = weapon_player_parm1 ();
|
|
parm16 = self.equip_state;
|
|
|
|
/* H4x0r */
|
|
if (self.deadflag)
|
|
SetDeadParms ();
|
|
};
|
|
|
|
void ()
|
|
DecodeParms =
|
|
{
|
|
/* Currency */
|
|
self.currency = parm1;
|
|
|
|
/* Purchased items */
|
|
self.itemfield_1 = parm2;
|
|
self.itemfield_2 = parm3;
|
|
self.itemfield_3 = parm4;
|
|
self.itemfield_4 = parm5;
|
|
|
|
equip_grant(self, EQUIPID_SHOTGUN);
|
|
|
|
/* Health and such */
|
|
self.armorvalue = floor (parm6 / 999);
|
|
self.armortype = parm7;
|
|
|
|
self.health = parm6 - self.armorvalue * 999;
|
|
|
|
self.max_armor = floor (parm8 / 999);
|
|
self.max_health = parm8 - self.max_armor * 999;
|
|
|
|
/* Ammo */
|
|
self.ammo_nails = floor (parm9 / 999);
|
|
self.ammo_shells = parm9 - self.ammo_nails * 999;
|
|
|
|
self.ammo_rockets = floor (parm10 / 999);
|
|
self.ammo_cells = parm10 - self.ammo_rockets * 999;
|
|
|
|
self.max_ammo_nails = floor (parm11 / 999);
|
|
self.max_ammo_shells = parm11 - self.max_ammo_nails * 999;
|
|
|
|
self.max_ammo_rockets = floor (parm12 / 999);
|
|
self.max_ammo_cells = parm12 - self.max_ammo_rockets * 999;
|
|
|
|
/* Wheeee */
|
|
weapon_player_parm1_decode (parm15);
|
|
self.equip_state = parm16;
|
|
|
|
SetDeadParms ();
|
|
};
|
|
|
|
void ()
|
|
RemoveClientFromGame =
|
|
{
|
|
self.classname = "player_outofgame";
|
|
mdl_setup_void ();
|
|
act_setup_dead ();
|
|
};
|
|
|
|
void ()
|
|
PutClientInGame =
|
|
{
|
|
local entity ent;
|
|
local float spawncount;
|
|
|
|
menu_set (NOTHING_function);
|
|
|
|
self.classname = "player";
|
|
|
|
DecodeParms ();
|
|
|
|
mdl_setup_player ();
|
|
act_setup_player ();
|
|
|
|
self.velocity = '0 0 0';
|
|
self.flags &= ~FL_INWATER;
|
|
|
|
/* FIXME: Hack to avoid jumping on spawn.... */
|
|
self.velocity_z = -270;
|
|
|
|
/* Select a spawn point.. */
|
|
for (spawncount = 5; spawncount > 0; spawncount--) {
|
|
spawn_head = random_enemy_chain (spawn_head);
|
|
ent = findradius (spawn_head.origin, 100);
|
|
while (ent) {
|
|
if (ent.classname == "player")
|
|
break;
|
|
ent = ent.chain;
|
|
}
|
|
|
|
if (!ent)
|
|
break;
|
|
}
|
|
|
|
teleport (self, spawn_head);
|
|
};
|
|
|
|
// Called right after ClientConnect, and on new maps.
|
|
void ()
|
|
PutClientInServer =
|
|
{
|
|
local entity spot;
|
|
|
|
/* Hack to get pmodel for servers that check it */
|
|
self.model = "progs/player.mdl";
|
|
self.modelindex = 0;
|
|
|
|
intermission_head = spot = random_enemy_chain (intermission_head);
|
|
self.origin = spot.origin;
|
|
self.angles = spot.angles;
|
|
self.fixangle = TRUE;
|
|
|
|
self.velocity = '0 0 0';
|
|
|
|
weapon_player_init ();
|
|
|
|
menu_set (menu_intro);
|
|
|
|
RemoveClientFromGame ();
|
|
};
|
|
|
|
void ()
|
|
_deathmsg_suicide =
|
|
{
|
|
local float r;
|
|
local string nname;
|
|
|
|
nname = name (self);
|
|
|
|
r = random();
|
|
if (r < 0.25)
|
|
bprint (PRINT_DEATH, nname, " says good bye to this cruel world.\n");
|
|
else if (r < 0.5)
|
|
bprint (PRINT_DEATH, nname, " takes the easy way out.\n");
|
|
else if (r < 0.75)
|
|
bprint (PRINT_DEATH, nname, " suicides.\n");
|
|
else
|
|
bprint (PRINT_DEATH, nname,
|
|
" stands at the wrong end of his shotgun.\n");
|
|
};
|
|
|
|
// C Code calls this when the player issues a 'kill' command.
|
|
void ()
|
|
ClientKill = {
|
|
damage (self, self, self, DAMAGE_MUSTDIE, _deathmsg_suicide);
|
|
};
|
|
|
|
void ()
|
|
_client_th_kill =
|
|
{
|
|
if (other == self)
|
|
self.frags--;
|
|
else
|
|
self.frags++;
|
|
logfrag (self, other);
|
|
};
|
|
|
|
// Called after the client is fully connected
|
|
void ()
|
|
ClientConnect = {
|
|
bprint (PRINT_HIGH, name (self), " connected\n");
|
|
self.flags |= FL_CLIENT;
|
|
|
|
override_set_th_kill (self, _client_th_kill);
|
|
};
|
|
|
|
// Called when the client disconnects
|
|
void ()
|
|
ClientDisconnect =
|
|
{
|
|
self.flags = 0;
|
|
bprint (PRINT_HIGH, name(self), " disconnected with ", ftos(self.frags),
|
|
" frags\n");
|
|
|
|
override_set_th_kill (self, NOTHING_function);
|
|
self.deathmsg1 = NIL;
|
|
damage (self, self, self, DAMAGE_MUSTDIE, NOTHING_function);
|
|
};
|