|
|
1.1 ! root 1: ! 2: ! 3: void() plat_center_touch; ! 4: void() plat_outside_touch; ! 5: void() plat_trigger_use; ! 6: void() plat_go_up; ! 7: void() plat_go_down; ! 8: void() plat_crush; ! 9: float PLAT_LOW_TRIGGER = 1; ! 10: ! 11: void() plat_spawn_inside_trigger = ! 12: { ! 13: local entity trigger; ! 14: local vector tmin, tmax; ! 15: ! 16: // ! 17: // middle trigger ! 18: // ! 19: trigger = spawn(); ! 20: trigger.touch = plat_center_touch; ! 21: trigger.movetype = MOVETYPE_NONE; ! 22: trigger.solid = SOLID_TRIGGER; ! 23: trigger.enemy = self; ! 24: ! 25: tmin = self.mins + '25 25 0'; ! 26: tmax = self.maxs - '25 25 -8'; ! 27: tmin_z = tmax_z - (self.pos1_z - self.pos2_z + 8); ! 28: if (self.spawnflags & PLAT_LOW_TRIGGER) ! 29: tmax_z = tmin_z + 8; ! 30: ! 31: if (self.size_x <= 50) ! 32: { ! 33: tmin_x = (self.mins_x + self.maxs_x) / 2; ! 34: tmax_x = tmin_x + 1; ! 35: } ! 36: if (self.size_y <= 50) ! 37: { ! 38: tmin_y = (self.mins_y + self.maxs_y) / 2; ! 39: tmax_y = tmin_y + 1; ! 40: } ! 41: ! 42: setsize (trigger, tmin, tmax); ! 43: }; ! 44: ! 45: void() plat_hit_top = ! 46: { ! 47: sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise1, 1, ATTN_NORM); ! 48: self.state = STATE_TOP; ! 49: self.think = plat_go_down; ! 50: self.nextthink = self.ltime + 3; ! 51: }; ! 52: ! 53: void() plat_hit_bottom = ! 54: { ! 55: sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise1, 1, ATTN_NORM); ! 56: self.state = STATE_BOTTOM; ! 57: }; ! 58: ! 59: void() plat_go_down = ! 60: { ! 61: sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); ! 62: self.state = STATE_DOWN; ! 63: SUB_CalcMove (self.pos2, self.speed, plat_hit_bottom); ! 64: }; ! 65: ! 66: void() plat_go_up = ! 67: { ! 68: sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); ! 69: self.state = STATE_UP; ! 70: SUB_CalcMove (self.pos1, self.speed, plat_hit_top); ! 71: }; ! 72: ! 73: void() plat_center_touch = ! 74: { ! 75: if (other.classname != "player") ! 76: return; ! 77: ! 78: if (other.health <= 0) ! 79: return; ! 80: ! 81: self = self.enemy; ! 82: if (self.state == STATE_BOTTOM) ! 83: plat_go_up (); ! 84: else if (self.state == STATE_TOP) ! 85: self.nextthink = self.ltime + 1; // delay going down ! 86: }; ! 87: ! 88: void() plat_outside_touch = ! 89: { ! 90: if (other.classname != "player") ! 91: return; ! 92: ! 93: if (other.health <= 0) ! 94: return; ! 95: ! 96: //dprint ("plat_outside_touch\n"); ! 97: self = self.enemy; ! 98: if (self.state == STATE_TOP) ! 99: plat_go_down (); ! 100: }; ! 101: ! 102: void() plat_trigger_use = ! 103: { ! 104: if (self.think) ! 105: return; // allready activated ! 106: plat_go_down(); ! 107: }; ! 108: ! 109: ! 110: void() plat_crush = ! 111: { ! 112: //dprint ("plat_crush\n"); ! 113: ! 114: other.deathtype = "squish"; ! 115: T_Damage (other, self, self, 1); ! 116: ! 117: if (self.state == STATE_UP) ! 118: plat_go_down (); ! 119: else if (self.state == STATE_DOWN) ! 120: plat_go_up (); ! 121: else ! 122: objerror ("plat_crush: bad self.state\n"); ! 123: }; ! 124: ! 125: void() plat_use = ! 126: { ! 127: self.use = SUB_Null; ! 128: if (self.state != STATE_UP) ! 129: objerror ("plat_use: not in up state"); ! 130: plat_go_down(); ! 131: }; ! 132: ! 133: ! 134: /*QUAKED func_plat (0 .5 .8) ? PLAT_LOW_TRIGGER ! 135: speed default 150 ! 136: ! 137: Plats are always drawn in the extended position, so they will light correctly. ! 138: ! 139: If the plat is the target of another trigger or button, it will start out disabled in the extended position until it is trigger, when it will lower and become a normal plat. ! 140: ! 141: If the "height" key is set, that will determine the amount the plat moves, instead of being implicitly determined by the model's height. ! 142: Set "sounds" to one of the following: ! 143: 1) base fast ! 144: 2) chain slow ! 145: */ ! 146: ! 147: ! 148: void() func_plat = ! 149: ! 150: { ! 151: local entity t; ! 152: ! 153: if (!self.t_length) ! 154: self.t_length = 80; ! 155: if (!self.t_width) ! 156: self.t_width = 10; ! 157: ! 158: if (self.sounds == 0) ! 159: self.sounds = 2; ! 160: // FIX THIS TO LOAD A GENERIC PLAT SOUND ! 161: ! 162: if (self.sounds == 1) ! 163: { ! 164: precache_sound ("plats/plat1.wav"); ! 165: precache_sound ("plats/plat2.wav"); ! 166: self.noise = "plats/plat1.wav"; ! 167: self.noise1 = "plats/plat2.wav"; ! 168: } ! 169: ! 170: if (self.sounds == 2) ! 171: { ! 172: precache_sound ("plats/medplat1.wav"); ! 173: precache_sound ("plats/medplat2.wav"); ! 174: self.noise = "plats/medplat1.wav"; ! 175: self.noise1 = "plats/medplat2.wav"; ! 176: } ! 177: ! 178: ! 179: self.mangle = self.angles; ! 180: self.angles = '0 0 0'; ! 181: ! 182: self.classname = "plat"; ! 183: self.solid = SOLID_BSP; ! 184: self.movetype = MOVETYPE_PUSH; ! 185: setorigin (self, self.origin); ! 186: setmodel (self, self.model); ! 187: setsize (self, self.mins , self.maxs); ! 188: ! 189: self.blocked = plat_crush; ! 190: if (!self.speed) ! 191: self.speed = 150; ! 192: ! 193: // pos1 is the top position, pos2 is the bottom ! 194: self.pos1 = self.origin; ! 195: self.pos2 = self.origin; ! 196: if (self.height) ! 197: self.pos2_z = self.origin_z - self.height; ! 198: else ! 199: self.pos2_z = self.origin_z - self.size_z + 8; ! 200: ! 201: self.use = plat_trigger_use; ! 202: ! 203: plat_spawn_inside_trigger (); // the "start moving" trigger ! 204: ! 205: if (self.targetname) ! 206: { ! 207: self.state = STATE_UP; ! 208: self.use = plat_use; ! 209: } ! 210: else ! 211: { ! 212: setorigin (self, self.pos2); ! 213: self.state = STATE_BOTTOM; ! 214: } ! 215: }; ! 216: ! 217: //============================================================================ ! 218: ! 219: void() train_next; ! 220: void() func_train_find; ! 221: ! 222: void() train_blocked = ! 223: { ! 224: if (time < self.attack_finished) ! 225: return; ! 226: self.attack_finished = time + 0.5; ! 227: other.deathtype = "squish"; ! 228: T_Damage (other, self, self, self.dmg); ! 229: }; ! 230: ! 231: void() train_use = ! 232: { ! 233: if (self.think != func_train_find) ! 234: return; // already activated ! 235: train_next(); ! 236: }; ! 237: ! 238: void() train_wait = ! 239: { ! 240: if (self.wait) ! 241: { ! 242: self.nextthink = self.ltime + self.wait; ! 243: sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise, 1, ATTN_NORM); ! 244: } ! 245: else ! 246: self.nextthink = self.ltime + 0.1; ! 247: ! 248: self.think = train_next; ! 249: }; ! 250: ! 251: void() train_next = ! 252: { ! 253: local entity targ; ! 254: ! 255: targ = find (world, targetname, self.target); ! 256: self.target = targ.target; ! 257: if (!self.target) ! 258: objerror ("train_next: no next target"); ! 259: if (targ.wait) ! 260: self.wait = targ.wait; ! 261: else ! 262: self.wait = 0; ! 263: sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); ! 264: SUB_CalcMove (targ.origin - self.mins, self.speed, train_wait); ! 265: }; ! 266: ! 267: void() func_train_find = ! 268: ! 269: { ! 270: local entity targ; ! 271: ! 272: targ = find (world, targetname, self.target); ! 273: self.target = targ.target; ! 274: setorigin (self, targ.origin - self.mins); ! 275: if (!self.targetname) ! 276: { // not triggered, so start immediately ! 277: self.nextthink = self.ltime + 0.1; ! 278: self.think = train_next; ! 279: } ! 280: }; ! 281: ! 282: /*QUAKED func_train (0 .5 .8) ? ! 283: Trains are moving platforms that players can ride. ! 284: The targets origin specifies the min point of the train at each corner. ! 285: The train spawns at the first target it is pointing at. ! 286: If the train is the target of a button or trigger, it will not begin moving until activated. ! 287: speed default 100 ! 288: dmg default 2 ! 289: sounds ! 290: 1) ratchet metal ! 291: ! 292: */ ! 293: void() func_train = ! 294: { ! 295: if (!self.speed) ! 296: self.speed = 100; ! 297: if (!self.target) ! 298: objerror ("func_train without a target"); ! 299: if (!self.dmg) ! 300: self.dmg = 2; ! 301: ! 302: if (self.sounds == 0) ! 303: { ! 304: self.noise = ("misc/null.wav"); ! 305: precache_sound ("misc/null.wav"); ! 306: self.noise1 = ("misc/null.wav"); ! 307: precache_sound ("misc/null.wav"); ! 308: } ! 309: ! 310: if (self.sounds == 1) ! 311: { ! 312: self.noise = ("plats/train2.wav"); ! 313: precache_sound ("plats/train2.wav"); ! 314: self.noise1 = ("plats/train1.wav"); ! 315: precache_sound ("plats/train1.wav"); ! 316: } ! 317: ! 318: self.cnt = 1; ! 319: self.solid = SOLID_BSP; ! 320: self.movetype = MOVETYPE_PUSH; ! 321: self.blocked = train_blocked; ! 322: self.use = train_use; ! 323: self.classname = "train"; ! 324: ! 325: setmodel (self, self.model); ! 326: setsize (self, self.mins , self.maxs); ! 327: setorigin (self, self.origin); ! 328: ! 329: // start trains on the second frame, to make sure their targets have had ! 330: // a chance to spawn ! 331: self.nextthink = self.ltime + 0.1; ! 332: self.think = func_train_find; ! 333: }; ! 334: ! 335: /*QUAKED misc_teleporttrain (0 .5 .8) (-8 -8 -8) (8 8 8) ! 336: This is used for the final bos ! 337: */ ! 338: void() misc_teleporttrain = ! 339: { ! 340: if (!self.speed) ! 341: self.speed = 100; ! 342: if (!self.target) ! 343: objerror ("func_train without a target"); ! 344: ! 345: self.cnt = 1; ! 346: self.solid = SOLID_NOT; ! 347: self.movetype = MOVETYPE_PUSH; ! 348: self.blocked = train_blocked; ! 349: self.use = train_use; ! 350: self.avelocity = '100 200 300'; ! 351: ! 352: self.noise = ("misc/null.wav"); ! 353: precache_sound ("misc/null.wav"); ! 354: self.noise1 = ("misc/null.wav"); ! 355: precache_sound ("misc/null.wav"); ! 356: ! 357: precache_model2 ("progs/teleport.mdl"); ! 358: setmodel (self, "progs/teleport.mdl"); ! 359: setsize (self, self.mins , self.maxs); ! 360: setorigin (self, self.origin); ! 361: ! 362: // start trains on the second frame, to make sure their targets have had ! 363: // a chance to spawn ! 364: self.nextthink = self.ltime + 0.1; ! 365: self.think = func_train_find; ! 366: }; ! 367:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.