]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Mario/arc_bolt_bounce
authorMario <mario.mario@y7mail.com>
Sun, 1 Nov 2020 05:55:56 +0000 (15:55 +1000)
committerMario <mario.mario@y7mail.com>
Sun, 1 Nov 2020 05:55:56 +0000 (15:55 +1000)
1  2 
qcsrc/client/weapons/projectile.qc
qcsrc/common/weapons/weapon/arc.qc

index 9ed53e309917906a927a1a0e8f589ce03ab49a27,3fe6deb78fb77c8c98c9bd33bc27eb9e7c2e37d6..4e457dabab9bcf24f2dbe4338b29d9e8c0e5e6bc
@@@ -1,19 -1,13 +1,13 @@@
  #include "projectile.qh"
  
- #include "../autocvars.qh"
- #include "../main.qh"
  #include <client/mutators/_mod.qh>
  #include <common/constants.qh>
- #include <common/effects/effect.qh>
  #include <common/effects/all.qh>
+ #include <common/effects/effect.qh>
+ #include <common/mutators/mutator/nades/nades.qh>
  #include <common/net_linked.qh>
  #include <common/physics/movetypes/movetypes.qh>
- #include <common/mutators/mutator/nades/nades.qh>
  #include <lib/csqcmodel/interpolate.qh>
  #include <lib/warpzone/anglestransform.qh>
  
  .float alpha;
