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