forked from Mirrors/openclonk
141 lines
2.5 KiB
C
141 lines
2.5 KiB
C
/*-- Hook --*/
|
|
|
|
local tower, rope;
|
|
|
|
/* Connection */
|
|
|
|
public func ControlUse(object clonk, int x, int y)
|
|
{
|
|
// Search for objects to connect with!
|
|
var connect = FindObjects(Find_Category(C4D_Vehicle), Find_AtPoint(), Find_Not(Find_Func("NoLiftTowerConnection")), Find_Not(Find_Func("IsEnvironment")));
|
|
if (!GetLength(connect)) return true;
|
|
if (GetLength(connect) == 1) return ConnectTo(connect[0]);
|
|
|
|
var menu = clonk->CreateRingMenu(GetID(), this);
|
|
for (var connect_object in connect)
|
|
menu->AddItem(connect_object);
|
|
menu->Show();
|
|
}
|
|
|
|
public func Selected(object menu, object selected)
|
|
{
|
|
return ConnectTo(selected->GetSymbol());
|
|
}
|
|
|
|
public func ConnectTo(object connect)
|
|
{
|
|
Hook();
|
|
/* rope->BreakRope(true);
|
|
SetRope(true);
|
|
rope->Connect(tower, connect);*/
|
|
rope->Reconnect(connect);
|
|
AddEffect("Connecting", this, 1, 1, this, nil, connect);
|
|
return true;
|
|
}
|
|
|
|
private func Hook()
|
|
{
|
|
if (Contained()) Exit();
|
|
this.Collectible = 0;
|
|
SetCategory(C4D_StaticBack);
|
|
}
|
|
private func Unhook()
|
|
{
|
|
this.Collectible = 1;
|
|
SetCategory(C4D_Object);
|
|
}
|
|
|
|
private func FxConnectingStart(object target, effect, int temp, object connect_object)
|
|
{
|
|
if (temp) return;
|
|
effect.connection = connect_object;
|
|
}
|
|
|
|
private func FxConnectingTimer(object target, effect)
|
|
{
|
|
if (!rope)
|
|
{
|
|
Unhook();
|
|
return -1;
|
|
}
|
|
if (!effect.connection)
|
|
{
|
|
Unhook();
|
|
rope->BreakRope(true);
|
|
SetRope();
|
|
return -1;
|
|
}
|
|
SetPosition(effect.connection->GetX(), effect.connection->GetY());
|
|
}
|
|
|
|
public func Connected()
|
|
{
|
|
return GetEffect("Connecting", this);
|
|
}
|
|
|
|
public func IsInteractable(object clonk)
|
|
{
|
|
return !this.Collectible && clonk->GetAction() == "Walk";
|
|
}
|
|
|
|
public func GetInteractionMetaInfo(object clonk)
|
|
{
|
|
return { IconID = LiftTower_Hook, Description = "$Unhook$" };
|
|
}
|
|
|
|
public func Interact(object clonk)
|
|
{
|
|
if(clonk->Collect(this))
|
|
{
|
|
RemoveEffect("Connecting", this);
|
|
Unhook();
|
|
rope->BreakRope(true);
|
|
SetRope();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/* Events */
|
|
|
|
protected func Hit()
|
|
{
|
|
Sound("Hits::Materials::Metal::LightMetalHit?");
|
|
}
|
|
|
|
func Construction(object constructor)
|
|
{
|
|
tower = constructor;
|
|
}
|
|
|
|
func Initialize()
|
|
{
|
|
AddTimer("Rotation", 2);
|
|
}
|
|
|
|
func SetRope(bool no_connect)
|
|
{
|
|
rope = CreateObjectAbove(LiftTower_Rope,0,0,NO_OWNER);
|
|
if (!no_connect) rope->Connect(tower, this);
|
|
tower->SetRope(rope);
|
|
return rope;
|
|
}
|
|
|
|
public func Destruction()
|
|
{
|
|
if(rope)
|
|
rope->HookRemoved();
|
|
}
|
|
|
|
protected func Rotation()
|
|
{
|
|
if (!rope) return;
|
|
SetR(rope->GetHookAngle());
|
|
}
|
|
|
|
public func NoLiftTowerConnection() { return true; }
|
|
|
|
local Name = "$Name$";
|
|
local Description = "$Description$";
|
|
local Collectible = 1;
|