X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fweapons%2Fweaponsystem.qc;h=d3b11cf184e7a66fcdc2a97668d7db1fd7437d68;hp=762f9a0e3dc12b619b531128366b6d9f0c36506f;hb=ae2c1407ec9a05e4f501a6604a7cce8e1030df9f;hpb=819247f875aa17ebcd2669676ee53195786a5457 diff --git a/qcsrc/server/weapons/weaponsystem.qc b/qcsrc/server/weapons/weaponsystem.qc index 762f9a0e3d..d3b11cf184 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" + /* =========================================================================== @@ -11,23 +28,24 @@ 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; } -// 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 = 1.0 * g_weaponspeedfactor; + + MUTATOR_CALLHOOK(WeaponSpeedFactor, t); + t = ret_float; + + return t; +} + void(float fr, float t, void() func) weapon_thinkf; @@ -37,7 +55,7 @@ float CL_Weaponentity_CustomizeEntityForClient() if(IS_SPEC(other)) if(other.enemy == self.owner) self.viewmodelforclient = other; - return TRUE; + return true; } /* @@ -231,12 +249,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 +265,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 +285,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) @@ -454,13 +472,13 @@ float weapon_prepareattack_checkammo(float 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; + 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 + return false; // no clicking, just allow if(self.weapon == self.switchweapon && time - self.prevdryfire > 1) // only play once BEFORE starting to switch weapons { @@ -489,40 +507,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) { @@ -542,17 +560,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) @@ -564,12 +582,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; @@ -587,8 +605,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; @@ -619,7 +637,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); @@ -631,17 +649,17 @@ void weapon_thinkf(float fr, float t, void() func) } } -float forbidWeaponUse() +float forbidWeaponUse(entity player) { if(time < game_starttime && !autocvar_sv_ready_restart_after_countdown) return 1; if(round_handler_IsActive() && !round_handler_IsRoundStarted()) return 1; - if(self.player_blocked) + if(player.player_blocked) return 1; - if(self.frozen) + if(player.frozen) return 1; - if(self.weapon_blocked) + if(player.weapon_blocked) return 1; return 0; } @@ -656,7 +674,7 @@ void W_WeaponFrame() if (!self.weaponentity || self.health < 1) return; // Dead player can't use weapons and injure impulse commands - if(forbidWeaponUse()) + if(forbidWeaponUse(self)) if(self.weaponentity.state != WS_CLEAR) { w_ready(); @@ -691,7 +709,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; @@ -794,7 +812,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); @@ -864,11 +882,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; @@ -892,7 +909,7 @@ void W_Reload(float sent_ammo_min, string sent_sound) 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; @@ -958,7 +975,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;