Exemplo n.º 1
0
  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);
  }
Exemplo n.º 2
0
  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;
  }
Exemplo n.º 3
0
        public boolean think(edict_t self) {
          edict_t ent;
          float points;
          float[] v = {0, 0, 0};
          float dist;

          EdictIterator edit = null;

          if (self.s.frame == 0) {
            // the BFG effect
            ent = null;
            while ((edit = GameBase.findradius(edit, self.s.origin, self.dmg_radius)) != null) {
              ent = edit.o;
              if (ent.takedamage == 0) continue;
              if (ent == self.owner) continue;
              if (!GameCombat.CanDamage(ent, self)) continue;
              if (!GameCombat.CanDamage(ent, self.owner)) continue;

              Math3D.VectorAdd(ent.mins, ent.maxs, v);
              Math3D.VectorMA(ent.s.origin, 0.5f, v, v);
              Math3D.VectorSubtract(self.s.origin, v, v);
              dist = Math3D.VectorLength(v);
              points = (float) (self.radius_dmg * (1.0 - Math.sqrt(dist / self.dmg_radius)));
              if (ent == self.owner) points = points * 0.5f;

              GameBase.gi.WriteByte(Defines.svc_temp_entity);
              GameBase.gi.WriteByte(Defines.TE_BFG_EXPLOSION);
              GameBase.gi.WritePosition(ent.s.origin);
              GameBase.gi.multicast(ent.s.origin, Defines.MULTICAST_PHS);
              GameCombat.T_Damage(
                  ent,
                  self,
                  self.owner,
                  self.velocity,
                  ent.s.origin,
                  Globals.vec3_origin,
                  (int) points,
                  0,
                  Defines.DAMAGE_ENERGY,
                  Defines.MOD_BFG_EFFECT);
            }
          }

          self.nextthink = GameBase.level.time + Defines.FRAMETIME;
          self.s.frame++;
          if (self.s.frame == 5) self.think = GameUtil.G_FreeEdictA;
          return true;
        }
Exemplo n.º 4
0
        public boolean think(edict_t self) {
          edict_t ent;
          edict_t ignore;
          float[] point = {0, 0, 0};
          float[] dir = {0, 0, 0};
          float[] start = {0, 0, 0};
          float[] end = {0, 0, 0};
          int dmg;
          trace_t tr;

          if (GameBase.deathmatch.value != 0) dmg = 5;
          else dmg = 10;

          EdictIterator edit = null;
          while ((edit = GameBase.findradius(edit, self.s.origin, 256)) != null) {
            ent = edit.o;

            if (ent == self) continue;

            if (ent == self.owner) continue;

            if (ent.takedamage == 0) continue;

            if (0 == (ent.svflags & Defines.SVF_MONSTER)
                && (null == ent.client)
                && (Lib.strcmp(ent.classname, "misc_explobox") != 0)) continue;

            Math3D.VectorMA(ent.absmin, 0.5f, ent.size, point);

            Math3D.VectorSubtract(point, self.s.origin, dir);
            Math3D.VectorNormalize(dir);

            ignore = self;
            Math3D.VectorCopy(self.s.origin, start);
            Math3D.VectorMA(start, 2048, dir, end);
            while (true) {
              tr =
                  GameBase.gi.trace(
                      start,
                      null,
                      null,
                      end,
                      ignore,
                      Defines.CONTENTS_SOLID
                          | Defines.CONTENTS_MONSTER
                          | Defines.CONTENTS_DEADMONSTER);

              if (null == tr.ent) break;

              // hurt it if we can
              if ((tr.ent.takedamage != 0)
                  && 0 == (tr.ent.flags & Defines.FL_IMMUNE_LASER)
                  && (tr.ent != self.owner))
                GameCombat.T_Damage(
                    tr.ent,
                    self,
                    self.owner,
                    dir,
                    tr.endpos,
                    Globals.vec3_origin,
                    dmg,
                    1,
                    Defines.DAMAGE_ENERGY,
                    Defines.MOD_BFG_LASER);

              // if we hit something that's not a monster or player we're
              // done
              if (0 == (tr.ent.svflags & Defines.SVF_MONSTER) && (null == tr.ent.client)) {
                GameBase.gi.WriteByte(Defines.svc_temp_entity);
                GameBase.gi.WriteByte(Defines.TE_LASER_SPARKS);
                GameBase.gi.WriteByte(4);
                GameBase.gi.WritePosition(tr.endpos);
                GameBase.gi.WriteDir(tr.plane.normal);
                GameBase.gi.WriteByte(self.s.skinnum);
                GameBase.gi.multicast(tr.endpos, Defines.MULTICAST_PVS);
                break;
              }

              ignore = tr.ent;
              Math3D.VectorCopy(tr.endpos, start);
            }

            GameBase.gi.WriteByte(Defines.svc_temp_entity);
            GameBase.gi.WriteByte(Defines.TE_BFG_LASER);
            GameBase.gi.WritePosition(self.s.origin);
            GameBase.gi.WritePosition(tr.endpos);
            GameBase.gi.multicast(self.s.origin, Defines.MULTICAST_PHS);
          }

          self.nextthink = GameBase.level.time + Defines.FRAMETIME;
          return true;
        }