コード例 #1
0
ファイル: GameWeapon.java プロジェクト: ksaveljev/jake2
        public void touch(edict_t ent, edict_t other, cplane_t plane, csurface_t surf) {
          float[] origin = {0, 0, 0};
          int n;

          if (other == ent.owner) return;

          if (surf != null && (surf.flags & Defines.SURF_SKY) != 0) {
            GameUtil.G_FreeEdict(ent);
            return;
          }

          if (ent.owner.client != null)
            PlayerWeapon.PlayerNoise(ent.owner, ent.s.origin, Defines.PNOISE_IMPACT);

          // calculate position for the explosion entity
          Math3D.VectorMA(ent.s.origin, -0.02f, ent.velocity, origin);

          if (other.takedamage != 0) {
            GameCombat.T_Damage(
                other,
                ent,
                ent.owner,
                ent.velocity,
                ent.s.origin,
                plane.normal,
                ent.dmg,
                0,
                0,
                Defines.MOD_ROCKET);
          } else {
            // don't throw any debris in net games
            if (GameBase.deathmatch.value == 0 && 0 == GameBase.coop.value) {
              if ((surf != null)
                  && 0
                      == (surf.flags
                          & (Defines.SURF_WARP
                              | Defines.SURF_TRANS33
                              | Defines.SURF_TRANS66
                              | Defines.SURF_FLOWING))) {
                n = Lib.rand() % 5;
                while (n-- > 0)
                  GameMisc.ThrowDebris(ent, "models/objects/debris2/tris.md2", 2, ent.s.origin);
              }
            }
          }

          GameCombat.T_RadiusDamage(
              ent, ent.owner, ent.radius_dmg, other, ent.dmg_radius, Defines.MOD_R_SPLASH);

          GameBase.gi.WriteByte(Defines.svc_temp_entity);
          if (ent.waterlevel != 0) GameBase.gi.WriteByte(Defines.TE_ROCKET_EXPLOSION_WATER);
          else GameBase.gi.WriteByte(Defines.TE_ROCKET_EXPLOSION);
          GameBase.gi.WritePosition(origin);
          GameBase.gi.multicast(ent.s.origin, Defines.MULTICAST_PHS);

          GameUtil.G_FreeEdict(ent);
        }
コード例 #2
0
ファイル: GameWeapon.java プロジェクト: ksaveljev/jake2
        public boolean think(edict_t ent) {
          float[] origin = {0, 0, 0};
          int mod;

          if (ent.owner.client != null)
            PlayerWeapon.PlayerNoise(ent.owner, ent.s.origin, Defines.PNOISE_IMPACT);

          // FIXME: if we are onground then raise our Z just a bit since we
          // are a point?
          if (ent.enemy != null) {
            float points = 0;
            float[] v = {0, 0, 0};
            float[] dir = {0, 0, 0};

            Math3D.VectorAdd(ent.enemy.mins, ent.enemy.maxs, v);
            Math3D.VectorMA(ent.enemy.s.origin, 0.5f, v, v);
            Math3D.VectorSubtract(ent.s.origin, v, v);
            points = ent.dmg - 0.5f * Math3D.VectorLength(v);
            Math3D.VectorSubtract(ent.enemy.s.origin, ent.s.origin, dir);
            if ((ent.spawnflags & 1) != 0) mod = Defines.MOD_HANDGRENADE;
            else mod = Defines.MOD_GRENADE;
            GameCombat.T_Damage(
                ent.enemy,
                ent,
                ent.owner,
                dir,
                ent.s.origin,
                Globals.vec3_origin,
                (int) points,
                (int) points,
                Defines.DAMAGE_RADIUS,
                mod);
          }

          if ((ent.spawnflags & 2) != 0) mod = Defines.MOD_HELD_GRENADE;
          else if ((ent.spawnflags & 1) != 0) mod = Defines.MOD_HG_SPLASH;
          else mod = Defines.MOD_G_SPLASH;
          GameCombat.T_RadiusDamage(ent, ent.owner, ent.dmg, ent.enemy, ent.dmg_radius, mod);

          Math3D.VectorMA(ent.s.origin, -0.02f, ent.velocity, origin);
          GameBase.gi.WriteByte(Defines.svc_temp_entity);
          if (ent.waterlevel != 0) {
            if (ent.groundentity != null) GameBase.gi.WriteByte(Defines.TE_GRENADE_EXPLOSION_WATER);
            else GameBase.gi.WriteByte(Defines.TE_ROCKET_EXPLOSION_WATER);
          } else {
            if (ent.groundentity != null) GameBase.gi.WriteByte(Defines.TE_GRENADE_EXPLOSION);
            else GameBase.gi.WriteByte(Defines.TE_ROCKET_EXPLOSION);
          }
          GameBase.gi.WritePosition(origin);
          GameBase.gi.multicast(ent.s.origin, Defines.MULTICAST_PHS);

          GameUtil.G_FreeEdict(ent);
          return true;
        }
