X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fweapons%2Fweaponsystem.qc;h=ba33c515ffea422da230ed8648cb308279ab1bf2;hb=9a3b01ba5da2726001a5ed74645a15ce764a3675;hp=dbe97dbe38560fb6064346175d50cbeb2ad320b5;hpb=153e558088db2813f7f7dd5367244b5470f4d425;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/weapons/weaponsystem.qc b/qcsrc/server/weapons/weaponsystem.qc index dbe97dbe3..ba33c515f 100644 --- a/qcsrc/server/weapons/weaponsystem.qc +++ b/qcsrc/server/weapons/weaponsystem.qc @@ -28,21 +28,29 @@ float W_WeaponRateFactor() { - float t; - t = 1.0 / g_weaponratefactor; + float t = 1.0 / g_weaponratefactor; - weapon_rate = t; - MUTATOR_CALLHOOK(WeaponRateFactor); + MUTATOR_CALLHOOK(WeaponRateFactor, t); t = weapon_rate; return t; } +float W_WeaponSpeedFactor() +{ + float t = 1.0 * g_weaponspeedfactor; + + MUTATOR_CALLHOOK(WeaponSpeedFactor, t); + t = ret_float; + + return t; +} + void(float fr, float t, void() func) weapon_thinkf; float CL_Weaponentity_CustomizeEntityForClient() -{ +{SELFPARAM(); self.viewmodelforclient = self.owner; if(IS_SPEC(other)) if(other.enemy == self.owner) @@ -102,19 +110,19 @@ float CL_Weaponentity_CustomizeEntityForClient() // call again with "" // remove the ent void CL_WeaponEntity_SetModel(string name) -{ +{SELFPARAM(); float v_shot_idx; if (name != "") { // if there is a child entity, hide it until we're sure we use it if (self.weaponentity) self.weaponentity.model = ""; - setmodel(self, strcat("models/weapons/v_", name, ".md3")); // precision set below + _setmodel(self, W_Model(strcat("v_", name, ".md3"))); v_shot_idx = gettagindex(self, "shot"); // used later if(!v_shot_idx) v_shot_idx = gettagindex(self, "tag_shot"); - setmodel(self, strcat("models/weapons/h_", name, ".iqm")); // precision set below + _setmodel(self, W_Model(strcat("h_", name, ".iqm"))); // preset some defaults that work great for renamed zym files (which don't need an animinfo) self.anim_fire1 = animfixfps(self, '0 1 0.01', '0 0 0'); self.anim_fire2 = animfixfps(self, '1 1 0.01', '0 0 0'); @@ -127,14 +135,14 @@ void CL_WeaponEntity_SetModel(string name) { if (!self.weaponentity) self.weaponentity = spawn(); - setmodel(self.weaponentity, strcat("models/weapons/v_", name, ".md3")); // precision does not matter + _setmodel(self.weaponentity, W_Model(strcat("v_", name, ".md3"))); setattachment(self.weaponentity, self, "weapon"); } else if(gettagindex(self, "tag_weapon")) { if (!self.weaponentity) self.weaponentity = spawn(); - setmodel(self.weaponentity, strcat("models/weapons/v_", name, ".md3")); // precision does not matter + _setmodel(self.weaponentity, W_Model(strcat("v_", name, ".md3"))); setattachment(self.weaponentity, self, "tag_weapon"); } else @@ -164,7 +172,7 @@ void CL_WeaponEntity_SetModel(string name) self.movedir = gettaginfo(self, idx); else { - print("WARNING: weapon model ", self.model, " does not support the 'shot' tag, will display shots TOTALLY wrong\n"); + LOG_INFO("WARNING: weapon model ", self.model, " does not support the 'shot' tag, will display shots TOTALLY wrong\n"); self.movedir = '0 0 0'; } } @@ -188,7 +196,7 @@ void CL_WeaponEntity_SetModel(string name) self.spawnorigin = gettaginfo(self, idx); else { - print("WARNING: weapon model ", self.model, " does not support the 'shell' tag, will display casings wrong\n"); + LOG_INFO("WARNING: weapon model ", self.model, " does not support the 'shell' tag, will display casings wrong\n"); self.spawnorigin = self.movedir; } } @@ -217,7 +225,7 @@ void CL_WeaponEntity_SetModel(string name) } else { - print("WARNING: weapon model ", self.model, " does not support the 'handle' tag and neither does the v_ model support the 'shot' tag, will display muzzle flashes TOTALLY wrong\n"); + LOG_INFO("WARNING: weapon model ", self.model, " does not support the 'handle' tag and neither does the v_ model support the 'shot' tag, will display muzzle flashes TOTALLY wrong\n"); self.oldorigin = '0 0 0'; // there is no way to recover from this } } @@ -261,22 +269,19 @@ void CL_WeaponEntity_SetModel(string name) } vector CL_Weapon_GetShotOrg(float wpn) -{ - entity wi, oldself; - vector ret; - wi = get_weaponinfo(wpn); - oldself = self; - self = spawn(); +{SELFPARAM(); + entity wi = get_weaponinfo(wpn); + setself(spawn()); CL_WeaponEntity_SetModel(wi.mdl); - ret = self.movedir; + vector ret = self.movedir; CL_WeaponEntity_SetModel(""); remove(self); - self = oldself; + setself(this); return ret; } void CL_Weaponentity_Think() -{ +{SELFPARAM(); int tb; self.nextthink = time; if (intermission_running) @@ -352,7 +357,7 @@ void CL_Weaponentity_Think() } void CL_ExteriorWeaponentity_Think() -{ +{SELFPARAM(); float tag_found; self.nextthink = time; if (self.owner.exteriorweaponentity != self) @@ -371,7 +376,7 @@ void CL_ExteriorWeaponentity_Think() self.dmg = self.owner.modelindex; self.deadflag = self.owner.deadflag; if (self.owner.weaponname != "") - setmodel(self, strcat("models/weapons/v_", self.owner.weaponname, ".md3")); // precision set below + _setmodel(self, W_Model(strcat("v_", self.owner.weaponname, ".md3"))); else self.model = ""; @@ -396,46 +401,41 @@ void CL_ExteriorWeaponentity_Think() self.glowmod = self.owner.weaponentity_glowmod; self.colormap = self.owner.colormap; - CSQCMODEL_AUTOUPDATE(); + CSQCMODEL_AUTOUPDATE(self); } // spawning weaponentity for client -void CL_SpawnWeaponentity() +void CL_SpawnWeaponentity(entity e) { - self.weaponentity = spawn(); - self.weaponentity.classname = "weaponentity"; - self.weaponentity.solid = SOLID_NOT; - self.weaponentity.owner = self; - setmodel(self.weaponentity, ""); // precision set when changed - setorigin(self.weaponentity, '0 0 0'); - self.weaponentity.angles = '0 0 0'; - self.weaponentity.viewmodelforclient = self; - self.weaponentity.flags = 0; - self.weaponentity.think = CL_Weaponentity_Think; - self.weaponentity.customizeentityforclient = CL_Weaponentity_CustomizeEntityForClient; - self.weaponentity.nextthink = time; - - self.exteriorweaponentity = spawn(); - self.exteriorweaponentity.classname = "exteriorweaponentity"; - self.exteriorweaponentity.solid = SOLID_NOT; - self.exteriorweaponentity.exteriorweaponentity = self.exteriorweaponentity; - self.exteriorweaponentity.owner = self; - setorigin(self.exteriorweaponentity, '0 0 0'); - self.exteriorweaponentity.angles = '0 0 0'; - self.exteriorweaponentity.think = CL_ExteriorWeaponentity_Think; - self.exteriorweaponentity.nextthink = time; - - { - entity oldself = self; - self = self.exteriorweaponentity; - CSQCMODEL_AUTOINIT(); - self = oldself; - } + entity view = e.weaponentity = spawn(); + view.classname = "weaponentity"; + view.solid = SOLID_NOT; + view.owner = e; + setmodel(view, MDL_Null); // precision set when changed + setorigin(view, '0 0 0'); + view.angles = '0 0 0'; + view.viewmodelforclient = e; + view.flags = 0; + view.think = CL_Weaponentity_Think; + view.customizeentityforclient = CL_Weaponentity_CustomizeEntityForClient; + view.nextthink = time; + + entity exterior = e.exteriorweaponentity = spawn(); + exterior.classname = "exteriorweaponentity"; + exterior.solid = SOLID_NOT; + exterior.exteriorweaponentity = exterior; + exterior.owner = e; + setorigin(exterior, '0 0 0'); + exterior.angles = '0 0 0'; + exterior.think = CL_ExteriorWeaponentity_Think; + exterior.nextthink = time; + + CSQCMODEL_AUTOINIT(exterior); } // Weapon subs void w_clear() -{ +{SELFPARAM(); if (self.weapon != -1) { self.weapon = 0; @@ -449,7 +449,7 @@ void w_clear() } void w_ready() -{ +{SELFPARAM(); if (self.weaponentity) self.weaponentity.state = WS_READY; weapon_thinkf(WFRAME_IDLE, 1000000, w_ready); @@ -458,23 +458,23 @@ void w_ready() .float prevdryfire; .float prevwarntime; float weapon_prepareattack_checkammo(float secondary) -{ +{SELFPARAM(); if (!(self.items & IT_UNLIMITED_WEAPON_AMMO)) if (!WEP_ACTION(self.weapon, WR_CHECKAMMO1 + secondary)) { // always keep the Mine Layer if we placed mines, so that we can detonate them entity mine; - if(self.weapon == WEP_MINE_LAYER) + if(self.weapon == WEP_MINE_LAYER.m_id) for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self) return false; - if(self.weapon == WEP_SHOTGUN) + if(self.weapon == WEP_SHOTGUN.m_id) if(!secondary && WEP_CVAR(shotgun, secondary) == 1) return false; // no clicking, just allow if(self.weapon == self.switchweapon && time - self.prevdryfire > 1) // only play once BEFORE starting to switch weapons { - sound (self, CH_WEAPON_A, "weapons/dryfire.wav", VOL_BASE, ATTEN_NORM); + sound (self, CH_WEAPON_A, SND_DRYFIRE, VOL_BASE, ATTEN_NORM); self.prevdryfire = time; } @@ -505,7 +505,7 @@ float weapon_prepareattack_checkammo(float secondary) } .float race_penalty; float weapon_prepareattack_check(float secondary, float attacktime) -{ +{SELFPARAM(); if(!weapon_prepareattack_checkammo(secondary)) return false; @@ -535,7 +535,7 @@ float weapon_prepareattack_check(float secondary, float attacktime) return true; } float weapon_prepareattack_do(float secondary, float attacktime) -{ +{SELFPARAM(); self.weaponentity.state = WS_INUSE; self.spawnshieldtime = min(self.spawnshieldtime, time); // kill spawn shield when you fire @@ -566,7 +566,7 @@ float weapon_prepareattack(float secondary, float attacktime) } void weapon_thinkf(float fr, float t, void() func) -{ +{SELFPARAM(); vector a; vector of, or, ou; float restartanim; @@ -629,7 +629,7 @@ void weapon_thinkf(float fr, float t, void() func) if((fr == WFRAME_FIRE1 || fr == WFRAME_FIRE2) && t) { - if((self.weapon == WEP_SHOCKWAVE || self.weapon == WEP_SHOTGUN) && fr == WFRAME_FIRE2) + if((self.weapon == WEP_SHOCKWAVE.m_id || self.weapon == WEP_SHOTGUN.m_id) && fr == WFRAME_FIRE2) animdecide_setaction(self, ANIMACTION_MELEE, restartanim); else animdecide_setaction(self, ANIMACTION_SHOOT, restartanim); @@ -657,7 +657,7 @@ float forbidWeaponUse(entity player) } void W_WeaponFrame() -{ +{SELFPARAM(); vector fo, ri, up; if (frametime) @@ -732,7 +732,7 @@ void W_WeaponFrame() if(ATTACK_FINISHED(self) <= time + self.weapon_frametime * 0.5) { #endif - sound(self, CH_WEAPON_SINGLE, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM); + sound(self, CH_WEAPON_SINGLE, SND_WEAPON_SWITCH, VOL_BASE, ATTN_NORM); self.weaponentity.state = WS_DROP; weapon_thinkf(WFRAME_DONTCHANGE, oldwep.switchdelay_drop, w_clear); #ifndef INDEPENDENT_ATTACK_FINISHED @@ -788,7 +788,7 @@ void W_WeaponFrame() } void W_AttachToShotorg(entity flash, vector offset) -{ +{SELFPARAM(); entity xflash; flash.owner = self; flash.angles_z = random() * 360; @@ -820,7 +820,7 @@ void W_AttachToShotorg(entity flash, vector offset) } void W_DecreaseAmmo(float ammo_use) -{ +{SELFPARAM(); entity wep = get_weaponinfo(self.weapon); if(cvar("g_overkill")) @@ -864,7 +864,7 @@ void W_DecreaseAmmo(float ammo_use) .string reload_sound; void W_ReloadedAndReady() -{ +{SELFPARAM(); // finish the reloading process, and do the ammo transfer self.clip_load = self.old_clip_load; // restore the ammo counter, in case we still had ammo in the weapon before reloading @@ -891,7 +891,7 @@ void W_ReloadedAndReady() } void W_Reload(float sent_ammo_min, string sent_sound) -{ +{SELFPARAM(); // set global values to work with entity e; e = get_weaponinfo(self.weapon); @@ -908,7 +908,7 @@ void W_Reload(float sent_ammo_min, string sent_sound) // don't reload weapons that don't have the RELOADABLE flag if (!(e.spawnflags & WEP_FLAG_RELOADABLE)) { - dprint("Warning: Attempted to reload a weapon that does not have the WEP_FLAG_RELOADABLE flag. Fix your code!\n"); + LOG_TRACE("Warning: Attempted to reload a weapon that does not have the WEP_FLAG_RELOADABLE flag. Fix your code!\n"); return; } @@ -927,7 +927,7 @@ void W_Reload(float sent_ammo_min, string sent_sound) { if(IS_REAL_CLIENT(self) && self.reload_complain < time) { - play2(self, "weapons/unavailable.wav"); + play2(self, SND(UNAVAILABLE)); sprint(self, strcat("You don't have enough ammo to reload the ^2", WEP_NAME(self.weapon), "\n")); self.reload_complain = time + 1; } @@ -951,7 +951,7 @@ void W_Reload(float sent_ammo_min, string sent_sound) // now begin the reloading process - sound(self, CH_WEAPON_SINGLE, self.reload_sound, VOL_BASE, ATTEN_NORM); + _sound(self, CH_WEAPON_SINGLE, self.reload_sound, VOL_BASE, ATTEN_NORM); // do not set ATTACK_FINISHED in reload code any more. This causes annoying delays if eg: You start reloading a weapon, // then quickly switch to another weapon and back. Reloading is canceled, but the reload delay is still there, @@ -968,10 +968,9 @@ void W_Reload(float sent_ammo_min, string sent_sound) } void W_DropEvent(float event, entity player, float weapon_type, entity weapon_item) -{ - entity oldself = self; - self = player; +{SELFPARAM(); + setself(player); weapon_dropevent_item = weapon_item; WEP_ACTION(weapon_type, event); - self = oldself; + setself(this); }