GS-EntBase: Cleanup and fixes regarding which func_ entities support the

'angles' key for visuals. trigger_hurt damagetype tweaks (needs more tests)
as well as monstermaker fixes and SF_ROT_TOGGLE func_door_rotatings no
longer auto-return...
This commit is contained in:
Marco Cawthorne 2022-01-03 00:23:20 -08:00
parent 758b28346d
commit d3dcb3a12b
Signed by: eukara
GPG key ID: C196CD8BA993248A
22 changed files with 89 additions and 56 deletions

View file

@ -305,6 +305,7 @@ func_breakable::Respawn(void)
SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin());
ClearAngles();
touch = PlayerTouch;
think = __NULL__;
@ -375,9 +376,6 @@ func_breakable::func_breakable(void)
/* proper init */
super::NSSurfacePropEntity();
/* contrary to what some map designers think, angles are not supported */
GetSpawnAngles() = angles = [0,0,0];
/* precache impact sound */
Sound_Precache(GetSurfaceData(SURFDATA_SND_BULLETIMPACT));
}

View file

@ -318,7 +318,9 @@ func_button::MoveToDestination(vector vecDest, void(void) func)
void
func_button::Respawn(void)
{
RestoreAngles();
SetMovementDirection();
ClearAngles();
SetSolid(SOLID_BSP);
SetMovetype(MOVETYPE_PUSH);
@ -356,7 +358,6 @@ func_button::Respawn(void)
}
m_iState = STATE_LOWERED;
SetAngles([0,0,0]);
}
void

View file

@ -118,10 +118,9 @@ func_conveyor::Respawn(void)
if (!m_flSpeed)
m_flSpeed = 100;
m_vecMoveDir = [0,0,0];
angles = GetSpawnAngles();
RestoreAngles();
SetMovementDirection();
ClearAngles();
SetModel(GetSpawnModel());
SetMovetype(MOVETYPE_NONE);
SetSolid(SOLID_BSP);
@ -133,7 +132,6 @@ func_conveyor::Respawn(void)
SetSkin(0);
}
SetAngles([0,0,0]);
}
void

View file

@ -372,8 +372,9 @@ func_door::Respawn(void)
if (m_flWait == 0)
m_flWait = 0.01f;
/* angles to vecMoveDir */
RestoreAngles();
SetMovementDirection();
ClearAngles();
if (spawnflags & SF_MOV_PASSABLE)
SetSolid(SOLID_NOT);
@ -428,8 +429,6 @@ func_door::Respawn(void)
if (targetname) {
m_iLocked = TRUE;
}
SetAngles([0,0,0]);
}
void

View file

@ -165,9 +165,9 @@ func_door_rotating::Arrived(void)
if (!(spawnflags & SF_ROT_USE)) {
touch = Touch;
}
if (m_flWait < 0) {
if ((spawnflags & SF_ROT_TOGGLE) || m_flWait < 0)
return;
}
think = Back;
nextthink = (ltime + m_flWait);
@ -385,7 +385,9 @@ func_door_rotating::RotToDest(vector vDestAngle, void(void) func)
void
func_door_rotating::Respawn(void)
{
func_door_rotating::SetMovementDirection();
RestoreAngles();
SetMovementDirection();
ClearAngles();
#ifdef GS_PHYSICS
takedamage = DAMAGE_YES;
@ -433,6 +435,8 @@ func_door_rotating::Respawn(void)
PortalClose();
}
m_iState = STATE_LOWERED;
if (spawnflags & SF_ROT_PASSABLE) {
SetSolid(SOLID_NOT);
}

View file

@ -173,6 +173,7 @@ void
func_mortar_field::Respawn(void)
{
InitBrushTrigger();
ClearAngles();
}
void

View file

@ -138,6 +138,7 @@ func_plat::Respawn(void)
SetSolid(SOLID_BSP);
SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin());
ClearAngles();
m_iState = PLATSTATE_RAISED;
think = __NULL__;

View file