コード例 #3
0
ファイル: GameWeapon.java プロジェクト: ksaveljev/jake2
        public void touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf) {
          if (other == self.owner) return;

          if (surf != null && (surf.flags & Defines.SURF_SKY) != 0) {
            GameUtil.G_FreeEdict(self);
            return;
          }

          if (self.owner.client != null)
            PlayerWeapon.PlayerNoise(self.owner, self.s.origin, Defines.PNOISE_IMPACT);

          // core explosion - prevents firing it into the wall/floor
          if (other.takedamage != 0)
            GameCombat.T_Damage(
                other,
                self,
                self.owner,
                self.velocity,
                self.s.origin,
                plane.normal,
                200,
                0,
                0,
                Defines.MOD_BFG_BLAST);
          GameCombat.T_RadiusDamage(self, self.owner, 200, other, 100, Defines.MOD_BFG_BLAST);

          GameBase.gi.sound(
              self,
              Defines.CHAN_VOICE,
              GameBase.gi.soundindex("weapons/bfg__x1b.wav"),
              1,
              Defines.ATTN_NORM,
              0);
          self.solid = Defines.SOLID_NOT;
          self.touch = null;
          Math3D.VectorMA(self.s.origin, -1 * Defines.FRAMETIME, self.velocity, self.s.origin);
          Math3D.VectorClear(self.velocity);
          self.s.modelindex = GameBase.gi.modelindex("sprites/s_bfg3.sp2");
          self.s.frame = 0;
          self.s.sound = 0;
          self.s.effects &= ~Defines.EF_ANIM_ALLFAST;
          self.think = bfg_explode;
          self.nextthink = GameBase.level.time + Defines.FRAMETIME;
          self.enemy = other;

          GameBase.gi.WriteByte(Defines.svc_temp_entity);
          GameBase.gi.WriteByte(Defines.TE_BFG_BIGEXPLOSION);
          GameBase.gi.WritePosition(self.s.origin);
          GameBase.gi.multicast(self.s.origin, Defines.MULTICAST_PVS);
        }
コード例 #4
0
ファイル: GameWeapon.java プロジェクト: ksaveljev/jake2
        public void touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf) {
          int mod;

          if (other == self.owner) return;

          if (surf != null && (surf.flags & Defines.SURF_SKY) != 0) {
            GameUtil.G_FreeEdict(self);
            return;
          }

          if (self.owner.client != null)
            PlayerWeapon.PlayerNoise(self.owner, self.s.origin, Defines.PNOISE_IMPACT);

          if (other.takedamage != 0) {
            if ((self.spawnflags & 1) != 0) mod = Defines.MOD_HYPERBLASTER;
            else mod = Defines.MOD_BLASTER;

            // bugfix null plane rst
            float[] normal;
            if (plane == null) normal = new float[3];
            else normal = plane.normal;

            GameCombat.T_Damage(
                other,
                self,
                self.owner,
                self.velocity,
                self.s.origin,
                normal,
                self.dmg,
                1,
                Defines.DAMAGE_ENERGY,
                mod);

          } else {
            GameBase.gi.WriteByte(Defines.svc_temp_entity);
            GameBase.gi.WriteByte(Defines.TE_BLASTER);
            GameBase.gi.WritePosition(self.s.origin);
            if (plane == null) GameBase.gi.WriteDir(Globals.vec3_origin);
            else GameBase.gi.WriteDir(plane.normal);
            GameBase.gi.multicast(self.s.origin, Defines.MULTICAST_PVS);
          }

          GameUtil.G_FreeEdict(self);
        }
