X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Ft_plats.qc;h=e2d801fa491fe9c011da08a22fea8ae1beccceac;hb=c2568958501bb2e9d8de435bab5de1aec2b048b9;hp=8dac99e41c6079fa50f2aebc4e6026357c399985;hpb=cc27f0c12851cbe300058b3a0ad7535b5a489263;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/t_plats.qc b/qcsrc/server/t_plats.qc index 8dac99e41..e2d801fa4 100644 --- a/qcsrc/server/t_plats.qc +++ b/qcsrc/server/t_plats.qc @@ -62,7 +62,7 @@ void plat_spawn_inside_trigger() void plat_hit_top() { - sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM); self.state = 1; self.think = plat_go_down; self.nextthink = self.ltime + 3; @@ -70,20 +70,20 @@ void plat_hit_top() void plat_hit_bottom() { - sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM); self.state = 2; }; void plat_go_down() { - sound (self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_NORM); self.state = 3; SUB_CalcMove (self.pos2, self.speed, plat_hit_bottom); }; void plat_go_up() { - sound (self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_NORM); self.state = 4; SUB_CalcMove (self.pos1, self.speed, plat_hit_top); }; @@ -245,40 +245,46 @@ void spawnfunc_func_plat() void() train_next; void train_wait() { - self.think = train_next; - self.nextthink = self.ltime + self.wait; - if(self.noise != "") - stopsoundto(MSG_BROADCAST, self, CHAN_TRIGGER); // send this as unreliable only, as the train will resume operation shortly anyway + stopsoundto(MSG_BROADCAST, self, CH_TRIGGER_SINGLE); // send this as unreliable only, as the train will resume operation shortly anyway + + if(self.wait < 0) + { + train_next(); + } + else + { + self.think = train_next; + self.nextthink = self.ltime + self.wait; + } + + entity oldself; + oldself = self; + self = self.enemy; + SUB_UseTargets(); + self = oldself; + self.enemy = world; }; void train_next() { local entity targ; targ = find(world, targetname, self.target); + self.enemy = targ; self.target = targ.target; if (!self.target) objerror("train_next: no next target"); self.wait = targ.wait; if (!self.wait) self.wait = 0.1; - if(self.wait < 0) - { - if (targ.speed) - SUB_CalcMove(targ.origin - self.mins, targ.speed, train_next); - else - SUB_CalcMove(targ.origin - self.mins, self.speed, train_next); - } + + if (targ.speed) + SUB_CalcMove(targ.origin - self.mins, targ.speed, train_wait); else - { - if (targ.speed) - SUB_CalcMove(targ.origin - self.mins, targ.speed, train_wait); - else - SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait); - } + SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait); if(self.noise != "") - sound(self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE); + sound(self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE); }; void func_train_find() @@ -331,8 +337,8 @@ void func_rotating_setactive(float astate) { if (astate == ACTIVE_TOGGLE) - { - if(self.active) + { + if(self.active == ACTIVE_ACTIVE) self.active = ACTIVE_NOT; else self.active = ACTIVE_ACTIVE; @@ -340,7 +346,7 @@ void func_rotating_setactive(float astate) else self.active = astate; - if(astate == ACTIVE_NOT) + if(self.active == ACTIVE_NOT) self.avelocity = '0 0 0'; else self.avelocity = self.pos1; @@ -408,19 +414,21 @@ void func_bobbing_controller_think() { local vector v; self.nextthink = time + 0.1; + + if not (self.owner.active == ACTIVE_ACTIVE) + { + self.owner.velocity = '0 0 0'; + return; + } + // calculate sinewave using makevectors makevectors((self.nextthink * self.owner.cnt + self.owner.phase * 360) * '0 1 0'); v = self.owner.destvec + self.owner.movedir * v_forward_y; - // * 10 so it will arrive in 0.1 sec - self.owner.velocity = (v - self.owner.origin) * 10; + if(self.owner.classname == "func_bobbing") // don't brake stuff if the func_bobbing was killtarget'ed + // * 10 so it will arrive in 0.1 sec + self.owner.velocity = (v - self.owner.origin) * 10; }; -void bobbing_blocked() -{ - // no need to duplicate code - generic_plat_blocked(); -} - /*QUAKED spawnfunc_func_bobbing (0 .5 .8) ? X_AXIS Y_AXIS Brush model that moves back and forth on one axis (default Z). speed : how long one cycle takes in seconds (default 4) @@ -436,7 +444,7 @@ void spawnfunc_func_bobbing() if (self.noise != "") { precache_sound(self.noise); - soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE); + soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE); } if (!self.speed) self.speed = 4; @@ -447,8 +455,10 @@ void spawnfunc_func_bobbing() // time scale to get degrees self.cnt = 360 / self.speed; + self.active = ACTIVE_ACTIVE; + // damage when blocked - self.blocked = bobbing_blocked; + self.blocked = generic_plat_blocked; if(self.dmg & (!self.message)) self.message = " was squished"; if(self.dmg && (!self.message2)) @@ -483,6 +493,82 @@ void spawnfunc_func_bobbing() // TODO make a reset function for this one }; +.float freq; +void func_pendulum_controller_think() +{ + local float v; + self.nextthink = time + 0.1; + + if not (self.owner.active == ACTIVE_ACTIVE) + { + self.owner.avelocity_x = 0; + return; + } + + // calculate sinewave using makevectors + makevectors((self.nextthink * self.owner.freq + self.owner.phase) * '0 360 0'); + v = self.owner.speed * v_forward_y + self.cnt; + if(self.owner.classname == "func_pendulum") // don't brake stuff if the func_bobbing was killtarget'ed + { + // * 10 so it will arrive in 0.1 sec + self.owner.avelocity_z = (remainder(v - self.owner.angles_z, 360)) * 10; + } +}; + +void spawnfunc_func_pendulum() +{ + local entity controller; + if (self.noise != "") + { + precache_sound(self.noise); + soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE); + } + + self.active = ACTIVE_ACTIVE; + + // keys: angle, speed, phase, noise, freq + + if(!self.speed) + self.speed = 30; + // not initializing self.dmg to 2, to allow damageless pendulum + + if(self.dmg & (!self.message)) + self.message = " was squished"; + if(self.dmg && (!self.message2)) + self.message2 = "was squished by"; + if(self.dmg && (!self.dmgtime)) + self.dmgtime = 0.25; + self.dmgtime2 = time; + + self.blocked = generic_plat_blocked; + + self.avelocity_z = 0.0000001; + if not(InitMovingBrushTrigger()) + return; + + if(!self.freq) + { + // find pendulum length (same formula as Q3A) + self.freq = 1 / (M_PI * 2) * sqrt(autocvar_sv_gravity / (3 * max(8, fabs(self.mins_z)))); + } + + // copy initial angle + self.cnt = self.angles_z; + + // wait for targets to spawn + controller = spawn(); + controller.classname = "func_pendulum_controller"; + controller.owner = self; + controller.nextthink = time + 1; + controller.think = func_pendulum_controller_think; + self.nextthink = self.ltime + 999999999; + self.think = SUB_Null; + + //self.effects |= EF_LOWPRECISION; + + // TODO make a reset function for this one +}; + // button and multiple button void() button_wait; @@ -528,7 +614,7 @@ void button_fire() return; if (self.noise != "") - sound (self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM); self.state = STATE_UP; SUB_CalcMove (self.pos2, self.speed, button_wait); @@ -551,6 +637,10 @@ void button_use() // dprint(activator.classname); // dprint(" triggered a button\n"); // } + + if not (self.active == ACTIVE_ACTIVE) + return; + self.enemy = activator; button_fire (); }; @@ -640,6 +730,8 @@ void spawnfunc_func_button() if(self.noise != "") precache_sound(self.noise); + self.active = ACTIVE_ACTIVE; + self.pos1 = self.origin; self.pos2 = self.pos1 + self.movedir*(fabs(self.movedir*self.size) - self.lip); self.flags |= FL_NOTARGET; @@ -733,7 +825,7 @@ void door_blocked() void door_hit_top() { if (self.noise1 != "") - sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM); self.state = STATE_TOP; if (self.spawnflags & DOOR_TOGGLE) return; // don't come down automatically @@ -750,14 +842,14 @@ void door_hit_top() void door_hit_bottom() { if (self.noise1 != "") - sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM); self.state = STATE_BOTTOM; }; void door_go_down() { if (self.noise2 != "") - sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); if (self.max_health) { self.takedamage = DAMAGE_YES; @@ -780,7 +872,7 @@ void door_go_up() } if (self.noise2 != "") - sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); self.state = STATE_UP; SUB_CalcMove (self.pos2, self.speed, door_hit_top); @@ -979,7 +1071,7 @@ void door_generic_plat_blocked() void door_rotating_hit_top() { if (self.noise1 != "") - sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM); self.state = STATE_TOP; if (self.spawnflags & DOOR_TOGGLE) return; // don't come down automatically @@ -990,7 +1082,7 @@ void door_rotating_hit_top() void door_rotating_hit_bottom() { if (self.noise1 != "") - sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM); if (self.lip==666) // self.lip is used to remember reverse opening direction for door_rotating { self.pos2 = '0 0 0' - self.pos2; @@ -1002,7 +1094,7 @@ void door_rotating_hit_bottom() void door_rotating_go_down() { if (self.noise2 != "") - sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); if (self.max_health) { self.takedamage = DAMAGE_YES; @@ -1024,7 +1116,7 @@ void door_rotating_go_up() return; } if (self.noise2 != "") - sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM); + sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); self.state = STATE_UP; SUB_CalcAngleMove (self.pos2, self.speed, door_rotating_hit_top); @@ -1348,8 +1440,10 @@ void spawnfunc_func_door_rotating() self.angles = '0 0 0'; self.max_health = self.health; + self.avelocity = self.movedir; if not(InitMovingBrushTrigger()) return; + self.velocity = '0 0 0'; //self.effects |= EF_LOWPRECISION; self.classname = "door_rotating"; @@ -1451,7 +1545,7 @@ void fd_secret_use() // Make a sound, wait a little... if (self.noise1 != "") - sound(self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM); + sound(self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM); self.nextthink = self.ltime + 0.1; temp = 1 - (self.spawnflags & SECRET_1ST_LEFT); // 1 or -1 @@ -1476,7 +1570,7 @@ void fd_secret_use() self.dest2 = self.dest1 + v_forward * self.t_length; SUB_CalcMove(self.dest1, self.speed, fd_secret_move1); if (self.noise2 != "") - sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM); + sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); }; // Wait after first movement... @@ -1485,14 +1579,14 @@ void fd_secret_move1() self.nextthink = self.ltime + 1.0; self.think = fd_secret_move2; if (self.noise3 != "") - sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM); + sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM); }; // Start moving sideways w/sound... void fd_secret_move2() { if (self.noise2 != "") - sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM); + sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); SUB_CalcMove(self.dest2, self.speed, fd_secret_move3); }; @@ -1500,7 +1594,7 @@ void fd_secret_move2() void fd_secret_move3() { if (self.noise3 != "") - sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM); + sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM); if (!(self.spawnflags & SECRET_OPEN_ONCE)) { self.nextthink = self.ltime + self.wait; @@ -1512,7 +1606,7 @@ void fd_secret_move3() void fd_secret_move4() { if (self.noise2 != "") - sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM); + sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); SUB_CalcMove(self.dest1, self.speed, fd_secret_move5); }; @@ -1522,13 +1616,13 @@ void fd_secret_move5() self.nextthink = self.ltime + 1.0; self.think = fd_secret_move6; if (self.noise3 != "") - sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM); + sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM); }; void fd_secret_move6() { if (self.noise2 != "") - sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM); + sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); SUB_CalcMove(self.oldorigin, self.speed, fd_secret_done); }; @@ -1541,7 +1635,7 @@ void fd_secret_done() //self.th_pain = fd_secret_use; } if (self.noise3 != "") - sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM); + sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM); }; void secret_blocked() @@ -1661,6 +1755,12 @@ void func_fourier_controller_think() float n, i, t; self.nextthink = time + 0.1; + if not (self.owner.active == ACTIVE_ACTIVE) + { + self.owner.velocity = '0 0 0'; + return; + } + n = floor((tokenize_console(self.owner.netname)) / 5); t = self.nextthink * self.owner.cnt + self.owner.phase * 360; @@ -1673,8 +1773,9 @@ void func_fourier_controller_think() v = v + ('1 0 0' * stof(argv(i*5+2)) + '0 1 0' * stof(argv(i*5+3)) + '0 0 1' * stof(argv(i*5+4))) * self.owner.height * v_forward_y; } - // * 10 so it will arrive in 0.1 sec - self.owner.velocity = (v - self.owner.origin) * 10; + if(self.owner.classname == "func_fourier") // don't brake stuff if the func_fourier was killtarget'ed + // * 10 so it will arrive in 0.1 sec + self.owner.velocity = (v - self.owner.origin) * 10; }; void spawnfunc_func_fourier() @@ -1683,7 +1784,7 @@ void spawnfunc_func_fourier() if (self.noise != "") { precache_sound(self.noise); - soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE); + soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE); } if (!self.speed) @@ -1708,6 +1809,8 @@ void spawnfunc_func_fourier() if not(InitMovingBrushTrigger()) return; + self.active = ACTIVE_ACTIVE; + // wait for targets to spawn controller = spawn(); controller.classname = "func_fourier_controller"; @@ -1784,7 +1887,15 @@ vector func_vectormamamam_origin(entity o, float t) void func_vectormamamam_controller_think() { self.nextthink = time + 0.1; - self.owner.velocity = (self.owner.destvec + func_vectormamamam_origin(self.owner, 0.1) - self.owner.origin) * 10; + + if not (self.owner.active == ACTIVE_ACTIVE) + { + self.owner.velocity = '0 0 0'; + return; + } + + if(self.owner.classname == "func_vectormamamam") // don't brake stuff if the func_vectormamamam was killtarget'ed + self.owner.velocity = (self.owner.destvec + func_vectormamamam_origin(self.owner, 0.1) - self.owner.origin) * 10; } void func_vectormamamam_findtarget() @@ -1819,7 +1930,7 @@ void spawnfunc_func_vectormamamam() if (self.noise != "") { precache_sound(self.noise); - soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE); + soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE); } if(!self.targetfactor) @@ -1868,5 +1979,7 @@ void spawnfunc_func_vectormamamam() // Savage: Reduce bandwith, critical on e.g. nexdm02 self.effects |= EF_LOWPRECISION; + self.active = ACTIVE_ACTIVE; + InitializeEntity(self, func_vectormamamam_findtarget, INITPRIO_FINDTARGET); }