add rule to prevent friendly fire

alut-include-path
Maikel de Vries 2017-01-07 14:46:52 +01:00
parent c73fed8aa6
commit 918e5ded0d
7 changed files with 182 additions and 0 deletions

View File

@ -0,0 +1,13 @@
// Disable friendly fire for melee weapons if rule is active.
#appendto Library_MeleeWeapon
public func ApplyShieldFactor(from, target, ...)
{
var w_controller = from->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 100;
return inherited(from, target, ...);
}

View File

@ -0,0 +1,17 @@
// Disable friendly fire for ranged weapons if rule is active.
#appendto Arrow
#appendto Javelin
#appendto LeadBullet
#appendto Boompack
#appendto Shrapnel
public func HitObject(object target, ...)
{
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 false;
return inherited(target, ...);
}

View File

@ -0,0 +1,7 @@
[DefCore]
id=Rule_NoFriendlyFire
Version=8,0
Category=C4D_StaticBack|C4D_Rule
Width=32
Height=32
Offset=-16,-16

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,141 @@
/**
No Friendly Fire Rule
If this rule is activate non-hostile crew members can't hit each other.
Some of the implementation is in appendto scripts.
@author Maikel
*/
public func Initialize()
{
// Don't do anything if this is not the first rule of this type.
if (ObjectCount(Find_ID(Rule_NoFriendlyFire)) > 1)
return;
// Find all crew members and protect them from friendly fire.
for (var crew in FindObjects(Find_OCF(OCF_CrewMember)))
DisableFriendlyFire(crew);
return;
}
public func Destruction()
{
// If this is not the last copy of this rule do nothing.
if (ObjectCount(Find_ID(Rule_NoFriendlyFire)) > 1)
return;
// Find all crew members and allow friendly fire.
for (var crew in FindObjects(Find_OCF(OCF_CrewMember)))
EnableFriendlyFire(crew);
return;
}
public func OnClonkRecruitment(object clonk, int plr)
{
DisableFriendlyFire(clonk);
return;
}
public func OnClonkDerecruitment(object clonk, int plr)
{
EnableFriendlyFire(clonk);
return;
}
public func OnClonkDeath(object clonk, int killed_by)
{
EnableFriendlyFire(clonk);
return;
}
/*-- Friendly Fire --*/
public func DisableFriendlyFire(object for_obj)
{
// Overload several functions to check for friendly fire.
if (for_obj.QueryCatchBlow != Rule_NoFriendlyFire.NoFF_QueryCatchBlow)
{
for_obj.Backup_QueryCatchBlow = for_obj.QueryCatchBlow;
for_obj.QueryCatchBlow = Rule_NoFriendlyFire.NoFF_QueryCatchBlow;
}
if (for_obj.BlastObject != Rule_NoFriendlyFire.NoFF_BlastObject)
{
for_obj.Backup_BlastObject = for_obj.BlastObject ?? Global.BlastObject;
for_obj.BlastObject = Rule_NoFriendlyFire.NoFF_BlastObject;
}
if (for_obj.DoShockwaveCheck != Rule_NoFriendlyFire.NoFF_DoShockwaveCheck)
{
for_obj.Backup_DoShockwaveCheck = for_obj.DoShockwaveCheck ?? Global.DoShockwaveCheck;
for_obj.DoShockwaveCheck = Rule_NoFriendlyFire.NoFF_DoShockwaveCheck;
}
return;
}
public func EnableFriendlyFire(object for_obj)
{
// Stop overloading functions to check for friendly fire.
if (for_obj.Backup_QueryCatchBlow != nil)
{
for_obj.QueryCatchBlow = for_obj.Backup_QueryCatchBlow;
for_obj.Backup_QueryCatchBlow = nil;
}
if (for_obj.Backup_BlastObject != nil)
{
for_obj.BlastObject = for_obj.Backup_BlastObject;
for_obj.Backup_BlastObject = nil;
}
if (for_obj.Backup_DoShockwaveCheck != nil)
{
for_obj.DoShockwaveCheck = for_obj.Backup_DoShockwaveCheck;
for_obj.Backup_DoShockwaveCheck = nil;
}
return;
}
public func NoFF_QueryCatchBlow(object projectile, ...)
{
var w_controller = projectile->GetController();
var t_controller = this->GetController();
if (w_controller != NO_OWNER && t_controller != NO_OWNER && !Hostile(w_controller, t_controller))
return true;
if (this.Backup_QueryCatchBlow)
return this->Backup_QueryCatchBlow(projectile, ...);
return false;
}
public func NoFF_BlastObject(int level, int caused_by, ...)
{
var w_controller = caused_by;
var t_controller = this->GetController();
if (w_controller != NO_OWNER && t_controller != NO_OWNER && !Hostile(w_controller, t_controller))
return true;
return this->Backup_BlastObject(level, caused_by, ...);
}
public func NoFF_DoShockwaveCheck(int x, int y, int caused_by, ...)
{
var w_controller = caused_by;
var t_controller = this->GetController();
if (w_controller != NO_OWNER && t_controller != NO_OWNER && !Hostile(w_controller, t_controller))
return false;
return this->Backup_DoShockwaveCheck(x, y, caused_by, ...);
}
/*-- Description --*/
public func Activate(int plr)
{
MessageWindow(this.Description, plr);
return true;
}
/*-- Properties --*/
local Name = "$Name$";
local Description = "$Description$";
local Visibility = VIS_Editor;
local EditorPlacementLimit = 1;

View File

@ -0,0 +1,2 @@
Name=Kein Teambeschuss
Description=Clan-Mitglieder bekommen nur Schaden von feindlichen Angriffe ab.

View File

@ -0,0 +1,2 @@
Name=No friendly fire
Description=Crew members only take damage from hostile fire.