X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fweapon%2Farc.qc;h=7c9d64c01abed4d09077f4a29d2e0546dee57ac2;hb=201f6309c92217b63dc34daf004fbb7424096eca;hp=e1796bdf235a4d6bee4873a3e53d9e95c1357048;hpb=0ee6791fda327d24c57a125513402f367d75ffb1;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/weapons/weapon/arc.qc b/qcsrc/common/weapons/weapon/arc.qc index e1796bdf2..7c9d64c01 100644 --- a/qcsrc/common/weapons/weapon/arc.qc +++ b/qcsrc/common/weapons/weapon/arc.qc @@ -13,7 +13,7 @@ CLASS(Arc, Weapon) /* crosshair */ ATTRIB(Arc, w_crosshair_size, float, 0.7); /* wepimg */ ATTRIB(Arc, model2, string, "weaponarc"); /* refname */ ATTRIB(Arc, netname, string, "arc"); -/* wepname */ ATTRIB(Arc, message, string, _("Arc")); +/* wepname */ ATTRIB(Arc, m_name, string, _("Arc")); ENDCLASS(Arc) REGISTER_WEAPON(ARC, NEW(Arc)); @@ -74,12 +74,12 @@ const int ARC_BT_BURST_HEAL = 0x12; const int ARC_BT_BURST_HIT = 0x13; const int ARC_BT_BURSTMASK = 0x10; -const int ARC_SF_SETTINGS = 1; -const int ARC_SF_START = 2; -const int ARC_SF_WANTDIR = 4; -const int ARC_SF_BEAMDIR = 8; -const int ARC_SF_BEAMTYPE = 16; -const int ARC_SF_LOCALMASK = 14; +const int ARC_SF_SETTINGS = BIT(0); +const int ARC_SF_START = BIT(1); +const int ARC_SF_WANTDIR = BIT(2); +const int ARC_SF_BEAMDIR = BIT(3); +const int ARC_SF_BEAMTYPE = BIT(4); +const int ARC_SF_LOCALMASK = ARC_SF_START | ARC_SF_WANTDIR | ARC_SF_BEAMDIR; #endif #ifdef SVQC ARC_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP) @@ -92,19 +92,18 @@ ARC_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP) .float beam_heat; // (beam) amount of heat produced .float arc_overheat; // (dropped arc/player) time during which it's too hot .float arc_cooldown; // (dropped arc/player) cooling speed -.float arc_heat_percent; // (player) arc heat in [0,1] (stat) +.float arc_heat_percent = _STAT(ARC_HEAT); .float arc_smoke_sound; #endif #ifdef CSQC -void Ent_ReadArcBeam(float isnew); .vector beam_color; .float beam_alpha; .float beam_thickness; -.float beam_traileffect; -.float beam_hiteffect; +.entity beam_traileffect; +.entity beam_hiteffect; .float beam_hitlight[4]; // 0: radius, 123: rgb -.float beam_muzzleeffect; +.entity beam_muzzleeffect; .float beam_muzzlelight[4]; // 0: radius, 123: rgb .string beam_image; @@ -128,11 +127,11 @@ vector Draw_ArcBeam_callback_last_bottom; // NOTE: in same coordinate system as #endif #ifdef IMPLEMENTATION #ifdef SVQC -spawnfunc(weapon_arc) { weapon_defaultspawnfunc(WEP_ARC.m_id); } +spawnfunc(weapon_arc) { weapon_defaultspawnfunc(this, WEP_ARC); } -float W_Arc_Beam_Send(entity to, int sf) -{SELFPARAM(); - WriteByte(MSG_ENTITY, ENT_CLIENT_ARC_BEAM); +bool W_Arc_Beam_Send(entity this, entity to, int sf) +{ + WriteHeader(MSG_ENTITY, ENT_CLIENT_ARC_BEAM); // Truncate information when this beam is displayed to the owner client // - The owner client has no use for beam start position or directions, @@ -214,7 +213,7 @@ void Arc_Player_SetHeat(entity player) //dprint("Heat: ",ftos(player.arc_heat_percent*100),"%\n"); } -void W_Arc_Beam_Think(void) +void W_Arc_Beam_Think() {SELFPARAM(); if(self != self.owner.arc_beam) { @@ -267,7 +266,7 @@ void W_Arc_Beam_Think(void) if ( WEP_CVAR(arc, overheat_max) > 0 && self.beam_heat >= WEP_CVAR(arc, overheat_max) ) { - Send_Effect_("arc_overheat", + Send_Effect(EFFECT_ARC_OVERHEAT, self.beam_start, self.beam_wantdir, 1 ); sound(self, CH_WEAPON_A, SND_ARC_STOP, VOL_BASE, ATTN_NORM); } @@ -584,8 +583,7 @@ void W_Arc_Beam(float burst) if(time - self.beam_prev > 1) sound(self, CH_WEAPON_A, SND_ARC_FIRE, VOL_BASE, ATTN_NORM); - entity beam = self.arc_beam = spawn(); - beam.classname = "W_Arc_Beam"; + entity beam = self.arc_beam = new(W_Arc_Beam); beam.solid = SOLID_NOT; beam.think = W_Arc_Beam_Think; beam.owner = self; @@ -607,10 +605,10 @@ void Arc_Smoke() if ( self.arc_overheat > time ) { if ( random() < self.arc_heat_percent ) - Send_Effect_("arc_smoke", smoke_origin, '0 0 0', 1 ); + Send_Effect(EFFECT_ARC_SMOKE, smoke_origin, '0 0 0', 1 ); if ( self.BUTTON_ATCK || self.BUTTON_ATCK2 ) { - Send_Effect_("arc_overheat_fire", smoke_origin, w_shotdir, 1 ); + Send_Effect(EFFECT_ARC_OVERHEAT_FIRE, smoke_origin, w_shotdir, 1 ); if ( !self.arc_smoke_sound ) { self.arc_smoke_sound = 1; @@ -623,7 +621,7 @@ void Arc_Smoke() { if ( random() < (self.arc_beam.beam_heat-WEP_CVAR(arc, overheat_min)) / ( WEP_CVAR(arc, overheat_max)-WEP_CVAR(arc, overheat_min) ) ) - Send_Effect_("arc_smoke", smoke_origin, '0 0 0', 1 ); + Send_Effect(EFFECT_ARC_SMOKE, smoke_origin, '0 0 0', 1 ); } if ( self.arc_smoke_sound && ( self.arc_overheat <= time || @@ -656,34 +654,34 @@ void Arc_Smoke() ); } } - METHOD(Arc, wr_think, void(entity thiswep, entity actor, bool fire1, bool fire2)) + METHOD(Arc, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) { Arc_Player_SetHeat(actor); Arc_Smoke(); if (time >= actor.arc_overheat) - if (fire1 || fire2 || actor.arc_beam.beam_bursting) + if ((fire & 1) || (fire & 2) || actor.arc_beam.beam_bursting) { if(actor.arc_BUTTON_ATCK_prev) { #if 0 if(actor.animstate_startframe == actor.anim_shoot.x && actor.animstate_numframes == actor.anim_shoot.y) - weapon_thinkf(actor, WFRAME_DONTCHANGE, autocvar_g_balance_arc_primary_animtime, w_ready); + weapon_thinkf(actor, weaponentity, WFRAME_DONTCHANGE, autocvar_g_balance_arc_primary_animtime, w_ready); else #endif - weapon_thinkf(actor, WFRAME_FIRE1, WEP_CVAR(arc, beam_animtime), w_ready); + weapon_thinkf(actor, weaponentity, WFRAME_DONTCHANGE, WEP_CVAR(arc, beam_animtime), w_ready); } if((!actor.arc_beam) || wasfreed(actor.arc_beam)) { - if(weapon_prepareattack(thiswep, actor, fire2, 0)) + if(weapon_prepareattack(thiswep, actor, weaponentity, boolean(fire & 2), 0)) { - W_Arc_Beam(fire2); + W_Arc_Beam(boolean(fire & 2)); if(!actor.arc_BUTTON_ATCK_prev) { - weapon_thinkf(actor, WFRAME_FIRE1, WEP_CVAR(arc, beam_animtime), w_ready); + weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(arc, beam_animtime), w_ready); actor.arc_BUTTON_ATCK_prev = true; } } @@ -695,18 +693,19 @@ void Arc_Smoke() if(actor.arc_BUTTON_ATCK_prev) { sound(actor, CH_WEAPON_A, SND_ARC_STOP, VOL_BASE, ATTN_NORM); - weapon_thinkf(actor, WFRAME_FIRE1, WEP_CVAR(arc, beam_animtime), w_ready); - ATTACK_FINISHED(actor) = time + WEP_CVAR(arc, beam_refire) * W_WeaponRateFactor(); + weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(arc, beam_animtime), w_ready); + int slot = weaponslot(weaponentity); + ATTACK_FINISHED(actor, slot) = time + WEP_CVAR(arc, beam_refire) * W_WeaponRateFactor(); } actor.arc_BUTTON_ATCK_prev = false; #if 0 - if(fire2) - if(weapon_prepareattack(thiswep, actor, true, autocvar_g_balance_arc_secondary_refire)) + if(fire & 2) + if(weapon_prepareattack(thiswep, actor, weaponentity, true, autocvar_g_balance_arc_secondary_refire)) { W_Arc_Attack2(); actor.arc_count = autocvar_g_balance_arc_secondary_count; - weapon_thinkf(actor, WFRAME_FIRE2, autocvar_g_balance_arc_secondary_animtime, w_arc_checkattack); + weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, autocvar_g_balance_arc_secondary_animtime, w_arc_checkattack); actor.arc_secondarytime = time + autocvar_g_balance_arc_secondary_refire2 * W_WeaponRateFactor(); } #endif @@ -839,7 +838,7 @@ void Draw_ArcBeam_callback(vector start, vector hit, vector end) Draw_ArcBeam_callback_last_bottom = WarpZone_UnTransformOrigin(WarpZone_trace_transform, bottom); } -void Reset_ArcBeam(void) +void Reset_ArcBeam() { entity e; for (e = world; (e = findfloat(e, beam_usevieworigin, 1)); ) { @@ -850,15 +849,15 @@ void Reset_ArcBeam(void) } } -void Draw_ArcBeam(void) -{SELFPARAM(); +void Draw_ArcBeam(entity this) +{ float dt = time - self.move_time; self.move_time = time; if(dt <= 0) { return; } if(!self.beam_usevieworigin) { - InterpolateOrigin_Do(); + InterpolateOrigin_Do(self); } // origin = beam starting origin @@ -1143,24 +1142,20 @@ void Draw_ArcBeam(void) Draw_ArcBeam_callback_last_bottom = '0 0 0'; } -void Remove_ArcBeam(void) +void Remove_ArcBeam() {SELFPARAM(); remove(self.beam_muzzleentity); sound(self, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM); } -void Ent_ReadArcBeam(float isnew) -{SELFPARAM(); +NET_HANDLE(ENT_CLIENT_ARC_BEAM, bool isnew) +{ int sf = ReadByte(); entity flash; if(isnew) { - // calculate shot origin offset from gun alignment - int gunalign = autocvar_cl_gunalign; - if(gunalign != 1 && gunalign != 2 && gunalign != 4) - gunalign = 3; // default value - --gunalign; + int gunalign = W_GetGunAlignment(world); self.beam_shotorigin = arc_shotorigin[gunalign]; @@ -1213,7 +1208,7 @@ void Ent_ReadArcBeam(float isnew) // self.iflags = IFLAG_ORIGIN | IFLAG_ANGLES | IFLAG_V_ANGLE; // why doesn't this work? self.iflags = IFLAG_ORIGIN; - InterpolateOrigin_Undo(); + InterpolateOrigin_Undo(self); } if(sf & ARC_SF_START) // starting location @@ -1232,7 +1227,7 @@ void Ent_ReadArcBeam(float isnew) else { // use player origin so that third person display still works - self.origin = getplayerorigin(player_localnum) + ('0 0 1' * getstati(STAT_VIEWHEIGHT)); + self.origin = entcs_receiver(player_localnum).origin + ('0 0 1' * getstati(STAT_VIEWHEIGHT)); } } @@ -1262,18 +1257,18 @@ void Ent_ReadArcBeam(float isnew) self.beam_color = '1 1 1'; self.beam_alpha = 0.5; self.beam_thickness = 8; - self.beam_traileffect = particleeffectnum(EFFECT_ARC_BEAM); - self.beam_hiteffect = particleeffectnum(EFFECT_ARC_LIGHTNING); + self.beam_traileffect = (EFFECT_ARC_BEAM); + self.beam_hiteffect = (EFFECT_ARC_LIGHTNING); self.beam_hitlight[0] = 0; self.beam_hitlight[1] = 1; self.beam_hitlight[2] = 1; self.beam_hitlight[3] = 1; - self.beam_muzzleeffect = -1; //particleeffectnum(EFFECT_VORTEX_MUZZLEFLASH); + self.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH); self.beam_muzzlelight[0] = 0; self.beam_muzzlelight[1] = 1; self.beam_muzzlelight[2] = 1; self.beam_muzzlelight[3] = 1; - if(self.beam_muzzleeffect >= 0) + if(self.beam_muzzleeffect) { setmodel(flash, MDL_ARC_MUZZLEFLASH); flash.alpha = self.beam_alpha; @@ -1287,19 +1282,19 @@ void Ent_ReadArcBeam(float isnew) self.beam_color = '1 1 1'; self.beam_alpha = 0.5; self.beam_thickness = 8; - self.beam_traileffect = particleeffectnum(EFFECT_ARC_BEAM); - self.beam_hiteffect = particleeffectnum(EFFECT_ARC_LIGHTNING); + self.beam_traileffect = (EFFECT_ARC_BEAM); + self.beam_hiteffect = (EFFECT_ARC_LIGHTNING); self.beam_hitlight[0] = 0; self.beam_hitlight[1] = 1; self.beam_hitlight[2] = 1; self.beam_hitlight[3] = 1; - self.beam_muzzleeffect = -1; // particleeffectnum(EFFECT_GRENADE_MUZZLEFLASH); + self.beam_muzzleeffect = NULL; // (EFFECT_GRENADE_MUZZLEFLASH); self.beam_muzzlelight[0] = 0; self.beam_muzzlelight[1] = 1; self.beam_muzzlelight[2] = 1; self.beam_muzzlelight[3] = 1; self.beam_image = "particles/lgbeam"; - if(self.beam_muzzleeffect >= 0) + if(self.beam_muzzleeffect) { setmodel(flash, MDL_ARC_MUZZLEFLASH); flash.alpha = self.beam_alpha; @@ -1313,19 +1308,19 @@ void Ent_ReadArcBeam(float isnew) self.beam_color = '1 1 1'; self.beam_alpha = 0.5; self.beam_thickness = 8; - self.beam_traileffect = particleeffectnum(EFFECT_ARC_BEAM_HEAL); - self.beam_hiteffect = particleeffectnum(EFFECT_ARC_BEAM_HEAL_IMPACT); + self.beam_traileffect = (EFFECT_ARC_BEAM_HEAL); + self.beam_hiteffect = (EFFECT_ARC_BEAM_HEAL_IMPACT); self.beam_hitlight[0] = 0; self.beam_hitlight[1] = 1; self.beam_hitlight[2] = 1; self.beam_hitlight[3] = 1; - self.beam_muzzleeffect = -1; //particleeffectnum(EFFECT_VORTEX_MUZZLEFLASH); + self.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH); self.beam_muzzlelight[0] = 0; self.beam_muzzlelight[1] = 1; self.beam_muzzlelight[2] = 1; self.beam_muzzlelight[3] = 1; self.beam_image = "particles/lgbeam"; - if(self.beam_muzzleeffect >= 0) + if(self.beam_muzzleeffect) { setmodel(flash, MDL_ARC_MUZZLEFLASH); flash.alpha = self.beam_alpha; @@ -1339,19 +1334,19 @@ void Ent_ReadArcBeam(float isnew) self.beam_color = '1 1 1'; self.beam_alpha = 0.5; self.beam_thickness = 8; - self.beam_traileffect = particleeffectnum(EFFECT_ARC_BEAM); - self.beam_hiteffect = particleeffectnum(EFFECT_ARC_LIGHTNING); + self.beam_traileffect = (EFFECT_ARC_BEAM); + self.beam_hiteffect = (EFFECT_ARC_LIGHTNING); self.beam_hitlight[0] = 20; self.beam_hitlight[1] = 1; self.beam_hitlight[2] = 0; self.beam_hitlight[3] = 0; - self.beam_muzzleeffect = -1; //particleeffectnum(EFFECT_VORTEX_MUZZLEFLASH); + self.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH); self.beam_muzzlelight[0] = 50; self.beam_muzzlelight[1] = 1; self.beam_muzzlelight[2] = 0; self.beam_muzzlelight[3] = 0; self.beam_image = "particles/lgbeam"; - if(self.beam_muzzleeffect >= 0) + if(self.beam_muzzleeffect) { setmodel(flash, MDL_ARC_MUZZLEFLASH); flash.alpha = self.beam_alpha; @@ -1365,19 +1360,19 @@ void Ent_ReadArcBeam(float isnew) self.beam_color = '1 1 1'; self.beam_alpha = 0.5; self.beam_thickness = 14; - self.beam_traileffect = particleeffectnum(EFFECT_ARC_BEAM); - self.beam_hiteffect = particleeffectnum(EFFECT_ARC_LIGHTNING); + self.beam_traileffect = (EFFECT_ARC_BEAM); + self.beam_hiteffect = (EFFECT_ARC_LIGHTNING); self.beam_hitlight[0] = 0; self.beam_hitlight[1] = 1; self.beam_hitlight[2] = 1; self.beam_hitlight[3] = 1; - self.beam_muzzleeffect = -1; //particleeffectnum(EFFECT_VORTEX_MUZZLEFLASH); + self.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH); self.beam_muzzlelight[0] = 0; self.beam_muzzlelight[1] = 1; self.beam_muzzlelight[2] = 1; self.beam_muzzlelight[3] = 1; self.beam_image = "particles/lgbeam"; - if(self.beam_muzzleeffect >= 0) + if(self.beam_muzzleeffect) { setmodel(flash, MDL_ARC_MUZZLEFLASH); flash.alpha = self.beam_alpha; @@ -1391,19 +1386,19 @@ void Ent_ReadArcBeam(float isnew) self.beam_color = '1 1 1'; self.beam_alpha = 0.5; self.beam_thickness = 14; - self.beam_traileffect = particleeffectnum(EFFECT_ARC_BEAM); - self.beam_hiteffect = particleeffectnum(EFFECT_ARC_LIGHTNING); + self.beam_traileffect = (EFFECT_ARC_BEAM); + self.beam_hiteffect = (EFFECT_ARC_LIGHTNING); self.beam_hitlight[0] = 0; self.beam_hitlight[1] = 1; self.beam_hitlight[2] = 1; self.beam_hitlight[3] = 1; - self.beam_muzzleeffect = -1; //particleeffectnum(EFFECT_VORTEX_MUZZLEFLASH); + self.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH); self.beam_muzzlelight[0] = 0; self.beam_muzzlelight[1] = 1; self.beam_muzzlelight[2] = 1; self.beam_muzzlelight[3] = 1; self.beam_image = "particles/lgbeam"; - if(self.beam_muzzleeffect >= 0) + if(self.beam_muzzleeffect) { setmodel(flash, MDL_ARC_MUZZLEFLASH); flash.alpha = self.beam_alpha; @@ -1417,19 +1412,19 @@ void Ent_ReadArcBeam(float isnew) self.beam_color = '1 1 1'; self.beam_alpha = 0.5; self.beam_thickness = 14; - self.beam_traileffect = particleeffectnum(EFFECT_ARC_BEAM_HEAL); - self.beam_hiteffect = particleeffectnum(EFFECT_ARC_BEAM_HEAL_IMPACT2); + self.beam_traileffect = (EFFECT_ARC_BEAM_HEAL); + self.beam_hiteffect = (EFFECT_ARC_BEAM_HEAL_IMPACT2); self.beam_hitlight[0] = 0; self.beam_hitlight[1] = 1; self.beam_hitlight[2] = 1; self.beam_hitlight[3] = 1; - self.beam_muzzleeffect = -1; //particleeffectnum(EFFECT_VORTEX_MUZZLEFLASH); + self.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH); self.beam_muzzlelight[0] = 0; self.beam_muzzlelight[1] = 1; self.beam_muzzlelight[2] = 1; self.beam_muzzlelight[3] = 1; self.beam_image = "particles/lgbeam"; - if(self.beam_muzzleeffect >= 0) + if(self.beam_muzzleeffect) { setmodel(flash, MDL_ARC_MUZZLEFLASH); flash.alpha = self.beam_alpha; @@ -1443,19 +1438,19 @@ void Ent_ReadArcBeam(float isnew) self.beam_color = '1 1 1'; self.beam_alpha = 0.5; self.beam_thickness = 14; - self.beam_traileffect = particleeffectnum(EFFECT_ARC_BEAM); - self.beam_hiteffect = particleeffectnum(EFFECT_ARC_LIGHTNING); + self.beam_traileffect = (EFFECT_ARC_BEAM); + self.beam_hiteffect = (EFFECT_ARC_LIGHTNING); self.beam_hitlight[0] = 0; self.beam_hitlight[1] = 1; self.beam_hitlight[2] = 1; self.beam_hitlight[3] = 1; - self.beam_muzzleeffect = -1; //particleeffectnum(EFFECT_VORTEX_MUZZLEFLASH); + self.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH); self.beam_muzzlelight[0] = 0; self.beam_muzzlelight[1] = 1; self.beam_muzzlelight[2] = 1; self.beam_muzzlelight[3] = 1; self.beam_image = "particles/lgbeam"; - if(self.beam_muzzleeffect >= 0) + if(self.beam_muzzleeffect) { setmodel(flash, MDL_ARC_MUZZLEFLASH); flash.alpha = self.beam_alpha; @@ -1471,19 +1466,19 @@ void Ent_ReadArcBeam(float isnew) self.beam_color = randomvec(); self.beam_alpha = 1; self.beam_thickness = 8; - self.beam_traileffect = false; - self.beam_hiteffect = false; + self.beam_traileffect = NULL; + self.beam_hiteffect = NULL; self.beam_hitlight[0] = 0; self.beam_hitlight[1] = 1; self.beam_hitlight[2] = 1; self.beam_hitlight[3] = 1; - self.beam_muzzleeffect = -1; //particleeffectnum(EFFECT_VORTEX_MUZZLEFLASH); + self.beam_muzzleeffect = NULL; //(EFFECT_VORTEX_MUZZLEFLASH); self.beam_muzzlelight[0] = 0; self.beam_muzzlelight[1] = 1; self.beam_muzzlelight[2] = 1; self.beam_muzzlelight[3] = 1; self.beam_image = "particles/lgbeam"; - if(self.beam_muzzleeffect >= 0) + if(self.beam_muzzleeffect) { setmodel(flash, MDL_ARC_MUZZLEFLASH); flash.alpha = self.beam_alpha; @@ -1497,8 +1492,9 @@ void Ent_ReadArcBeam(float isnew) if(!self.beam_usevieworigin) { - InterpolateOrigin_Note(); + InterpolateOrigin_Note(this); } + return true; } #endif