1 #include "platforms.qh"
2 void generic_plat_blocked(entity this, entity blocker)
5 if (this.dmg && blocker.takedamage != DAMAGE_NO) {
6 if (this.dmgtime2 < time) {
7 Damage(blocker, this, this, this.dmg, DEATH_HURTTRIGGER.m_id, blocker.origin, '0 0 0');
8 this.dmgtime2 = time + this.dmgtime;
11 // Gib dead/dying stuff
12 if (IS_DEAD(blocker)) {
13 Damage(blocker, this, this, 10000, DEATH_HURTTRIGGER.m_id, blocker.origin, '0 0 0');
19 void plat_spawn_inside_trigger(entity this)
25 settouch(trigger, plat_center_touch);
26 set_movetype(trigger, MOVETYPE_NONE);
27 trigger.solid = SOLID_TRIGGER;
30 tmin = this.absmin + '25 25 0';
31 tmax = this.absmax - '25 25 -8';
32 tmin_z = tmax_z - (this.pos1_z - this.pos2_z + 8);
33 if (this.spawnflags & PLAT_LOW_TRIGGER) {
37 if (this.size_x <= 50) {
38 tmin_x = (this.mins_x + this.maxs_x) / 2;
41 if (this.size_y <= 50) {
42 tmin_y = (this.mins_y + this.maxs_y) / 2;
46 if (tmin_x < tmax_x) {
47 if (tmin_y < tmax_y) {
48 if (tmin_z < tmax_z) {
49 setsize(trigger, tmin, tmax);
55 // otherwise, something is fishy...
57 objerror(this, "plat_spawn_inside_trigger: platform has odd size or lip, can't spawn");
60 void plat_hit_top(entity this)
62 _sound(this, CH_TRIGGER_SINGLE, this.noise1, VOL_BASE, ATTEN_NORM);
65 setthink(this, plat_go_down);
66 this.nextthink = this.ltime + 3;
69 void plat_hit_bottom(entity this)
71 _sound(this, CH_TRIGGER_SINGLE, this.noise1, VOL_BASE, ATTEN_NORM);
75 void plat_go_down(entity this)
77 _sound(this, CH_TRIGGER_SINGLE, this.noise, VOL_BASE, ATTEN_NORM);
79 SUB_CalcMove(this, this.pos2, TSPEED_LINEAR, this.speed, plat_hit_bottom);
82 void plat_go_up(entity this)
84 _sound(this, CH_TRIGGER_SINGLE, this.noise, VOL_BASE, ATTEN_NORM);
86 SUB_CalcMove(this, this.pos1, TSPEED_LINEAR, this.speed, plat_hit_top);
89 void plat_center_touch(entity this, entity toucher)
92 if (!toucher.iscreature) {
96 if (toucher.health <= 0) {
100 if (!IS_PLAYER(toucher)) {
103 if (IS_DEAD(toucher)) {
108 if (this.enemy.state == 2) {
109 plat_go_up(this.enemy);
110 } else if (this.enemy.state == 1) {
111 this.enemy.nextthink = this.enemy.ltime + 1;
115 void plat_outside_touch(entity this, entity toucher)
118 if (!toucher.iscreature) {
122 if (toucher.health <= 0) {
126 if (!IS_PLAYER(toucher)) {
131 if (this.enemy.state == 1) {
132 entity e = this.enemy;
137 void plat_trigger_use(entity this, entity actor, entity trigger)
139 if (getthink(this)) {
140 return; // already activated
146 void plat_crush(entity this, entity blocker)
148 if ((this.spawnflags & 4) && (blocker.takedamage != DAMAGE_NO)) { // KIll Kill Kill!!
150 Damage(blocker, this, this, 10000, DEATH_HURTTRIGGER.m_id, blocker.origin, '0 0 0');
154 if ((this.dmg) && (blocker.takedamage != DAMAGE_NO)) { // Shall we bite?
155 Damage(blocker, this, this, this.dmg, DEATH_HURTTRIGGER.m_id, blocker.origin, '0 0 0');
156 // Gib dead/dying stuff
157 if (IS_DEAD(blocker)) {
158 Damage(blocker, this, this, 10000, DEATH_HURTTRIGGER.m_id, blocker.origin, '0 0 0');
163 if (this.state == 4) {
165 } else if (this.state == 3) {
168 // when in other states, then the plat_crush event came delayed after
169 // plat state already had changed
170 // this isn't a bug per se!
174 void plat_use(entity this, entity actor, entity trigger)
176 this.use = func_null;
177 if (this.state != 4) {
178 objerror(this, "plat_use: not in up state");
183 .string sound1, sound2;
185 void plat_reset(entity this)
188 setorigin(this, this.pos1);
192 setorigin(this, this.pos2);
194 this.use = plat_trigger_use;
198 this.SendFlags |= SF_TRIGGER_RESET;
202 .float platmovetype_start_default, platmovetype_end_default;
203 bool set_platmovetype(entity e, string s)
205 // sets platmovetype_start and platmovetype_end based on a string consisting of two values
207 int n = tokenize_console(s);
209 e.platmovetype_start = stof(argv(0));
211 e.platmovetype_start = 0;
215 e.platmovetype_end = stof(argv(1));
217 e.platmovetype_end = e.platmovetype_start;
221 if (argv(2) == "force") {
222 return true; // no checking, return immediately
225 if (!cubic_speedfunc_is_sane(e.platmovetype_start, e.platmovetype_end)) {
226 objerror(e, "Invalid platform move type; platform would go in reverse, which is not allowed.");