X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fweapon%2Ffireball.qc;h=df1c3c669d1b6f296e8ef49e96ff309c74b374e7;hp=4f8f3787c3443335c0d91ca11aa72c5648d5b484;hb=047e80d3190ef626c6029a655677ff1a08e66e3a;hpb=5c99ce6fe3050cddf897e9988ff59dd0a7c1ba0a diff --git a/qcsrc/common/weapons/weapon/fireball.qc b/qcsrc/common/weapons/weapon/fireball.qc index 4f8f3787c..df1c3c669 100644 --- a/qcsrc/common/weapons/weapon/fireball.qc +++ b/qcsrc/common/weapons/weapon/fireball.qc @@ -1,19 +1,21 @@ #ifndef IMPLEMENTATION -REGISTER_WEAPON( -/* WEP_##id */ FIREBALL, -/* function */ W_Fireball, -/* ammotype */ ammo_none, -/* impulse */ 9, -/* flags */ WEP_FLAG_SUPERWEAPON | WEP_TYPE_SPLASH, -/* rating */ BOT_PICKUP_RATING_MID, -/* color */ '1 0.5 0', -/* modelname */ "fireball", -/* simplemdl */ "foobar", -/* crosshair */ "gfx/crosshairfireball", -/* wepimg */ "weaponfireball", -/* refname */ "fireball", -/* wepname */ _("Fireball") -); +CLASS(Fireball, Weapon) +/* ammotype */ //ATTRIB(Fireball, ammo_field, .int, ammo_none) +/* impulse */ ATTRIB(Fireball, impulse, int, 9) +/* flags */ ATTRIB(Fireball, spawnflags, int, WEP_FLAG_SUPERWEAPON | WEP_TYPE_SPLASH); +/* rating */ ATTRIB(Fireball, bot_pickupbasevalue, float, BOT_PICKUP_RATING_MID); +/* color */ ATTRIB(Fireball, wpcolor, vector, '1 0.5 0'); +/* modelname */ ATTRIB(Fireball, mdl, string, "fireball"); +#ifndef MENUQC +/* model */ ATTRIB(Fireball, m_model, Model, MDL_FIREBALL_ITEM); +#endif +/* crosshair */ ATTRIB(Fireball, w_crosshair, string, "gfx/crosshairfireball"); +/* crosshair */ //ATTRIB(Fireball, w_crosshair_size, float, 0.65); +/* wepimg */ ATTRIB(Fireball, model2, string, "weaponfireball"); +/* refname */ ATTRIB(Fireball, netname, string, "fireball"); +/* wepname */ ATTRIB(Fireball, message, string, _("Fireball")); +ENDCLASS(Fireball) +REGISTER_WEAPON(FIREBALL, NEW(Fireball)); #define FIREBALL_SETTINGS(w_cvar,w_prop) FIREBALL_SETTINGS_LIST(w_cvar, w_prop, FIREBALL, fireball) #define FIREBALL_SETTINGS_LIST(w_cvar,w_prop,id,sn) \ @@ -58,7 +60,7 @@ FIREBALL_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP) void spawnfunc_weapon_fireball(void) { weapon_defaultspawnfunc(WEP_FIREBALL.m_id); } void W_Fireball_Explode(void) -{ +{SELFPARAM(); entity e; float dist; float points; @@ -114,7 +116,7 @@ void W_Fireball_TouchExplode(void) } void W_Fireball_LaserPlay(float dt, float dist, float damage, float edgedamage, float burntime) -{ +{SELFPARAM(); entity e; float d; vector p; @@ -148,7 +150,7 @@ void W_Fireball_LaserPlay(float dt, float dist, float damage, float edgedamage, } void W_Fireball_Think(void) -{ +{SELFPARAM(); if(time > self.pushltime) { self.cnt = 1; @@ -163,7 +165,7 @@ void W_Fireball_Think(void) } void W_Fireball_Damage(entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) -{ +{SELFPARAM(); if(self.health <= 0) return; @@ -179,10 +181,10 @@ void W_Fireball_Damage(entity inflictor, entity attacker, float damage, int deat } void W_Fireball_Attack1(void) -{ +{SELFPARAM(); entity proj; - W_SetupShot_ProjectileSize(self, '-16 -16 -16', '16 16 16', false, 2, W_Sound("fireball_fire2"), CH_WEAPON_A, WEP_CVAR_PRI(fireball, damage) + WEP_CVAR_PRI(fireball, bfgdamage)); + W_SetupShot_ProjectileSize(self, '-16 -16 -16', '16 16 16', false, 2, SND(FIREBALL_FIRE2), CH_WEAPON_A, WEP_CVAR_PRI(fireball, damage) + WEP_CVAR_PRI(fireball, bfgdamage)); Send_Effect(EFFECT_FIREBALL_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1); @@ -218,45 +220,45 @@ void W_Fireball_Attack1(void) } void W_Fireball_AttackEffect(float i, vector f_diff) -{ +{SELFPARAM(); W_SetupShot_ProjectileSize(self, '-16 -16 -16', '16 16 16', false, 0, "", 0, 0); w_shotorg += f_diff.x * v_up + f_diff.y * v_right; Send_Effect(EFFECT_FIREBALL_PRE_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1); } -void W_Fireball_Attack1_Frame4(void) +void W_Fireball_Attack1_Frame4(Weapon thiswep, bool fire1, bool fire2) { W_Fireball_Attack1(); weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(fireball, animtime), w_ready); } -void W_Fireball_Attack1_Frame3(void) +void W_Fireball_Attack1_Frame3(Weapon thiswep, bool fire1, bool fire2) { W_Fireball_AttackEffect(0, '+1.25 +3.75 0'); weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(fireball, animtime), W_Fireball_Attack1_Frame4); } -void W_Fireball_Attack1_Frame2(void) +void W_Fireball_Attack1_Frame2(Weapon thiswep, bool fire1, bool fire2) { W_Fireball_AttackEffect(0, '-1.25 +3.75 0'); weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(fireball, animtime), W_Fireball_Attack1_Frame3); } -void W_Fireball_Attack1_Frame1(void) +void W_Fireball_Attack1_Frame1(Weapon thiswep, bool fire1, bool fire2) { W_Fireball_AttackEffect(1, '+1.25 -3.75 0'); weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(fireball, animtime), W_Fireball_Attack1_Frame2); } -void W_Fireball_Attack1_Frame0(void) -{ +void W_Fireball_Attack1_Frame0(Weapon thiswep, bool fire1, bool fire2) +{SELFPARAM(); W_Fireball_AttackEffect(0, '-1.25 -3.75 0'); - sound(self, CH_WEAPON_SINGLE, W_Sound("fireball_prefire2"), VOL_BASE, ATTEN_NORM); + sound(self, CH_WEAPON_SINGLE, SND_FIREBALL_PREFIRE2, VOL_BASE, ATTEN_NORM); weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(fireball, animtime), W_Fireball_Attack1_Frame1); } void W_Fireball_Firemine_Think(void) -{ +{SELFPARAM(); if(time > self.pushltime) { remove(self); @@ -282,7 +284,7 @@ void W_Fireball_Firemine_Think(void) } void W_Fireball_Firemine_Touch(void) -{ +{SELFPARAM(); PROJECTILE_TOUCH; if(other.takedamage == DAMAGE_AIM) if(Fire_AddDamage(other, self.realowner, WEP_CVAR_SEC(fireball, damage), WEP_CVAR_SEC(fireball, damagetime), self.projectiledeathtype) >= 0) @@ -294,7 +296,7 @@ void W_Fireball_Firemine_Touch(void) } void W_Fireball_Attack2(void) -{ +{SELFPARAM(); entity proj; vector f_diff; float c; @@ -316,7 +318,7 @@ void W_Fireball_Attack2(void) f_diff = '+1.25 +3.75 0'; break; } - W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', false, 2, W_Sound("fireball_fire"), CH_WEAPON_A, WEP_CVAR_SEC(fireball, damage)); + W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', false, 2, SND(FIREBALL_FIRE), CH_WEAPON_A, WEP_CVAR_SEC(fireball, damage)); traceline(w_shotorg, w_shotorg + f_diff_x * v_up + f_diff_y * v_right, MOVE_NORMAL, self); w_shotorg = trace_endpos; @@ -348,11 +350,7 @@ void W_Fireball_Attack2(void) MUTATOR_CALLHOOK(EditProjectile, self, proj); } -bool W_Fireball(int req) -{ - switch(req) - { - case WR_AIM: + METHOD(Fireball, wr_aim, bool(entity thiswep)) { self.BUTTON_ATCK = false; self.BUTTON_ATCK2 = false; @@ -375,18 +373,18 @@ bool W_Fireball(int req) return true; } - case WR_THINK: + METHOD(Fireball, wr_think, bool(entity thiswep, bool fire1, bool fire2)) { - if(self.BUTTON_ATCK) + if(fire1) { if(time >= self.fireball_primarytime) if(weapon_prepareattack(0, WEP_CVAR_PRI(fireball, refire))) { - W_Fireball_Attack1_Frame0(); + W_Fireball_Attack1_Frame0(thiswep, fire1, fire2); self.fireball_primarytime = time + WEP_CVAR_PRI(fireball, refire2) * W_WeaponRateFactor(); } } - else if(self.BUTTON_ATCK2) + else if(fire2) { if(weapon_prepareattack(1, WEP_CVAR_SEC(fireball, refire))) { @@ -397,62 +395,53 @@ bool W_Fireball(int req) return true; } - case WR_INIT: + METHOD(Fireball, wr_init, bool(entity thiswep)) { - precache_model(W_Model("g_fireball.md3")); - precache_model(W_Model("v_fireball.md3")); - precache_model(W_Model("h_fireball.iqm")); - precache_model("models/sphere/sphere.md3"); - precache_sound(W_Sound("fireball_fire")); - precache_sound(W_Sound("fireball_fire2")); - precache_sound(W_Sound("fireball_prefire2")); FIREBALL_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP); return true; } - case WR_SETUP: + METHOD(Fireball, wr_setup, bool(entity thiswep)) { self.ammo_field = ammo_none; return true; } - case WR_CHECKAMMO1: - case WR_CHECKAMMO2: + METHOD(Fireball, wr_checkammo1, bool(entity thiswep)) + { + return true; // infinite ammo + } + METHOD(Fireball, wr_checkammo2, bool(entity thiswep)) { return true; // fireball has infinite ammo } - case WR_CONFIG: + METHOD(Fireball, wr_config, bool(entity thiswep)) { FIREBALL_SETTINGS(WEP_CONFIG_WRITE_CVARS, WEP_CONFIG_WRITE_PROPS); return true; } - case WR_RESETPLAYER: + METHOD(Fireball, wr_resetplayer, bool(entity thiswep)) { self.fireball_primarytime = time; return true; } - case WR_SUICIDEMESSAGE: + METHOD(Fireball, wr_suicidemessage, bool(entity thiswep)) { if(w_deathtype & HITTYPE_SECONDARY) return WEAPON_FIREBALL_SUICIDE_FIREMINE; else return WEAPON_FIREBALL_SUICIDE_BLAST; } - case WR_KILLMESSAGE: + METHOD(Fireball, wr_killmessage, bool(entity thiswep)) { if(w_deathtype & HITTYPE_SECONDARY) return WEAPON_FIREBALL_MURDER_FIREMINE; else return WEAPON_FIREBALL_MURDER_BLAST; } - } - return false; -} + #endif #ifdef CSQC -bool W_Fireball(int req) -{ - switch(req) - { - case WR_IMPACTEFFECT: + + METHOD(Fireball, wr_impacteffect, bool(entity thiswep)) { vector org2; if(w_deathtype & HITTYPE_SECONDARY) @@ -464,23 +453,20 @@ bool W_Fireball(int req) org2 = w_org + w_backoff * 16; pointparticles(particleeffectnum(EFFECT_FIREBALL_EXPLODE), org2, '0 0 0', 1); if(!w_issilent) - sound(self, CH_SHOTS, W_Sound("fireball_impact2"), VOL_BASE, ATTEN_NORM * 0.25); // long range boom + sound(self, CH_SHOTS, SND_FIREBALL_IMPACT2, VOL_BASE, ATTEN_NORM * 0.25); // long range boom } return true; } - case WR_INIT: + METHOD(Fireball, wr_init, bool(entity thiswep)) { - precache_sound(W_Sound("fireball_impact2")); return true; } - case WR_ZOOMRETICLE: + METHOD(Fireball, wr_zoomreticle, bool(entity thiswep)) { // no weapon specific image for this weapon return false; } - } - return false; -} + #endif #endif