diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index 9e4df54729d..4f73fa9bd59 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -307,8 +307,6 @@ Note: All fields default to false unless mentioned otherwise. leakiness = ; // Probability of leaking through radiation suit (0 = never, 256 = always), default = 0. damageterraineffect = ; // Will spawn a terrain splash when damage is inflicted. Default = false. damagehazard = ; // Changes damage model to Strife's delayed damage for the given sector. Default = false. - hurtmonsters = ; // Non-players like monsters and decorations are hurt by this sector in the same manner as player. Doesn't work with damagehazard. - harminair = ; // Actors in this sector are harmed by the damage effects of the floor even if they aren't touching it. floorterrain = ; // Sets the terrain for the sector's floor. Default = 'use the flat texture's terrain definition.' ceilingterrain = ; // Sets the terrain for the sector's ceiling. Default = 'use the flat texture's terrain definition.' floor_reflect = ; // reflectiveness of floor (OpenGL only, not functional on sloped sectors) diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index d6453b6f8ad..943893c66a8 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -504,8 +504,6 @@ enum SECMF_OVERLAPPING = 512, // floor and ceiling overlap and require special renderer action. SECMF_NOSKYWALLS = 1024, // Do not draw "sky walls" SECMF_LIFT = 2048, // For MBF monster AI - SECMF_HURTMONSTERS = 4096, // Monsters in this sector are hurt like players. - SECMF_HARMINAIR = 8192, // Actors in this sector are also hurt mid-air. }; enum diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 1fd9869c325..9748e082f6c 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -1979,14 +1979,6 @@ class UDMFParser : public UDMFParserBase Flag(sec->Flags, SECF_HAZARD, key); break; - case NAME_hurtmonsters: - Flag(sec->MoreFlags, SECMF_HURTMONSTERS, key); - break; - - case NAME_harminair: - Flag(sec->MoreFlags, SECMF_HARMINAIR, key); - break; - case NAME_floorterrain: sec->terrainnum[sector_t::floor] = P_FindTerrain(CheckString(key)); break; diff --git a/src/namedef_custom.h b/src/namedef_custom.h index dbf94dbafc5..dd2e0066d47 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -810,8 +810,6 @@ xx(damageinterval) xx(leakiness) xx(damageterraineffect) xx(damagehazard) -xx(hurtmonsters) -xx(harminair) xx(floorterrain) xx(ceilingterrain) xx(floor_reflect) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 759d9d26281..d472decad19 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -442,8 +442,7 @@ enum ActorFlag9 MF9_DOSHADOWBLOCK = 0x00000002, // [inkoalawetrust] Should the monster look for SHADOWBLOCK actors ? MF9_SHADOWBLOCK = 0x00000004, // [inkoalawetrust] Actors in the line of fire with this flag trigger the MF_SHADOW aiming penalty. MF9_SHADOWAIMVERT = 0x00000008, // [inkoalawetrust] Monster aim is also offset vertically when aiming at shadow actors. - MF9_DECOUPLEDANIMATIONS = 0x00000010, // [RL0] Decouple model animations from states - MF9_NOSECTORDAMAGE = 0x00000020, // [inkoalawetrust] Actor ignores any sector-based damage (i.e damaging floors, NOT crushers) + MF9_DECOUPLEDANIMATIONS = 0x00000010, // [RL0] Decouple model animations from states MF9_ISPUFF = 0x00000040, // [AA] Set on actors by P_SpawnPuff }; diff --git a/src/playsim/p_3dfloors.cpp b/src/playsim/p_3dfloors.cpp index 505bfa7946b..dd5a2bb0a7e 100644 --- a/src/playsim/p_3dfloors.cpp +++ b/src/playsim/p_3dfloors.cpp @@ -198,15 +198,15 @@ void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flags, int //========================================================================== // -// P_ActorOnSpecial3DFloor -// Checks to see if an actor is standing on or is inside a 3D floor (water) +// P_PlayerOnSpecial3DFloor +// Checks to see if a player is standing on or is inside a 3D floor (water) // and applies any specials.. // //========================================================================== -void P_ActorOnSpecial3DFloor(AActor* victim) +void P_PlayerOnSpecial3DFloor(player_t* player) { - for(auto rover : victim->Sector->e->XFloor.ffloors) + for(auto rover : player->mo->Sector->e->XFloor.ffloors) { if (!(rover->flags & FF_EXISTS)) continue; if (rover->flags & FF_FIX) continue; @@ -215,22 +215,22 @@ void P_ActorOnSpecial3DFloor(AActor* victim) if(rover->flags & FF_SOLID) { // Player must be on top of the floor to be affected... - if(victim->Z() != rover->top.plane->ZatPoint(victim)) continue; + if(player->mo->Z() != rover->top.plane->ZatPoint(player->mo)) continue; } else { //Water and DEATH FOG!!! heh if ((rover->flags & FF_NODAMAGE) || - victim->Z() > rover->top.plane->ZatPoint(victim) || - victim->Top() < rover->bottom.plane->ZatPoint(victim)) + player->mo->Z() > rover->top.plane->ZatPoint(player->mo) || + player->mo->Top() < rover->bottom.plane->ZatPoint(player->mo)) continue; } // Apply sector specials - P_ActorInSpecialSector(victim, rover->model); + P_PlayerInSpecialSector(player, rover->model); // Apply flat specials (using the ceiling!) - P_ActorOnSpecialFlat(victim, rover->model->GetTerrain(rover->top.isceiling)); + P_PlayerOnSpecialFlat(player, rover->model->GetTerrain(rover->top.isceiling)); break; } diff --git a/src/playsim/p_3dfloors.h b/src/playsim/p_3dfloors.h index 2dba7f71379..05d222137e9 100644 --- a/src/playsim/p_3dfloors.h +++ b/src/playsim/p_3dfloors.h @@ -113,7 +113,8 @@ struct lightlist_t -void P_ActorOnSpecial3DFloor(AActor* victim); +class player_t; +void P_PlayerOnSpecial3DFloor(player_t* player); bool P_CheckFor3DFloorHit(AActor * mo, double z, bool trigger); bool P_CheckFor3DCeilingHit(AActor * mo, double z, bool trigger); diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 8d34e6c73ba..72251ec7923 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -4435,14 +4435,6 @@ void AActor::Tick () // must have been removed if (ObjectFlags & OF_EuthanizeMe) return; } - //[inkoalawetrust] Genericized level damage handling that makes sector, 3D floor, and TERRAIN flat damage affect monsters and other NPCs too. - if (!(flags9 & MF9_NOSECTORDAMAGE) && (player || (player == nullptr && Sector->MoreFlags & SECMF_HURTMONSTERS))) - { - P_ActorOnSpecial3DFloor(this); - P_ActorInSpecialSector(this,Sector); - if (!isAbove(Sector->floorplane.ZatPoint(this)) || waterlevel) // Actor must be touching the floor for TERRAIN flats. - P_ActorOnSpecialFlat(this, P_GetThingFloorType(this)); - } if (tics != -1) { diff --git a/src/playsim/p_spec.cpp b/src/playsim/p_spec.cpp index 9c3fde6f4d6..ab52f285af1 100644 --- a/src/playsim/p_spec.cpp +++ b/src/playsim/p_spec.cpp @@ -100,7 +100,7 @@ #include "c_console.h" #include "p_spec_thinkers.h" -static FRandom pr_actorinspecialsector ("ActorInSpecialSector"); +static FRandom pr_playerinspecialsector ("PlayerInSpecialSector"); EXTERN_CVAR(Bool, cl_predict_specials) EXTERN_CVAR(Bool, forcewater) @@ -419,18 +419,21 @@ bool P_PredictLine(line_t *line, AActor *mo, int side, int activationType) } // -// P_ActorInSpecialSector +// P_PlayerInSpecialSector // Called every tic frame -// that the actor origin is in a special sector +// that the player origin is in a special sector // -void P_ActorInSpecialSector (AActor *victim, sector_t * sector) +void P_PlayerInSpecialSector (player_t *player, sector_t * sector) { if (sector == NULL) - sector = victim->Sector; - - // Falling, not all the way down yet? - if (!(sector->MoreFlags & SECMF_HARMINAIR) && !victim->isAtZ(sector->LowestFloorAt(victim)) && !victim->waterlevel) - return; + { + // Falling, not all the way down yet? + sector = player->mo->Sector; + if (!player->mo->isAtZ(sector->LowestFloorAt(player->mo)) + && !player->mo->waterlevel) + { + return; + } // Has hit ground. @@ -441,7 +444,7 @@ void P_ActorInSpecialSector (AActor *victim, sector_t * sector) if (sector->damageinterval <= 0) sector->damageinterval = 32; // repair invalid damageinterval values - if (victim->player && sector->Flags & (SECF_EXIT1 | SECF_EXIT2)) + if (sector->Flags & (SECF_EXIT1 | SECF_EXIT2)) { for (int i = 0; i < MAXPLAYERS; i++) if (playeringame[i]) @@ -460,7 +463,7 @@ void P_ActorInSpecialSector (AActor *victim, sector_t * sector) // different damage types yet, so that's not happening for now. // [MK] account for subclasses that may have "Full" protection (i.e.: prevent leaky damage) int ironfeet = 0; - for (auto i = victim->Inventory; i != NULL; i = i->Inventory) + for (auto i = player->mo->Inventory; i != NULL; i = i->Inventory) { if (i->IsKindOf(NAME_PowerIronFeet)) { @@ -472,28 +475,28 @@ void P_ActorInSpecialSector (AActor *victim, sector_t * sector) } } - if (victim->player && sector->Flags & SECF_ENDGODMODE) victim->player->cheats &= ~CF_GODMODE; - if ((ironfeet == 0 || (ironfeet < 2 && pr_actorinspecialsector() < sector->leakydamage))) + if (sector->Flags & SECF_ENDGODMODE) player->cheats &= ~CF_GODMODE; + if ((ironfeet == 0 || (ironfeet < 2 && pr_playerinspecialsector() < sector->leakydamage))) { - if (victim->player && sector->Flags & SECF_HAZARD) + if (sector->Flags & SECF_HAZARD) { - victim->player->hazardcount += sector->damageamount; - victim->player->hazardtype = sector->damagetype; - victim->player->hazardinterval = sector->damageinterval; + player->hazardcount += sector->damageamount; + player->hazardtype = sector->damagetype; + player->hazardinterval = sector->damageinterval; } else if (Level->time % sector->damageinterval == 0) { - if (!(victim->player && victim->player->cheats & (CF_GODMODE | CF_GODMODE2))) + if (!(player->cheats & (CF_GODMODE | CF_GODMODE2))) { - P_DamageMobj(victim, NULL, NULL, sector->damageamount, sector->damagetype); + P_DamageMobj(player->mo, NULL, NULL, sector->damageamount, sector->damagetype); } - if (victim->player && (sector->Flags & SECF_ENDLEVEL) && victim->player->health <= 10 && (!deathmatch || !(dmflags & DF_NO_EXIT))) + if ((sector->Flags & SECF_ENDLEVEL) && player->health <= 10 && (!deathmatch || !(dmflags & DF_NO_EXIT))) { Level->ExitLevel(0, false); } if (sector->Flags & SECF_DMGTERRAINFX) { - P_HitWater(victim, victim->Sector, victim->Pos(), false, true, true); + P_HitWater(player->mo, player->mo->Sector, player->mo->Pos(), false, true, true); } } } @@ -502,14 +505,14 @@ void P_ActorInSpecialSector (AActor *victim, sector_t * sector) { if (Level->time % sector->damageinterval == 0) { - P_GiveBody(victim, -sector->damageamount, 100); + P_GiveBody(player->mo, -sector->damageamount, 100); } } - if (victim->player && sector->isSecret()) + if (sector->isSecret()) { sector->ClearSecret(); - P_GiveSecret(Level, victim, true, true, sector->Index()); + P_GiveSecret(Level, player->mo, true, true, sector->Index()); } } @@ -648,13 +651,13 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, GiveSecret) //============================================================================ // -// P_ActorOnSpecialFlat +// P_PlayerOnSpecialFlat // //============================================================================ -void P_ActorOnSpecialFlat (AActor *victim, int floorType) +void P_PlayerOnSpecialFlat (player_t *player, int floorType) { - auto Level = victim->Level; + auto Level = player->mo->Level; if (Terrains[floorType].DamageAmount && !(Level->time % (Terrains[floorType].DamageTimeMask+1))) @@ -664,7 +667,7 @@ void P_ActorOnSpecialFlat (AActor *victim, int floorType) if (Terrains[floorType].AllowProtection) { auto pitype = PClass::FindActor(NAME_PowerIronFeet); - for (ironfeet = victim->Inventory; ironfeet != NULL; ironfeet = ironfeet->Inventory) + for (ironfeet = player->mo->Inventory; ironfeet != NULL; ironfeet = ironfeet->Inventory) { if (ironfeet->IsKindOf (pitype)) break; @@ -674,18 +677,20 @@ void P_ActorOnSpecialFlat (AActor *victim, int floorType) int damage = 0; if (ironfeet == NULL) { - damage = P_DamageMobj (victim, NULL, NULL, Terrains[floorType].DamageAmount, + damage = P_DamageMobj (player->mo, NULL, NULL, Terrains[floorType].DamageAmount, Terrains[floorType].DamageMOD); } if (damage > 0 && Terrains[floorType].Splash != -1) { - S_Sound (victim, CHAN_AUTO, 0, + S_Sound (player->mo, CHAN_AUTO, 0, Splashes[Terrains[floorType].Splash].NormalSplashSound, 1, ATTN_IDLE); } } } + + // // P_UpdateSpecials // Animate planes, scroll walls, etc. diff --git a/src/playsim/p_spec.h b/src/playsim/p_spec.h index ebb5d93f913..cc7d990a97c 100644 --- a/src/playsim/p_spec.h +++ b/src/playsim/p_spec.h @@ -90,8 +90,8 @@ bool P_ActivateLine (line_t *ld, AActor *mo, int side, int activationType, DVect bool P_TestActivateLine (line_t *ld, AActor *mo, int side, int activationType, DVector3 *optpos = NULL); bool P_PredictLine (line_t *ld, AActor *mo, int side, int activationType); -void P_ActorInSpecialSector (AActor *victim, sector_t * sector=NULL); -void P_ActorOnSpecialFlat (AActor *victim, int floorType); +void P_PlayerInSpecialSector (player_t *player, sector_t * sector=NULL); +void P_PlayerOnSpecialFlat (player_t *player, int floorType); void P_SectorDamage(FLevelLocals *Level, int tag, int amount, FName type, PClassActor *protectClass, int flags); void P_SetSectorFriction (FLevelLocals *level, int tag, int amount, bool alterFlag); double FrictionToMoveFactor(double friction); diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index a98a7c523cd..d3294ffd605 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -1204,6 +1204,15 @@ DEFINE_ACTION_FUNCTION(APlayerPawn, CheckMusicChange) void P_CheckEnvironment(player_t *player) { + P_PlayerOnSpecial3DFloor(player); + P_PlayerInSpecialSector(player); + + if (!player->mo->isAbove(player->mo->Sector->floorplane.ZatPoint(player->mo)) || + player->mo->waterlevel) + { + // Player must be touching the floor + P_PlayerOnSpecialFlat(player, P_GetThingFloorType(player->mo)); + } if (player->mo->Vel.Z <= -player->mo->FloatVar(NAME_FallingScreamMinSpeed) && player->mo->Vel.Z >= -player->mo->FloatVar(NAME_FallingScreamMaxSpeed) && player->mo->alternative == nullptr && player->mo->waterlevel == 0) diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 129c06b7869..be7c299edd3 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -351,7 +351,6 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(MF9, SHADOWBLOCK, AActor, flags9), DEFINE_FLAG(MF9, SHADOWAIMVERT, AActor, flags9), DEFINE_FLAG(MF9, DECOUPLEDANIMATIONS, AActor, flags9), - DEFINE_FLAG(MF9, NOSECTORDAMAGE, AActor, flags9), DEFINE_PROTECTED_FLAG(MF9, ISPUFF, AActor, flags9), //[AA] was spawned by SpawnPuff // Effect flags diff --git a/wadsrc/static/zscript/mapdata.zs b/wadsrc/static/zscript/mapdata.zs index 06a7bf3eadf..5d45563eb39 100644 --- a/wadsrc/static/zscript/mapdata.zs +++ b/wadsrc/static/zscript/mapdata.zs @@ -435,11 +435,6 @@ struct Sector native play SECMF_UNDERWATERMASK = 32+64, SECMF_DRAWN = 128, // sector has been drawn at least once SECMF_HIDDEN = 256, // Do not draw on textured automap - SECMF_OVERLAPPING = 512, // floor and ceiling overlap and require special renderer action. - SECMF_NOSKYWALLS = 1024, // Do not draw "sky walls" - SECMF_LIFT = 2048, // For MBF monster AI - SECMF_HURTMONSTERS = 4096, // Monsters in this sector are hurt like players. - SECMF_HARMINAIR = 8192, // Actors in this sector are also hurt mid-air. } native uint16 MoreFlags; @@ -457,9 +452,6 @@ struct Sector native play SECF_ENDLEVEL = 512, // ends level when health goes below 10 SECF_HAZARD = 1024, // Change to Strife's delayed damage handling. SECF_NOATTACK = 2048, // monsters cannot start attacks in this sector. - SECF_EXIT1 = 4096, - SECF_EXIT2 = 8192, - SECF_KILLMONSTERS = 16384,// Monsters in this sector are instantly killed. SECF_WASSECRET = 1 << 30, // a secret that was discovered SECF_SECRET = 1 << 31, // a secret sector