X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fall.qc;h=897e2caef2f5975e3627458dd0d6894d7da9a3d8;hb=b9671f63469586007314131f3f53728795c035cd;hp=177d12c2d36d54e221be9ef5aec6145c09e2f5ea;hpb=43eba8ca70f00458db385630f86009f6d7fa849a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/weapons/all.qc b/qcsrc/common/weapons/all.qc index 177d12c2d..897e2caef 100644 --- a/qcsrc/common/weapons/all.qc +++ b/qcsrc/common/weapons/all.qc @@ -4,58 +4,59 @@ #include "all.qh" #if defined(CSQC) - #include "../../client/defs.qh" + #include #include "../constants.qh" #include "../stats.qh" - #include "../../lib/warpzone/anglestransform.qh" - #include "../../lib/warpzone/common.qh" - #include "../../lib/warpzone/client.qh" + #include + #include + #include #include "../util.qh" - #include "../buffs/all.qh" - #include "../../client/autocvars.qh" + #include #include "../deathtypes/all.qh" - #include "../../lib/csqcmodel/interpolate.qh" - #include "../movetypes/movetypes.qh" - #include "../../client/main.qh" - #include "../../lib/csqcmodel/cl_model.qh" + #include + #include "../physics/movetypes/movetypes.qh" + #include + #include #elif defined(MENUQC) #elif defined(SVQC) - #include "../../lib/warpzone/anglestransform.qh" - #include "../../lib/warpzone/common.qh" - #include "../../lib/warpzone/util_server.qh" - #include "../../lib/warpzone/server.qh" - #include "../constants.qh" - #include "../stats.qh" - #include "../teams.qh" - #include "../util.qh" - #include "../buffs/all.qh" - #include "../monsters/all.qh" - #include "config.qh" - #include "../../server/weapons/csqcprojectile.qh" - #include "../../server/weapons/tracing.qh" - #include "../../server/t_items.qh" - #include "../../server/autocvars.qh" - #include "../../server/constants.qh" - #include "../../server/defs.qh" - #include "../notifications.qh" - #include "../deathtypes/all.qh" - #include "../../server/mutators/all.qh" - #include "../mapinfo.qh" - #include "../../server/command/common.qh" - #include "../../lib/csqcmodel/sv_model.qh" - #include "../../server/portals.qh" - #include "../../server/g_hook.qh" + #include + #include + #include + #include + #include "../constants.qh" + #include "../stats.qh" + #include "../teams.qh" + #include "../util.qh" + #include "../monsters/all.qh" + #include "config.qh" + #include + #include + #include "../t_items.qh" + #include + #include + #include + #include "../notifications/all.qh" + #include "../deathtypes/all.qh" + #include + #include "../mapinfo.qh" + #include + #include + #include + #include #endif #ifndef MENUQC #include "calculations.qc" #endif +#ifdef SVQC + #include "config.qc" +#endif #define IMPLEMENTATION #include "all.inc" #undef IMPLEMENTATION // WEAPON PLUGIN SYSTEM -WepSet WepSet_FromWeapon(int a) +WepSet _WepSet_FromWeapon(int a) { a -= WEP_FIRST; if (Weapons_MAX > 24) @@ -73,18 +74,6 @@ WepSet WepSet_FromWeapon(int a) return '1 0 0' * power2of(a); } #ifdef SVQC - void WepSet_AddStat() - { - addstat(STAT_WEAPONS, AS_INT, weapons_x); - if (Weapons_MAX > 24) addstat(STAT_WEAPONS2, AS_INT, weapons_y); - if (Weapons_MAX > 48) addstat(STAT_WEAPONS3, AS_INT, weapons_z); - } - void WepSet_AddStat_InMap() - { - addstat(STAT_WEAPONSINMAP, AS_INT, weaponsinmap_x); - if (Weapons_MAX > 24) addstat(STAT_WEAPONSINMAP2, AS_INT, weaponsinmap_y); - if (Weapons_MAX > 48) addstat(STAT_WEAPONSINMAP3, AS_INT, weaponsinmap_z); - } void WriteWepSet(float dst, WepSet w) { if (Weapons_MAX > 48) WriteInt72_t(dst, w); @@ -95,19 +84,11 @@ WepSet WepSet_FromWeapon(int a) #ifdef CSQC WepSet WepSet_GetFromStat() { - WepSet w = '0 0 0'; - w.x = getstati(STAT_WEAPONS); - if (Weapons_MAX > 24) w.y = getstati(STAT_WEAPONS2); - if (Weapons_MAX > 48) w.z = getstati(STAT_WEAPONS3); - return w; + return STAT(WEAPONS); } WepSet WepSet_GetFromStat_InMap() { - WepSet w = '0 0 0'; - w_x = getstati(STAT_WEAPONSINMAP); - if (Weapons_MAX > 24) w_y = getstati(STAT_WEAPONSINMAP2); - if (Weapons_MAX > 48) w_z = getstati(STAT_WEAPONSINMAP3); - return w; + return STAT(WEAPONSINMAP); } WepSet ReadWepSet() { @@ -123,10 +104,10 @@ string W_FixWeaponOrder(string order, float complete) } string W_NameWeaponOrder_MapFunc(string s) { - entity wi; - if (s == "0" || stof(s)) + int i = stof(s); + if (s == "0" || i) { - wi = get_weaponinfo(stof(s)); + entity wi = Weapons_from(i); if (wi != WEP_Null) return wi.netname; } return s; @@ -151,11 +132,9 @@ string W_NameWeaponOrder(string order) } string W_NumberWeaponOrder_MapFunc(string s) { - int i; if (s == "0" || stof(s)) return s; s = W_UndeprecateName(s); - for (i = WEP_FIRST; i <= WEP_LAST; ++i) - if (s == get_weaponinfo(i).netname) return ftos(i); + FOREACH(Weapons, it != WEP_Null && it.netname == s, return ftos(i)); return s; } string W_NumberWeaponOrder(string order) @@ -174,17 +153,17 @@ void W_FixWeaponOrder_BuildImpulseList_swap(int i, int j, entity pass) } float W_FixWeaponOrder_BuildImpulseList_cmp(int i, int j, entity pass) { - entity e1, e2; - float d; - e1 = get_weaponinfo(W_FixWeaponOrder_BuildImpulseList_buf[i]); - e2 = get_weaponinfo(W_FixWeaponOrder_BuildImpulseList_buf[j]); - d = (e1.impulse + 9) % 10 - (e2.impulse + 9) % 10; + int si = W_FixWeaponOrder_BuildImpulseList_buf[i]; + Weapon e1 = Weapons_from(si); + int sj = W_FixWeaponOrder_BuildImpulseList_buf[j]; + Weapon e2 = Weapons_from(sj); + int d = (e1.impulse + 9) % 10 - (e2.impulse + 9) % 10; if (d != 0) return -d; // high impulse first! return strstrofs(strcat(" ", W_FixWeaponOrder_BuildImpulseList_order, " "), - sprintf(" %d ", W_FixWeaponOrder_BuildImpulseList_buf[i]), 0) + sprintf(" %d ", si), 0) - strstrofs(strcat(" ", W_FixWeaponOrder_BuildImpulseList_order, " "), - sprintf(" %d ", W_FixWeaponOrder_BuildImpulseList_buf[j]), 0) + sprintf(" %d ", sj), 0) ; // low char index first! } string W_FixWeaponOrder_BuildImpulseList(string o) @@ -194,7 +173,7 @@ string W_FixWeaponOrder_BuildImpulseList(string o) for (i = WEP_FIRST; i <= WEP_LAST; ++i) W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST] = i; heapsort(WEP_LAST - WEP_FIRST + 1, W_FixWeaponOrder_BuildImpulseList_swap, W_FixWeaponOrder_BuildImpulseList_cmp, - world); + NULL); o = ""; for (i = WEP_FIRST; i <= WEP_LAST; ++i) o = strcat(o, " ", ftos(W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST])); @@ -202,7 +181,7 @@ string W_FixWeaponOrder_BuildImpulseList(string o) return substring(o, 1, -1); } -string W_FixWeaponOrder_AllowIncomplete(string order) +string W_FixWeaponOrder_AllowIncomplete(entity this, string order) { return W_FixWeaponOrder(order, 0); } @@ -215,7 +194,7 @@ string W_FixWeaponOrder_ForceComplete(string order) void W_RandomWeapons(entity e, float n) { - int i, j; + int i; WepSet remaining; WepSet result; remaining = e.weapons; @@ -223,10 +202,13 @@ void W_RandomWeapons(entity e, float n) for (i = 0; i < n; ++i) { RandomSelection_Init(); - for (j = WEP_FIRST; j <= WEP_LAST; ++j) - if (remaining & WepSet_FromWeapon(j)) RandomSelection_Add(world, j, string_null, 1, 1); - result |= WepSet_FromWeapon(RandomSelection_chosen_float); - remaining &= ~WepSet_FromWeapon(RandomSelection_chosen_float); + FOREACH(Weapons, it != WEP_Null, { + if (remaining & (it.m_wepset)) + RandomSelection_Add(it, 0, string_null, 1, 1); + }); + Weapon w = RandomSelection_chosen_ent; + result |= WepSet_FromWeapon(w); + remaining &= ~WepSet_FromWeapon(w); } e.weapons = result; } @@ -268,8 +250,8 @@ string GetAmmoPicture(.int ammotype) case ammo_nails: return STAT_NAILS; case ammo_rockets: return STAT_ROCKETS; case ammo_cells: return STAT_CELLS; - case ammo_plasma: return STAT_PLASMA; - case ammo_fuel: return STAT_FUEL; + case ammo_plasma: return STAT_PLASMA.m_id; + case ammo_fuel: return STAT_FUEL.m_id; default: return -1; } } @@ -280,7 +262,7 @@ string W_Sound(string w_snd) string output = strcat("weapons/", w_snd); #ifdef SVQC MUTATOR_CALLHOOK(WeaponSound, w_snd, output); - return weapon_sound_output; + return M_ARGV(1, string); #else return output; #endif @@ -289,12 +271,8 @@ string W_Sound(string w_snd) string W_Model(string w_mdl) { string output = strcat("models/weapons/", w_mdl); -#ifdef SVQC - MUTATOR_CALLHOOK(WeaponModel, w_mdl, output); - return weapon_model_output; -#else - return output; -#endif + MUTATOR_CALLHOOK(WeaponModel, w_mdl, output); + return M_ARGV(1, string); } #ifndef MENUQC @@ -409,7 +387,7 @@ vector shotorg_adjust_values(vector vecs, bool y_is_right, bool visual, int algn * call again with "" * remove the ent */ -void CL_WeaponEntity_SetModel(entity this, string name) +void CL_WeaponEntity_SetModel(entity this, string name, bool _anim) { if (name == "") { @@ -449,9 +427,11 @@ void CL_WeaponEntity_SetModel(entity this, string name) this.weaponchild = new(weaponchild); #ifdef CSQC this.weaponchild.drawmask = MASK_NORMAL; + this.weaponchild.renderflags |= RF_VIEWMODEL; #endif } _setmodel(this.weaponchild, W_Model(strcat("v_", name, ".md3"))); + setsize(this.weaponchild, '0 0 0', '0 0 0'); setattachment(this.weaponchild, this, t); } else @@ -460,6 +440,7 @@ void CL_WeaponEntity_SetModel(entity this, string name) this.weaponchild = NULL; } + setsize(this, '0 0 0', '0 0 0'); setorigin(this, '0 0 0'); this.angles = '0 0 0'; this.frame = 0; @@ -542,11 +523,7 @@ void CL_WeaponEntity_SetModel(entity this, string name) if (this.movedir.x >= 0) { -#ifdef SVQC - int algn = this.owner.cvar_cl_gunalign; -#else - int algn = autocvar_cl_gunalign; -#endif + int algn = STAT(GUNALIGN, this.owner); vector v = this.movedir; this.movedir = shotorg_adjust(v, false, false, algn); this.view_ofs = shotorg_adjust(v, false, true, algn) - v; @@ -563,6 +540,7 @@ void CL_WeaponEntity_SetModel(entity this, string name) // check if an instant weapon switch occurred setorigin(this, this.view_ofs); + if (!_anim) return; // reset animstate now this.wframe = WFRAME_IDLE; setanim(this, this.anim_idle, true, false, true); @@ -580,9 +558,22 @@ NET_HANDLE(wframe, bool isNew) a.y = ReadCoord(); a.z = ReadCoord(); bool restartanim = ReadByte(); - setanim(viewmodel, a, restartanim == false, restartanim, restartanim); + anim_set(viewmodel, a, !restartanim, restartanim, restartanim); viewmodel.state = ReadByte(); + viewmodel.weapon_nextthink = ReadFloat(); viewmodel.alpha = ReadByte() / 255; + switch (viewmodel.state) + { + case WS_RAISE: + viewmodel.weapon_switchdelay = activeweapon.switchdelay_raise; + break; + case WS_DROP: + viewmodel.weapon_switchdelay = activeweapon.switchdelay_drop; + break; + default: + viewmodel.weapon_switchdelay = 0; + break; + } return true; } #endif @@ -599,36 +590,65 @@ void wframe_send(entity actor, entity weaponentity, vector a, bool restartanim) WriteCoord(channel, a.z); WriteByte(channel, restartanim); WriteByte(channel, weaponentity.state); - WriteByte(channel, weaponentity.alpha * 255); + WriteFloat(channel, weaponentity.weapon_nextthink); + WriteByte(channel, weaponentity.m_alpha * 255); } #endif -REGISTER_NET_TEMP(wglow) -#ifdef CSQC -NET_HANDLE(wglow, bool isNew) +REGISTER_NET_C2S(w_whereis) +#ifdef SVQC +void Weapon_whereis(Weapon this, entity cl); +NET_HANDLE(w_whereis, bool) { - vector g = '0 0 0'; - g.x = ReadCoord(); - g.y = ReadCoord(); - g.z = ReadCoord(); - viewmodel.glowmod = g; + Weapon wpn = ReadRegistered(Weapons); + if (wpn != WEP_Null) Weapon_whereis(wpn, sender); return true; } -#endif - -#ifdef SVQC -void wglow_send(entity actor, vector g) +#else +void w_whereis(Weapon this) { - if (!IS_REAL_CLIENT(actor)) return; - int channel = MSG_ONE; - msg_entity = actor; - WriteHeader(channel, wglow); - WriteCoord(channel, g.x); - WriteCoord(channel, g.y); - WriteCoord(channel, g.z); + int channel = MSG_C2S; + WriteHeader(channel, w_whereis); + WriteRegistered(Weapons, channel, this); +} +CLIENT_COMMAND(weapon_find, "Show spawn locations of a weapon") +{ + switch (request) + { + case CMD_REQUEST_COMMAND: + { + string s = argv(1); + if (s == "all") + { + FOREACH(Weapons, it != WEP_Null, w_whereis(it)); + return; + } + if (s == "unowned") + { + FOREACH(Weapons, it != WEP_Null && !(STAT(WEAPONS) & it.m_wepset), w_whereis(it)); + return; + } + FOREACH(Weapons, it != WEP_Null && it.netname == s, + { + w_whereis(it); + return; + }); + } + default: + { + LOG_INFOF("Incorrect parameters for ^2%s^7\n", "weapon_find"); + } + case CMD_REQUEST_USAGE: + { + LOG_INFO("\nUsage:^3 cl_cmd weapon_find weapon\n"); + LOG_INFO(" Where 'weapon' is the lowercase weapon name, 'all' or 'unowned'.\n"); + return; + } + } } #endif + #endif #endif