#include "bumblebee_weapons.qh" #ifdef GAMEQC REGISTER_NET_LINKED(ENT_CLIENT_BUMBLE_RAYGUN) #endif #ifdef SVQC void bumblebee_fire_cannon(entity this, entity _gun, string _tagname, entity _owner) { vector v = gettaginfo(_gun, gettagindex(_gun, _tagname)); vehicles_projectile(this, EFFECT_BIGPLASMA_MUZZLEFLASH, SND_VEH_BUMBLEBEE_FIRE, v, normalize(v_forward + randomvec() * autocvar_g_vehicle_bumblebee_cannon_spread) * autocvar_g_vehicle_bumblebee_cannon_speed, autocvar_g_vehicle_bumblebee_cannon_damage, autocvar_g_vehicle_bumblebee_cannon_radius, autocvar_g_vehicle_bumblebee_cannon_force, 0, DEATH_VH_BUMB_GUN.m_id, PROJECTILE_BUMBLE_GUN, 0, true, true, _owner); } bool bumble_raygun_send(entity this, entity to, float sf) { WriteHeader(MSG_ENTITY, ENT_CLIENT_BUMBLE_RAYGUN); WriteByte(MSG_ENTITY, sf); if (sf & BRG_SETUP) { WriteByte(MSG_ENTITY, etof(this.realowner)); WriteByte(MSG_ENTITY, this.realowner.team); WriteByte(MSG_ENTITY, this.cnt); } if (sf & BRG_START) WriteVector(MSG_ENTITY, this.hook_start); if (sf & BRG_END) WriteVector(MSG_ENTITY, this.hook_end); return true; } #endif // SVQC #ifdef CSQC void bumble_raygun_draw(entity this); .vector bumble_origin; NET_HANDLE(ENT_CLIENT_BUMBLE_RAYGUN, bool isNew) { int sf = ReadByte(); if (sf & BRG_SETUP) { this.cnt = ReadByte(); this.team = ReadByte(); this.count = ReadByte(); this.colormod = (this.count ? '1 0 0' : '0 1 0'); this.traileffect = EFFECT_BUMBLEBEE_HEAL_MUZZLEFLASH.m_id; this.lip = particleeffectnum(EFFECT_BUMBLEBEE_HEAL_IMPACT); this.draw = bumble_raygun_draw; if (isNew) IL_PUSH(g_drawables, this); } if (sf & BRG_START) { this.origin = ReadVector(); setorigin(this, this.origin); } if (sf & BRG_END) this.bumble_origin = ReadVector(); return true; } .float bumble_raygun_nextdraw; void bumble_raygun_draw(entity this) { float _len = vlen(this.origin - this.bumble_origin); vector _dir = normalize(this.bumble_origin - this.origin); if (this.bumble_raygun_nextdraw < time) { entity eff = REGISTRY_GET(Effects, this.traileffect); boxparticles(particleeffectnum(eff), this, this.origin, this.origin + _dir * -64, _dir * -_len, _dir * -_len, 1, PARTICLES_USEALPHA); boxparticles(this.lip, this, this.bumble_origin, this.bumble_origin + _dir * -64, _dir * -200, _dir * -200, 1, PARTICLES_USEALPHA); this.bumble_raygun_nextdraw = time + 0.1; } vector _vtmp1, _vtmp2; float df = DRAWFLAG_NORMAL; //(random() < 0.5 ? DRAWFLAG_ADDITIVE : DRAWFLAG_SCREEN); float sz, al; for (float i = -0.1; i < 0.2; i += 0.1) { sz = 5 + random() * 5; al = 0.25 + random() * 0.5; _vtmp1 = this.origin + _dir * _len * (0.25 + i); _vtmp1 += (randomvec() * (_len * 0.2) * (frametime * 2)); //this.raygun_l1; Draw_CylindricLine(this.origin, _vtmp1, sz, "gfx/colors/white", 1, 1, this.colormod, al, df, view_origin); _vtmp2 = this.origin + _dir * _len * (0.5 + i); _vtmp2 += (randomvec() * (_len * 0.2) * (frametime * 5)); //this.raygun_l2; Draw_CylindricLine(_vtmp1, _vtmp2, sz, "gfx/colors/white", 1, 1, this.colormod, al, df, view_origin); _vtmp1 = this.origin + _dir * _len * (0.75 + i); _vtmp1 += randomvec() * (_len * 0.2) * (frametime * 10); //this.raygun_l3; Draw_CylindricLine(_vtmp2, _vtmp1, sz, "gfx/colors/white", 1, 1, this.colormod, al, df, view_origin); Draw_CylindricLine(_vtmp1, this.bumble_origin + randomvec() * 32, sz, "gfx/colors/white", 1, 1, this.colormod, al, df, view_origin); } } #endif // CSQC