forked from Mirrors/openclonk
Objects: CTF - Flag now attached to base
This prevents players from scoring if the other team has already taken the flag but not have cleared the base.
parent
42a1d61351
commit
c628de3d73
|
@ -37,7 +37,7 @@ public func FindTeam(int find_team)
|
|||
// Flag can be picked up by interaction.
|
||||
public func IsInteractable(object clonk)
|
||||
{
|
||||
if (GetAction() == "Attach")
|
||||
if (GetAction() == "AttachCarrier")
|
||||
if (GetActionTarget() != clonk)
|
||||
return false;
|
||||
var controller = clonk->GetController();
|
||||
|
@ -56,7 +56,7 @@ public func GetInteractionMetaInfo(object clonk)
|
|||
var ctrl_team = GetPlayerTeam(controller);
|
||||
if (team == ctrl_team)
|
||||
return { Description = "$MsgBeamFlag$" };
|
||||
if (GetAction() == "Attach" && GetActionTarget() == clonk)
|
||||
if (GetAction() == "AttachCarrier" && GetActionTarget() == clonk)
|
||||
return { Description = "$MsgDropFlag$" };
|
||||
return { Description = "$MsgGrabFlag$" };
|
||||
}
|
||||
|
@ -72,16 +72,16 @@ public func Interact(object clonk)
|
|||
return true;
|
||||
}
|
||||
// Carrying clonk, drop flag.
|
||||
if (GetAction() == "Attach" && GetActionTarget() == clonk)
|
||||
if (GetAction() == "AttachCarrier" && GetActionTarget() == clonk)
|
||||
{
|
||||
SetAction("Idle");
|
||||
RemoveEffect("FlagCarried", clonk);
|
||||
Log("$MsgFlagDropped$", GetTeamName(ctrl_team), GetTeamName(team));
|
||||
Log("$MsgFlagDropped$", GetTaggedTeamName(ctrl_team), GetTaggedTeamName(team));
|
||||
return true;
|
||||
}
|
||||
// Fiendly team, grab flag.
|
||||
SetAction("Attach", clonk);
|
||||
Log("$MsgFlagStolen$", GetTeamName(ctrl_team), GetTeamName(team));
|
||||
SetAction("AttachCarrier", clonk);
|
||||
Log("$MsgFlagStolen$", GetTaggedTeamName(ctrl_team), GetTaggedTeamName(team));
|
||||
AddEffect("FlagCarried", clonk, 100, 5, this);
|
||||
return true;
|
||||
}
|
||||
|
@ -92,8 +92,6 @@ protected func Initialize()
|
|||
return;
|
||||
}
|
||||
|
||||
public func HasNoFadeOut() { return true; }
|
||||
|
||||
protected func FxFlagCarriedStart(object target, int num, int temp)
|
||||
{
|
||||
if (temp == 0)
|
||||
|
@ -111,13 +109,13 @@ protected func FxFlagCarriedTimer(object target, int num)
|
|||
{
|
||||
var controller = target->GetController();
|
||||
var ctrl_team = GetPlayerTeam(controller);
|
||||
var base = FindObject(Find_ID(Goal_FlagBase), Find_Func("FindTeam", ctrl_team), Find_Distance(30));
|
||||
var base = FindObject(Find_ID(Goal_FlagBase), Find_Func("FindTeam", ctrl_team), Find_Distance(20));
|
||||
if (base && base->IsBaseWithFlag())
|
||||
{
|
||||
var goal = FindObject(Find_ID(Goal_CaptureTheFlag));
|
||||
if (goal)
|
||||
goal->AddTeamScore(ctrl_team);
|
||||
Log("$MsgFlagCaptured$", GetTeamName(ctrl_team));
|
||||
Log("$MsgFlagCaptured$", GetTaggedTeamName(ctrl_team));
|
||||
BeamFlag(false);
|
||||
return -1;
|
||||
}
|
||||
|
@ -128,8 +126,9 @@ protected func FxFlagCarriedStop(object target, int num, int reason, bool temp)
|
|||
{
|
||||
if (temp)
|
||||
return 1;
|
||||
SetAction("Idle");
|
||||
this.Visibility = VIS_All;
|
||||
if (reason == 4)
|
||||
SetAction("Idle");
|
||||
if (target)
|
||||
{
|
||||
target->DetachMesh(EffectVar(0, target, num));
|
||||
|
@ -165,8 +164,8 @@ protected func Destruction()
|
|||
{
|
||||
var flag = CreateObject(Goal_Flag, 0, 0, GetOwner());
|
||||
flag->SetTeam(GetTeam());
|
||||
flag->SetPosition(base->GetX() + 7, base->GetY() - 13);
|
||||
Log("$MsgFlagRestored$", GetTeamName(team));
|
||||
SetAction("AttachBase", base);
|
||||
Log("$MsgFlagRestored$", GetTaggedTeamName(team));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -174,7 +173,9 @@ protected func Destruction()
|
|||
// Returns whether the flag is at its base.
|
||||
public func IsAtBase()
|
||||
{
|
||||
return !!FindObject(Find_ID(Goal_FlagBase), Find_Func("FindTeam", team), Find_Distance(30));
|
||||
if (GetAction() == "AttachBase")
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
private func BeamFlag(bool msg)
|
||||
|
@ -182,14 +183,11 @@ private func BeamFlag(bool msg)
|
|||
if (IsAtBase())
|
||||
return;
|
||||
if (msg)
|
||||
Log("$MsgFlagBeamed$", GetTeamName(team));
|
||||
SetAction("Idle");
|
||||
Log("$MsgFlagBeamed$", GetTaggedTeamName(team));
|
||||
//SetAction("Idle");
|
||||
var base = FindObject(Find_ID(Goal_FlagBase), Find_Func("FindTeam", team));
|
||||
if (base)
|
||||
{
|
||||
if(ObjectDistance(base) > 30)
|
||||
SetPosition(base->GetX() + 7, base->GetY() - 13);
|
||||
}
|
||||
SetAction("AttachBase", base);
|
||||
else
|
||||
RemoveObject();
|
||||
return;
|
||||
|
@ -197,9 +195,18 @@ private func BeamFlag(bool msg)
|
|||
|
||||
local Name = "$Name$";
|
||||
local ActMap = {
|
||||
Attach = {
|
||||
AttachCarrier = {
|
||||
Prototype = Action,
|
||||
Name = "Attach",
|
||||
Name = "AttachCarrier",
|
||||
Procedure = DFA_ATTACH,
|
||||
Length = 1,
|
||||
Delay = 0,
|
||||
NextAction = "Attach",
|
||||
Animation = "Wave",
|
||||
},
|
||||
AttachBase = {
|
||||
Prototype = Action,
|
||||
Name = "AttachBase",
|
||||
Procedure = DFA_ATTACH,
|
||||
Length = 1,
|
||||
Delay = 0,
|
||||
|
|
|
@ -5,7 +5,7 @@ Category=C4D_StaticBack
|
|||
Width=10
|
||||
Height=5
|
||||
Offset=-5,-3
|
||||
Vertices=3
|
||||
VertexX=-5,5,0
|
||||
VertexY=3,3,-2
|
||||
VertexFriction=100,100,100
|
||||
Vertices=4
|
||||
VertexX=1,-4,4,0
|
||||
VertexY=2,3,3,-2
|
||||
VertexFriction=100,100,100,50
|
|
@ -32,7 +32,12 @@ public func FindTeam(int find_team)
|
|||
// Returns whether there is a flag at this base.
|
||||
public func IsBaseWithFlag()
|
||||
{
|
||||
return !!FindObject(Find_ID(Goal_Flag), Find_Func("FindTeam", team), Find_Distance(30));
|
||||
var flag = FindObject(Find_ID(Goal_Flag), Find_Func("FindTeam", team));
|
||||
if (flag->GetAction() != "AttachBase")
|
||||
return false;
|
||||
if (flag->GetActionTarget() != this)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
private func UpdateColor()
|
||||
|
|
|
@ -31,7 +31,7 @@ public func SetFlagBase(int team, int x, int y)
|
|||
var base = CreateObject(Goal_FlagBase, x, y, NO_OWNER);
|
||||
base->SetTeam(team);
|
||||
var flag = CreateObject(Goal_Flag, x, y, NO_OWNER);
|
||||
flag->SetPosition(x + 7, y - 13);
|
||||
flag->SetAction("AttachBase", base);
|
||||
flag->SetTeam(team);
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue