mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-13 07:57:52 +00:00
- Added DesingatedTeam property from Skulltag. Allows friendly fire calculations to be applied to monsters/objects and allows the friendly AI to be aware of teams.
SVN r3113 (trunk)
This commit is contained in:
parent
7ed7e9f755
commit
d9d94d04ba
6 changed files with 56 additions and 23 deletions
|
@ -858,6 +858,7 @@ public:
|
||||||
int lastbump; // Last time the actor was bumped, used to control BUMPSPECIAL
|
int lastbump; // Last time the actor was bumped, used to control BUMPSPECIAL
|
||||||
int Score; // manipulated by score items, ACS or DECORATE. The engine doesn't use this itself for anything.
|
int Score; // manipulated by score items, ACS or DECORATE. The engine doesn't use this itself for anything.
|
||||||
FString * Tag; // Strife's tag name.
|
FString * Tag; // Strife's tag name.
|
||||||
|
int DesignatedTeam; // Allow for friendly fire cacluations to be done on non-players.
|
||||||
|
|
||||||
AActor *BlockingMobj; // Actor that blocked the last move
|
AActor *BlockingMobj; // Actor that blocked the last move
|
||||||
line_t *BlockingLine; // Line that blocked the last move
|
line_t *BlockingLine; // Line that blocked the last move
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include "thingdef/thingdef.h"
|
#include "thingdef/thingdef.h"
|
||||||
#include "d_dehacked.h"
|
#include "d_dehacked.h"
|
||||||
#include "g_level.h"
|
#include "g_level.h"
|
||||||
|
#include "teaminfo.h"
|
||||||
|
|
||||||
#include "gi.h"
|
#include "gi.h"
|
||||||
|
|
||||||
|
@ -1417,9 +1418,7 @@ AActor *LookForEnemiesInBlock (AActor *lookee, int index, void *extparam)
|
||||||
other = NULL;
|
other = NULL;
|
||||||
if (link->flags & MF_FRIENDLY)
|
if (link->flags & MF_FRIENDLY)
|
||||||
{
|
{
|
||||||
if (deathmatch &&
|
if (!lookee->IsFriend(link))
|
||||||
lookee->FriendPlayer != 0 && link->FriendPlayer != 0 &&
|
|
||||||
lookee->FriendPlayer != link->FriendPlayer)
|
|
||||||
{
|
{
|
||||||
// This is somebody else's friend, so go after it
|
// This is somebody else's friend, so go after it
|
||||||
other = link;
|
other = link;
|
||||||
|
@ -1581,7 +1580,7 @@ bool P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// [SP] If you don't see any enemies in deathmatch, look for players (but only when friend to a specific player.)
|
// [SP] If you don't see any enemies in deathmatch, look for players (but only when friend to a specific player.)
|
||||||
if (actor->FriendPlayer == 0) return result;
|
if (actor->FriendPlayer == 0 && (!teamplay || actor->DesignatedTeam == TEAM_NONE)) return result;
|
||||||
if (result || !deathmatch) return true;
|
if (result || !deathmatch) return true;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1664,10 +1663,8 @@ bool P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params)
|
||||||
// We're going to ignore our master, but go after his enemies.
|
// We're going to ignore our master, but go after his enemies.
|
||||||
if ( actor->flags & MF_FRIENDLY )
|
if ( actor->flags & MF_FRIENDLY )
|
||||||
{
|
{
|
||||||
if ( actor->FriendPlayer == 0 )
|
if ( actor->IsFriend(player->mo) )
|
||||||
continue; // I have no friends, I will ignore players.
|
continue;
|
||||||
if ( actor->FriendPlayer == player->mo->FriendPlayer )
|
|
||||||
continue; // This is my master.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((player->mo->flags & MF_SHADOW && !(i_compatflags & COMPATF_INVISIBILITY)) ||
|
if ((player->mo->flags & MF_SHADOW && !(i_compatflags & COMPATF_INVISIBILITY)) ||
|
||||||
|
|
|
@ -1087,6 +1087,21 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [RH] Avoid friendly fire if enabled
|
||||||
|
if (!(flags & DMG_FORCED) && source != NULL &&
|
||||||
|
((player && player != source->player) || !player) &&
|
||||||
|
target->IsTeammate (source))
|
||||||
|
{
|
||||||
|
if (player)
|
||||||
|
FriendlyFire = true;
|
||||||
|
if (damage < TELEFRAG_DAMAGE)
|
||||||
|
{ // Still allow telefragging :-(
|
||||||
|
damage = (int)((float)damage * level.teamdamage);
|
||||||
|
if (damage <= 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// player specific
|
// player specific
|
||||||
//
|
//
|
||||||
|
@ -1115,17 +1130,6 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// [RH] Avoid friendly fire if enabled
|
|
||||||
if (source != NULL && player != source->player && target->IsTeammate (source))
|
|
||||||
{
|
|
||||||
FriendlyFire = true;
|
|
||||||
if (damage < TELEFRAG_DAMAGE)
|
|
||||||
{ // Still allow telefragging :-(
|
|
||||||
damage = (int)((float)damage * level.teamdamage);
|
|
||||||
if (damage <= 0)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!(flags & DMG_NO_ARMOR) && player->mo->Inventory != NULL)
|
if (!(flags & DMG_NO_ARMOR) && player->mo->Inventory != NULL)
|
||||||
{
|
{
|
||||||
int newdam = damage;
|
int newdam = damage;
|
||||||
|
|
|
@ -300,6 +300,7 @@ void AActor::Serialize (FArchive &arc)
|
||||||
<< pushfactor
|
<< pushfactor
|
||||||
<< Species
|
<< Species
|
||||||
<< Score
|
<< Score
|
||||||
|
<< DesignatedTeam
|
||||||
<< lastpush << lastbump
|
<< lastpush << lastbump
|
||||||
<< PainThreshold
|
<< PainThreshold
|
||||||
<< DamageFactor
|
<< DamageFactor
|
||||||
|
@ -775,6 +776,7 @@ void AActor::CopyFriendliness (AActor *other, bool changeTarget)
|
||||||
flags3 = (flags3 & ~(MF3_NOSIGHTCHECK | MF3_HUNTPLAYERS)) | (other->flags3 & (MF3_NOSIGHTCHECK | MF3_HUNTPLAYERS));
|
flags3 = (flags3 & ~(MF3_NOSIGHTCHECK | MF3_HUNTPLAYERS)) | (other->flags3 & (MF3_NOSIGHTCHECK | MF3_HUNTPLAYERS));
|
||||||
flags4 = (flags4 & ~MF4_NOHATEPLAYERS) | (other->flags4 & MF4_NOHATEPLAYERS);
|
flags4 = (flags4 & ~MF4_NOHATEPLAYERS) | (other->flags4 & MF4_NOHATEPLAYERS);
|
||||||
FriendPlayer = other->FriendPlayer;
|
FriendPlayer = other->FriendPlayer;
|
||||||
|
DesignatedTeam = other->DesignatedTeam;
|
||||||
if (changeTarget && other->target != NULL && !(other->target->flags3 & MF3_NOTARGET))
|
if (changeTarget && other->target != NULL && !(other->target->flags3 & MF3_NOTARGET))
|
||||||
{
|
{
|
||||||
// LastHeard must be set as well so that A_Look can react to the new target if called
|
// LastHeard must be set as well so that A_Look can react to the new target if called
|
||||||
|
@ -5296,12 +5298,18 @@ AActor *P_SpawnPlayerMissile (AActor *source, fixed_t x, fixed_t y, fixed_t z,
|
||||||
|
|
||||||
bool AActor::IsTeammate (AActor *other)
|
bool AActor::IsTeammate (AActor *other)
|
||||||
{
|
{
|
||||||
if (!player || !other || !other->player)
|
if (!other)
|
||||||
return false;
|
return false;
|
||||||
if (!deathmatch)
|
else if (!deathmatch && player && other->player)
|
||||||
return true;
|
return true;
|
||||||
if (teamplay && other->player->userinfo.team != TEAM_NONE &&
|
int myTeam = DesignatedTeam;
|
||||||
player->userinfo.team == other->player->userinfo.team)
|
int otherTeam = other->DesignatedTeam;
|
||||||
|
if (player)
|
||||||
|
myTeam = player->userinfo.team;
|
||||||
|
if (other->player)
|
||||||
|
otherTeam = other->player->userinfo.team;
|
||||||
|
if (teamplay && myTeam != TEAM_NONE &&
|
||||||
|
myTeam == otherTeam)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -5353,6 +5361,11 @@ bool AActor::IsFriend (AActor *other)
|
||||||
{
|
{
|
||||||
if (flags & other->flags & MF_FRIENDLY)
|
if (flags & other->flags & MF_FRIENDLY)
|
||||||
{
|
{
|
||||||
|
if (deathmatch && teamplay)
|
||||||
|
return IsTeammate(other) ||
|
||||||
|
(FriendPlayer != 0 && other->FriendPlayer != 0 &&
|
||||||
|
players[FriendPlayer-1].mo->IsTeammate(players[other->FriendPlayer-1].mo));
|
||||||
|
|
||||||
return !deathmatch ||
|
return !deathmatch ||
|
||||||
FriendPlayer == other->FriendPlayer ||
|
FriendPlayer == other->FriendPlayer ||
|
||||||
FriendPlayer == 0 ||
|
FriendPlayer == 0 ||
|
||||||
|
@ -5378,6 +5391,11 @@ bool AActor::IsHostile (AActor *other)
|
||||||
// Both monsters are friendly and belong to the same player if applicable.
|
// Both monsters are friendly and belong to the same player if applicable.
|
||||||
if (flags & other->flags & MF_FRIENDLY)
|
if (flags & other->flags & MF_FRIENDLY)
|
||||||
{
|
{
|
||||||
|
if (deathmatch && teamplay)
|
||||||
|
return !IsTeammate(other) &&
|
||||||
|
!(FriendPlayer != 0 && other->FriendPlayer != 0 &&
|
||||||
|
players[FriendPlayer-1].mo->IsTeammate(players[other->FriendPlayer-1].mo));
|
||||||
|
|
||||||
return deathmatch &&
|
return deathmatch &&
|
||||||
FriendPlayer != other->FriendPlayer &&
|
FriendPlayer != other->FriendPlayer &&
|
||||||
FriendPlayer !=0 &&
|
FriendPlayer !=0 &&
|
||||||
|
|
|
@ -67,6 +67,7 @@
|
||||||
#include "r_translate.h"
|
#include "r_translate.h"
|
||||||
#include "a_morph.h"
|
#include "a_morph.h"
|
||||||
#include "colormatcher.h"
|
#include "colormatcher.h"
|
||||||
|
#include "teaminfo.h"
|
||||||
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -1120,6 +1121,17 @@ DEFINE_PROPERTY(activation, N, Actor)
|
||||||
defaults->activationtype = val;
|
defaults->activationtype = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
DEFINE_PROPERTY(designatedteam, I, Actor)
|
||||||
|
{
|
||||||
|
PROP_INT_PARM(val, 0);
|
||||||
|
if(val < 0 || (val >= (signed) Teams.Size() && val != TEAM_NONE))
|
||||||
|
I_Error("Invalid team designation.\n");
|
||||||
|
defaults->DesignatedTeam = val;
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// Special inventory properties
|
// Special inventory properties
|
||||||
|
|
|
@ -21,6 +21,7 @@ ACTOR Actor native //: Thinker
|
||||||
PushFactor 0.25
|
PushFactor 0.25
|
||||||
WeaveIndexXY 0
|
WeaveIndexXY 0
|
||||||
WeaveIndexZ 16
|
WeaveIndexZ 16
|
||||||
|
DesignatedTeam 255
|
||||||
|
|
||||||
// Variables for the expression evaluator
|
// Variables for the expression evaluator
|
||||||
// NOTE: fixed_t and angle_t are only used here to ensure proper conversion
|
// NOTE: fixed_t and angle_t are only used here to ensure proper conversion
|
||||||
|
|
Loading…
Reference in a new issue