|
|
1.1 root 1:
2:
3: void() SUB_Null = {};
4:
5: void() SUB_Remove = {remove(self);};
6:
7:
8: /*
9: QuakeEd only writes a single float for angles (bad idea), so up and down are
10: just constant angles.
11: */
12: vector() SetMovedir =
13: {
14: if (self.angles == '0 -1 0')
15: self.movedir = '0 0 1';
16: else if (self.angles == '0 -2 0')
17: self.movedir = '0 0 -1';
18: else
19: {
20: makevectors (self.angles);
21: self.movedir = v_forward;
22: }
23:
24: self.angles = '0 0 0';
25: };
26:
27: /*
28: ================
29: InitTrigger
30: ================
31: */
32: void() InitTrigger =
33: {
34: // trigger angles are used for one-way touches. An angle of 0 is assumed
35: // to mean no restrictions, so use a yaw of 360 instead.
36: if (self.angles != '0 0 0')
37: SetMovedir ();
38: self.solid = SOLID_TRIGGER;
39: setmodel (self, self.model); // set size and link into world
40: self.movetype = MOVETYPE_NONE;
41: self.modelindex = 0;
42: self.model = "";
43: };
44:
45: /*
46: =============
47: SUB_CalcMove
48:
49: calculate self.velocity and self.nextthink to reach dest from
50: self.origin traveling at speed
51: ===============
52: */
53: void(entity ent, vector tdest, float tspeed, void() func) SUB_CalcMoveEnt =
54: {
55: local entity stemp;
56: stemp = self;
57: self = ent;
58:
59: SUB_CalcMove (tdest, tspeed, func);
60: self = stemp;
61: };
62:
63: void(vector tdest, float tspeed, void() func) SUB_CalcMove =
64: {
65: local vector vdestdelta;
66: local float len, traveltime;
67:
68: if (!tspeed)
69: objerror("No speed is defined!");
70:
71: self.think1 = func;
72: self.finaldest = tdest;
73: self.think = SUB_CalcMoveDone;
74:
75: if (tdest == self.origin)
76: {
77: self.velocity = '0 0 0';
78: self.nextthink = self.ltime + 0.1;
79: return;
80: }
81:
82: // set destdelta to the vector needed to move
83: vdestdelta = tdest - self.origin;
84:
85: // calculate length of vector
86: len = vlen (vdestdelta);
87:
88: // divide by speed to get time to reach dest
89: traveltime = len / tspeed;
90:
91: if (traveltime < 0.03)
92: traveltime = 0.03;
93:
94: // set nextthink to trigger a think when dest is reached
95: self.nextthink = self.ltime + traveltime;
96:
97: // scale the destdelta vector by the time spent traveling to get velocity
98: self.velocity = vdestdelta * (1/traveltime); // qcc won't take vec/float
99: };
100:
101: /*
102: ============
103: After moving, set origin to exact final destination
104: ============
105: */
106: void() SUB_CalcMoveDone =
107: {
108: setorigin(self, self.finaldest);
109: self.velocity = '0 0 0';
110: self.nextthink = -1;
111: if (self.think1)
112: self.think1();
113: };
114:
115:
116: /*
117: =============
118: SUB_CalcAngleMove
119:
120: calculate self.avelocity and self.nextthink to reach destangle from
121: self.angles rotating
122:
123: The calling function should make sure self.think is valid
124: ===============
125: */
126: void(entity ent, vector destangle, float tspeed, void() func) SUB_CalcAngleMoveEnt =
127: {
128: local entity stemp;
129: stemp = self;
130: self = ent;
131: SUB_CalcAngleMove (destangle, tspeed, func);
132: self = stemp;
133: };
134:
135: void(vector destangle, float tspeed, void() func) SUB_CalcAngleMove =
136: {
137: local vector destdelta;
138: local float len, traveltime;
139:
140: if (!tspeed)
141: objerror("No speed is defined!");
142:
143: // set destdelta to the vector needed to move
144: destdelta = destangle - self.angles;
145:
146: // calculate length of vector
147: len = vlen (destdelta);
148:
149: // divide by speed to get time to reach dest
150: traveltime = len / tspeed;
151:
152: // set nextthink to trigger a think when dest is reached
153: self.nextthink = self.ltime + traveltime;
154:
155: // scale the destdelta vector by the time spent traveling to get velocity
156: self.avelocity = destdelta * (1 / traveltime);
157:
158: self.think1 = func;
159: self.finalangle = destangle;
160: self.think = SUB_CalcAngleMoveDone;
161: };
162:
163: /*
164: ============
165: After rotating, set angle to exact final angle
166: ============
167: */
168: void() SUB_CalcAngleMoveDone =
169: {
170: self.angles = self.finalangle;
171: self.avelocity = '0 0 0';
172: self.nextthink = -1;
173: if (self.think1)
174: self.think1();
175: };
176:
177:
178: //=============================================================================
179:
180: void() DelayThink =
181: {
182: activator = self.enemy;
183: SUB_UseTargets ();
184: remove(self);
185: };
186:
187: /*
188: ==============================
189: SUB_UseTargets
190:
191: the global "activator" should be set to the entity that initiated the firing.
192:
193: If self.delay is set, a DelayedUse entity will be created that will actually
194: do the SUB_UseTargets after that many seconds have passed.
195:
196: Centerprints any self.message to the activator.
197:
198: Removes all entities with a targetname that match self.killtarget,
199: and removes them, so some events can remove other triggers.
200:
201: Search for (string)targetname in all entities that
202: match (string)self.target and call their .use function
203:
204: ==============================
205: */
206: void() SUB_UseTargets =
207: {
208: local entity t, stemp, otemp, act;
209:
210: //
211: // check for a delay
212: //
213: if (self.delay)
214: {
215: // create a temp object to fire at a later time
216: t = spawn();
217: t.classname = "DelayedUse";
218: t.nextthink = time + self.delay;
219: t.think = DelayThink;
220: t.enemy = activator;
221: t.message = self.message;
222: t.killtarget = self.killtarget;
223: t.target = self.target;
224: return;
225: }
226:
227:
228: //
229: // print the message
230: //
231: if (activator.classname == "player" && self.message != "")
232: {
233: centerprint (activator, self.message);
234: if (!self.noise)
235: sound (activator, CHAN_VOICE, "misc/talk.wav", 1, ATTN_NORM);
236: }
237:
238: //
239: // kill the killtagets
240: //
241: if (self.killtarget)
242: {
243: t = world;
244: do
245: {
246: t = find (t, targetname, self.killtarget);
247: if (!t)
248: return;
249: remove (t);
250: } while ( 1 );
251: }
252:
253: //
254: // fire targets
255: //
256: if (self.target)
257: {
258: act = activator;
259: t = world;
260: do
261: {
262: t = find (t, targetname, self.target);
263: if (!t)
264: {
265: return;
266: }
267: stemp = self;
268: otemp = other;
269: self = t;
270: other = stemp;
271: if (self.use != SUB_Null)
272: {
273: if (self.use)
274: self.use ();
275: }
276: self = stemp;
277: other = otemp;
278: activator = act;
279: } while ( 1 );
280: }
281:
282:
283: };
284:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.