Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
train.qc File Reference
#include "train.qh"
Include dependency graph for train.qc:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void func_train_find (entity this)
 spawnfunc (func_train)
void train_link (entity this)
void train_next (entity this)
entity train_next_find (entity this)
float train_send (entity this, entity to, float sf)
void train_use (entity this, entity actor, entity trigger)
void train_wait (entity this)

Variables

entity future_target
float train_wait_turning

Function Documentation

◆ func_train_find()

void func_train_find ( entity this)

Definition at line 201 of file train.qc.

202{
203 entity targ = train_next_find(this);
204 this.target = targ.target;
205 this.target_random = targ.target_random;
206 // save the future target for later
207 this.future_target = train_next_find(targ);
208 if (this.target == "")
209 objerror(this, "func_train_find: no next target");
210 setorigin(this, targ.origin - this.view_ofs);
211
212 if(!(this.spawnflags & TRAIN_NEEDACTIVATION))
213 {
214 this.nextthink = this.ltime + 1;
215 setthink(this, train_next);
216 }
217
218 train_link(this);
219}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
int spawnflags
Definition ammo.qh:15
float nextthink
float ltime
Definition net.qc:10
#define objerror
Definition pre.qh:8
#define setthink(e, f)
float target_random
Definition subs.qh:57
entity train_next_find(entity this)
Definition train.qc:66
entity future_target
Definition train.qc:3
void train_next(entity this)
Definition train.qc:83
void train_link(entity this)
Definition train.qc:187
const int TRAIN_NEEDACTIVATION
Definition train.qh:6
string target
Definition triggers.qh:55

References entity(), future_target, ltime, nextthink, objerror, setthink, spawnflags, target, target_random, train_link(), TRAIN_NEEDACTIVATION, train_next(), and train_next_find().

Referenced by spawnfunc().

◆ spawnfunc()

spawnfunc ( func_train )

Definition at line 229 of file train.qc.

230{
231 if (this.noise != "")
232 precache_sound(this.noise);
233
234 if (this.target == "")
235 objerror(this, "func_train without a target");
236 if (!this.speed)
237 this.speed = 100;
238
239 if (!InitMovingBrushTrigger(this))
240 return;
241 this.effects |= EF_LOWPRECISION;
242
244 this.use = train_use;
245
246 if (this.spawnflags & TRAIN_TURN)
247 {
248 this.platmovetype_turn = true;
249 this.view_ofs = '0 0 0'; // don't offset a rotating train, origin works differently now
250 }
251 else
252 this.view_ofs = this.mins;
253
254 // wait for targets to spawn
256
258 if(this.dmg && (this.message == ""))
259 this.message = " was squished";
260 if(this.dmg && (this.message2 == ""))
261 this.message2 = "was squished by";
262 if(this.dmg && (!this.dmgtime))
263 this.dmgtime = 0.25;
264 this.dmgtime2 = time;
265
266 if(!set_platmovetype(this, this.platmovetype))
267 return;
270
271 // TODO make a reset function for this one
272}
float dmg
Definition breakable.qc:12
string message
Definition powerups.qc:19
const int INITPRIO_FINDTARGET
Definition constants.qh:96
vector mins
float effects
float time
#define use
float EF_LOWPRECISION
float speed
Definition dynlight.qc:9
string precache_sound(string sample)
float platmovetype_end_default
Definition platforms.qc:208
void generic_plat_blocked(entity this, entity blocker)
Definition platforms.qc:3
bool set_platmovetype(entity e, string s)
Definition platforms.qc:209
float platmovetype_start_default
Definition platforms.qc:208
float dmgtime
Definition platforms.qh:7
float dmgtime2
Definition platforms.qh:8
vector view_ofs
Definition progsdefs.qc:151
#define setblocked(e, f)
bool InitMovingBrushTrigger(entity this)
Definition subs.qc:577
float platmovetype_turn
Definition subs.qc:113
string noise
Definition subs.qh:83
float platmovetype_start
Definition subs.qh:44
float platmovetype_end
Definition subs.qh:44
string platmovetype
Definition subs.qh:43
void train_use(entity this, entity actor, entity trigger)
Definition train.qc:192
void func_train_find(entity this)
Definition train.qc:201
const int TRAIN_TURN
Definition train.qh:5
string message2
Definition triggers.qh:19
void InitializeEntity(entity e, void(entity this) func, int order)
Definition world.qc:2209

References dmg, dmgtime, dmgtime2, EF_LOWPRECISION, effects, func_train_find(), generic_plat_blocked(), InitializeEntity(), InitMovingBrushTrigger(), INITPRIO_FINDTARGET, message, message2, mins, noise, objerror, platmovetype, platmovetype_end, platmovetype_end_default, platmovetype_start, platmovetype_start_default, platmovetype_turn, precache_sound(), set_platmovetype(), setblocked, spawnflags, speed, target, time, TRAIN_NEEDACTIVATION, TRAIN_TURN, train_use(), use, and view_ofs.

◆ train_link()

void train_link ( entity this)

Definition at line 187 of file train.qc.

188{
189 //Net_LinkEntity(this, 0, false, train_send);
190}

