#include <common/util.qh>
REGISTRY(Weapons, 72) // Increase as needed. Can be up to 72.
-#define Weapons_from(i) _Weapons_from(i, WEP_Null)
REGISTER_REGISTRY(Weapons)
STATIC_INIT(WeaponPickup) { FOREACH(Weapons, true, it.m_pickup = NEW(WeaponPickup, it)); }
#define WepSet_FromWeapon(it) ((it).m_wepset)
WepSet _WepSet_FromWeapon(int i);
-GENERIC_COMMAND(dumpweapons, "Dump all weapons into weapons_dump.txt") // WEAPONTODO: make this work with other progs than just server
+GENERIC_COMMAND(dumpweapons, "Dump all weapons into weapons_dump.txt", false) // WEAPONTODO: make this work with other progs than just server
{
switch(request)
{
default:
case CMD_REQUEST_USAGE:
{
- LOG_INFO("Usage:^3 ", GetProgramCommandPrefix(), " dumpweapons [filename]");
- LOG_INFO(" Where 'filename' is the file to write (default is weapons_dump.cfg),");
- LOG_INFO(" if supplied with '-' output to console as well as default,");
- LOG_INFO(" if left blank, it will only write to default.");
+ LOG_HELP("Usage:^3 ", GetProgramCommandPrefix(), " dumpweapons [filename]");
+ LOG_HELP(" Where 'filename' is the file to write (default is weapons_dump.cfg),");
+ LOG_HELP(" if supplied with '-' output to console as well as default,");
+ LOG_HELP(" if left blank, it will only write to default.");
return;
}
}
[[alias("WEP_" #id)]] Weapon _wep_##sname
REGISTER_WEAPON(Null, NEW(Weapon));
+REGISTRY_DEFINE_GET(Weapons, WEP_Null)
-Weapon Weapons_fromstr(string s)
+Weapon Weapon_from_name(string s)
{
FOREACH(Weapons, it != WEP_Null && it.netname == s, return it);
- return NULL;
+ return WEP_Null;
}
+#ifdef GAMEQC
+
// legacy w_prop mappings
#define X(fld, T) .T fld; .T wepvar_##fld = fld;
X(switchdelay_drop, float)
X(weaponthrowable, float)
#ifdef SVQC
X(reload_ammo, float)
-.float reloading_ammo = reload_ammo;
+const .float reloading_ammo = reload_ammo;
X(reload_time, float)
-.float reloading_time = reload_time;
+const .float reloading_time = reload_time;
#endif
#undef X
+#endif
+
#define W_PROPS(L, class, prefix) \
#define W_PROP_BOTH(class, fld, T, wepname) \
W_PROP_PRI(class, fld, T, wepname) \
W_PROP_SEC(class, fld, T, wepname)
- #define W_PROP_BEGIN(class)
- #define _W_PROP(class, fld, T, wepname) \
- /* static */ T _W_PROP_CVAR(wepname, fld); \
- ATTRIB(class, wepvar_##fld, T, _W_PROP_CVAR(wepname, fld));
- #define _W_PROP_CVAR(wepname, fld) autocvar_g_balance_##wepname##_##fld
- #define W_PROP_END()
+ #define W_PROP_BEGIN(class)
+ #ifdef GAMEQC
+ #define _W_PROP(class, fld, T, wepname) \
+ /* static */ T _W_PROP_CVAR(wepname, fld); \
+ ATTRIB(class, wepvar_##fld, T, _W_PROP_CVAR(wepname, fld));
+ #define _W_PROP_CVAR(wepname, fld) autocvar_g_balance_##wepname##_##fld
+ #else
+ #define _W_PROP(class, fld, T, wepname)
+ #define _W_PROP_CVAR(wepname, fld)
+ #endif
+ #define W_PROP_END()
#define W_CONFIG_BOTH(class, fld, T, wepname) \
W_CONFIG_PRI(class, fld, T, wepname) \
W_CONFIG_SEC(class, fld, T, wepname)
- #define W_CONFIG_BEGIN(class) METHOD(class, wr_config, void(class this)) {
- #ifdef SVQC
- #define _W_CONFIG(class, fld, T, wepname) if (#wepname == this.netname) WEP_CONFIG_WRITE_CVARS(wepname, fld, T);
- #else
- #define _W_CONFIG(class, fld, T, wepname)
- #endif
- #define W_CONFIG_END() }
+ #ifdef SVQC
+ #define W_CONFIG_BEGIN(class) METHOD(class, wr_config, void(class this)) {
+ #define _W_CONFIG(class, fld, T, wepname) if (#wepname == this.netname) WEP_CONFIG_WRITE_CVARS(wepname, fld, T);
+ #define W_CONFIG_END() }
+ #else
+ #define W_CONFIG_BEGIN(class)
+ #define _W_CONFIG(class, fld, T, wepname)
+ #define W_CONFIG_END()
+ #endif
#define W_UPDATE(class, wepname, fld, T, m) W_UPDATE_##m(class, fld, T, wepname)
#define W_UPDATE_BOTH(class, fld, T, wepname) \
W_UPDATE_PRI(class, fld, T, wepname) \
W_UPDATE_SEC(class, fld, T, wepname)
- .entity baseline, baseline_target;
- #define W_UPDATE_BEGIN(class) \
- METHOD(class, wr_update, void(class this)) \
- { \
- noref entity b = this.baseline; \
- if (!b) \
- { \
- b = this.baseline = new_pure(baseline); \
- b.baseline_target = this; \
- }
- #ifdef SVQC
- #define _W_UPDATE(class, fld, T, wepname) \
- { \
- T it = _W_PROP_CVAR(wepname, fld); \
- b.wepvar_##fld = this.wepvar_##fld; \
- this.wepvar_##fld = it; \
- }
- #else
- #define _W_UPDATE(class, fld, T, wepname)
- #endif
- #define W_UPDATE_END() }
+ #ifdef GAMEQC
+ .entity baseline, baseline_target;
+ #define W_UPDATE_BEGIN(class) \
+ METHOD(class, wr_update, void(class this)) \
+ { \
+ noref entity b = this.baseline; \
+ if (!b) \
+ { \
+ b = this.baseline = new_pure(baseline); \
+ b.baseline_target = this; \
+ }
+ #ifdef SVQC
+ #define _W_UPDATE(class, fld, T, wepname) \
+ { \
+ T it = _W_PROP_CVAR(wepname, fld); \
+ b.wepvar_##fld = this.wepvar_##fld; \
+ this.wepvar_##fld = it; \
+ }
+ #else
+ #define _W_UPDATE(class, fld, T, wepname)
+ #endif
+ #define W_UPDATE_END() }
+ #else
+ #define W_UPDATE_BEGIN(class)
+ #define _W_UPDATE(class, fld, T, wepname)
+ #define W_UPDATE_END()
+ #endif
#define W_NET(class, wepname, fld, T, m) W_NET_##m(class, fld, T, wepname)
#define W_NET_BOTH(class, fld, T, wepname) \
W_NET_PRI(class, fld, T, wepname) \
W_NET_SEC(class, fld, T, wepname)
- REGISTER_NET_TEMP(WeaponUpdate)
#if defined(CSQC)
+ REGISTER_NET_TEMP(WeaponUpdate)
#define W_NET_BEGIN(class) METHOD(class, wr_net, void(class this, int i)) { int n = 0;
#define _W_NET(class, fld, T, wepname) \
{ \
.void(Weapon this, int i) wr_net;
NET_HANDLE(WeaponUpdate, bool isnew)
{
- Weapon w = Weapons_from(ReadByte());
+ Weapon w = REGISTRY_GET(Weapons, ReadByte());
for (int i; (i = ReadByte()); )
{
w.wr_net(w, i);
}
#define W_NET_END() }
#elif defined(SVQC)
+ REGISTER_NET_TEMP(WeaponUpdate)
#define W_NET_BEGIN(class) \
METHOD(class, wr_net, void(class this, int chan)) \
{ \
bool commit = false; \
int i = 0;
- #define _W_NET(class, fld, T, wepname) \
+ #define _W_NET(class, fld, T, wepname) \
{ \
++i; \
T it = this.wepvar_##fld; \
WriteByte(chan, i); Write_##T(chan, it); \
} \
}
- #define W_NET_END() \
- if (commit) WriteByte(chan, 0); \
- }
+ #define W_NET_END() if (commit) WriteByte(chan, 0); }
#else
#define W_NET_BEGIN(class)
#define _W_NET(class, fld, T, wepname)
#define WEP_CVAR_BOTH(wepname, isprimary, name) ((isprimary) ? WEP_CVAR_PRI(wepname, name) : WEP_CVAR_SEC(wepname, name))
const int WEP_FIRST = 1;
-#define WEP_LAST (Weapons_COUNT - 1)
+#define WEP_LAST (REGISTRY_COUNT(Weapons) - 1)
WepSet WEPSET_ALL;
WepSet WEPSET_SUPERWEAPONS;
// TODO: invert after 0.8.2. Will require moving 'best weapon' impulses
#define WEP_IMPULSE_BEGIN 230
-#define WEP_IMPULSE_END bound(WEP_IMPULSE_BEGIN, WEP_IMPULSE_BEGIN + (Weapons_COUNT - 1) - 1, 253)
+#define WEP_IMPULSE_END bound(WEP_IMPULSE_BEGIN, WEP_IMPULSE_BEGIN + (REGISTRY_COUNT(Weapons) - 1) - 1, 253)
REGISTRY_SORT(Weapons, WEP_HARDCODED_IMPULSES + 1)
REGISTRY_CHECK(Weapons)
FOREACH(Weapons, true, {
WepSet set = it.m_wepset = _WepSet_FromWeapon(it.m_id = i);
WEPSET_ALL |= set;
- if ((it.spawnflags) & WEP_FLAG_SUPERWEAPON) WEPSET_SUPERWEAPONS |= set;
+ if (it.spawnflags & WEP_FLAG_SUPERWEAPON) WEPSET_SUPERWEAPONS |= set;
if (it == WEP_Null) continue;
int imp = WEP_IMPULSE_BEGIN + it.m_id - 1;
if (imp <= WEP_IMPULSE_END)
FOREACH(Weapons, true, it.wr_init(it));
#endif
weaponorder_byid = "";
- for (int i = Weapons_MAX - 1; i >= 1; --i)
- if (Weapons_from(i))
+ for (int i = REGISTRY_MAX(Weapons) - 1; i >= 1; --i)
+ if (REGISTRY_GET(Weapons, i))
weaponorder_byid = strcat(weaponorder_byid, " ", ftos(i));
weaponorder_byid = strzone(substring(weaponorder_byid, 1, -1));
}
vector shotorg_adjust_values(vector vecs, bool y_is_right, bool visual, int algn);
void CL_WeaponEntity_SetModel(entity this, string name, bool _anim);
+#ifdef CSQC
+bool cvar_cl_accuracy_data_share;
+REPLICATE(cvar_cl_accuracy_data_share, bool, "cl_accuracy_data_share");
+bool cvar_cl_accuracy_data_receive;
+REPLICATE(cvar_cl_accuracy_data_receive, bool, "cl_accuracy_data_receive");
+#endif
+
+#ifdef SVQC
+void wframe_send(entity actor, entity weaponentity, int wepframe, float attackrate, bool restartanim);
+#endif
+
#ifdef SVQC
-void wframe_send(entity actor, entity weaponentity, vector a, bool restartanim);
+void W_MuzzleFlash(entity actor, .entity weaponentity, entity eff, vector shotorg, vector shotdir);
#endif
#endif