@ -182,7 +182,10 @@ func_rotating::Respawn(void)
SetMovetype(MOVETYPE_PUSH);
SetSolid((spawnflags & FR_NOTSOLID) ? SOLID_NOT : SOLID_BSP);
SetOrigin(GetSpawnOrigin());
RestoreAngles();
SetMovementDirection();
ClearAngles();
if (spawnflags & FR_STARTON) {
avelocity = m_vecMoveDir * m_flSpeed;

View file

@ -14,7 +14,7 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*QUAKED func_tracktraincontrols (0 .5 .8) ?
/*QUAKED func_traincontrols (0 .5 .8) ?
Brush that marks the usable region of a func_tracktrain, in order
to gain control.
@ -26,21 +26,22 @@ to gain control.
This entity was introduced in Half-Life (1998).
*/
class func_tracktraincontrols:NSBrushTrigger
class func_traincontrols:NSBrushTrigger
{
void(void) func_tracktraincontrols;
void(void) func_traincontrols;
virtual void(void) Respawn;
};
void
func_tracktraincontrols::Respawn(void)
func_traincontrols::Respawn(void)
{
InitBrushTrigger();
ClearAngles();
}
void
func_tracktraincontrols::func_tracktraincontrols(void)
func_traincontrols::func_traincontrols(void)
{
super::NSBrushTrigger();
}

View file

@ -33,6 +33,6 @@ This entity was introduced in Counter-Strike (2000).
void
func_vehiclecontrols(void)
{
spawnfunc_func_tracktraincontrols();
spawnfunc_func_traincontrols();
self.classname = "func_vehiclecontrols";
}

View file

@ -99,6 +99,8 @@ func_wall_toggle::Respawn(void)
SetSolid(SOLID_BSP);
SetModel(GetSpawnModel());
SetOrigin(origin);
ClearAngles();
m_iVisible = 1;
m_oldmodelindex = modelindex;

View file

@ -98,8 +98,10 @@ momentary_door::Respawn(void)
SetSolid(SOLID_BSP);
SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin());
RestoreAngles();
SetMovementDirection();
SetAngles([0,0,0]);
ClearAngles();
m_vecPos1 = GetSpawnOrigin();
m_vecPos2 = (m_vecPos1 + m_vecMoveDir * (fabs(m_vecMoveDir * size) - m_flDistance));

View file

@ -129,8 +129,11 @@ momentary_rot_button::Respawn(void)
SetSolid(SOLID_BSP);
SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin());
RestoreAngles();
SetMovementDirection();
SetAngles([0,0,0]);
ClearAngles();
PlayerUse = OnPlayerUse;
m_vecPos1 = [0,0,0];

View file

@ -132,15 +132,17 @@ monstermaker::Spawner(void)
vector newang = self.angles;
string tname = self.netname;
/* prevent us from being deleted by callfunction() */
self.spawnflags |= MSF_MULTIPLAYER;
/* become the classname assigned */
NSMonster t = (NSMonster)self;
callfunction(self.classname);
/* apply the saved values back */
t.origin = t.GetSpawnOrigin() = neworg;
t.angles = t.GetSpawnAngles() = newang;
t.origin = t.m_oldOrigin = neworg;
t.angles = t.m_oldAngle = newang;
t.targetname = tname;
t.spawnflags |= MSF_MULTIPLAYER;
/* spawn anew */
t.Respawn();

View file

@ -37,30 +37,27 @@ This entity was introduced in Quake (1996).
.float hurt_next;
typedef enumflags
{
HURTTYPE_GENERIC,
HURTTYPE_CRUSH,
HURTTYPE_BULLET,
HURTTYPE_SLASH,
HURTTYPE_BURN,
HURTTYPE_FREEZE,
HURTTYPE_FALL,
HURTTYPE_BLAST,
HURTTYPE_CLUB,
HURTTYPE_SHOCK,
HURTTYPE_SONIC,
HURTTYPE_ENERGYBEAM,
HURTTYPE_DROWN,
HURTTYPE_PARALYSE,
HURTTYPE_NERVEGAS,
HURTTYPE_POISON,
HURTTYPE_RADIATION,
HURTTYPE_DROWNRECOVER,
HURTTYPE_CHEMICAL,
HURTTYPE_SLOWBURN,
HURTTYPE_SLOWFREEZE,
} hurttype_e;
#define HURTTYPE_GENERIC 0
#define HURTTYPE_CRUSH 1
#define HURTTYPE_BULLET 2
#define HURTTYPE_SLASH 4
#define HURTTYPE_BURN 8
#define HURTTYPE_FREEZE 16
#define HURTTYPE_FALL 32
#define HURTTYPE_BLAST 64
#define HURTTYPE_CLUB 128
#define HURTTYPE_SHOCK 256
#define HURTTYPE_SONIC 512
#define HURTTYPE_ENERGYBEAM 1024
#define HURTTYPE_DROWN 16384
#define HURTTYPE_PARALYSE 32768
#define HURTTYPE_NERVEGAS 65536
#define HURTTYPE_POISON 131072
#define HURTTYPE_RADIATION 262144
#define HURTTYPE_DROWNRECOVER 524288
#define HURTTYPE_CHEMICAL 1048576
#define HURTTYPE_SLOWBURN 2097152
#define HURTTYPE_SLOWFREEZE 4194304
#define SF_HURT_ONCE 1 // Turn off once it fired the first time
#define SF_HURT_OFF 2 // Needs to be triggered in order to work again
@ -249,7 +246,7 @@ trigger_hurt::SpawnKey(string strKey, string strValue)
m_iDamage = stoi(strValue);
break;
case "damagetype":
m_iDamageType = stoi(strValue);
m_iDamageType = (int)stoi(strValue);
break;
case "wait":
m_flNextDmg = stof(strValue);