コード例 #5
0
ファイル: GameWeapon.java プロジェクト: ksaveljev/jake2
  /*
   * =================
   * fire_rail
   * =================
   */
  public static void fire_rail(edict_t self, float[] start, float[] aimdir, int damage, int kick) {
    float[] from = {0, 0, 0};
    float[] end = {0, 0, 0};
    trace_t tr = null;
    edict_t ignore;
    int mask;
    boolean water;

    Math3D.VectorMA(start, 8192f, aimdir, end);
    Math3D.VectorCopy(start, from);
    ignore = self;
    water = false;
    mask = Defines.MASK_SHOT | Defines.CONTENTS_SLIME | Defines.CONTENTS_LAVA;
    while (ignore != null) {
      tr = GameBase.gi.trace(from, null, null, end, ignore, mask);

      if ((tr.contents & (Defines.CONTENTS_SLIME | Defines.CONTENTS_LAVA)) != 0) {
        mask &= ~(Defines.CONTENTS_SLIME | Defines.CONTENTS_LAVA);
        water = true;
      } else {
        // ZOID--added so rail goes through SOLID_BBOX entities (gibs,
        // etc)
        if ((tr.ent.svflags & Defines.SVF_MONSTER) != 0
            || (tr.ent.client != null)
            || (tr.ent.solid == Defines.SOLID_BBOX)) ignore = tr.ent;
        else ignore = null;

        if ((tr.ent != self) && (tr.ent.takedamage != 0))
          GameCombat.T_Damage(
              tr.ent,
              self,
              self,
              aimdir,
              tr.endpos,
              tr.plane.normal,
              damage,
              kick,
              0,
              Defines.MOD_RAILGUN);
      }

      Math3D.VectorCopy(tr.endpos, from);
    }

    // send gun puff / flash
    GameBase.gi.WriteByte(Defines.svc_temp_entity);
    GameBase.gi.WriteByte(Defines.TE_RAILTRAIL);
    GameBase.gi.WritePosition(start);
    GameBase.gi.WritePosition(tr.endpos);
    GameBase.gi.multicast(self.s.origin, Defines.MULTICAST_PHS);
    // gi.multicast (start, MULTICAST_PHS);
    if (water) {
      GameBase.gi.WriteByte(Defines.svc_temp_entity);
      GameBase.gi.WriteByte(Defines.TE_RAILTRAIL);
      GameBase.gi.WritePosition(start);
      GameBase.gi.WritePosition(tr.endpos);
      GameBase.gi.multicast(tr.endpos, Defines.MULTICAST_PHS);
    }

    if (self.client != null) PlayerWeapon.PlayerNoise(self, tr.endpos, Defines.PNOISE_IMPACT);
  }