References entity().

Referenced by func_train_find().

◆ train_next()

void train_next ( entity this)

Definition at line 83 of file train.qc.

84{
85 entity targ = NULL, cp = NULL;
86 vector cp_org = '0 0 0';
87
88 targ = this.future_target;
89
90 this.target = targ.target;
91 this.target_random = targ.target_random;
92 this.future_target = train_next_find(targ);
93
94 if (this.spawnflags & TRAIN_CURVE)
95 {
96 if(targ.curvetarget)
97 {
98 cp = find(NULL, targetname, targ.curvetarget); // get its second target (the control point)
99 cp_org = cp.origin - this.view_ofs; // no control point found, assume a straight line to the destination
100 }
101 }
102 if (this.target == "")
103 objerror(this, "train_next: no next target");
104 this.wait = targ.wait;
105 if (!this.wait)
106 this.wait = 0.1;
107
108 if(targ.platmovetype)
109 {
110 // this path_corner contains a movetype overrider, apply it
111 this.platmovetype_start = targ.platmovetype_start;
112 this.platmovetype_end = targ.platmovetype_end;
113 }
114 else
115 {
116 // this path_corner doesn't contain a movetype overrider, use the train's defaults
119 }
120
121 if (targ.speed)
122 {
123 if (cp)
124 SUB_CalcMove_Bezier(this, cp_org, targ.origin - this.view_ofs, TSPEED_LINEAR, targ.speed, train_wait);
125 else
126 SUB_CalcMove(this, targ.origin - this.view_ofs, TSPEED_LINEAR, targ.speed, train_wait);
127 }
128 else
129 {
130 if (cp)
131 SUB_CalcMove_Bezier(this, cp_org, targ.origin - this.view_ofs, TSPEED_LINEAR, this.speed, train_wait);
132 else
133 SUB_CalcMove(this, targ.origin - this.view_ofs, TSPEED_LINEAR, this.speed, train_wait);
134 }
135
136 if(this.noise != "")
138}
float wait
Definition items.qc:17
entity find(entity start,.string field, string match)
#define NULL
Definition post.qh:14
vector
Definition self.qh:92
const int CH_TRIGGER_SINGLE
Definition sound.qh:13
const float VOL_BASE
Definition sound.qh:36
#define _sound(e, c, s, v, a)
Definition sound.qh:43
const float ATTEN_IDLE
Definition sound.qh:32
void SUB_CalcMove(entity this, vector tdest, float tspeedtype, float tspeed, void(entity this) func)
Definition subs.qc:267
void SUB_CalcMove_Bezier(entity this, vector tcontrol, vector tdest, float tspeedtype, float tspeed, void(entity this) func)
Definition subs.qc:204
const int TSPEED_LINEAR
Definition subs.qh:71
void train_wait(entity this)
Definition train.qc:8
const int TRAIN_CURVE
Definition train.qh:4
string targetname
Definition triggers.qh:56

References _sound, ATTEN_IDLE, CH_TRIGGER_SINGLE, entity(), find(), future_target, noise, NULL, objerror, platmovetype_end, platmovetype_end_default, platmovetype_start, platmovetype_start_default, spawnflags, SUB_CalcMove(), SUB_CalcMove_Bezier(), target, target_random, targetname, TRAIN_CURVE, train_next_find(), train_wait(), TSPEED_LINEAR, vector, view_ofs, VOL_BASE, and wait.

Referenced by dynlight_find_path(), func_train_find(), train_use(), and train_wait().

◆ train_next_find()

entity train_next_find ( entity this)

Definition at line 66 of file train.qc.

67{
68 if(this.target_random)
69 {
71 for(entity t = NULL; (t = find(t, targetname, this.target));)
72 {
74 }
76 }
77 else
78 {
79 return find(NULL, targetname, this.target);
80 }
81}
ERASEABLE void RandomSelection_Init()
Definition random.qc:4
#define RandomSelection_AddEnt(e, weight, priority)
Definition random.qh:14
entity RandomSelection_chosen_ent
Definition random.qh:5

References entity(), find(), NULL, RandomSelection_AddEnt, RandomSelection_chosen_ent, RandomSelection_Init(), target, target_random, and targetname.

Referenced by func_train_find(), and train_next().

◆ train_send()

float train_send ( entity this,
entity to,
float sf )

Definition at line 143 of file train.qc.

