X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fweapons%2Fweaponsystem.qc;h=cbfba4c9f3ef4ae7b2b75d29b4bb559a53c7ab44;hb=0394852103d5d410a54f14daa6fc698d0cdbd74f;hp=d593658a3d2a5bac7b265ebe06331dfa16f508a4;hpb=6c319c2baf6bcac5d7f57d097b7773d1f6f23294;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/weapons/weaponsystem.qc b/qcsrc/server/weapons/weaponsystem.qc index d593658a3..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; @@ -366,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; } @@ -374,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?"); @@ -416,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); }); } @@ -453,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) @@ -508,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) @@ -793,6 +803,8 @@ void W_Reload(entity actor, .entity weaponentity, float sent_ammo_min, Sound sen { 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)); @@ -836,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); }