X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fweapons%2Fweaponsystem.qc;h=cbfba4c9f3ef4ae7b2b75d29b4bb559a53c7ab44;hb=0394852103d5d410a54f14daa6fc698d0cdbd74f;hp=f3f1150efcd6b17e54f94a0ee6a2a96f9adbebcb;hpb=562296609ea1d6664e07246bb78d219e167ec89c;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/weapons/weaponsystem.qc b/qcsrc/server/weapons/weaponsystem.qc index f3f1150ef..cbfba4c9f 100644 --- a/qcsrc/server/weapons/weaponsystem.qc +++ b/qcsrc/server/weapons/weaponsystem.qc @@ -3,14 +3,16 @@ #include "selection.qh" #include "../command/common.qh" +#include +#include #include #include "../round_handler.qh" #include #include -#include #include #include #include +#include #include #include #include @@ -55,7 +57,7 @@ bool CL_Weaponentity_CustomizeEntityForClient(entity this, entity client) vector CL_Weapon_GetShotOrg(int wpn) { - entity wi = Weapons_from(wpn); + entity wi = REGISTRY_GET(Weapons, wpn); entity e = spawn(); CL_WeaponEntity_SetModel(e, wi.mdl, false); vector ret = e.movedir; @@ -163,6 +165,7 @@ void CL_ExteriorWeaponentity_Think(entity this) Weapon wep = this.owner.(weaponentity).m_weapon; if (wep) this.glowmod = weaponentity_glowmod(wep, this.owner, this.owner.clientcolors, this.owner.(weaponentity)); this.colormap = this.owner.colormap; + this.skin = w_ent.skin; CSQCMODEL_AUTOUPDATE(this); } @@ -223,7 +226,7 @@ void w_ready(Weapon thiswep, entity actor, .entity weaponentity, int fire) .float prevwarntime; bool weapon_prepareattack_checkammo(Weapon thiswep, entity actor, bool secondary, .entity weaponentity) { - if ((actor.items & IT_UNLIMITED_WEAPON_AMMO)) return true; + if ((actor.items & IT_UNLIMITED_AMMO)) return true; bool ammo = false; if (secondary) ammo = thiswep.wr_checkammo2(thiswep, actor, weaponentity); else ammo = thiswep.wr_checkammo1(thiswep, actor, weaponentity); @@ -365,6 +368,9 @@ void weapon_thinkf(entity actor, .entity weaponentity, WFRAME fr, float t, void( bool restartanim; if (fr == WFRAME_DONTCHANGE) { + // this can happen when the weapon entity is newly spawned, since it has a clear state and no previous weapon frame + if (this.wframe == WFRAME_DONTCHANGE) + this.wframe = WFRAME_IDLE; fr = this.wframe; restartanim = false; } @@ -373,22 +379,7 @@ void weapon_thinkf(entity actor, .entity weaponentity, WFRAME fr, float t, void( restartanim = fr != WFRAME_IDLE; } - vector of = v_forward; - vector or = v_right; - vector ou = v_up; - - vector a = '0 0 0'; this.wframe = fr; - if (fr == WFRAME_IDLE) a = this.anim_idle; - else if (fr == WFRAME_FIRE1) a = this.anim_fire1; - else if (fr == WFRAME_FIRE2) a = this.anim_fire2; - else // if (fr == WFRAME_RELOAD) - a = this.anim_reload; - a.z *= g_weaponratefactor; - - v_forward = of; - v_right = or; - v_up = ou; if (this.weapon_think == w_ready && func != w_ready && this.state == WS_RAISE) backtrace( "Tried to override initial weapon think function - should this really happen?"); @@ -415,7 +406,7 @@ void weapon_thinkf(entity actor, .entity weaponentity, WFRAME fr, float t, void( { FOREACH_CLIENT(true, { if(it == actor || (IS_SPEC(it) && it.enemy == actor)) - wframe_send(it, this, a, restartanim); + wframe_send(it, this, fr, g_weaponratefactor, restartanim); }); } @@ -452,6 +443,28 @@ bool weaponLocked(entity player) return false; } +void W_ResetGunAlign(entity player, int preferred_alignment) +{ + if(W_DualWielding(player)) + preferred_alignment = 3; // right align, the second gun will default to left + + // clear current weapon slots' alignments so we can redo the calculations! + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + if (player.(weaponentity)) + player.(weaponentity).m_gunalign = 0; + } + + // now set the new values + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + if (player.(weaponentity)) + player.(weaponentity).m_gunalign = W_GunAlign(player.(weaponentity), preferred_alignment); + } +} + .bool hook_switchweapon; void W_WeaponFrame(Player actor, .entity weaponentity) @@ -507,10 +520,8 @@ void W_WeaponFrame(Player actor, .entity weaponentity) return; } - makevectors(actor.v_angle); - vector fo = v_forward; // save them in case the weapon think functions change it - vector ri = v_right; - vector up = v_up; + vector fo, ri, up; + MAKE_VECTORS(actor.v_angle, fo, ri, up); // Change weapon if (this.m_weapon != this.m_switchweapon) @@ -687,7 +698,7 @@ void W_AttachToShotorg(entity actor, .entity weaponentity, entity flash, vector void W_DecreaseAmmo(Weapon wep, entity actor, float ammo_use, .entity weaponentity) { if (MUTATOR_CALLHOOK(W_DecreaseAmmo, actor, actor.(weaponentity), ammo_use)) return; - if ((actor.items & IT_UNLIMITED_WEAPON_AMMO) && !wep.reloading_ammo) return; + if ((actor.items & IT_UNLIMITED_AMMO) && !wep.reloading_ammo) return; ammo_use = M_ARGV(2, float); @@ -734,7 +745,7 @@ void W_ReloadedAndReady(Weapon thiswep, entity actor, .entity weaponentity, int w_ent.clip_load = w_ent.old_clip_load; // restore the ammo counter, in case we still had ammo in the weapon before reloading // if the gun uses no ammo, max out weapon load, else decrease ammo as we increase weapon load - if (!w_ent.reload_ammo_min || (actor.items & IT_UNLIMITED_WEAPON_AMMO) || wpn.ammo_type == RES_NONE) + if (!w_ent.reload_ammo_min || (actor.items & IT_UNLIMITED_AMMO) || wpn.ammo_type == RES_NONE) { w_ent.clip_load = w_ent.reload_ammo_amount; } @@ -790,8 +801,10 @@ void W_Reload(entity actor, .entity weaponentity, float sent_ammo_min, Sound sen { if (!GetResource(actor, e.ammo_type) && this.reload_ammo_min) { - if (!(actor.items & IT_UNLIMITED_WEAPON_AMMO)) + if (!(actor.items & IT_UNLIMITED_AMMO)) { + if (autocvar_g_weaponswitch_debug == 2 && weaponslot(weaponentity) > 0) + return; // in this case the primary weapon will do the switching when it runs out of ammo (TODO: do this same check but for other slots) if (IS_REAL_CLIENT(actor) && actor.reload_complain < time) { play2(actor, SND(UNAVAILABLE)); @@ -835,7 +848,7 @@ void W_Reload(entity actor, .entity weaponentity, float sent_ammo_min, Sound sen void W_DropEvent(.void(Weapon, entity actor, .entity) event, entity player, float weapon_type, entity weapon_item, .entity weaponentity) { - Weapon w = Weapons_from(weapon_type); + Weapon w = REGISTRY_GET(Weapons, weapon_type); weapon_dropevent_item = weapon_item; w.event(w, player, weaponentity); }