144{
145 WriteHeader(MSG_ENTITY, ENT_CLIENT_TRAIN);
147
148 if(sf & SF_TRIGGER_INIT)
149 {
153
155
156 trigger_common_write(this, true);
157
159
160 WriteVector(MSG_ENTITY, this.pos1);
161 WriteVector(MSG_ENTITY, this.pos2);
162
163 WriteVector(MSG_ENTITY, this.size);
164
165 WriteVector(MSG_ENTITY, this.view_ofs);
166
167 WriteAngleVector(MSG_ENTITY, this.mangle);
168
171 WriteByte(MSG_ENTITY, this.lip);
174
177 }
178
179 if(sf & SF_TRIGGER_RESET)
180 {
181 // used on client
182 }
183
184 return true;
185}
float height
Definition bobbing.qc:3
vector size
int state
const int SF_TRIGGER_RESET
Definition defs.qh:24
const int SF_TRIGGER_INIT
Definition defs.qh:22
model
Definition ent_cs.qc:139
const int MSG_ENTITY
Definition net.qh:115
#define WriteHeader(to, id)
Definition net.qh:221
void WriteString(string data, float dest, float desto)
void WriteShort(float data, float dest, float desto)
void WriteByte(float data, float dest, float desto)
vector pos2
Definition subs.qh:50
vector mangle
Definition subs.qh:51
string curvetarget
Definition subs.qh:56
float lip
Definition subs.qh:40
vector pos1
Definition subs.qh:50
void trigger_common_write(entity this, bool withtarget)
Definition triggers.qc:110

References curvetarget, dmg, dmgtime, entity(), height, lip, mangle, model, MSG_ENTITY, platmovetype, platmovetype_turn, pos1, pos2, SF_TRIGGER_INIT, SF_TRIGGER_RESET, size, spawnflags, speed, state, trigger_common_write(), view_ofs, wait, WriteByte(), WriteHeader, WriteShort(), and WriteString().

◆ train_use()

void train_use ( entity this,
entity actor,
entity trigger )

Definition at line 192 of file train.qc.

193{
194 this.nextthink = this.ltime + 1;
195 setthink(this, train_next);
196 this.use = func_null; // not again, next target can set it again if needed
197 if(trigger.target2 && trigger.target2 != "")
198 this.future_target = find(NULL, targetname, trigger.target2);
199}
var void func_null()

References entity(), find(), func_null(), future_target, ltime, nextthink, NULL, setthink, targetname, train_next(), and use.

Referenced by spawnfunc(), and train_wait().

◆ train_wait()

void train_wait ( entity this)

Definition at line 8 of file train.qc.

9{
11 this.enemy = NULL;
12
13 // if turning is enabled, the train will turn toward the next point while waiting
15 {
16 entity targ, cp;
17 vector ang;
18 targ = this.future_target;
19 if((this.spawnflags & TRAIN_CURVE) && targ.curvetarget)
20 cp = find(NULL, targetname, targ.curvetarget);
21 else
22 cp = NULL;
23
24 if(cp) // bezier curves movement
25 ang = cp.origin - (this.origin - this.view_ofs); // use the origin of the control point of the next path_corner
26 else // linear movement
27 ang = targ.origin - (this.origin - this.view_ofs); // use the origin of the next path_corner
29 ang_x = -ang_x; // flip up / down orientation
30
31 if(this.wait > 0) // slow turning
33 else // instant turning
34 SUB_CalcAngleMove(this, ang, TSPEED_TIME, 0.0000001, train_wait);
35 this.train_wait_turning = true;
36 return;
37 }
38
39#ifdef SVQC
40 if(this.noise != "")
41 stopsoundto(MSG_BROADCAST, this, CH_TRIGGER_SINGLE); // send this as unreliable only, as the train will resume operation shortly anyway
42#endif
43
44#ifdef SVQC
45 entity tg = this.future_target;
46 if(tg.spawnflags & TRAIN_NEEDACTIVATION)
47 {
48 this.use = train_use;
49 setthink(this, func_null);
50 this.nextthink = 0;
51 }
52 else
53#endif
54 if(this.wait < 0 || this.train_wait_turning) // no waiting or we already waited while turning
55 {
56 this.train_wait_turning = false;
57 train_next(this);
58 }
59 else
60 {
61 setthink(this, train_next);
62 this.nextthink = this.ltime + this.wait;
63 }
64}
vector origin
void SUB_UseTargets(entity this, entity actor, entity trigger)
Definition triggers.qc:344
vector vectoangles(vector v)
float MSG_BROADCAST
Definition menudefs.qc:55
vector vector ang
Definition self.qh:92
void stopsoundto(int _dest, entity e, int chan)
Definition all.qc:84
void SUB_CalcAngleMove(entity this, vector destangle, float tspeedtype, float tspeed, void(entity this) func)
Definition subs.qc:347
const int TSPEED_TIME
Definition subs.qh:70
entity enemy
Definition sv_ctf.qh:153
float train_wait_turning
Definition train.qc:2

References ang, CH_TRIGGER_SINGLE, enemy, entity(), find(), func_null(), future_target, ltime, MSG_BROADCAST, nextthink, noise, NULL, origin, platmovetype_turn, setthink, spawnflags, stopsoundto(), SUB_CalcAngleMove(), SUB_UseTargets(), targetname, time, TRAIN_CURVE, TRAIN_NEEDACTIVATION, train_next(), train_use(), train_wait(), train_wait_turning, TSPEED_TIME, use, vectoangles(), vector, view_ofs, and wait.

Referenced by train_next(), and train_wait().

Variable Documentation

◆ future_target

entity future_target

Definition at line 3 of file train.qc.

Referenced by func_train_find(), train_next(), train_use(), and train_wait().

◆ train_wait_turning

float train_wait_turning

Definition at line 2 of file train.qc.

Referenced by train_wait().