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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
/*-- Magic Spawnpoint --*/
#strict
local initialized, angle, player, spawntimer,WpID;
func IsWaypoint() { return(1); }
global func PlaceSpawnpoint(id idObj, int iX, int iY, int timer)
{
var spwn = CreateObject(MSPN, iX, iY, -1);
spwn->CreateContents(idObj);
if(timer)
spwn->LocalN("spawntimer") = timer;
return(spwn);
}
protected func Initialize()
{
if(Random(14)) WpID=SCRL;
else WpID=OGBT;
// Standardtimer = 1000 Frames
spawntimer = 1000;
SetClrModulation(RGBa(0,0,0,255));
}
protected func Timer()
{
if(!player) player = CreateArray();
// Noch nicht initialisiert?
if(!initialized)
// Ein Inhaltsobjekt?
if(Contents())
// Initialisieren
return(Initialized());
// Kein Inhalt?
if(!Contents())
{
return(CreateContents(WpID));
}
// Tolle Effekt starten
angle += 10;
if(angle >= 360) angle = 0;
SetObjDrawTransform(1000, 0,0,0, 1000, Sin(angle, 8)*1000 - 2000,0, 1);
if(Random(2)) CreateParticle("NoGravSpark", RandomX(-5,5), RandomX(5,10), 0, -5, 25, RGBa(210, 210, 255, 100));
// Alle Timer runterzählen
DecreaseTimer();
}
private func Initialized()
{
// Unsichtbar werden
SetAction("Invis");
// Objekt als Layer auflegen
SetGraphics(0, 0, GetID(Contents()), 1, 1);
// Transformation
SetObjDrawTransform(1000, 0,0,0, 1000, -5000,0, 1);
// Sammeleffekt starten
// AddEffect("Collect", this(), 1, 3, this());
// Objekt(e) erzeugen
// Waffen-Bleiben-Regel
//player = CreateArray();
// Initialisiert
initialized = true;
}
/* Timer runterzählen */
private func DecreaseTimer()
{
// Waffen-Bleiben-Regel
if(FindObject(WPST))
{
for(var i=0 ; i < GetPlayerCount() ; i++)
// Spielertimer runterzählen
{
if(player[GetPlayerByIndex(i)])
player[GetPlayerByIndex(i)] -= 5;
if(player[GetPlayerByIndex(i)] <= 0 && !(Local() & 2**GetPlayerByIndex(i)))
{
// Spieler kann das Objekt wieder einsammeln
player[GetPlayerByIndex(i)] = 0;
Local() += 2**GetPlayerByIndex(i);
}
}
}
else
{
// Timer runterzählen
player[0] -= 5;
if(player[0] <= 0)
{
// Objekt ist wieder da
player[0] = 0;
Local() = true;
SetVisibility(VIS_All());
}
}
}
/* Einsammel-Effekte */
/*
public func FxCollectTimer()
{
// Ist ein Clonk hier? -> Einsammeln lassen
var pObj;
for(var pClonk in FindObjects(Find_AtPoint(), Find_OCF(OCF_CrewMember()), Find_OCF(OCF_CrewMember()), Find_NoContainer()))
if(CheckCollect(GetOwner(pClonk)))
{
pObj = FindContents();
// Kann der Clonk einsammeln?
Collect(pObj, pClonk);
if(Contained(pObj) == this()) RemoveObject(pObj);
else
{
Sound("Grab", 0, pClonk, 0, GetOwner(pClonk)+1);
Collected(GetOwner(pClonk));
}
}
}*/
public func RejectEntrance(object pClonk)
{
// Objekt ist ein Clonk?
if(!(GetOCF(pClonk) & OCF_CrewMember) && !(pClonk->~CanCollectFromSpawnpoints())) return(1);
// Ich hab Contents?
if(!Contents()) return(1);
// Darf einsammeln
if(CheckCollect(GetOwner(pClonk)))
{
var pObj = Contents();
// Kann der Clonk einsammeln?
if(ObjectCount(0, 0, 0, 0, 0, 0, 0, 0, pClonk) >= 1)
return(1);
Collect(pObj, pClonk);
CreateContents(WpID);
Initialized();
if(Contained(pObj) == this()) RemoveObject(pObj);
else
{
Sound("Grab", 0, pClonk, 0, GetOwner(pClonk)+1);
Collected(GetOwner(pClonk));
}
}
return(1);
}
private func CheckCollect(int iPlr) // Überprüft, ob ein Spieler das Objekt einsammeln darf
{
// Waffen-Bleiben-Regel
if(FindObject(WPST))
return(Local() & 2**iPlr);
else
return(Local());
}
private func Collected(int iPlr) // Regelt, dass ein Spieler das Objekt einsammelt
{
// Waffen-Bleiben-Regel
if(FindObject(WPST))
{
// Spielertimer hochsetzen
player[iPlr] = spawntimer;
// Nicht mehr sichtbar für den Spieler
Local() -= 2**iPlr;
}
else
{
// Timer hochsetzen
player[0] = spawntimer;
// Nicht mehr einsammelbar
Local() = false;
// Nicht mehr sichtbar
SetVisibility(VIS_God());
}
}
|