X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fw_hook.qc;h=ca94ace96e1cfe6ea1bcb87d8200ef0ffc04c673;hb=014e27ddc7d207bd3ffe09a5d966f969e4a50712;hp=ae0f756d49d0514895c05d00e0a434d15c06f1e3;hpb=6b7f6568458d842f2416c8fb0d6b5127a478cb44;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/weapons/w_hook.qc b/qcsrc/common/weapons/w_hook.qc index ae0f756d4..ca94ace96 100644 --- a/qcsrc/common/weapons/w_hook.qc +++ b/qcsrc/common/weapons/w_hook.qc @@ -1,27 +1,47 @@ #ifdef REGISTER_WEAPON REGISTER_WEAPON( /* WEP_##id */ HOOK, -/* function */ w_hook, -/* ammotype */ IT_CELLS|IT_FUEL, +/* function */ W_Hook, +/* ammotype */ ammo_fuel, /* impulse */ 0, /* flags */ WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, /* rating */ 0, -/* model */ "hookgun", -/* shortname */ "hook", -/* fullname */ _("Grappling Hook") +/* color */ '0 0.5 0', +/* modelname */ "hookgun", +/* simplemdl */ "foobar", +/* crosshair */ "gfx/crosshairhook 0.5", +/* wepimg */ "weaponhook", +/* refname */ "hook", +/* wepname */ _("Grappling Hook") ); -#else + +#define HOOK_SETTINGS(w_cvar,w_prop) HOOK_SETTINGS_LIST(w_cvar, w_prop, HOOK, hook) +#define HOOK_SETTINGS_LIST(w_cvar,w_prop,id,sn) \ + w_cvar(id, sn, BOTH, animtime) \ + w_cvar(id, sn, BOTH, refire) \ + w_cvar(id, sn, PRI, ammo) \ + w_cvar(id, sn, PRI, hooked_ammo) \ + w_cvar(id, sn, PRI, hooked_time_free) \ + w_cvar(id, sn, PRI, hooked_time_max) \ + w_cvar(id, sn, SEC, damage) \ + w_cvar(id, sn, SEC, duration) \ + w_cvar(id, sn, SEC, edgedamage) \ + w_cvar(id, sn, SEC, force) \ + w_cvar(id, sn, SEC, gravity) \ + w_cvar(id, sn, SEC, lifetime) \ + w_cvar(id, sn, SEC, power) \ + w_cvar(id, sn, SEC, radius) \ + w_cvar(id, sn, SEC, speed) \ + w_cvar(id, sn, SEC, health) \ + w_cvar(id, sn, SEC, damageforcescale) \ + w_prop(id, sn, float, switchdelay_raise, switchdelay_raise) \ + w_prop(id, sn, float, switchdelay_drop, switchdelay_drop) \ + w_prop(id, sn, string, weaponreplace, weaponreplace) \ + w_prop(id, sn, float, weaponstart, weaponstart) \ + w_prop(id, sn, float, weaponstartoverride, weaponstartoverride) + #ifdef SVQC -void spawnfunc_weapon_hook() -{ - if(g_grappling_hook) // offhand hook - { - startitem_failed = TRUE; - remove(self); - return; - } - weapon_defaultspawnfunc(WEP_HOOK); -} +HOOK_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP) .float dmg; .float dmg_edge; @@ -33,6 +53,20 @@ void spawnfunc_weapon_hook() .float hook_refire; .float hook_time_hooked; .float hook_time_fueldecrease; +#endif +#else +#ifdef SVQC + +void spawnfunc_weapon_hook() +{ + if(g_grappling_hook) // offhand hook + { + startitem_failed = TRUE; + remove(self); + return; + } + weapon_defaultspawnfunc(WEP_HOOK); +} void W_Hook_ExplodeThink (void) { @@ -62,12 +96,12 @@ void W_Hook_Explode2 (void) self.think = W_Hook_ExplodeThink; self.nextthink = time; - self.dmg = autocvar_g_balance_hook_secondary_damage; - self.dmg_edge = autocvar_g_balance_hook_secondary_edgedamage; - self.dmg_radius = autocvar_g_balance_hook_secondary_radius; - self.dmg_force = autocvar_g_balance_hook_secondary_force; - self.dmg_power = autocvar_g_balance_hook_secondary_power; - self.dmg_duration = autocvar_g_balance_hook_secondary_duration; + self.dmg = WEP_CVAR_SEC(hook, damage); + self.dmg_edge = WEP_CVAR_SEC(hook, edgedamage); + self.dmg_radius = WEP_CVAR_SEC(hook, radius); + self.dmg_force = WEP_CVAR_SEC(hook, force); + self.dmg_power = WEP_CVAR_SEC(hook, power); + self.dmg_duration = WEP_CVAR_SEC(hook, duration); self.teleport_time = time; self.dmg_last = 1; self.movetype = MOVETYPE_NONE; @@ -97,38 +131,38 @@ void W_Hook_Attack2() { entity gren; - W_DecreaseAmmo(ammo_cells, autocvar_g_balance_hook_secondary_ammo, FALSE); - W_SetupShot (self, FALSE, 4, "weapons/hookbomb_fire.wav", CH_WEAPON_A, autocvar_g_balance_hook_secondary_damage); + //W_DecreaseAmmo(WEP_CVAR_SEC(hook, ammo)); // WEAPONTODO: Figure out how to handle ammo with hook secondary (gravitybomb) + W_SetupShot (self, FALSE, 4, "weapons/hookbomb_fire.wav", CH_WEAPON_A, WEP_CVAR_SEC(hook, damage)); gren = spawn (); gren.owner = gren.realowner = self; gren.classname = "hookbomb"; gren.bot_dodge = TRUE; - gren.bot_dodgerating = autocvar_g_balance_hook_secondary_damage; + gren.bot_dodgerating = WEP_CVAR_SEC(hook, damage); gren.movetype = MOVETYPE_TOSS; PROJECTILE_MAKETRIGGER(gren); gren.projectiledeathtype = WEP_HOOK | HITTYPE_SECONDARY; setorigin(gren, w_shotorg); setsize(gren, '0 0 0', '0 0 0'); - gren.nextthink = time + autocvar_g_balance_hook_secondary_lifetime; + gren.nextthink = time + WEP_CVAR_SEC(hook, lifetime); gren.think = adaptor_think2use_hittype_splash; gren.use = W_Hook_Explode2; gren.touch = W_Hook_Touch2; gren.takedamage = DAMAGE_YES; - gren.health = autocvar_g_balance_hook_secondary_health; - gren.damageforcescale = autocvar_g_balance_hook_secondary_damageforcescale; + gren.health = WEP_CVAR_SEC(hook, health); + gren.damageforcescale = WEP_CVAR_SEC(hook, damageforcescale); gren.event_damage = W_Hook_Damage; gren.damagedbycontents = TRUE; gren.missile_flags = MIF_SPLASH | MIF_ARC; - gren.velocity = '0 0 1' * autocvar_g_balance_hook_secondary_speed; + gren.velocity = '0 0 1' * WEP_CVAR_SEC(hook, speed); if(autocvar_g_projectiles_newton_style) gren.velocity = gren.velocity + self.velocity; - gren.gravity = autocvar_g_balance_hook_secondary_gravity; - //W_SetupProjectileVelocity(gren); // just falling down! + gren.gravity = WEP_CVAR_SEC(hook, gravity); + //W_SetupProjVelocity_Basic(gren); // just falling down! gren.angles = '0 0 0'; gren.flags = FL_PROJECTILE; @@ -138,7 +172,7 @@ void W_Hook_Attack2() other = gren; MUTATOR_CALLHOOK(EditProjectile); } -float w_hook(float req) +float W_Hook(float req) { float hooked_time_max, hooked_fuel; @@ -154,55 +188,55 @@ float w_hook(float req) if (self.BUTTON_ATCK || (!(self.items & IT_JETPACK) && self.BUTTON_HOOK)) { if(!self.hook) - if not(self.hook_state & HOOK_WAITING_FOR_RELEASE) - if not(self.hook_state & HOOK_FIRING) + if(!(self.hook_state & HOOK_WAITING_FOR_RELEASE)) + if(!(self.hook_state & HOOK_FIRING)) if (time > self.hook_refire) if (weapon_prepareattack(0, -1)) { - W_DecreaseAmmo(ammo_fuel, autocvar_g_balance_hook_primary_fuel, FALSE); + W_DecreaseAmmo(WEP_CVAR_PRI(hook, ammo)); self.hook_state |= HOOK_FIRING; - weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_hook_primary_animtime, w_ready); + weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(hook, animtime), w_ready); } } if (self.BUTTON_ATCK2) { - if (weapon_prepareattack(1, autocvar_g_balance_hook_secondary_refire)) + if (weapon_prepareattack(1, WEP_CVAR_SEC(hook, refire))) { W_Hook_Attack2(); - weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_hook_secondary_animtime, w_ready); + weapon_thinkf(WFRAME_FIRE2, WEP_CVAR_SEC(hook, animtime), w_ready); } } if(self.hook) { // if hooked, no bombs, and increase the timer - self.hook_refire = max(self.hook_refire, time + autocvar_g_balance_hook_primary_refire * W_WeaponRateFactor()); + self.hook_refire = max(self.hook_refire, time + WEP_CVAR_PRI(hook, refire) * W_WeaponRateFactor()); // hook also inhibits health regeneration, but only for 1 second - if not(self.items & IT_UNLIMITED_WEAPON_AMMO) + if(!(self.items & IT_UNLIMITED_WEAPON_AMMO)) self.pauseregen_finished = max(self.pauseregen_finished, time + autocvar_g_balance_pause_fuel_regen); } if(self.hook && self.hook.state == 1) { - hooked_time_max = autocvar_g_balance_hook_primary_hooked_time_max; + hooked_time_max = WEP_CVAR_PRI(hook, hooked_time_max); if (hooked_time_max > 0) { if ( time > self.hook_time_hooked + hooked_time_max ) self.hook_state |= HOOK_REMOVING; } - hooked_fuel = autocvar_g_balance_hook_primary_hooked_fuel; + hooked_fuel = WEP_CVAR_PRI(hook, hooked_ammo); if (hooked_fuel > 0) { if ( time > self.hook_time_fueldecrease ) { - if not(self.items & IT_UNLIMITED_WEAPON_AMMO) + if(!(self.items & IT_UNLIMITED_WEAPON_AMMO)) { if ( self.ammo_fuel >= (time - self.hook_time_fueldecrease) * hooked_fuel ) { - W_DecreaseAmmo(ammo_fuel, (time - self.hook_time_fueldecrease) * hooked_fuel, FALSE); + W_DecreaseAmmo((time - self.hook_time_fueldecrease) * hooked_fuel); self.hook_time_fueldecrease = time; // decrease next frame again } @@ -219,21 +253,21 @@ float w_hook(float req) else { self.hook_time_hooked = time; - self.hook_time_fueldecrease = time + autocvar_g_balance_hook_primary_hooked_time_free; + self.hook_time_fueldecrease = time + WEP_CVAR_PRI(hook, hooked_time_free); } if (self.BUTTON_CROUCH) { - self.hook_state &~= HOOK_PULLING; + self.hook_state &= ~HOOK_PULLING; if (self.BUTTON_ATCK || (!(self.items & IT_JETPACK) && self.BUTTON_HOOK)) - self.hook_state &~= HOOK_RELEASING; + self.hook_state &= ~HOOK_RELEASING; else self.hook_state |= HOOK_RELEASING; } else { self.hook_state |= HOOK_PULLING; - self.hook_state &~= HOOK_RELEASING; + self.hook_state &= ~HOOK_RELEASING; if (self.BUTTON_ATCK || (!(self.items & IT_JETPACK) && self.BUTTON_HOOK)) { @@ -244,13 +278,13 @@ float w_hook(float req) else { self.hook_state |= HOOK_REMOVING; - self.hook_state &~= HOOK_WAITING_FOR_RELEASE; + self.hook_state &= ~HOOK_WAITING_FOR_RELEASE; } } return TRUE; } - case WR_PRECACHE: + case WR_INIT: { precache_model ("models/weapons/g_hookgun.md3"); precache_model ("models/weapons/v_hookgun.md3"); @@ -258,13 +292,12 @@ float w_hook(float req) precache_sound ("weapons/hook_impact.wav"); // done by g_hook.qc precache_sound ("weapons/hook_fire.wav"); precache_sound ("weapons/hookbomb_fire.wav"); + HOOK_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP) return TRUE; } case WR_SETUP: { - weapon_setup(WEP_HOOK); - self.current_ammo = ammo_fuel; - self.hook_state &~= HOOK_WAITING_FOR_RELEASE; + self.hook_state &= ~HOOK_WAITING_FOR_RELEASE; return TRUE; } case WR_CHECKAMMO1: @@ -272,11 +305,17 @@ float w_hook(float req) if(self.hook) return self.ammo_fuel > 0; else - return self.ammo_fuel >= autocvar_g_balance_hook_primary_fuel; + return self.ammo_fuel >= WEP_CVAR_PRI(hook, ammo); } case WR_CHECKAMMO2: { - return self.ammo_cells >= autocvar_g_balance_hook_secondary_ammo; + // infinite ammo for now + return TRUE; // self.ammo_cells >= WEP_CVAR_SEC(hook, ammo); // WEAPONTODO: see above + } + case WR_CONFIG: + { + HOOK_SETTINGS(WEP_CONFIG_WRITE_CVARS, WEP_CONFIG_WRITE_PROPS) + return TRUE; } case WR_RESETPLAYER: { @@ -296,7 +335,7 @@ float w_hook(float req) } #endif #ifdef CSQC -float w_hook(float req) +float W_Hook(float req) { switch(req) { @@ -310,11 +349,16 @@ float w_hook(float req) return TRUE; } - case WR_PRECACHE: + case WR_INIT: { precache_sound("weapons/hookbomb_impact.wav"); return TRUE; } + case WR_ZOOMRETICLE: + { + // no weapon specific image for this weapon + return FALSE; + } } return TRUE; }