make friendly fire rule also work for lightning strikes and punches

install-platforms
Maikel de Vries 2018-01-24 11:42:19 +01:00
parent 65c279233e
commit 73dbc72f34
4 changed files with 46 additions and 11 deletions

View File

@ -98,16 +98,8 @@ protected func FxLightningMoveTimer(object target, effect fx, int time)
if (obj && !obj->~RejectLightningStrike(this, damage))
{
var is_attractor = obj.IsLightningAttractor;
// Do a callback notifying the object that it has been struck by lightning.
obj->~OnLightningStrike(this, damage);
// Damage or hurt objects. Lightning strikes may have a controller, thus pass this for kill tracing.
if (obj)
{
if (obj->GetOCF() & OCF_Alive)
Punch(obj, damage);
else
obj->DoDamage(damage, FX_Call_DmgScript, GetController());
}
// Perform the strike on the object.
PerformLightningStrike(obj, damage);
// Reduce strength of the lightning if an object is struck.
strength -= damage;
// Remove lightning if too weak or an attractor has been struck.
@ -173,6 +165,21 @@ private func DrawLightningLine(int x1, int y1, int x2, int y2, int distance, int
return;
}
private func PerformLightningStrike(object target, int damage)
{
// Do a callback notifying the object that it has been struck by lightning.
target->~OnLightningStrike(this, damage);
// Damage or hurt objects. Lightning strikes may have a controller, thus pass this for kill tracing.
if (target)
{
if (target->GetOCF() & OCF_Alive)
Punch(target, damage);
else
target->DoDamage(damage, FX_Call_DmgScript, GetController());
}
return;
}
// Don't save in scenarios.
func SaveScenarioObject() { return false; }

View File

@ -0,0 +1,13 @@
// Disable friendly fire for lightning strikes if rule is active.
#appendto Lightning
private func PerformLightningStrike(object target, int damage)
{
var w_controller = this->GetController();
var t_controller = target->GetController();
if (FindObject(Find_ID(Rule_NoFriendlyFire)))
if (w_controller != NO_OWNER && t_controller != NO_OWNER && !Hostile(w_controller, t_controller))
return;
return _inherited(target, damage, ...);
}

View File

@ -0,0 +1,15 @@
// Disable friendly fire for damage done through the Punch function.
// This needs be done by overloading because the callback QueryCatchBlow
// only halves the damage and prevents the tumbling.
global func Punch(object obj, int strength)
{
var w_controller = NO_OWNER;
if (this)
w_controller = this->GetController();
var t_controller = obj->GetController();
if (FindObject(Find_ID(Rule_NoFriendlyFire)))
if (w_controller != NO_OWNER && t_controller != NO_OWNER && !Hostile(w_controller, t_controller))
return false;
return _inherited(obj, strength, ...);
}

View File

@ -1,6 +1,6 @@
/**
No Friendly Fire Rule
If this rule is activate non-hostile crew members can't hit each other.
If this rule is active non-hostile crew members can't hit each other.
Some of the implementation is in appendto scripts.
@author Maikel