X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fitems.qc;h=b21df78e3f247cb53b809446f95a555c25c86bcb;hb=04d7768d6a7d13490d9530a164703f1919c204e4;hp=1265f71c5e6cdb5cbf04a35037792828fdc31c9d;hpb=1a02dfa42534cfd8697e6c4d0e1181e5ec6c1fc7;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/items.qc b/qcsrc/server/items.qc index 1265f71c5..b21df78e3 100644 --- a/qcsrc/server/items.qc +++ b/qcsrc/server/items.qc @@ -5,25 +5,55 @@ /// game items. /// \copyright GNU GPLv2 or any later version. -#include "g_subs.qh" +#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_Create(string class_name, vector position) +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; } - setorigin(item, position); return item; } @@ -59,6 +89,7 @@ bool Item_InitializeLoot(entity item, string class_name, vector position, 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); @@ -67,7 +98,6 @@ bool Item_InitializeLoot(entity item, string class_name, vector position, return false; } item.gravity = 1; - setorigin(item, position); item.velocity = vel; SUB_SetFade(item, time + time_to_live, 1); return true; @@ -83,6 +113,11 @@ 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;