forked from Mirrors/openclonk
add rule to prevent friendly fire
parent
c73fed8aa6
commit
918e5ded0d
|
@ -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, ...);
|
||||
}
|
|
@ -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, ...);
|
||||
}
|
|
@ -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 |
|
@ -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;
|
|
@ -0,0 +1,2 @@
|
|||
Name=Kein Teambeschuss
|
||||
Description=Clan-Mitglieder bekommen nur Schaden von feindlichen Angriffe ab.
|
|
@ -0,0 +1,2 @@
|
|||
Name=No friendly fire
|
||||
Description=Crew members only take damage from hostile fire.
|
Loading…
Reference in New Issue