summaryrefslogtreecommitdiffstats
path: root/Items.c4d/Distributor.c4d/Script.c
blob: 156c30db6db4d08310e46be102fe8a711482e5c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#strict 2
#include UT7I

func Floating()
{
	return GetProcedure() == "FLOAT";
}

func ControlDigDouble(object caller)
{
	if(DenyContainedDirectCom())
	{
		return false;
	}
	return SetAction("Idle");
}

func Activate(object caller)
{
	caller->Exit(this);
	SetAction("Float");
	return true;
}

func AcceptsObject(object obj, id id, object requester)
{
	return FindObject2(Find_Tube(), ExcludeOrigin(requester), Find_Func("CanSendObject", this, obj));
}

func RetrieveObject(object requester, id type, arriveCallback, object excludeOrigin, failCallback, object realTarget)
{
	var line = FindObject2(Find_Tube(), ExcludeOrigin(requester), ExcludeOrigin(excludeOrigin), Find_Func("CanRetrieveObject", this, type, false)) || FindObject2(Find_Tube(), ExcludeOrigin(requester), ExcludeOrigin(excludeOrigin), Find_Func("CanRetrieveObject", this, type, true), Sort_Func("FactoryLoad"));
	if(line)
	{
		return line->RetrieveObject(this, type, BindCallback(Callback("ForwardObject"), [0, 1, 2, Bind(requester), Bind(arriveCallback)]), 0, failCallback, realTarget || requester->GetLineEnd(this));
	}
}

func ForwardObject(object obj, object line, object receiver, object requester, arriveCallback)
{
	if(requester)
	{
		return requester->SendObject(this, obj, arriveCallback);
	}
}

func ExcludeOrigin(object originLine)
{
	var origin = originLine;
	if(!originLine)
	{
		return Find_And();
	}
	if(origin->~IsTube())
	{
		origin = origin->ObjectOrigin(this);
	}
	else
	{
		originLine = 0;
	}
	return Find_And(Find_Exclude(originLine), Find_Not(Find_Func("HasObjectOrigin", origin)));
}

func ReceiveObject(object obj, bool noReturn, array arriveCallback, object senderLine)
{
	if(arriveCallback)
	{
		if(CallA(arriveCallback, [obj, senderLine, this], true))
		{
			return TU7I_NoCallback;
		}
	}
	else
	{
		var line = FindObject2(Find_Tube(), ExcludeOrigin(senderLine), Find_Func("CanSendObject", this, obj));
		return line && line->SendObject(this, obj, noReturn);
	}
}

func HasObject(id type, bool allowProduction, object receiverLine, object excludeOrigin)
{
	return FindObject2(Find_Tube(), ExcludeOrigin(receiverLine), Find_Func("CanRetrieveObject", this, type, allowProduction), ExcludeOrigin(excludeOrigin));
}

func GetRetrievableObjects(object requester, bool produce)
{
	var lines = FindObjects(Find_Tube(), ExcludeOrigin(requester));
	var IDs = [], produceIDs = [], part;
	for(var line in lines)
	{
		part = line->~GetRetrievableObjects(this, produce) || [];
		for(var id in part)
		{
			if(GetIndexOf(id, IDs) == -1)
			{
				IDs[GetLength(IDs)] = id;
			}
		}
	}
	return IDs;
}

func RejectEntrance(object obj)
{
	return Floating();
}