@@@ -308,7 -302,7 +302,7 @@@ NET_HANDLE(ENT_CLIENT_PROJECTILE, bool 
                        HANDLE(GRENADE_BOUNCING)   this.traileffect = EFFECT_TR_GRENADE.m_id; break;
                        HANDLE(MINE)               this.traileffect = EFFECT_TR_GRENADE.m_id; break;
                        HANDLE(BLASTER)            this.traileffect = EFFECT_Null.m_id; break;
 -                      HANDLE(ARC_BOLT)           this.traileffect = EFFECT_Null.m_id; break;
 +                      HANDLE(ARC_BOLT)           this.traileffect = EFFECT_TR_WIZSPIKE.m_id; break;
                        HANDLE(HLAC)               this.traileffect = EFFECT_Null.m_id; break;
                        HANDLE(PORTO_RED)          this.traileffect = EFFECT_TR_WIZSPIKE.m_id; this.scale = 4; break;
                        HANDLE(PORTO_BLUE)         this.traileffect = EFFECT_TR_WIZSPIKE.m_id; this.scale = 4; break;
                                this.mins = '-4 -4 -4';
                                this.maxs = '4 4 4';
                                break;
 +                      case PROJECTILE_ARC_BOLT:
 +                              set_movetype(this, MOVETYPE_BOUNCE);
 +                              settouch(this, func_null);
 +                              break;
                        case PROJECTILE_RAPTORBOMB:
                                this.mins = '-3 -3 -3';
                                this.maxs = '3 3 3';
        if (!(this.count & 0x80))
                InterpolateOrigin_Note(this);
  
-       this.classname = "csqcprojectile";
        this.draw = Projectile_Draw;
        if (isnew) IL_PUSH(g_drawables, this);
        this.entremove = Ent_RemoveProjectile;
index cdd89e93d2157d5d1fb6c9e008b9dedcb1e16295,848825f147dc7b6d4bcd860dd9e5f55f5a4fe33f..4b159019e62acdcad320c8b84262dd6130bd0b34
@@@ -1,8 -1,8 +1,8 @@@
  #include "arc.qh"
  
  #ifdef SVQC
- #include <common/gamemodes/gamemode/onslaught/sv_onslaught.qh>
  #include <common/gamemodes/gamemode/onslaught/sv_generator.qh>
+ #include <common/gamemodes/gamemode/onslaught/sv_onslaught.qh>
  
  bool W_Arc_Beam_Send(entity this, entity to, int sf)
  {
@@@ -118,28 -118,20 +118,28 @@@ void W_Arc_Bolt_Damage(entity this, ent
  void W_Arc_Bolt_Touch(entity this, entity toucher)
  {
        PROJECTILE_TOUCH(this, toucher);
 -      this.use(this, NULL, toucher);
 +      if(this.cnt >= WEP_CVAR(arc, bolt_bounce_count) || !WEP_CVAR(arc, bolt_bounce_count) || toucher.takedamage == DAMAGE_AIM) {
 +              this.use(this, NULL, toucher);
 +      } else {
 +              this.cnt++;
 +              Send_Effect(EFFECT_BALL_SPARKS, this.origin, this.velocity, 1);
 +              this.angles = vectoangles(this.velocity);
 +              this.owner = NULL;
 +              this.projectiledeathtype |= HITTYPE_BOUNCE;
 +              if(WEP_CVAR(arc, bolt_bounce_explode))
 +                      RadiusDamage(this, this.realowner, WEP_CVAR(arc, bolt_damage), WEP_CVAR(arc, bolt_edgedamage), WEP_CVAR(arc, bolt_radius), NULL, NULL, WEP_CVAR(arc, bolt_force), this.projectiledeathtype, this.weaponentity_fld, toucher);
 +              if(this.cnt == 1 && WEP_CVAR(arc, bolt_bounce_lifetime))
 +                      this.nextthink = time + WEP_CVAR(arc, bolt_bounce_lifetime);
 +      }
  }
  
 -void W_Arc_Attack_Bolt(Weapon thiswep, entity actor, .entity weaponentity)
 +void W_Arc_Attack_Bolt(Weapon thiswep, entity actor, .entity weaponentity, int fire)
  {
 -      entity missile;
 -
 -      W_DecreaseAmmo(thiswep, actor, WEP_CVAR(arc, bolt_ammo), weaponentity);
 -
 -      W_SetupShot(actor, weaponentity, false, 2, SND_LASERGUN_FIRE, CH_WEAPON_A, WEP_CVAR(arc, bolt_damage), WEP_ARC.m_id | HITTYPE_SECONDARY);
 +      W_SetupShot(actor, weaponentity, false, 2, SND_ELECTRO_FIRE2, CH_WEAPON_A, WEP_CVAR(arc, bolt_damage), thiswep.m_id | HITTYPE_SECONDARY);
  
        W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
  
 -      missile = new(missile);
 +      entity missile = new(missile);
        missile.owner = missile.realowner = actor;
        missile.bot_dodge = true;
        IL_PUSH(g_bot_dodge, missile);
        IL_PUSH(g_damagedbycontents, missile);
  
        settouch(missile, W_Arc_Bolt_Touch);
 +      missile.cnt = 0;
        missile.use = W_Arc_Bolt_Explode_use;
        setthink(missile, adaptor_think2use_hittype_splash);
        missile.nextthink = time + WEP_CVAR(arc, bolt_lifetime);
        PROJECTILE_MAKETRIGGER(missile);
 -      missile.projectiledeathtype = WEP_ARC.m_id | HITTYPE_SECONDARY;
 +      missile.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
        missile.weaponentity_fld = weaponentity;
        setorigin(missile, w_shotorg);
        setsize(missile, '0 0 0', '0 0 0');
  
 -      set_movetype(missile, MOVETYPE_FLY);
 +      set_movetype(missile, MOVETYPE_BOUNCEMISSILE);
        W_SetupProjVelocity_PRE(missile, arc, bolt_);
  
        missile.angles = vectoangles(missile.velocity);
        missile.flags = FL_PROJECTILE;
 +      IL_PUSH(g_projectiles, missile);
        missile.missile_flags = MIF_SPLASH;
  
        CSQCProjectile(missile, true, PROJECTILE_ARC_BOLT, true);
  
        MUTATOR_CALLHOOK(EditProjectile, actor, missile);
 +
 +      actor.(weaponentity).misc_bulletcounter = actor.(weaponentity).misc_bulletcounter + 1;
 +      if(actor.(weaponentity).misc_bulletcounter == 0)
 +      {
 +              ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR(arc, bolt_refire2) * W_WeaponRateFactor(actor);
 +              weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(arc, bolt_refire), w_ready);
 +      }
 +      else
 +      {
 +              weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(arc, bolt_refire), W_Arc_Attack_Bolt);
 +      }
  }
  
  void W_Arc_Beam_Think(entity this)
@@@ -680,28 -659,10 +680,28 @@@ METHOD(Arc, wr_think, void(entity thisw
      }
      else if(fire & 2)
      {
 -        if(weapon_prepareattack(thiswep, actor, weaponentity, true, WEP_CVAR(arc, bolt_refire)))
 +        if(weapon_prepareattack(thiswep, actor, weaponentity, true, 0))
          {
 -            W_Arc_Attack_Bolt(thiswep, actor, weaponentity);
 -            weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(arc, bolt_refire), w_ready);
 +              if(!thiswep.wr_checkammo2(thiswep, actor, weaponentity))
 +            if(!(actor.items & IT_UNLIMITED_AMMO))
 +            {
 +                W_SwitchWeapon_Force(actor, w_getbestweapon(actor, weaponentity), weaponentity);
 +                w_ready(thiswep, actor, weaponentity, fire);
 +                return;
 +            }
 +            float ammo_available = GetResource(actor, thiswep.ammo_type);
 +            // We don't want to shoot 3 rounds if there's 2 left in the mag, so we'll use a fraction.
 +            // Also keep the fraction <= 1 otherwise we'd mag dump in one burst.
 +            float burst_fraction = min(1, ammo_available / WEP_CVAR(arc, bolt_ammo));
 +            int to_shoot = floor(WEP_CVAR(arc, bolt_count) * burst_fraction);
 +
 +            // We also don't want to use 3 rounds if there's only 2 left.
 +            int to_use = min(WEP_CVAR(arc, bolt_ammo), ammo_available);
 +            W_DecreaseAmmo(thiswep, actor, to_use, weaponentity);
 +
 +            // Bursting counts up to 0 from a negative.
 +            actor.(weaponentity).misc_bulletcounter = -to_shoot;
 +            W_Arc_Attack_Bolt(thiswep, actor, weaponentity, fire);
          }
      }
  
@@@ -803,8 -764,8 +803,8 @@@ METHOD(Arc, wr_impacteffect, void(entit
      {
          vector org2;
          org2 = w_org + w_backoff * 6;
 -        pointparticles(EFFECT_ARC_BOLT_EXPLODE, org2, w_backoff * 1000, 1);
 -        if(!w_issilent) { sound(actor, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTN_NORM); }
 +        pointparticles(EFFECT_ELECTRO_IMPACT, org2, w_backoff * 1000, 1);
 +        if(!w_issilent) { sound(actor, CH_SHOTS, SND_ELECTRO_IMPACT, VOL_BASE, ATTN_NORM); }
      }
  }
  
@@@ -1240,7 -1201,7 +1240,7 @@@ NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool is
                this.move_time = time;
                loopsound(this, CH_SHOTS_SINGLE, SND_ARC_LOOP, VOL_BASE, ATTEN_NORM);
  
-               flash = spawn();
+               flash = new(arc_flash);
                flash.owner = this;
                flash.effects = EF_ADDITIVE | EF_FULLBRIGHT;
                //flash.drawmask = MASK_NORMAL;