Delay the renaming of CTF entity classnames to after they have fully spawned.
Fix bot spawning a little.
This commit is contained in:
parent
30f372c060
commit
5aa4b76644
3 changed files with 59 additions and 25 deletions
|
@ -14,6 +14,11 @@
|
||||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void CSEv_TeamJoin_f(float teamChoice);
|
||||||
|
void CSEv_ClassJoin_f(float classSelection);
|
||||||
|
void CSEv_JoinAuto(void);
|
||||||
|
|
||||||
void
|
void
|
||||||
OP4CTFRules::OP4CTFRules(void)
|
OP4CTFRules::OP4CTFRules(void)
|
||||||
{
|
{
|
||||||
|
@ -26,8 +31,11 @@ OP4CTFRules::InitPostEnts(void)
|
||||||
forceinfokey(world, "teams", "2");
|
forceinfokey(world, "teams", "2");
|
||||||
forceinfokey(world, "team_1", "Black Mesa");
|
forceinfokey(world, "team_1", "Black Mesa");
|
||||||
forceinfokey(world, "teamscore_1", "0");
|
forceinfokey(world, "teamscore_1", "0");
|
||||||
|
forceinfokey(world, "teamcolor_1", "1 1 0");
|
||||||
forceinfokey(world, "team_2", "Opposing Force");
|
forceinfokey(world, "team_2", "Opposing Force");
|
||||||
forceinfokey(world, "teamscore_2", "0");
|
forceinfokey(world, "teamscore_2", "0");
|
||||||
|
forceinfokey(world, "teamcolor_2", "0 1 0");
|
||||||
|
|
||||||
|
|
||||||
forceinfokey(world, "ctfflag_1", "0");
|
forceinfokey(world, "ctfflag_1", "0");
|
||||||
forceinfokey(world, "ctfflag_2", "0");
|
forceinfokey(world, "ctfflag_2", "0");
|
||||||
|
@ -49,6 +57,10 @@ OP4CTFRules::PlayerConnect(NSClientPlayer pp)
|
||||||
forceinfokey(pp, "*score", "0");
|
forceinfokey(pp, "*score", "0");
|
||||||
forceinfokey(pp, "*icon1", "");
|
forceinfokey(pp, "*icon1", "");
|
||||||
forceinfokey(pp, "*icon2", "");
|
forceinfokey(pp, "*icon2", "");
|
||||||
|
|
||||||
|
if (clienttype(pp) == CLIENTTYPE_BOT) {
|
||||||
|
pp.ScheduleThink(CSEv_JoinAuto, 1.0f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -85,22 +97,9 @@ void CSEv_ClassJoin_f(float);
|
||||||
bool
|
bool
|
||||||
OP4CTFRules::ConsoleCommand(NSClientPlayer pp, string cmd)
|
OP4CTFRules::ConsoleCommand(NSClientPlayer pp, string cmd)
|
||||||
{
|
{
|
||||||
static void OP4CTFRules_BotJoin(void) {
|
|
||||||
float tag = (random() < 0.5) ? 1 : 2;
|
|
||||||
CSEv_TeamJoin_f(tag);
|
|
||||||
CSEv_ClassJoin_f(tag == 1 ? 0 : 13);
|
|
||||||
}
|
|
||||||
|
|
||||||
tokenize(cmd);
|
tokenize(cmd);
|
||||||
|
|
||||||
switch (argv(0)) {
|
switch (argv(0)) {
|
||||||
case "bot_add":
|
|
||||||
entity bot_ent = Bot_AddQuick();
|
|
||||||
if (bot_ent) {
|
|
||||||
bot_ent.think = OP4CTFRules_BotJoin;
|
|
||||||
bot_ent.nextthink = time;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
@ -134,6 +133,12 @@ OP4CTFRules::CharacterSpawn(NSClientPlayer playerEnt, string playerModel)
|
||||||
pl.glock_mag = 18;
|
pl.glock_mag = 18;
|
||||||
pl.ammo_9mm = 44;
|
pl.ammo_9mm = 44;
|
||||||
|
|
||||||
|
/* Just-In-Case (tm) */
|
||||||
|
pl.g_items &= ~ITEM_GOALITEM;
|
||||||
|
pl.flags &= ~FL_GOALITEM;
|
||||||
|
pl.flagmodel = 0;
|
||||||
|
pl.SetInfoKey("*icon1", "");
|
||||||
|
|
||||||
entity spot = Spawn_SelectRandom(strcat("info_ctfspawn_", ftos(pl.team)));
|
entity spot = Spawn_SelectRandom(strcat("info_ctfspawn_", ftos(pl.team)));
|
||||||
pl.Transport(spot.origin, spot.angles);
|
pl.Transport(spot.origin, spot.angles);
|
||||||
Weapons_RefreshAmmo(pl);
|
Weapons_RefreshAmmo(pl);
|
||||||
|
@ -172,7 +177,7 @@ OP4CTFRules::CaptureFlag(NSClientPlayer pp)
|
||||||
enemyFlag = (NSEntity)find(world, ::classname, flagName);
|
enemyFlag = (NSEntity)find(world, ::classname, flagName);
|
||||||
|
|
||||||
if (!enemyFlag) {
|
if (!enemyFlag) {
|
||||||
error("What the hell? There's no flag back there!");
|
NSError("The flag spawnpoint cannot be found.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,7 +214,7 @@ OP4CTFRules::DropFlag(NSClientPlayer pp)
|
||||||
|
|
||||||
/* item is still pick-upable */
|
/* item is still pick-upable */
|
||||||
if (targetFlag.GetSolid() != SOLID_NOT) {
|
if (targetFlag.GetSolid() != SOLID_NOT) {
|
||||||
print("the item is not picked up. \n");
|
NSLog("the item is not picked up.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,7 +225,7 @@ OP4CTFRules::DropFlag(NSClientPlayer pp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
print("^1WARNING: ^7Player marked as having impossible goal-item\n");
|
NSWarning("Player marked as having impossible goal-item.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -292,7 +297,7 @@ CSEv_ClassJoin_f(float classSelection)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (playerModel == "") {
|
if (playerModel == "") {
|
||||||
error("invalid model selection, erroring out");
|
NSError("invalid model selection, erroring out");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if we're alive, kill them (we need to drop the flag anyhow */
|
/* if we're alive, kill them (we need to drop the flag anyhow */
|
||||||
|
@ -302,4 +307,12 @@ CSEv_ClassJoin_f(float classSelection)
|
||||||
} else {
|
} else {
|
||||||
rule.CharacterSpawn((NSClientPlayer)self, playerModel);
|
rule.CharacterSpawn((NSClientPlayer)self, playerModel);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CSEv_JoinAuto(void)
|
||||||
|
{
|
||||||
|
float teamChoice = random() < 0.5 ? 1 : 2;
|
||||||
|
CSEv_TeamJoin_f(teamChoice);
|
||||||
|
CSEv_ClassJoin_f(teamChoice == 1 ? 0 : 13);
|
||||||
}
|
}
|
|
@ -32,6 +32,8 @@ info_ctfspawn:NSEntity
|
||||||
|
|
||||||
virtual void Respawn(void);
|
virtual void Respawn(void);
|
||||||
virtual void SpawnKey(string, string);
|
virtual void SpawnKey(string, string);
|
||||||
|
|
||||||
|
nonvirtual void _AfterSpawn(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -52,11 +54,16 @@ info_ctfspawn::SpawnKey(string strKey, string strValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
info_ctfspawn::_AfterSpawn(void)
|
||||||
|
{
|
||||||
|
classname = strcat("info_ctfspawn_", ftos(team));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
info_ctfspawn::Respawn(void)
|
info_ctfspawn::Respawn(void)
|
||||||
{
|
{
|
||||||
SetOrigin(GetSpawnOrigin());
|
SetOrigin(GetSpawnOrigin());
|
||||||
SetSolid(SOLID_NOT);
|
SetSolid(SOLID_NOT);
|
||||||
|
ScheduleThink(_AfterSpawn, 0.0f);
|
||||||
classname = strcat("info_ctfspawn_", ftos(team));
|
|
||||||
}
|
}
|
|
@ -44,6 +44,7 @@ class item_ctfflag:OP4CTFItem
|
||||||
nonvirtual void FlagTaken(void);
|
nonvirtual void FlagTaken(void);
|
||||||
nonvirtual void FlagDrop(NSClientPlayer);
|
nonvirtual void FlagDrop(NSClientPlayer);
|
||||||
nonvirtual void FlagReturns(void);
|
nonvirtual void FlagReturns(void);
|
||||||
|
nonvirtual void _AfterSpawn(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -52,6 +53,12 @@ item_ctfflag::item_ctfflag(void)
|
||||||
m_eActivator = __NULL__;
|
m_eActivator = __NULL__;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
item_ctfflag::_AfterSpawn(void)
|
||||||
|
{
|
||||||
|
classname = strcat("info_ctfflag_", ftos(m_iTeamID));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
item_ctfflag::Respawn(void)
|
item_ctfflag::Respawn(void)
|
||||||
{
|
{
|
||||||
|
@ -64,10 +71,10 @@ item_ctfflag::Respawn(void)
|
||||||
|
|
||||||
botinfo = BOTINFO_TEAM_GOALITEM;
|
botinfo = BOTINFO_TEAM_GOALITEM;
|
||||||
|
|
||||||
classname = strcat("info_ctfflag_", ftos(m_iTeamID));
|
|
||||||
forceinfokey(world, strcat("ctfflag_", ftos(m_iTeamID)), ftos(CTFFLAG_IDLE));
|
forceinfokey(world, strcat("ctfflag_", ftos(m_iTeamID)), ftos(CTFFLAG_IDLE));
|
||||||
m_eActivator = __NULL__;
|
m_eActivator = __NULL__;
|
||||||
team = m_iTeamID;
|
team = m_iTeamID;
|
||||||
|
ScheduleThink(_AfterSpawn, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -80,12 +87,18 @@ item_ctfflag::Touch(entity eToucher)
|
||||||
if (eToucher.team == 0)
|
if (eToucher.team == 0)
|
||||||
return;
|
return;
|
||||||
if (eToucher.team == m_iTeamID) {
|
if (eToucher.team == m_iTeamID) {
|
||||||
if (m_eActivator == __NULL__) /* only on flags that haven't been dropped */
|
if (m_eActivator == __NULL__) { /* only on flags that haven't been dropped */
|
||||||
if (pl.g_items & ITEM_GOALITEM) {
|
if (pl.g_items & ITEM_GOALITEM) {
|
||||||
OP4CTFRules rule = (OP4CTFRules)g_grMode;
|
OP4CTFRules rule = (OP4CTFRules)g_grMode;
|
||||||
rule.CaptureFlag((NSClientPlayer)pl);
|
rule.CaptureFlag((NSClientPlayer)pl);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
/* return the flag, give 1 point */
|
||||||
|
FlagReturns();
|
||||||
|
pl.score += 1;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_eActivator = pl;
|
m_eActivator = pl;
|
||||||
|
@ -137,6 +150,7 @@ item_ctfflag::FlagDrop(NSClientPlayer pp)
|
||||||
pl.flagmodel = 0;
|
pl.flagmodel = 0;
|
||||||
m_eActivator = pp; /* to mark that who this was dropped by */
|
m_eActivator = pp; /* to mark that who this was dropped by */
|
||||||
forceinfokey(world, strcat("ctfflag_", ftos(m_iTeamID)), ftos(CTFFlAG_MISSING));
|
forceinfokey(world, strcat("ctfflag_", ftos(m_iTeamID)), ftos(CTFFlAG_MISSING));
|
||||||
|
forceinfokey(pl, "*icon1", "");
|
||||||
|
|
||||||
/* return after N secs */
|
/* return after N secs */
|
||||||
ScheduleThink(FlagReturns, 30.0f);
|
ScheduleThink(FlagReturns, 30.0f);
|
||||||
|
|
Loading…
Reference in a new issue