public static void SP_trigger_multiple(Entity ent) { if (ent.sounds == 1) ent.noise_index = ServerInit.SV_SoundIndex("misc/secret.wav"); else if (ent.sounds == 2) ent.noise_index = ServerInit.SV_SoundIndex("misc/talk.wav"); else if (ent.sounds == 3) ent.noise_index = ServerInit.SV_SoundIndex("misc/trigger1.wav"); if (ent.wait == 0) ent.wait = 0.2f; ent.touch = Touch_Multi; ent.movetype = Constants.MOVETYPE_NONE; ent.svflags |= Constants.SVF_NOCLIENT; if ((ent.spawnflags & 4) != 0) { ent.solid = Constants.SOLID_NOT; ent.use = trigger_enable; } else { ent.solid = Constants.SOLID_TRIGGER; ent.use = Use_Multi; } if (!Math3D.VectorEquals(ent.s.angles, Globals.vec3_origin)) GameBase.G_SetMovedir(ent.s.angles, ent.movedir); ServerGame.PF_setmodel(ent, ent.model); World.SV_LinkEdict(ent); }
public void touch(Entity self, Entity other, Plane plane, Surface surf) { if (other.client != null) { if ((self.spawnflags & 2) != 0) return; } else if ((other.svflags & Constants.SVF_MONSTER) != 0) { if (0 == (self.spawnflags & 1)) return; } else return; if (!Math3D.VectorEquals(self.movedir, Globals.vec3_origin)) { float[] forward = {0, 0, 0}; Math3D.AngleVectors(other.s.angles, forward, null, null); if (Math3D.DotProduct(forward, self.movedir) < 0) return; } self.activator = other; multi_trigger(self); }
public static void InitTrigger(Entity self) { if (!Math3D.VectorEquals(self.s.angles, Globals.vec3_origin)) GameBase.G_SetMovedir(self.s.angles, self.movedir); self.solid = Constants.SOLID_TRIGGER; self.movetype = Constants.MOVETYPE_NONE; ServerGame.PF_setmodel(self, self.model); self.svflags = Constants.SVF_NOCLIENT; }
public void touch(Entity self, Entity other, Plane plane, Surface surf) { if (Lib.strcmp(other.classname, "grenade") == 0) { Math3D.VectorScale(self.movedir, self.speed * 10, other.velocity); } else if (other.health > 0) { Math3D.VectorScale(self.movedir, self.speed * 10, other.velocity); if (other.client != null) { // don't take falling damage immediately from this Math3D.VectorCopy(other.velocity, other.client.oldvelocity); if (other.fly_sound_debounce_time < GameBase.level.time) { other.fly_sound_debounce_time = GameBase.level.time + 1.5f; ServerGame.PF_StartSound( other, Constants.CHAN_AUTO, windsound, (float) 1, (float) Constants.ATTN_NORM, (float) 0); } } } if ((self.spawnflags & PUSH_ONCE) != 0) GameUtil.G_FreeEdict(self); }
/** * QUAKED trigger_once (.5 .5 .5) ? x x TRIGGERED Triggers once, then removes itself. You must set * the key "target" to the name of another object in the level that has a matching "targetname". * * <p>If TRIGGERED, this trigger must be triggered before it is live. * * <p>sounds 1) secret 2) beep beep 3) large switch 4) * * <p>"message" string to be displayed when triggered */ public static void SP_trigger_once(Entity ent) { // make old maps work because I messed up on flag assignments here // triggered was on bit 1 when it should have been on bit 4 if ((ent.spawnflags & 1) != 0) { float[] v = {0, 0, 0}; Math3D.VectorMA(ent.mins, 0.5f, ent.size, v); ent.spawnflags &= ~1; ent.spawnflags |= 4; ServerGame.PF_dprintf( "fixed TRIGGERED flag on " + ent.classname + " at " + Lib.vtos(v) + "\n"); } ent.wait = -1; SP_trigger_multiple(ent); }