View file

@ -86,8 +86,6 @@ trigger_push::SetMovementDirection(void)
makevectors(GetSpawnAngles());
m_vecMoveDir = v_forward;
}
angles = [0,0,0];
}
void
@ -142,7 +140,10 @@ void
trigger_push::Respawn(void)
{
InitBrushTrigger();
RestoreAngles();
SetMovementDirection();
ClearAngles();
if (spawnflags & TP_STARTOFF) {
SetSolid(SOLID_NOT);

View file

@ -63,6 +63,10 @@ class NSEntity:NSTrigger
nonvirtual void(void) ClearParent;
virtual void(void) ParentUpdate;
/* some ents need this */
nonvirtual void(void) RestoreAngles;
nonvirtual void(void) ClearAngles;
nonvirtual vector(void) GetSpawnOrigin;
nonvirtual vector(void) GetSpawnAngles;
nonvirtual string(void) GetSpawnModel;

View file

@ -240,6 +240,17 @@ NSEntity::ClearParent(void)
{
m_parent = __NULL__;
}
void
NSEntity::RestoreAngles(void)
{
angles = GetSpawnAngles();
}
void
NSEntity::ClearAngles(void)
{
angles = [0,0,0];
}
#endif
/* we want to really use those set functions because they'll notify of any

View file

@ -77,12 +77,12 @@ func_illusionary::Respawn(void)
super::Respawn();
/* func_illusionary specifics */
SetAngles([0,0,0]);
SetMovetype(MOVETYPE_NONE);
SetSolid(SOLID_NOT);
SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin());
SetSkin(0);
ClearAngles();
// TODO: Add support for (skin) -1 = Empty, -7 = Volumetric light
if (skin < 0) {
@ -126,6 +126,7 @@ func_illusionary::Init(void)
SetAngles([0,0,0]);
SetMovetype(MOVETYPE_NONE);
SetSolid(SOLID_NOT);
angles = [0,0,0];
if (skin == -1 && m_iRenderMode == RM_TEXTURE)
SetRenderMode(RM_TRIGGER);

View file

@ -74,13 +74,14 @@ func_ladder::Respawn(void)
super::Respawn();
/* func_ladder specifics */
SetAngles([0,0,0]);
SetMovetype(MOVETYPE_NONE);
SetSolid(SOLID_BSP);
SetSkin(CONTENT_LADDER);
SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin());
SetFrame(0);
ClearAngles();
#ifdef GS_RENDERFX
SetRenderMode(RM_TRIGGER);
#endif
@ -122,6 +123,7 @@ func_ladder::Init(void)
movetype = MOVETYPE_NONE;
solid = SOLID_BSP;
skin = CONTENT_LADDER;
angles = [0,0,0];
}
#endif

View file

@ -77,12 +77,12 @@ func_wall::Respawn(void)
super::Respawn();
/* func_wall specifics */
SetAngles([0,0,0]);
SetMovetype(MOVETYPE_PUSH);
SetSolid(SOLID_BSP);
SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin());
SetFrame(0);
ClearAngles();
}
#else
float
@ -120,6 +120,7 @@ func_wall::Init(void)
setorigin(this, origin);
movetype = MOVETYPE_PUSH;
solid = SOLID_BSP;
angles = [0,0,0];
MakeStatic();
}

View file

@ -83,7 +83,8 @@ worldspawn::SpawnKey(string strField, string strKey)
{
switch (strField) {
case "startdark":
Fade_StartDark();
if (stof(strKey) == 1)
Fade_StartDark();
break;
case "chaptertitle":
GameMessage_Setup(strKey, 0);