Added some primitive building commands for the engineer...
This commit is contained in:
parent
38b5fc6cc3
commit
fad9e10a95
10 changed files with 431 additions and 1 deletions
43
src/client/cmds.qc
Normal file
43
src/client/cmds.qc
Normal file
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Copyright (c) 2016-2020 Marco Cawthorne <marco@icculus.org>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
int
|
||||
ClientGame_ConsoleCommand(void)
|
||||
{
|
||||
switch(argv(0)) {
|
||||
case "build":
|
||||
int type = stoi(argv(1));
|
||||
|
||||
switch (type) {
|
||||
case 1:
|
||||
sendevent("TFC_BuildDispenser", "");
|
||||
break;
|
||||
case 2:
|
||||
sendevent("TFC_BuildSentry", "");
|
||||
break;
|
||||
case 4:
|
||||
sendevent("TFC_BuildTele", "");
|
||||
break;
|
||||
case 5:
|
||||
sendevent("TFC_BuildTeleExit", "");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return (0);
|
||||
}
|
||||
return (1);
|
||||
}
|
|
@ -24,6 +24,7 @@ Comparable to worldspawn in SSQC in that it's mostly used for precaches
|
|||
void
|
||||
ClientGame_Init(float apilevel, string enginename, float engineversion)
|
||||
{
|
||||
registercommand("build");
|
||||
Obituary_Init();
|
||||
}
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ init.qc
|
|||
../../../valve/src/client/flashlight.qc
|
||||
../../../valve/src/client/player.qc
|
||||
entities.qc
|
||||
../../../valve/src/client/cmds.qc
|
||||
cmds.qc
|
||||
game_event.qc
|
||||
../../../valve/src/client/camera.qc
|
||||
../../../valve/src/client/viewmodel.qc
|
||||
|
|
75
src/server/dispencer.qc
Normal file
75
src/server/dispencer.qc
Normal file
|
@ -0,0 +1,75 @@
|
|||
|
||||
#define TFC_SENTRY_COST 130
|
||||
|
||||
class
|
||||
TFCSentry:NSSurfacePropEntity
|
||||
{
|
||||
NSSurfacePropEntity m_eHead;
|
||||
|
||||
void(void) TFCSentry;
|
||||
|
||||
virtual void(player) Place;
|
||||
virtual void(void) FinishPlacing;
|
||||
};
|
||||
|
||||
void
|
||||
TFCSentry::Place(player pl)
|
||||
{
|
||||
SetAngles(pl.GetAngles());
|
||||
|
||||
makevectors([0, pl.v_angle[1], 0]);
|
||||
SetOrigin(pl.origin + (v_forward * 48));
|
||||
DropToFloor();
|
||||
|
||||
think = FinishPlacing;
|
||||
nextthink = time + 5.0f;
|
||||
real_owner = pl;
|
||||
|
||||
env_message_single(real_owner, "#Engineer_building");
|
||||
Sound_Play(this, CHAN_BODY, "engineer.build");
|
||||
}
|
||||
|
||||
void
|
||||
TFCSentry::FinishPlacing(void)
|
||||
{
|
||||
/* put the top on that spins */
|
||||
m_eHead.SetModel("models/sentry1.mdl");
|
||||
m_eHead.SetAngles(GetAngles());
|
||||
m_eHead.SetSolid(SOLID_BBOX);
|
||||
m_eHead.SetMovetype(MOVETYPE_NONE);
|
||||
m_eHead.SetSize([-16,-16,0], [16,16,32]);
|
||||
m_eHead.SetOrigin(GetOrigin() + [0,0,20]);
|
||||
|
||||
env_message_single(real_owner, "#Sentry_finish");
|
||||
Sound_Play(this, CHAN_BODY, "engineer.turret_set");
|
||||
}
|
||||
|
||||
void
|
||||
TFCSentry::TFCSentry(void)
|
||||
{
|
||||
m_eHead = spawn(NSSurfacePropEntity);
|
||||
SetModel("models/base.mdl");
|
||||
SetSolid(SOLID_BBOX);
|
||||
SetMovetype(MOVETYPE_NONE);
|
||||
SetSize([-16,-16,0], [16,16,20]);
|
||||
}
|
||||
|
||||
void
|
||||
CSEv_TFC_BuildSentry_(void)
|
||||
{
|
||||
player pl = (player)self;
|
||||
|
||||
/* only engineers can do this */
|
||||
if (pl.classtype != CLASS_ENGINEER)
|
||||
return;
|
||||
|
||||
/* it costs */
|
||||
if (pl.m_iAmmoCells < TFC_SENTRY_COST)
|
||||
return;
|
||||
|
||||
pl.m_iAmmoCells -= TFC_SENTRY_COST;
|
||||
|
||||
/* deploy */
|
||||
TFCSentry sentry = spawn(TFCSentry);
|
||||
sentry.Place(pl);
|
||||
}
|
66
src/server/dispenser.qc
Normal file
66
src/server/dispenser.qc
Normal file
|
@ -0,0 +1,66 @@
|
|||
|
||||
#define TFC_DISPENSER_COST 100
|
||||
|
||||
class
|
||||
TFCDispenser:NSSurfacePropEntity
|
||||
{
|
||||
|
||||
void(void) TFCDispenser;
|
||||
|
||||
virtual void(player) Place;
|
||||
virtual void(void) FinishPlacing;
|
||||
};
|
||||
|
||||
void
|
||||
TFCDispenser::Place(player pl)
|
||||
{
|
||||
SetAngles(pl.GetAngles());
|
||||
|
||||
makevectors([0, pl.v_angle[1], 0]);
|
||||
SetOrigin(pl.origin + (v_forward * 48));
|
||||
DropToFloor();
|
||||
|
||||
think = FinishPlacing;
|
||||
nextthink = time + 5.0f;
|
||||
real_owner = pl;
|
||||
colormap = pl.colormap;
|
||||
|
||||
env_message_single(real_owner, "#Engineer_building");
|
||||
Sound_Play(this, CHAN_BODY, "engineer.build");
|
||||
}
|
||||
|
||||
void
|
||||
TFCDispenser::FinishPlacing(void)
|
||||
{
|
||||
env_message_single(real_owner, "#Dispenser_finish");
|
||||
Sound_Play(this, CHAN_BODY, "engineer.turret_set");
|
||||
}
|
||||
|
||||
void
|
||||
TFCDispenser::TFCDispenser(void)
|
||||
{
|
||||
SetModel("models/dispenser.mdl");
|
||||
SetSolid(SOLID_BBOX);
|
||||
SetMovetype(MOVETYPE_NONE);
|
||||
SetSize([-16,-16,0], [16,16,48]);
|
||||
}
|
||||
|
||||
void
|
||||
CSEv_TFC_BuildDispenser_(void)
|
||||
{
|
||||
player pl = (player)self;
|
||||
|
||||
/* only engineers can do this */
|
||||
if (pl.classtype != CLASS_ENGINEER)
|
||||
return;
|
||||
|
||||
/* it costs */
|
||||
if (pl.m_iAmmoCells < TFC_DISPENSER_COST)
|
||||
return;
|
||||
|
||||
pl.m_iAmmoCells -= TFC_DISPENSER_COST;
|
||||
|
||||
/* deploy */
|
||||
TFCDispenser dispenser = spawn(TFCDispenser);
|
||||
dispenser.Place(pl);
|
||||
}
|
|
@ -22,6 +22,10 @@ defs.h
|
|||
../../../valve/src/server/player.qc
|
||||
../../../valve/src/server/spectator.qc
|
||||
|
||||
dispenser.qc
|
||||
sentry.qc
|
||||
teleporter.qc
|
||||
|
||||
vox.qc
|
||||
../../../valve/src/server/items.qc
|
||||
info_player_teamspawn.qc
|
||||
|
|
76
src/server/sentry.qc
Normal file
76
src/server/sentry.qc
Normal file
|
@ -0,0 +1,76 @@
|
|||
|
||||
#define TFC_SENTRY_COST 130
|
||||
|
||||
class
|
||||
TFCSentry:NSSurfacePropEntity
|
||||
{
|
||||
NSSurfacePropEntity m_eHead;
|
||||
|
||||
void(void) TFCSentry;
|
||||
|
||||
virtual void(player) Place;
|
||||
virtual void(void) FinishPlacing;
|
||||
};
|
||||
|
||||
void
|
||||
TFCSentry::Place(player pl)
|
||||
{
|
||||
SetAngles(pl.GetAngles());
|
||||
|
||||
makevectors([0, pl.v_angle[1], 0]);
|
||||
SetOrigin(pl.origin + (v_forward * 48));
|
||||
DropToFloor();
|
||||
|
||||
think = FinishPlacing;
|
||||
nextthink = time + 5.0f;
|
||||
real_owner = pl;
|
||||
colormap = pl.colormap;
|
||||
|
||||
env_message_single(real_owner, "#Engineer_building");
|
||||
Sound_Play(this, CHAN_BODY, "engineer.build");
|
||||
}
|
||||
|
||||
void
|
||||
TFCSentry::FinishPlacing(void)
|
||||
{
|
||||
/* put the top on that spins */
|
||||
m_eHead.SetModel("models/sentry1.mdl");
|
||||
m_eHead.SetAngles(GetAngles());
|
||||
m_eHead.SetSolid(SOLID_BBOX);
|
||||
m_eHead.SetMovetype(MOVETYPE_NONE);
|
||||
m_eHead.SetSize([-16,-16,0], [16,16,32]);
|
||||
m_eHead.SetOrigin(GetOrigin() + [0,0,20]);
|
||||
|
||||
env_message_single(real_owner, "#Sentry_finish");
|
||||
Sound_Play(this, CHAN_BODY, "engineer.turret_set");
|
||||
}
|
||||
|
||||
void
|
||||
TFCSentry::TFCSentry(void)
|
||||
{
|
||||
m_eHead = spawn(NSSurfacePropEntity);
|
||||
SetModel("models/base.mdl");
|
||||
SetSolid(SOLID_BBOX);
|
||||
SetMovetype(MOVETYPE_NONE);
|
||||
SetSize([-16,-16,0], [16,16,20]);
|
||||
}
|
||||
|
||||
void
|
||||
CSEv_TFC_BuildSentry_(void)
|
||||
{
|
||||
player pl = (player)self;
|
||||
|
||||
/* only engineers can do this */
|
||||
if (pl.classtype != CLASS_ENGINEER)
|
||||
return;
|
||||
|
||||
/* it costs */
|
||||
if (pl.m_iAmmoCells < TFC_SENTRY_COST)
|
||||
return;
|
||||
|
||||
pl.m_iAmmoCells -= TFC_SENTRY_COST;
|
||||
|
||||
/* deploy */
|
||||
TFCSentry sentry = spawn(TFCSentry);
|
||||
sentry.Place(pl);
|
||||
}
|
|
@ -29,6 +29,8 @@ Game_Worldspawn(void)
|
|||
Sound_Precache("player.lightfall");
|
||||
Sound_Precache("player_tfc.death");
|
||||
Sound_Precache("player_tfc.jump");
|
||||
Sound_Precache("engineer.build");
|
||||
Sound_Precache("engineer.turret_set");
|
||||
|
||||
precache_model("models/player.mdl");
|
||||
precache_model("models/w_weaponbox.mdl");
|
||||
|
|
153
src/server/teleporter.qc
Normal file
153
src/server/teleporter.qc
Normal file
|
@ -0,0 +1,153 @@
|
|||
|
||||
#define TFC_TELEPORTER_COST 125
|
||||
|
||||
/* main teleporter */
|
||||
class
|
||||
TFCTeleporter:NSSurfacePropEntity
|
||||
{
|
||||
float m_flNextTeleport;
|
||||
|
||||
void(void) TFCTeleporter;
|
||||
|
||||
virtual void(player) Place;
|
||||
virtual void(void) FinishPlacing;
|
||||
virtual void(entity) Touch;
|
||||
};
|
||||
|
||||
void
|
||||
TFCTeleporter::Touch(entity eToucher)
|
||||
{
|
||||
if (eToucher.team != real_owner.team)
|
||||
return;
|
||||
|
||||
if (m_flNextTeleport > time)
|
||||
return;
|
||||
|
||||
TFCTeleporter target = world;
|
||||
string exitname;
|
||||
|
||||
if (classname == "TFCTeleporter")
|
||||
exitname = "TFCTeleporterExit";
|
||||
else
|
||||
return;
|
||||
|
||||
/* loop through all exits */
|
||||
for (entity e = world; (e = find(e, ::classname, exitname));) {
|
||||
/* if it's not places by our owner... */
|
||||
if (e.real_owner != real_owner)
|
||||
continue;
|
||||
|
||||
target = (TFCTeleporter)e;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
/* teleport our player */
|
||||
setorigin(eToucher, target.origin + [0,0,32]);
|
||||
|
||||
/* if the teleport was successful, make them unusable for 2.5 secs */
|
||||
target.m_flNextTeleport = m_flNextTeleport = time + 2.5f;
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
TFCTeleporter::Place(player pl)
|
||||
{
|
||||
SetAngles(pl.GetAngles());
|
||||
|
||||
makevectors([0, pl.v_angle[1], 0]);
|
||||
SetOrigin(pl.origin + (v_forward * 48));
|
||||
DropToFloor();
|
||||
|
||||
think = FinishPlacing;
|
||||
nextthink = time + 5.0f;
|
||||
real_owner = pl;
|
||||
colormap = pl.colormap;
|
||||
|
||||
env_message_single(real_owner, "#Engineer_building");
|
||||
Sound_Play(this, CHAN_BODY, "engineer.build");
|
||||
}
|
||||
|
||||
void
|
||||
TFCTeleporter::FinishPlacing(void)
|
||||
{
|
||||
env_message_single(real_owner, "You built the entrance, sonny!");
|
||||
Sound_Play(this, CHAN_BODY, "engineer.turret_set");
|
||||
}
|
||||
|
||||
void
|
||||
TFCTeleporter::TFCTeleporter(void)
|
||||
{
|
||||
SetModel("models/dispenser.mdl");
|
||||
SetSolid(SOLID_TRIGGER);
|
||||
SetMovetype(MOVETYPE_NONE);
|
||||
SetSize([-16,-16,0], [16,16,48]);
|
||||
}
|
||||
|
||||
|
||||
/* exit only */
|
||||
class
|
||||
TFCTeleporterExit:TFCTeleporter
|
||||
{
|
||||
void(void) TFCTeleporterExit;
|
||||
virtual void(void) FinishPlacing;
|
||||
};
|
||||
|
||||
void
|
||||
TFCTeleporterExit::FinishPlacing(void)
|
||||
{
|
||||
env_message_single(real_owner, "You built the exit, sonny!");
|
||||
Sound_Play(this, CHAN_BODY, "engineer.turret_set");
|
||||
}
|
||||
|
||||
void
|
||||
TFCTeleporterExit::TFCTeleporterExit(void)
|
||||
{
|
||||
SetModel("models/dispenser.mdl");
|
||||
SetSolid(SOLID_TRIGGER);
|
||||
SetMovetype(MOVETYPE_NONE);
|
||||
SetSize([-16,-16,0], [16,16,48]);
|
||||
}
|
||||
|
||||
void
|
||||
CSEv_TFC_BuildTele_(void)
|
||||
{
|
||||
player pl = (player)self;
|
||||
|
||||
/* only engineers can do this */
|
||||
if (pl.classtype != CLASS_ENGINEER)
|
||||
return;
|
||||
|
||||
/* it costs */
|
||||
if (pl.m_iAmmoCells < TFC_TELEPORTER_COST)
|
||||
return;
|
||||
|
||||
pl.m_iAmmoCells -= TFC_TELEPORTER_COST;
|
||||
|
||||
/* deploy */
|
||||
TFCTeleporter start = spawn(TFCTeleporter);
|
||||
start.Place(pl);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CSEv_TFC_BuildTeleExit_(void)
|
||||
{
|
||||
player pl = (player)self;
|
||||
|
||||
/* only engineers can do this */
|
||||
if (pl.classtype != CLASS_ENGINEER)
|
||||
return;
|
||||
|
||||
/* it costs */
|
||||
if (pl.m_iAmmoCells < TFC_TELEPORTER_COST)
|
||||
return;
|
||||
|
||||
pl.m_iAmmoCells -= TFC_TELEPORTER_COST;
|
||||
|
||||
/* deploy */
|
||||
TFCTeleporterExit end = spawn(TFCTeleporterExit);
|
||||
end.Place(pl);
|
||||
}
|
|
@ -17,3 +17,13 @@ weapon_sbs.reload
|
|||
{
|
||||
sample weapons/reload3.wav
|
||||
}
|
||||
|
||||
engineer.build
|
||||
{
|
||||
sample weapons/building.wav
|
||||
}
|
||||
|
||||
engineer.turret_set
|
||||
{
|
||||
sample weapons/turrset.wav
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue