From: bones_was_here Date: Sun, 2 Aug 2020 06:02:52 +0000 (+1000) Subject: Merge branch 'master' into bones_was_here/q3compat X-Git-Tag: xonotic-v0.8.5~352^2~58 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=0b9df86c9a55dd9ed9031b21e430fc3094fac709;p=xonotic%2Fxonotic-data.pk3dir.git Merge branch 'master' into bones_was_here/q3compat --- 0b9df86c9a55dd9ed9031b21e430fc3094fac709 diff --cc qcsrc/common/stats.qh index a0bde6b92,5bbc4dd26..e1aba4caa --- a/qcsrc/common/stats.qh +++ b/qcsrc/common/stats.qh @@@ -3,7 -3,7 +3,8 @@@ #ifdef SVQC #include #include +#include + #include #endif // Full list of all stat constants, included in a single location for easy reference diff --cc qcsrc/server/items/spawning.qc index 000000000,f1c8796c7..829e69141 mode 000000,100644..100644 --- a/qcsrc/server/items/spawning.qc +++ b/qcsrc/server/items/spawning.qc @@@ -1,0 -1,149 +1,148 @@@ + #include "spawning.qh" + + /// \file + /// \brief Source file that contains implementation of the functions related to + /// creation of game items. + /// \copyright GNU GPLv2 or any later version. + + #include + #include + #include + #include + + .bool m_isloot; ///< Holds whether item is loot. + /// \brief Holds whether strength, shield or superweapon timers expire while + /// this item is on the ground. + .bool m_isexpiring; + + entity Item_FindDefinition(string class_name) + { + FOREACH(Items, it.m_canonical_spawnfunc == class_name, + { + return it; + }); + FOREACH(Weapons, it.m_canonical_spawnfunc == class_name, + { + return it.m_pickup; + }); + return NULL; + } + + bool Item_IsAllowed(string class_name) + { + entity definition = Item_FindDefinition(class_name); + if (definition == NULL) + { + return false; + } + return Item_IsDefinitionAllowed(definition); + } + + bool Item_IsDefinitionAllowed(entity definition) + { + return !MUTATOR_CALLHOOK(FilterItemDefinition, definition); + } + + entity Item_Create(string class_name, vector position, bool no_align) + { + entity item = spawn(); + item.classname = class_name; + item.spawnfunc_checked = true; + setorigin(item, position); + item.noalign = no_align; + Item_Initialize(item, class_name); + if (wasfreed(item)) + { + return NULL; + } + return item; + } + + void Item_Initialize(entity item, string class_name) + { + FOREACH(Weapons, it.m_canonical_spawnfunc == class_name, + { + weapon_defaultspawnfunc(item, it); + return; + }); + FOREACH(Items, it.m_canonical_spawnfunc == class_name, + { + StartItem(item, it); + return; + }); + LOG_FATALF("Item_Initialize: Invalid classname: %s", class_name); + } + + entity Item_CreateLoot(string class_name, vector position, vector vel, + float time_to_live) + { + entity item = spawn(); + if (!Item_InitializeLoot(item, class_name, position, vel, time_to_live)) + { + return NULL; + } + return item; + } + + bool Item_InitializeLoot(entity item, string class_name, vector position, + vector vel, float time_to_live) + { + item.classname = class_name; + Item_SetLoot(item, true); + item.noalign = true; + setorigin(item, position); + item.pickup_anyway = true; + item.spawnfunc_checked = true; + Item_Initialize(item, class_name); + if (wasfreed(item)) + { + return false; + } + item.gravity = 1; + item.velocity = vel; + SUB_SetFade(item, time + time_to_live, 1); + return true; + } + + bool Item_IsLoot(entity item) + { + return item.m_isloot || item.classname == "droppedweapon"; + } + + void Item_SetLoot(entity item, bool loot) + { + item.m_isloot = loot; + } + + bool Item_ShouldKeepPosition(entity item) + { + return item.noalign || (item.spawnflags & 1); + } + + bool Item_IsExpiring(entity item) + { + return item.m_isexpiring; + } + + void Item_SetExpiring(entity item, bool expiring) + { + item.m_isexpiring = expiring; + } + + // Compatibility spawn functions + -// FIXME: in Quake this is green armor, in Xonotic maps it is an armor shard -SPAWNFUNC_ITEM(item_armor1, ITEM_ArmorSmall) ++SPAWNFUNC_ITEM_COND(item_armor1, cvar("sv_mapformat_is_quake3"), ITEM_ArmorSmall, ITEM_ArmorMedium) + + SPAWNFUNC_ITEM(item_armor25, ITEM_ArmorMega) + + SPAWNFUNC_ITEM(item_armor_large, ITEM_ArmorMega) + + SPAWNFUNC_ITEM(item_health1, ITEM_HealthSmall) + + SPAWNFUNC_ITEM(item_health25, ITEM_HealthMedium) + + SPAWNFUNC_ITEM(item_health_large, ITEM_HealthBig) + + SPAWNFUNC_ITEM(item_health100, ITEM_HealthMega) + + SPAWNFUNC_ITEM(item_quad, ITEM_Strength)