#endif
#ifdef SVQC
-#include <server/items.qh>
+#include <server/items/spawning.qh>
#endif
+#ifdef GAMEQC
const int IT_UNLIMITED_AMMO = BIT(0); // when this bit is set, using a weapon does not reduce ammo. Checkpoints can give this powerup.
const int IT_UNLIMITED_SUPERWEAPONS = BIT(1); // when this bit is set, superweapons don't expire. Checkpoints can give this powerup.
const int IT_KEY1 = BIT(6);
const int IT_KEY2 = BIT(7);
-const int IT_CTF_SHIELDED = BIT(8); // set for the flag shield
+const int IT_BUFF = BIT(8); // unused bit for buff items
// special colorblend meaning in engine
-const int IT_INVISIBILITY = BIT(9);
-const int IT_INVINCIBLE = BIT(10);
+// legacy bitflags for powerups
+const int IT_INVISIBILITY = BIT(9);
+const int IT_INVINCIBLE = BIT(10);
const int IT_SUPERWEAPON = BIT(11); // suit
-const int IT_STRENGTH = BIT(12);
+const int IT_STRENGTH = BIT(12);
+const int IT_SPEED = BIT(13);
// item masks
const int IT_PICKUPMASK = IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS | IT_JETPACK | IT_FUEL_REGEN; // strength and invincible are handled separately
+// item networking
+const int ISF_REMOVEFX = BIT(0); // technically unnecessary (after the kludge in Item_Think() is reverted), but cheaper and cleaner than using ITS_AVAILABLE
+const int ISF_LOCATION = BIT(1);
+const int ISF_MODEL = BIT(2);
+const int ISF_STATUS = BIT(3);
+const int ISF_COLORMAP = BIT(4);
+const int ISF_DROP = BIT(5);
+const int ISF_ANGLES = BIT(6);
+const int ISF_SIZE = BIT(7);
+
+REGISTER_NET_LINKED(ENT_CLIENT_ITEM)
+
+// item status
+.int ItemStatus;
+const int ITS_STAYWEP = BIT(0);
+const int ITS_ANIMATE1 = BIT(1);
+const int ITS_ANIMATE2 = BIT(2);
+const int ITS_AVAILABLE = BIT(3);
+const int ITS_ALLOWFB = BIT(4);
+const int ITS_ALLOWSI = BIT(5);
+const int ITS_GLOW = BIT(6);
+const int ITS_EXPIRING = BIT(7);
+
+// enough to notice it's about to despawn and circle jump to grab it
+const float IT_DESPAWNFX_TIME = 1.5;
+
+// 2hz probably enough to correct a desync caused by serious lag
+// FIXME but updating faster applies the kludge in Item_Think() sooner so it's less noticeable
+const float IT_UPDATE_INTERVAL = 0.0625;
+
+.float fade_start;
+.float fade_end;
+
+.string mdl;
+#endif
+
#ifdef SVQC
.float strength_finished; // NOTE: this field is used only by map entities, it does not directly apply the strength stat
.float invincible_finished; // ditto
+.float buffs_finished; // ditts
-#define spawnfunc_body(item) \
- if (!Item_IsDefinitionAllowed(item)) \
+#define SPAWNFUNC_BODY(item) \
+ if (item && Item_IsDefinitionAllowed(item)) \
+ StartItem(this, item); \
+ else \
{ \
startitem_failed = true; \
delete(this); \
- return; \
- } \
- StartItem(this, item)
+ }
#define SPAWNFUNC_ITEM(name, item) \
spawnfunc(name) \
{ \
- spawnfunc_body(item); \
+ SPAWNFUNC_BODY(item) \
}
#define SPAWNFUNC_ITEM_COND(name, cond, item1, item2) \
- spawnfunc(name) \
- { \
- entity item = (cond) ? item1 : item2; \
- spawnfunc_body(item); \
- }
+ SPAWNFUNC_ITEM(name, (cond ? item1 : item2))
#else