Server: streamline gamerule progs interface
This commit is contained in:
parent
967ac0145b
commit
2db52608b1
9 changed files with 145 additions and 351 deletions
|
@ -90,12 +90,6 @@ public:
|
||||||
virtual int MaxItemPerSlot(int);
|
virtual int MaxItemPerSlot(int);
|
||||||
/** Overridable: Returns if NSMonster or NSTalkMonster entities can spawn. */
|
/** Overridable: Returns if NSMonster or NSTalkMonster entities can spawn. */
|
||||||
virtual bool MonstersSpawn(void);
|
virtual bool MonstersSpawn(void);
|
||||||
/** Overridable: shim to handle application of direct damage. */
|
|
||||||
nonvirtual void DamageApply(entity,entity,float,int,damageType_t);
|
|
||||||
/** Checks if an entity can be attacked from a given position. */
|
|
||||||
nonvirtual bool DamageCheckTrace(entity,vector);
|
|
||||||
/** Overridable: shim to handle application of indirect radius damage. */
|
|
||||||
nonvirtual void DamageRadius(vector,entity,float,float,bool,int);
|
|
||||||
|
|
||||||
/* end of a game */
|
/* end of a game */
|
||||||
/** Called when intermission starts. Will send all current players to the intermission screen. */
|
/** Called when intermission starts. Will send all current players to the intermission screen. */
|
||||||
|
@ -147,3 +141,4 @@ private:
|
||||||
NSGameRules g_grMode;
|
NSGameRules g_grMode;
|
||||||
|
|
||||||
#define CGameRules NSGameRules
|
#define CGameRules NSGameRules
|
||||||
|
#define RULEMAP(x, y, z) x.y = externvalue(x.m_ruleProgs, z); if (!x.y) { x.y = NSGameRules::y; }
|
||||||
|
|
|
@ -18,10 +18,24 @@ var bool autocvar_sv_friendlyFire = false;
|
||||||
var int autocvar_mp_td_dmgToKick = 300i;
|
var int autocvar_mp_td_dmgToKick = 300i;
|
||||||
var int autocvar_mp_td_dmgToWarn = 200i;
|
var int autocvar_mp_td_dmgToWarn = 200i;
|
||||||
|
|
||||||
|
#warning NSGameRule progs need to have their functions cached for speed reasons
|
||||||
|
|
||||||
void
|
void
|
||||||
NSGameRules::NSGameRules(void)
|
NSGameRules::NSGameRules(void)
|
||||||
{
|
{
|
||||||
forceinfokey(world, "teamplay", "0");
|
forceinfokey(world, "teams", "");
|
||||||
|
forceinfokey(world, "teamplay", "");
|
||||||
|
forceinfokey(world, "coop", "");
|
||||||
|
|
||||||
|
/* clean up... */
|
||||||
|
for (int teamID = 1; teamID < 1000; teamID++) {
|
||||||
|
forceinfokey(world, sprintf("team_%i", teamID), "");
|
||||||
|
forceinfokey(world, sprintf("teamscore_%i", teamID), "");
|
||||||
|
forceinfokey(world, sprintf("teamcolor_%i", teamID), "");
|
||||||
|
forceinfokey(world, sprintf("teamclosed_%i", teamID), "");
|
||||||
|
forceinfokey(world, sprintf("teamspawn_%i", teamID), "");
|
||||||
|
}
|
||||||
|
|
||||||
forceinfokey(world, sprintf("teamspawn_%d", TEAM_CONNECTING), "");
|
forceinfokey(world, sprintf("teamspawn_%d", TEAM_CONNECTING), "");
|
||||||
forceinfokey(world, sprintf("teamspawn_%d", TEAM_UNASSIGNED), "info_player_start");
|
forceinfokey(world, sprintf("teamspawn_%d", TEAM_UNASSIGNED), "info_player_start");
|
||||||
forceinfokey(world, sprintf("teamspawn_%d", TEAM_SPECTATOR), "info_spectator_start");
|
forceinfokey(world, sprintf("teamspawn_%d", TEAM_SPECTATOR), "info_spectator_start");
|
||||||
|
@ -55,7 +69,6 @@ NSGameRules::Restore(string strKey, string strValue)
|
||||||
void
|
void
|
||||||
NSGameRules::Input(entity eAct, string strInput, string strData)
|
NSGameRules::Input(entity eAct, string strInput, string strData)
|
||||||
{
|
{
|
||||||
RuleC_CallInput(m_ruleProgs, eAct, strInput, strData);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -69,21 +82,13 @@ NSGameRules::RestoreComplete(void)
|
||||||
void
|
void
|
||||||
NSGameRules::InitPostEnts(void)
|
NSGameRules::InitPostEnts(void)
|
||||||
{
|
{
|
||||||
RuleC_CallFunc(m_ruleProgs, world, "CodeCallback_StartGameType");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* logic */
|
/* logic */
|
||||||
void
|
void
|
||||||
NSGameRules::FrameStart(void)
|
NSGameRules::FrameStart(void)
|
||||||
{
|
{
|
||||||
//print("StartFrame!\n");
|
|
||||||
|
|
||||||
/* hack */
|
|
||||||
if (time < 2.5f) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
RuleC_CallFrame(m_ruleProgs, "CodeCallback_FrameStart");
|
|
||||||
}
|
}
|
||||||
bool
|
bool
|
||||||
NSGameRules::ConsoleCommand(NSClientPlayer pl, string cmd)
|
NSGameRules::ConsoleCommand(NSClientPlayer pl, string cmd)
|
||||||
|
@ -93,13 +98,11 @@ NSGameRules::ConsoleCommand(NSClientPlayer pl, string cmd)
|
||||||
bool
|
bool
|
||||||
NSGameRules::ClientCommand(NSClient pl, string cmd)
|
NSGameRules::ClientCommand(NSClient pl, string cmd)
|
||||||
{
|
{
|
||||||
return RuleC_CallString(m_ruleProgs, pl, cmd, "CodeCallback_ClientCommand");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
NSGameRules::ImpulseCommand(NSClient pl, float num)
|
NSGameRules::ImpulseCommand(NSClient pl, float num)
|
||||||
{
|
{
|
||||||
return RuleC_CallFloat(m_ruleProgs, pl, num, "CodeCallback_ImpulseCommand");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -108,14 +111,11 @@ NSGameRules::PlayerConnect(NSClientPlayer pl)
|
||||||
if (Plugin_PlayerConnect(pl) == false) {
|
if (Plugin_PlayerConnect(pl) == false) {
|
||||||
bprint(PRINT_HIGH, sprintf("%s^d connected.\n", pl.netname));
|
bprint(PRINT_HIGH, sprintf("%s^d connected.\n", pl.netname));
|
||||||
}
|
}
|
||||||
|
|
||||||
RuleC_CallFunc(m_ruleProgs, pl, "CodeCallback_PlayerConnect");
|
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
NSGameRules::PlayerDisconnect(NSClientPlayer pl)
|
NSGameRules::PlayerDisconnect(NSClientPlayer pl)
|
||||||
{
|
{
|
||||||
bprint(PRINT_HIGH, sprintf("%s^d disconnected.\n", pl.netname));
|
bprint(PRINT_HIGH, sprintf("%s^d disconnected.\n", pl.netname));
|
||||||
RuleC_CallFunc(m_ruleProgs, pl, "CodeCallback_PlayerDisconnect");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -131,18 +131,11 @@ NSGameRules::PlayerKill(NSClientPlayer pl)
|
||||||
void
|
void
|
||||||
NSGameRules::NPCDeath(NSActor npc, NSActor attacker, NSActor inflictor)
|
NSGameRules::NPCDeath(NSActor npc, NSActor attacker, NSActor inflictor)
|
||||||
{
|
{
|
||||||
if (RuleC_CallDamage(m_ruleProgs, npc, attacker, inflictor, "", "CodeCallback_NPCKilled")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
NSGameRules::PlayerDeath(NSClientPlayer pl, NSActor attacker, NSDict damageDecl)
|
NSGameRules::PlayerDeath(NSClientPlayer pl, NSActor attacker, NSDict damageDecl)
|
||||||
{
|
{
|
||||||
if (RuleC_CallDamage(m_ruleProgs, pl, attacker, attacker, "", "CodeCallback_PlayerKilled")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
||||||
WriteByte(MSG_MULTICAST, EV_OBITUARY);
|
WriteByte(MSG_MULTICAST, EV_OBITUARY);
|
||||||
WriteString(MSG_MULTICAST, (attacker.netname) ? attacker.netname : attacker.classname);
|
WriteString(MSG_MULTICAST, (attacker.netname) ? attacker.netname : attacker.classname);
|
||||||
|
@ -169,18 +162,12 @@ NSGameRules::PlayerDeath(NSClientPlayer pl, NSActor attacker, NSDict damageDecl)
|
||||||
void
|
void
|
||||||
NSGameRules::PlayerPain(NSClientPlayer pl, NSActor attacker, NSDict damageDecl)
|
NSGameRules::PlayerPain(NSClientPlayer pl, NSActor attacker, NSDict damageDecl)
|
||||||
{
|
{
|
||||||
if (RuleC_CallDamage(m_ruleProgs, pl, attacker, attacker, "", "CodeCallback_PlayerDamage")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fallback code here, or rest implemented by sub-class */
|
/* fallback code here, or rest implemented by sub-class */
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
NSGameRules::PlayerSpawn(NSClientPlayer pl)
|
NSGameRules::PlayerSpawn(NSClientPlayer pl)
|
||||||
{
|
{
|
||||||
RuleC_CallFunc(m_ruleProgs, pl, "CodeCallback_PlayerSpawn");
|
|
||||||
|
|
||||||
/* implemented by sub-class */
|
/* implemented by sub-class */
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
|
@ -226,10 +213,6 @@ NSGameRules::SpectatorThink(NSClientSpectator pl)
|
||||||
int
|
int
|
||||||
NSGameRules::MaxItemPerSlot(int slot)
|
NSGameRules::MaxItemPerSlot(int slot)
|
||||||
{
|
{
|
||||||
if (m_ruleProgs) {
|
|
||||||
return RuleC_CallMaxItemsPerSlot(m_ruleProgs, slot, "CodeCallback_MaxItemPerSlot");
|
|
||||||
}
|
|
||||||
|
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,7 +321,7 @@ NSGameRules::MonstersSpawn(void)
|
||||||
bool
|
bool
|
||||||
NSGameRules::IsTeamplay(void)
|
NSGameRules::IsTeamplay(void)
|
||||||
{
|
{
|
||||||
return (false);
|
return (serverkeyfloat("teams") > 0);
|
||||||
}
|
}
|
||||||
bool
|
bool
|
||||||
NSGameRules::IsMultiplayer(void)
|
NSGameRules::IsMultiplayer(void)
|
||||||
|
@ -346,26 +329,6 @@ NSGameRules::IsMultiplayer(void)
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
NSGameRules::DamageApply(entity t, entity c, float dmg, int w, damageType_t type)
|
|
||||||
{
|
|
||||||
NSError("Deprecated!");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* checks if we can hit an entity at 5 of the same spots */
|
|
||||||
bool
|
|
||||||
NSGameRules::DamageCheckTrace(entity t, vector vecHitPos)
|
|
||||||
{
|
|
||||||
NSError("Deprecated!");
|
|
||||||
return (false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
NSGameRules::DamageRadius(vector org, entity attacker, float dmg, float r, bool checkCollision, int w)
|
|
||||||
{
|
|
||||||
NSError("Deprecated!");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
NSGameRules::IntermissionEnd(void)
|
NSGameRules::IntermissionEnd(void)
|
||||||
{
|
{
|
||||||
|
@ -393,13 +356,11 @@ NSGameRules::PlayerCanAttack(NSClientPlayer bp)
|
||||||
bool
|
bool
|
||||||
NSGameRules::PlayerRequestRespawn(NSClientPlayer pl)
|
NSGameRules::PlayerRequestRespawn(NSClientPlayer pl)
|
||||||
{
|
{
|
||||||
return RuleC_CallRequestSpawn(m_ruleProgs, pl, "CodeCallback_PlayerRequestRespawn");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
NSGameRules::PlayerRequestTeam(NSClientPlayer pl, int teamNum)
|
NSGameRules::PlayerRequestTeam(NSClientPlayer pl, int teamNum)
|
||||||
{
|
{
|
||||||
return RuleC_CallRequestTeam(m_ruleProgs, pl, teamNum, "CodeCallback_CallRequestTeam");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -453,6 +414,12 @@ NSGameRules::ChatMessageTeam(NSClient cl, string strMessage)
|
||||||
string
|
string
|
||||||
NSGameRules::Title(void)
|
NSGameRules::Title(void)
|
||||||
{
|
{
|
||||||
|
string gameType = cvars.GetString("g_gametype");
|
||||||
|
|
||||||
|
if (STRING_SET(gameType)) {
|
||||||
|
return gameType;
|
||||||
|
}
|
||||||
|
|
||||||
return "Default";
|
return "Default";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,6 +444,24 @@ NSGameRules::InitFromProgs(string pathToProgs)
|
||||||
if (mainFunction) {
|
if (mainFunction) {
|
||||||
externset(newRule.m_ruleProgs, this, "self");
|
externset(newRule.m_ruleProgs, this, "self");
|
||||||
thread(mainFunction())
|
thread(mainFunction())
|
||||||
|
|
||||||
|
/* map progs functions to class methods */
|
||||||
|
RULEMAP(newRule, ClientCommand, "CodeCallback_ClientCommand")
|
||||||
|
RULEMAP(newRule, ConsoleCommand, "CodeCallback_ConsoleCommand")
|
||||||
|
RULEMAP(newRule, FrameStart, "CodeCallback_FrameStart")
|
||||||
|
RULEMAP(newRule, ImpulseCommand, "CodeCallback_ImpulseCommand")
|
||||||
|
RULEMAP(newRule, InitPostEnts, "CodeCallback_StartGameType")
|
||||||
|
RULEMAP(newRule, Input, "CodeCallback_Input")
|
||||||
|
RULEMAP(newRule, NPCDeath, "CodeCallback_NPCKilled")
|
||||||
|
RULEMAP(newRule, PlayerCanAttack, "CodeCallback_PlayerCanAttack")
|
||||||
|
RULEMAP(newRule, PlayerConnect, "CodeCallback_PlayerConnect")
|
||||||
|
RULEMAP(newRule, PlayerDeath, "CodeCallback_PlayerKilled")
|
||||||
|
RULEMAP(newRule, PlayerDisconnect, "CodeCallback_PlayerDisconnect")
|
||||||
|
RULEMAP(newRule, PlayerPain, "CodeCallback_PlayerDamage")
|
||||||
|
RULEMAP(newRule, PlayerRequestRespawn, "CodeCallback_PlayerRequestRespawn")
|
||||||
|
RULEMAP(newRule, PlayerRequestTeam, "CodeCallback_CallRequestTeam")
|
||||||
|
RULEMAP(newRule, PlayerSpawn, "CodeCallback_PlayerSpawn")
|
||||||
|
RULEMAP(newRule, Title, "CodeCallback_Title")
|
||||||
} else {
|
} else {
|
||||||
NSError("%S does not have a main function.", pathToProgs);
|
NSError("%S does not have a main function.", pathToProgs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,8 +49,17 @@ Cmd_ParseClientCommand(NSClient sender, string cmd, int commandArguments)
|
||||||
PutClientInServer();
|
PutClientInServer();
|
||||||
break;
|
break;
|
||||||
case "setpos":
|
case "setpos":
|
||||||
|
printf("%i %S\n", commandArguments, cmd);
|
||||||
if (cvar("sv_cheats") == 1) {
|
if (cvar("sv_cheats") == 1) {
|
||||||
setorigin(sender, stov(argv(1)));
|
if (commandArguments == 2) { /* setpos "0 0 0" */
|
||||||
|
setorigin(sender, stov(argv(1)));
|
||||||
|
} else if (commandArguments == 3) { /* setpos "0 0 0" "0 0 0" */
|
||||||
|
setorigin(sender, stov(argv(1)));
|
||||||
|
} else if (commandArguments == 4) { /* setpos 0 0 0 */
|
||||||
|
setorigin(sender, [stof(argv(1)), stof(argv(2)), stof(argv(3))]);
|
||||||
|
} else if (commandArguments == 7) { /* setpos 0 0 0 0 0 0 */
|
||||||
|
setorigin(sender, [stof(argv(1)), stof(argv(2)), stof(argv(3))]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -60,8 +69,7 @@ Cmd_ParseClientCommand(NSClient sender, string cmd, int commandArguments)
|
||||||
float timeleft;
|
float timeleft;
|
||||||
timeleft = cvar("timelimit") - (time / 60);
|
timeleft = cvar("timelimit") - (time / 60);
|
||||||
timestring = Util_TimeToString(timeleft);
|
timestring = Util_TimeToString(timeleft);
|
||||||
msg = sprintf("we have %s minutes remaining", timestring);
|
bprint(PRINT_CHAT, sprintf("we have %s minutes remaining", timestring));
|
||||||
bprint(PRINT_CHAT, msg);
|
|
||||||
break;
|
break;
|
||||||
case "listInventory":
|
case "listInventory":
|
||||||
NSActor_ListInventory((NSActor)self);
|
NSActor_ListInventory((NSActor)self);
|
||||||
|
|
|
@ -19,17 +19,3 @@ void MapC_Init(void);
|
||||||
void MapC_CallMainFunction(void);
|
void MapC_CallMainFunction(void);
|
||||||
|
|
||||||
void MapC_CallNamedFunction(entity, string);
|
void MapC_CallNamedFunction(entity, string);
|
||||||
|
|
||||||
bool RuleC_CallFunc(float, entity, string);
|
|
||||||
bool RuleC_CallFrame(float, string);
|
|
||||||
|
|
||||||
bool RuleC_CallDamage(float, entity, entity, entity, string, string);
|
|
||||||
|
|
||||||
bool RuleC_CallRequestSpawn(float, entity, string);
|
|
||||||
bool RuleC_CallRequestTeam(float, entity, int, string);
|
|
||||||
|
|
||||||
bool RuleC_CallString(float, entity, string, string);
|
|
||||||
|
|
||||||
bool RuleC_CallFloat(float, entity, float, string);
|
|
||||||
int RuleC_CallMaxItemsPerSlot(float, int, string);
|
|
||||||
void RuleC_CallInput(float, entity, string, string);
|
|
||||||
|
|
|
@ -73,185 +73,3 @@ MapC_CallNamedFunction(entity functionActivator, string targetFunction)
|
||||||
NSError("%s does not have a function %s.", mapname, targetFunction);
|
NSError("%s does not have a function %s.", mapname, targetFunction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Gamerule specific Scripting, nicknamed 'RuleC'. */
|
|
||||||
bool
|
|
||||||
RuleC_CallFunc(float progsNum, entity pl, string funcName)
|
|
||||||
{
|
|
||||||
if (progsNum) {
|
|
||||||
void(void) mainFunction;
|
|
||||||
mainFunction = externvalue(progsNum, funcName);
|
|
||||||
|
|
||||||
if (mainFunction) {
|
|
||||||
entity oldSelf = self;
|
|
||||||
//externset(progsNum, pl, "self");
|
|
||||||
self = pl;
|
|
||||||
mainFunction();
|
|
||||||
self = oldSelf;
|
|
||||||
return (true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (false);
|
|
||||||
}
|
|
||||||
bool
|
|
||||||
RuleC_CallFrame(float progsNum, string funcName)
|
|
||||||
{
|
|
||||||
if (progsNum) {
|
|
||||||
void(void) mainFunction;
|
|
||||||
mainFunction = externvalue(progsNum, funcName);
|
|
||||||
|
|
||||||
if (mainFunction) {
|
|
||||||
entity oldSelf = self;
|
|
||||||
externset(progsNum, frametime, "frametime");
|
|
||||||
self = world;
|
|
||||||
mainFunction();
|
|
||||||
self = oldSelf;
|
|
||||||
return (true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (false);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
RuleC_CallDamage(float progsNum, entity target, entity inflictor, entity attacker, string weapon, string funcName)
|
|
||||||
{
|
|
||||||
if (progsNum) {
|
|
||||||
void(entity inflictor, entity attacker, string weapon) mainFunction;
|
|
||||||
mainFunction = externvalue(progsNum, funcName);
|
|
||||||
|
|
||||||
if (mainFunction) {
|
|
||||||
entity oldSelf = self;
|
|
||||||
externset(progsNum, target, "self");
|
|
||||||
self = target;
|
|
||||||
mainFunction(inflictor, attacker, weapon);
|
|
||||||
self = oldSelf;
|
|
||||||
forceinfokey(target, "*deaths", ftos(target.deaths));
|
|
||||||
return (true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (false);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
RuleC_CallRequestSpawn(float progsNum, entity pl, string funcName)
|
|
||||||
{
|
|
||||||
bool returnValue = false;
|
|
||||||
|
|
||||||
if (progsNum) {
|
|
||||||
bool(void) mainFunction;
|
|
||||||
mainFunction = externvalue(progsNum, funcName);
|
|
||||||
|
|
||||||
if (mainFunction) {
|
|
||||||
entity oldSelf = self;
|
|
||||||
externset(progsNum, pl, "self");
|
|
||||||
self = pl;
|
|
||||||
returnValue = mainFunction();
|
|
||||||
self = oldSelf;
|
|
||||||
return (returnValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (returnValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
RuleC_CallRequestTeam(float progsNum, entity pl, int teamNum, string funcName)
|
|
||||||
{
|
|
||||||
bool returnValue = false;
|
|
||||||
|
|
||||||
if (progsNum) {
|
|
||||||
bool(int) mainFunction;
|
|
||||||
mainFunction = externvalue(progsNum, funcName);
|
|
||||||
|
|
||||||
if (mainFunction) {
|
|
||||||
entity oldSelf = self;
|
|
||||||
externset(progsNum, pl, "self");
|
|
||||||
self = pl;
|
|
||||||
returnValue = mainFunction(teamNum);
|
|
||||||
self = oldSelf;
|
|
||||||
return (returnValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (returnValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
RuleC_CallString(float progsNum, entity pl, string targetString, string funcName)
|
|
||||||
{
|
|
||||||
bool returnValue = false;
|
|
||||||
|
|
||||||
if (progsNum) {
|
|
||||||
bool(string) mainFunction;
|
|
||||||
mainFunction = externvalue(progsNum, funcName);
|
|
||||||
|
|
||||||
if (mainFunction) {
|
|
||||||
entity oldSelf = self;
|
|
||||||
externset(progsNum, pl, "self");
|
|
||||||
self = pl;
|
|
||||||
returnValue = mainFunction(targetString);
|
|
||||||
self = oldSelf;
|
|
||||||
return (returnValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (returnValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
RuleC_CallFloat(float progsNum, entity pl, float targetFloat, string funcName)
|
|
||||||
{
|
|
||||||
bool returnValue = false;
|
|
||||||
|
|
||||||
if (progsNum) {
|
|
||||||
bool(float) mainFunction;
|
|
||||||
mainFunction = externvalue(progsNum, funcName);
|
|
||||||
|
|
||||||
if (mainFunction) {
|
|
||||||
entity oldSelf = self;
|
|
||||||
externset(progsNum, pl, "self");
|
|
||||||
self = pl;
|
|
||||||
returnValue = mainFunction(targetFloat);
|
|
||||||
self = oldSelf;
|
|
||||||
return (returnValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (returnValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
RuleC_CallMaxItemsPerSlot(float progsNum, int targetFloat, string funcName)
|
|
||||||
{
|
|
||||||
int returnValue = -1i;
|
|
||||||
|
|
||||||
if (progsNum) {
|
|
||||||
int(int) mainFunction;
|
|
||||||
mainFunction = externvalue(progsNum, funcName);
|
|
||||||
|
|
||||||
if (mainFunction) {
|
|
||||||
returnValue = mainFunction(targetFloat);
|
|
||||||
return (returnValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (returnValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
RuleC_CallInput(float progsNum, entity activator, string inputName, string inputData)
|
|
||||||
{
|
|
||||||
if (progsNum) {
|
|
||||||
void(entity, string, string) mainFunction;
|
|
||||||
mainFunction = externvalue(progsNum, "CodeCallback_Input");
|
|
||||||
|
|
||||||
if (mainFunction) {
|
|
||||||
mainFunction(activator, inputName, inputData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1747,6 +1747,12 @@ NSClientPlayer::Damage(entity inflictor, entity attacker, NSDict damageDecl, flo
|
||||||
|
|
||||||
damageDecl.AddKey("location", vtos(hitLocation));
|
damageDecl.AddKey("location", vtos(hitLocation));
|
||||||
|
|
||||||
|
/* apply knockback, but only on death */
|
||||||
|
float knockBack = damageDecl.GetFloat("knockback");
|
||||||
|
if (knockBack >= 0) {
|
||||||
|
AddVelocity(dmgDir * knockBack);
|
||||||
|
}
|
||||||
|
|
||||||
/* they died */
|
/* they died */
|
||||||
if (GetHealth() <= 0) {
|
if (GetHealth() <= 0) {
|
||||||
g_grMode.PlayerDeath(this, (NSActor)attacker, damageDecl);
|
g_grMode.PlayerDeath(this, (NSActor)attacker, damageDecl);
|
||||||
|
|
|
@ -89,11 +89,12 @@ private:
|
||||||
/** Will transport an entity from its position to the exit position. */
|
/** Will transport an entity from its position to the exit position. */
|
||||||
nonvirtual void TransportEntity(NSEntity);
|
nonvirtual void TransportEntity(NSEntity);
|
||||||
|
|
||||||
#ifdef CLIENT
|
|
||||||
vector m_vecTargetPos;
|
vector m_vecTargetPos;
|
||||||
vector m_vecTargetN;
|
vector m_vecTargetN;
|
||||||
vector m_vecTargetS;
|
vector m_vecTargetS;
|
||||||
vector m_vecTargetT;
|
vector m_vecTargetT;
|
||||||
|
|
||||||
|
#ifdef CLIENT
|
||||||
float m_flSize;
|
float m_flSize;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -117,4 +118,4 @@ private:
|
||||||
|
|
||||||
.float portalnum;
|
.float portalnum;
|
||||||
.float impulse; //used as the radius for the solid_portal csg subtraction
|
.float impulse; //used as the radius for the solid_portal csg subtraction
|
||||||
.bool isPortal;
|
.bool isPortal;
|
||||||
|
|
|
@ -32,13 +32,10 @@ NSPortal::NSPortal(void)
|
||||||
m_brushNum = -1;
|
m_brushNum = -1;
|
||||||
m_bEnabled = false;
|
m_bEnabled = false;
|
||||||
isPortal = true;
|
isPortal = true;
|
||||||
|
|
||||||
#ifdef CLIENT
|
|
||||||
m_vecTargetPos = g_vec_null;
|
m_vecTargetPos = g_vec_null;
|
||||||
m_vecTargetN = g_vec_null;
|
m_vecTargetN = g_vec_null;
|
||||||
m_vecTargetS = g_vec_null;
|
m_vecTargetS = g_vec_null;
|
||||||
m_vecTargetT = g_vec_null;
|
m_vecTargetT = g_vec_null;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SERVER
|
#ifdef SERVER
|
||||||
|
|
||||||
|
@ -150,15 +147,15 @@ NSPortal::PortalClose(void)
|
||||||
/* invalidate the other portal's reference to this one, only
|
/* invalidate the other portal's reference to this one, only
|
||||||
if we're still actively linked. */
|
if we're still actively linked. */
|
||||||
if (m_ePortalTarget && m_ePortalTarget.m_ePortalTarget == this) {
|
if (m_ePortalTarget && m_ePortalTarget.m_ePortalTarget == this) {
|
||||||
m_ePortalTarget.m_bEnabled = false;
|
m_ePortalTarget.m_bEnabled = false;
|
||||||
m_ePortalTarget.m_ePortalTarget = __NULL__;
|
m_ePortalTarget.m_ePortalTarget = __NULL__;
|
||||||
m_ePortalTarget._PortalUpdated();
|
m_ePortalTarget._PortalUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now kill our own reference */
|
/* now kill our own reference */
|
||||||
m_ePortalTarget = __NULL__;
|
m_ePortalTarget = __NULL__;
|
||||||
m_bEnabled = false;
|
m_bEnabled = false;
|
||||||
_PortalUpdated();
|
_PortalUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -167,16 +164,17 @@ NSPortal::PortalLinkTo(NSPortal target, bool openPortal)
|
||||||
m_ePortalTarget = target;
|
m_ePortalTarget = target;
|
||||||
|
|
||||||
m_bEnabled = openPortal;
|
m_bEnabled = openPortal;
|
||||||
|
|
||||||
SendFlags = -1;
|
SendFlags = -1;
|
||||||
_PortalUpdated();
|
_PortalUpdated();
|
||||||
|
|
||||||
if (m_ePortalTarget)
{
|
if (m_ePortalTarget)
|
||||||
m_ePortalTarget.m_ePortalTarget = this;
|
{
|
||||||
m_ePortalTarget.m_bEnabled = openPortal;
|
m_ePortalTarget.m_ePortalTarget = this;
|
||||||
m_ePortalTarget.SendFlags = -1;
|
m_ePortalTarget.m_bEnabled = openPortal;
|
||||||
m_ePortalTarget._PortalUpdated();
|
m_ePortalTarget.SendFlags = -1;
|
||||||
}
|
m_ePortalTarget._PortalUpdated();
|
||||||
|
}
|
||||||
|
|
||||||
return target ? true : false;
|
return target ? true : false;
|
||||||
}
|
}
|
||||||
|
@ -208,22 +206,24 @@ void
|
||||||
NSPortal::_PortalUpdated(void)
|
NSPortal::_PortalUpdated(void)
|
||||||
{
|
{
|
||||||
/* the displayed surface must be in a known position.
|
/* the displayed surface must be in a known position.
|
||||||
we're not going to compensate for the model here, because I'm too lazy.
*/
|
we're not going to compensate for the model here, because I'm too lazy.
|
||||||
|
*/
|
||||||
vector newAngles = angles;
|
vector newAngles = angles;
|
||||||
//newAngles[0] * -1;
|
//newAngles[0] * -1;
|
||||||
makevectors(newAngles);
|
makevectors(newAngles);
|
||||||
|
|
||||||
m_vecPortalN = v_forward;
|
m_vecPortalN = v_forward;
|
||||||
m_vecPortalS = -v_right;
|
m_vecPortalS = -v_right;
|
||||||
m_vecPortalT = v_up;
|
m_vecPortalT = v_up;
|
||||||
m_vecPortalPos = origin;
|
m_vecPortalPos = origin;
|
||||||
|
|
||||||
/* expand the size of the object along the plane, and set up a portal region.
*/
|
/* expand the size of the object along the plane, and set up a portal region.
|
||||||
movetype = MOVETYPE_NONE;
|
*/
|
||||||
|
movetype = MOVETYPE_NONE;
|
||||||
|
|
||||||
if (m_bEnabled == true) {
|
if (m_bEnabled == true) {
|
||||||
solid = SOLID_PORTAL;
|
solid = SOLID_PORTAL;
|
||||||
setmodel(this, modelnameforindex(m_flPortalModel));
|
setmodel(this, modelnameforindex(m_flPortalModel));
|
||||||
if (m_bWasEnabled == false) {
|
if (m_bWasEnabled == false) {
|
||||||
m_bWasEnabled = true;
|
m_bWasEnabled = true;
|
||||||
#ifdef SERVER
|
#ifdef SERVER
|
||||||
|
@ -244,81 +244,75 @@ NSPortal::_PortalUpdated(void)
|
||||||
//modelindex = 0;
|
//modelindex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* determine size of major axis
*/
|
/* determine size of major axis
|
||||||
float portalSize = max(size[0], size[1], size[2]);
|
*/
|
||||||
impulse = portalSize; /* let the engine know how wide the portal should be
*/
|
float portalSize = max(size[0], size[1], size[2]);
|
||||||
|
impulse = portalSize; /* let the engine know how wide the portal should be
|
||||||
/* make sure the abs size contains the entire portal.
*/
|
*/
|
||||||
portalSize = sqrt(portalSize * portalSize * 2);
|
|
||||||
mins -= portalSize * [1, 1, 1];
|
/* make sure the abs size contains the entire portal.
|
||||||
maxs += portalSize * [1, 1, 1];
|
*/
|
||||||
setsize(this, mins, maxs);
|
portalSize = sqrt(portalSize * portalSize * 2);
|
||||||
|
mins -= portalSize * [1, 1, 1];
|
||||||
|
maxs += portalSize * [1, 1, 1];
|
||||||
|
setsize(this, mins, maxs);
|
||||||
}
|
}
|
||||||
|
|
||||||
vector
|
vector
|
||||||
NSPortal::_DirectionTransform(vector v)
|
NSPortal::_DirectionTransform(vector v)
|
||||||
{
|
{
|
||||||
/* FIXME: this should include .angles stuff
*/
|
/* FIXME: this should include .angles stuff
|
||||||
vector tmp, r;
|
*/
|
||||||
tmp[0] = v * m_vecPortalN;
|
vector tmp, r;
|
||||||
tmp[1] = v * m_vecPortalS;
|
tmp[0] = v * m_vecPortalN;
|
||||||
tmp[2] = v * m_vecPortalT;
|
tmp[1] = v * m_vecPortalS;
|
||||||
|
tmp[2] = v * m_vecPortalT;
|
||||||
|
|
||||||
r = [0, 0, 0];
|
r = [0, 0, 0];
|
||||||
|
|
||||||
if (!m_ePortalTarget)
{
|
if (!m_ePortalTarget) {
|
||||||
#ifdef CSQC
|
r += tmp[2] * m_vecTargetT;
|
||||||
r += tmp[2] * m_vecTargetT;
|
r -= tmp[1] * m_vecTargetS;
|
||||||
r -= tmp[1] * m_vecTargetS;
|
r -= tmp[0] * m_vecTargetN;
|
||||||
r -= tmp[0] * m_vecTargetN;
|
} else {
|
||||||
#else
|
r += tmp[2] * m_ePortalTarget.m_vecPortalT;
|
||||||
r += tmp[2] * this.m_vecPortalT;
|
r -= tmp[1] * m_ePortalTarget.m_vecPortalS;
|
||||||
r -= tmp[1] * this.m_vecPortalS;
|
r -= tmp[0] * m_ePortalTarget.m_vecPortalN;
|
||||||
r -= tmp[0] * this.m_vecPortalN;
|
}
|
||||||
#endif
|
|
||||||
}
else
{
|
|
||||||
r += tmp[2] * m_ePortalTarget.m_vecPortalT;
|
|
||||||
r -= tmp[1] * m_ePortalTarget.m_vecPortalS;
|
|
||||||
r -= tmp[0] * m_ePortalTarget.m_vecPortalN;
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector
|
vector
|
||||||
NSPortal::_OriginTransform(vector p)
|
NSPortal::_OriginTransform(vector p)
|
||||||
{
|
{
|
||||||
if (!m_ePortalTarget)
{
|
if (!m_ePortalTarget) {
|
||||||
#ifdef CSQC
|
return m_vecPortalPos - _DirectionTransform(m_vecPortalPos - p);
|
||||||
return m_vecTargetPos - _DirectionTransform(m_vecPortalPos - p);
|
}
|
||||||
#else
|
|
||||||
return this.m_vecPortalPos - _DirectionTransform(m_vecPortalPos - p);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return m_ePortalTarget.m_vecPortalPos - _DirectionTransform(m_vecPortalPos - p);
|
return m_ePortalTarget.m_vecPortalPos - _DirectionTransform(m_vecPortalPos - p);
|
||||||
}
|
}
|
||||||
|
|
||||||
// need to generate forward/right/up vectors
|
// need to generate forward/right/up vectors
|
||||||
// return value is the new view origin.
|
// return value is the new view origin.
|
||||||
// trace_end_pos needs to contain the pvs origin.
|
// trace_end_pos needs to contain the pvs origin.
|
||||||
vector
|
vector
|
||||||
NSPortal::camera_transform(vector originalOrg, vector originalAngles)
|
NSPortal::camera_transform(vector originalOrg, vector originalAngles)
|
||||||
{
|
{
|
||||||
vector newCameraPos;
|
vector newCameraPos;
|
||||||
|
|
||||||
newCameraPos = _OriginTransform(originalOrg);
|
|
||||||
v_forward = _DirectionTransform(v_forward);
|
|
||||||
v_right = _DirectionTransform(v_right);
|
|
||||||
v_up = _DirectionTransform(v_up);
|
|
||||||
|
|
||||||
//trace from the center of the target to the view, to set trace_endpos for the pvs origin
|
|
||||||
if (m_ePortalTarget)
|
|
||||||
traceline(m_ePortalTarget.m_vecPortalPos, newCameraPos, MOVE_NOMONSTERS, this);
|
|
||||||
else
|
|
||||||
trace_endpos = this.m_vecPortalPos;
|
|
||||||
|
|
||||||
return newCameraPos;
|
newCameraPos = _OriginTransform(originalOrg);
|
||||||
|
v_forward = _DirectionTransform(v_forward);
|
||||||
|
v_right = _DirectionTransform(v_right);
|
||||||
|
v_up = _DirectionTransform(v_up);
|
||||||
|
|
||||||
|
//trace from the center of the target to the view, to set trace_endpos for the pvs origin
|
||||||
|
if (m_ePortalTarget)
|
||||||
|
traceline(m_ePortalTarget.m_vecPortalPos, newCameraPos, MOVE_NOMONSTERS, this);
|
||||||
|
else
|
||||||
|
trace_endpos = this.m_vecPortalPos;
|
||||||
|
|
||||||
|
return newCameraPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* because when using custom player physics, the engine will not do us any favors
|
/* because when using custom player physics, the engine will not do us any favors
|
||||||
|
|
|
@ -19,9 +19,10 @@ NSSurfacePropEntity::NSSurfacePropEntity(void)
|
||||||
{
|
{
|
||||||
m_flBurnNext = 0.0f;
|
m_flBurnNext = 0.0f;
|
||||||
#ifdef SERVER
|
#ifdef SERVER
|
||||||
|
max_health = 100;
|
||||||
|
max_armor = 100;
|
||||||
m_iPropData = -1i;
|
m_iPropData = -1i;
|
||||||
m_iMaterial = -1i;
|
m_iMaterial = -1i;
|
||||||
max_health = 100;
|
|
||||||
m_strOnBreak = __NULL__;
|
m_strOnBreak = __NULL__;
|
||||||
m_eBurner= __NULL__;
|
m_eBurner= __NULL__;
|
||||||
m_iBurnWeapon = 0i;
|
m_iBurnWeapon = 0i;
|
||||||
|
@ -255,7 +256,7 @@ NSSurfacePropEntity::Damage(entity inflictor, entity attacker, NSDict damageDecl
|
||||||
health = rint(health - damagePoints);
|
health = rint(health - damagePoints);
|
||||||
|
|
||||||
if (health <= 0) {
|
if (health <= 0) {
|
||||||
/* apply knockback */
|
/* apply knockback, but only on death */
|
||||||
float knockBack = damageDecl.GetFloat("knockback");
|
float knockBack = damageDecl.GetFloat("knockback");
|
||||||
if (knockBack >= 0) {
|
if (knockBack >= 0) {
|
||||||
AddVelocity(dmgDir * knockBack);
|
AddVelocity(dmgDir * knockBack);
|
||||||
|
|
Loading…
Reference in a new issue