コード例 #6
0
ファイル: GameWeapon.java プロジェクト: ksaveljev/jake2
  /*
   * =================
   * fire_lead
   *
   * This is an internal support routine used for bullet/pellet based weapons.
   * =================
   */
  public static void fire_lead(
      edict_t self,
      float[] start,
      float[] aimdir,
      int damage,
      int kick,
      int te_impact,
      int hspread,
      int vspread,
      int mod) {
    trace_t tr;
    float[] dir = {0, 0, 0};
    float[] forward = {0, 0, 0}, right = {0, 0, 0}, up = {0, 0, 0};
    float[] end = {0, 0, 0};
    float r;
    float u;
    float[] water_start = {0, 0, 0};
    boolean water = false;
    int content_mask = Defines.MASK_SHOT | Defines.MASK_WATER;

    tr = GameBase.gi.trace(self.s.origin, null, null, start, self, Defines.MASK_SHOT);
    if (!(tr.fraction < 1.0)) {
      Math3D.vectoangles(aimdir, dir);
      Math3D.AngleVectors(dir, forward, right, up);

      r = Lib.crandom() * hspread;
      u = Lib.crandom() * vspread;
      Math3D.VectorMA(start, 8192, forward, end);
      Math3D.VectorMA(end, r, right, end);
      Math3D.VectorMA(end, u, up, end);

      if ((GameBase.gi.pointcontents.pointcontents(start) & Defines.MASK_WATER) != 0) {
        water = true;
        Math3D.VectorCopy(start, water_start);
        content_mask &= ~Defines.MASK_WATER;
      }

      tr = GameBase.gi.trace(start, null, null, end, self, content_mask);

      // see if we hit water
      if ((tr.contents & Defines.MASK_WATER) != 0) {
        int color;

        water = true;
        Math3D.VectorCopy(tr.endpos, water_start);

        if (!Math3D.VectorEquals(start, tr.endpos)) {
          if ((tr.contents & Defines.CONTENTS_WATER) != 0) {
            if (Lib.strcmp(tr.surface.name, "*brwater") == 0) color = Defines.SPLASH_BROWN_WATER;
            else color = Defines.SPLASH_BLUE_WATER;
          } else if ((tr.contents & Defines.CONTENTS_SLIME) != 0) color = Defines.SPLASH_SLIME;
          else if ((tr.contents & Defines.CONTENTS_LAVA) != 0) color = Defines.SPLASH_LAVA;
          else color = Defines.SPLASH_UNKNOWN;

          if (color != Defines.SPLASH_UNKNOWN) {
            GameBase.gi.WriteByte(Defines.svc_temp_entity);
            GameBase.gi.WriteByte(Defines.TE_SPLASH);
            GameBase.gi.WriteByte(8);
            GameBase.gi.WritePosition(tr.endpos);
            GameBase.gi.WriteDir(tr.plane.normal);
            GameBase.gi.WriteByte(color);
            GameBase.gi.multicast(tr.endpos, Defines.MULTICAST_PVS);
          }

          // change bullet's course when it enters water
          Math3D.VectorSubtract(end, start, dir);
          Math3D.vectoangles(dir, dir);
          Math3D.AngleVectors(dir, forward, right, up);
          r = Lib.crandom() * hspread * 2;
          u = Lib.crandom() * vspread * 2;
          Math3D.VectorMA(water_start, 8192, forward, end);
          Math3D.VectorMA(end, r, right, end);
          Math3D.VectorMA(end, u, up, end);
        }

        // re-trace ignoring water this time
        tr = GameBase.gi.trace(water_start, null, null, end, self, Defines.MASK_SHOT);
      }
    }

    // send gun puff / flash
    if (!((tr.surface != null) && 0 != (tr.surface.flags & Defines.SURF_SKY))) {
      if (tr.fraction < 1.0) {
        if (tr.ent.takedamage != 0) {
          GameCombat.T_Damage(
              tr.ent,
              self,
              self,
              aimdir,
              tr.endpos,
              tr.plane.normal,
              damage,
              kick,
              Defines.DAMAGE_BULLET,
              mod);
        } else {
          if (!"sky".equals(tr.surface.name)) {
            GameBase.gi.WriteByte(Defines.svc_temp_entity);
            GameBase.gi.WriteByte(te_impact);
            GameBase.gi.WritePosition(tr.endpos);
            GameBase.gi.WriteDir(tr.plane.normal);
            GameBase.gi.multicast(tr.endpos, Defines.MULTICAST_PVS);

            if (self.client != null)
              PlayerWeapon.PlayerNoise(self, tr.endpos, Defines.PNOISE_IMPACT);
          }
        }
      }
    }

    // if went through water, determine where the end and make a bubble
    // trail
    if (water) {
      float[] pos = {0, 0, 0};

      Math3D.VectorSubtract(tr.endpos, water_start, dir);
      Math3D.VectorNormalize(dir);
      Math3D.VectorMA(tr.endpos, -2, dir, pos);
      if ((GameBase.gi.pointcontents.pointcontents(pos) & Defines.MASK_WATER) != 0)
        Math3D.VectorCopy(pos, tr.endpos);
      else tr = GameBase.gi.trace(pos, null, null, water_start, tr.ent, Defines.MASK_WATER);

      Math3D.VectorAdd(water_start, tr.endpos, pos);
      Math3D.VectorScale(pos, 0.5f, pos);

      GameBase.gi.WriteByte(Defines.svc_temp_entity);
      GameBase.gi.WriteByte(Defines.TE_BUBBLETRAIL);
      GameBase.gi.WritePosition(water_start);
      GameBase.gi.WritePosition(tr.endpos);
      GameBase.gi.multicast(pos, Defines.MULTICAST_PVS);
    }
  }