X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fweapons%2Fweaponsystem.qc;h=4f072c4c085bb7e829c6355da495a14c0ad33888;hb=9c09a961b8674e3a808889d3f34d71855018d3bc;hp=580be7c9eb6550163ba3f3f6dc2d42744d5e8ea9;hpb=8f8c153ded2fc16282faf86ec673b3d44120801c;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/weapons/weaponsystem.qc b/qcsrc/server/weapons/weaponsystem.qc index 580be7c9e..4f072c4c0 100644 --- a/qcsrc/server/weapons/weaponsystem.qc +++ b/qcsrc/server/weapons/weaponsystem.qc @@ -1,3 +1,20 @@ +#include "weaponsystem.qh" +#include "../_all.qh" + +#include "selection.qh" + +#include "../command/common.qh" +#include "../mutators/mutators_include.qh" +#include "../round_handler.qh" +#include "../t_items.qh" +#include "../../common/animdecide.qh" +#include "../../common/constants.qh" +#include "../../common/monsters/all.qh" +#include "../../common/notifications.qh" +#include "../../common/util.qh" +#include "../../common/weapons/all.qh" +#include "../../csqcmodellib/sv_model.qh" + /* =========================================================================== @@ -21,13 +38,18 @@ float W_WeaponRateFactor() return t; } -// VorteX: static frame globals -const float WFRAME_DONTCHANGE = -1; -const float WFRAME_FIRE1 = 0; -const float WFRAME_FIRE2 = 1; -const float WFRAME_IDLE = 2; -const float WFRAME_RELOAD = 3; -.float wframe; +float W_WeaponSpeedFactor() +{ + float t; + t = 1.0 * g_weaponspeedfactor; + + ret_float = t; + MUTATOR_CALLHOOK(WeaponSpeedFactor); + t = ret_float; + + return t; +} + void(float fr, float t, void() func) weapon_thinkf; @@ -37,7 +59,7 @@ float CL_Weaponentity_CustomizeEntityForClient() if(IS_SPEC(other)) if(other.enemy == self.owner) self.viewmodelforclient = other; - return TRUE; + return true; } /* @@ -231,12 +253,12 @@ void CL_WeaponEntity_SetModel(string name) self.view_ofs = '0 0 0'; - if(self.movedir_x >= 0) + if(self.movedir.x >= 0) { vector v0; v0 = self.movedir; - self.movedir = shotorg_adjust(v0, FALSE, FALSE); - self.view_ofs = shotorg_adjust(v0, FALSE, TRUE) - v0; + self.movedir = shotorg_adjust(v0, false, false); + self.view_ofs = shotorg_adjust(v0, false, true) - v0; } self.owner.stat_shotorg = compressShotOrigin(self.movedir); self.movedir = decompressShotOrigin(self.owner.stat_shotorg); // make them match perfectly @@ -247,7 +269,7 @@ void CL_WeaponEntity_SetModel(string name) setorigin(self, self.view_ofs); // reset animstate now self.wframe = WFRAME_IDLE; - setanim(self, self.anim_idle, TRUE, FALSE, TRUE); + setanim(self, self.anim_idle, true, false, true); } vector CL_Weapon_GetShotOrg(float wpn) @@ -267,10 +289,10 @@ vector CL_Weapon_GetShotOrg(float wpn) void CL_Weaponentity_Think() { - float tb; + int tb; self.nextthink = time; if (intermission_running) - self.frame = self.anim_idle_x; + self.frame = self.anim_idle.x; if (self.owner.weaponentity != self) { if (self.weaponentity) @@ -456,7 +478,11 @@ float weapon_prepareattack_checkammo(float secondary) entity mine; if(self.weapon == WEP_MINE_LAYER) for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self) - return FALSE; + return false; + + if(self.weapon == WEP_SHOTGUN) + 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 { @@ -485,40 +511,40 @@ float weapon_prepareattack_checkammo(float secondary) W_SwitchToOtherWeapon(self); } - return FALSE; + return false; } - return TRUE; + return true; } .float race_penalty; float weapon_prepareattack_check(float secondary, float attacktime) { if(!weapon_prepareattack_checkammo(secondary)) - return FALSE; + return false; //if sv_ready_restart_after_countdown is set, don't allow the player to shoot //if all players readied up and the countdown is running if(time < game_starttime || time < self.race_penalty) { - return FALSE; + return false; } if (timeout_status == TIMEOUT_ACTIVE) //don't allow the player to shoot while game is paused - return FALSE; + return false; // do not even think about shooting if switching if(self.switchweapon != self.weapon) - return FALSE; + return false; if(attacktime >= 0) { // don't fire if previous attack is not finished if (ATTACK_FINISHED(self) > time + self.weapon_frametime * 0.5) - return FALSE; + return false; // don't fire while changing weapon if (self.weaponentity.state != WS_READY) - return FALSE; + return false; } - return TRUE; + return true; } float weapon_prepareattack_do(float secondary, float attacktime) { @@ -538,17 +564,17 @@ float weapon_prepareattack_do(float secondary, float attacktime) } self.bulletcounter += 1; //dprint("attack finished ", ftos(ATTACK_FINISHED(self)), "\n"); - return TRUE; + return true; } float weapon_prepareattack(float secondary, float attacktime) { if(weapon_prepareattack_check(secondary, attacktime)) { weapon_prepareattack_do(secondary, attacktime); - return TRUE; + return true; } else - return FALSE; + return false; } void weapon_thinkf(float fr, float t, void() func) @@ -560,12 +586,12 @@ void weapon_thinkf(float fr, float t, void() func) if(fr == WFRAME_DONTCHANGE) { fr = self.weaponentity.wframe; - restartanim = FALSE; + restartanim = false; } else if (fr == WFRAME_IDLE) - restartanim = FALSE; + restartanim = false; else - restartanim = TRUE; + restartanim = true; of = v_forward; or = v_right; @@ -583,8 +609,8 @@ void weapon_thinkf(float fr, float t, void() func) a = self.weaponentity.anim_fire2; else // if (fr == WFRAME_RELOAD) a = self.weaponentity.anim_reload; - a_z *= g_weaponratefactor; - setanim(self.weaponentity, a, restartanim == FALSE, restartanim, restartanim); + a.z *= g_weaponratefactor; + setanim(self.weaponentity, a, restartanim == false, restartanim, restartanim); } v_forward = of; @@ -637,6 +663,8 @@ float forbidWeaponUse() return 1; if(self.frozen) return 1; + if(self.weapon_blocked) + return 1; return 0; } @@ -685,7 +713,7 @@ void W_WeaponFrame() self.weapon = self.switchweapon; self.weaponname = newwep.mdl; self.bulletcounter = 0; - //self.ammo_field = newwep.ammo_field; + self.ammo_field = newwep.ammo_field; WEP_ACTION(self.switchweapon, WR_SETUP); self.weaponentity.state = WS_RAISE; @@ -788,7 +816,7 @@ void W_AttachToShotorg(entity flash, vector offset) flash.viewmodelforclient = self; - if(self.weaponentity.oldorigin_x > 0) + if(self.weaponentity.oldorigin.x > 0) { setattachment(xflash, self.exteriorweaponentity, ""); setorigin(xflash, self.weaponentity.oldorigin + offset); @@ -807,6 +835,13 @@ void W_DecreaseAmmo(float ammo_use) { entity wep = get_weaponinfo(self.weapon); + if(cvar("g_overkill")) + if(self.ok_use_ammocharge) + { + ok_DecreaseCharge(self, self.weapon); + return; // TODO + } + if((self.items & IT_UNLIMITED_WEAPON_AMMO) && !wep.reloading_ammo) return; @@ -851,11 +886,10 @@ void W_ReloadedAndReady() self.clip_load = self.reload_ammo_amount; else { - while(self.clip_load < self.reload_ammo_amount && self.(self.ammo_field)) // make sure we don't add more ammo than we have - { - self.clip_load += 1; - self.(self.ammo_field) -= 1; - } + // make sure we don't add more ammo than we have + float load = min(self.reload_ammo_amount - self.clip_load, self.(self.ammo_field)); + self.clip_load += load; + self.(self.ammo_field) -= load; } self.(weapon_load[self.weapon]) = self.clip_load; @@ -874,8 +908,12 @@ void W_Reload(float sent_ammo_min, string sent_sound) entity e; e = get_weaponinfo(self.weapon); + if(cvar("g_overkill")) + if(self.ok_use_ammocharge) + return; // TODO + self.reload_ammo_min = sent_ammo_min; - self.reload_ammo_amount = e.reloading_ammo;; + self.reload_ammo_amount = e.reloading_ammo; self.reload_time = e.reloading_time; self.reload_sound = sent_sound; @@ -941,7 +979,6 @@ void W_Reload(float sent_ammo_min, string sent_sound) self.clip_load = self.(weapon_load[self.weapon]) = -1; } -entity weapon_dropevent_item; void W_DropEvent(float event, entity player, float weapon_type, entity weapon_item) { entity oldself = self;