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.
Maikel de Vries 2010-12-07 17:16:18 +01:00
parent 42a1d61351
commit c628de3d73
4 changed files with 40 additions and 28 deletions

View File

@ -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,

View File

@ -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

View File

@ -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()

View File

@ -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;
}