//============================ Constants ======================================
-enum
-{
- RANDOM_ITEM_TYPE_HEALTH = 1,
- RANDOM_ITEM_TYPE_ARMOR,
- RANDOM_ITEM_TYPE_RESOURCE,
- RANDOM_ITEM_TYPE_WEAPON,
- RANDOM_ITEM_TYPE_POWERUP
-};
-
//======================= Global variables ====================================
// Replace cvars
string RandomItems_GetRandomItemClassName(string prefix)
{
- if (autocvar_g_instagib)
+ if (MUTATOR_IS_ENABLED(mutator_instagib))
{
return RandomItems_GetRandomInstagibItemClassName(prefix);
}
- if (expr_evaluate(autocvar_g_overkill))
+ if (MUTATOR_IS_ENABLED(ok))
{
return RandomItems_GetRandomOverkillItemClassName(prefix);
}
- return RandomItems_GetRandomVanillaItemClassName(prefix);
+ return RandomItems_GetRandomVanillaItemClassName(prefix,
+ RANDOM_ITEM_TYPE_ALL);
}
-string RandomItems_GetRandomVanillaItemClassName(string prefix)
+string RandomItems_GetRandomVanillaItemClassName(string prefix, int types)
{
- RandomSelection_Init();
- RandomSelection_AddFloat(RANDOM_ITEM_TYPE_HEALTH,
- cvar(sprintf("g_%s_health_probability", prefix)), 1);
- RandomSelection_AddFloat(RANDOM_ITEM_TYPE_ARMOR,
- cvar(sprintf("g_%s_armor_probability", prefix)), 1);
- RandomSelection_AddFloat(RANDOM_ITEM_TYPE_RESOURCE,
- cvar(sprintf("g_%s_resource_probability", prefix)), 1);
- RandomSelection_AddFloat(RANDOM_ITEM_TYPE_WEAPON,
- cvar(sprintf("g_%s_weapon_probability", prefix)), 1);
- RandomSelection_AddFloat(RANDOM_ITEM_TYPE_POWERUP,
- cvar(sprintf("g_%s_powerup_probability", prefix)), 1);
- int item_type = RandomSelection_chosen_float;
- switch (item_type)
+ if (types == 0)
{
- case RANDOM_ITEM_TYPE_HEALTH:
+ return "";
+ }
+ while (types != 0)
+ {
+ string cvar_name;
+ RandomSelection_Init();
+ if (types & RANDOM_ITEM_TYPE_HEALTH)
{
- return RandomItems_GetRandomItemClassNameWithProperty(prefix,
- instanceOfHealth);
+ cvar_name = sprintf("g_%s_health_probability", prefix);
+ if (!(cvar_type(cvar_name) & CVAR_TYPEFLAG_EXISTS))
+ {
+ LOG_WARNF("Random items: cvar %s doesn't exist.", cvar_name);
+ }
+ else
+ {
+ RandomSelection_AddFloat(RANDOM_ITEM_TYPE_HEALTH,
+ cvar(cvar_name), 1);
+ }
}
- case RANDOM_ITEM_TYPE_ARMOR:
+ if (types & RANDOM_ITEM_TYPE_ARMOR)
{
- return RandomItems_GetRandomItemClassNameWithProperty(prefix,
- instanceOfArmor);
+ cvar_name = sprintf("g_%s_armor_probability", prefix);
+ if (!(cvar_type(cvar_name) & CVAR_TYPEFLAG_EXISTS))
+ {
+ LOG_WARNF("Random items: cvar %s doesn't exist.", cvar_name);
+ }
+ else
+ {
+ RandomSelection_AddFloat(RANDOM_ITEM_TYPE_ARMOR,
+ cvar(cvar_name), 1);
+ }
}
- case RANDOM_ITEM_TYPE_RESOURCE:
+ if (types & RANDOM_ITEM_TYPE_RESOURCE)
{
- return RandomItems_GetRandomItemClassNameWithProperty(prefix,
- instanceOfAmmo);
+ cvar_name = sprintf("g_%s_resource_probability", prefix);
+ if (!(cvar_type(cvar_name) & CVAR_TYPEFLAG_EXISTS))
+ {
+ LOG_WARNF("Random items: cvar %s doesn't exist.", cvar_name);
+ }
+ else
+ {
+ RandomSelection_AddFloat(RANDOM_ITEM_TYPE_RESOURCE,
+ cvar(cvar_name), 1);
+ }
}
- case RANDOM_ITEM_TYPE_WEAPON:
+ if (types & RANDOM_ITEM_TYPE_WEAPON)
{
- RandomSelection_Init();
- FOREACH(Weapons, it != WEP_Null &&
- !(it.spawnflags & WEP_FLAG_MUTATORBLOCKED),
+ cvar_name = sprintf("g_%s_weapon_probability", prefix);
+ if (!(cvar_type(cvar_name) & CVAR_TYPEFLAG_EXISTS))
{
- string cvar_name = sprintf("g_%s_%s_probability", prefix,
- it.m_canonical_spawnfunc);
- RandomSelection_AddString(it.m_canonical_spawnfunc,
- cvar(cvar_name), 1);
- });
- return RandomSelection_chosen_string;
+ LOG_WARNF("Random items: cvar %s doesn't exist.", cvar_name);
+ }
+ else
+ {
+ RandomSelection_AddFloat(RANDOM_ITEM_TYPE_WEAPON, cvar(cvar_name), 1);
+ }
}
- case RANDOM_ITEM_TYPE_POWERUP:
+ if (types & RANDOM_ITEM_TYPE_POWERUP)
{
- return RandomItems_GetRandomItemClassNameWithProperty(prefix,
- instanceOfPowerup);
+ cvar_name = sprintf("g_%s_powerup_probability", prefix);
+ if (!(cvar_type(cvar_name) & CVAR_TYPEFLAG_EXISTS))
+ {
+ LOG_WARNF("Random items: cvar %s doesn't exist.", cvar_name);
+ }
+ else
+ {
+ RandomSelection_AddFloat(RANDOM_ITEM_TYPE_POWERUP, cvar(cvar_name), 1);
+ }
}
+ int item_type = RandomSelection_chosen_float;
+ string class_name = "";
+ switch (item_type)
+ {
+ case RANDOM_ITEM_TYPE_HEALTH:
+ {
+ class_name = RandomItems_GetRandomItemClassNameWithProperty(
+ prefix, instanceOfHealth);
+ break;
+ }
+ case RANDOM_ITEM_TYPE_ARMOR:
+ {
+ class_name = RandomItems_GetRandomItemClassNameWithProperty(
+ prefix, instanceOfArmor);
+ break;
+ }
+ case RANDOM_ITEM_TYPE_RESOURCE:
+ {
+ class_name = RandomItems_GetRandomItemClassNameWithProperty(
+ prefix, instanceOfAmmo);
+ break;
+ }
+ case RANDOM_ITEM_TYPE_WEAPON:
+ {
+ RandomSelection_Init();
+ FOREACH(Weapons, it != WEP_Null &&
+ !(it.spawnflags & WEP_FLAG_MUTATORBLOCKED),
+ {
+ cvar_name = sprintf("g_%s_%s_probability", prefix,
+ it.m_canonical_spawnfunc);
+ if (!(cvar_type(cvar_name) & CVAR_TYPEFLAG_EXISTS))
+ {
+ LOG_WARNF("Random items: cvar %s doesn't exist.",
+ cvar_name);
+ continue;
+ }
+ RandomSelection_AddString(it.m_canonical_spawnfunc,
+ cvar(cvar_name), 1);
+ });
+ class_name = RandomSelection_chosen_string;
+ break;
+ }
+ case RANDOM_ITEM_TYPE_POWERUP:
+ {
+ class_name = RandomItems_GetRandomItemClassNameWithProperty(
+ prefix, instanceOfPowerup);
+ break;
+ }
+ }
+ if (class_name != "")
+ {
+ return class_name;
+ }
+ types &= ~item_type;
}
return "";
}
string RandomItems_GetRandomInstagibItemClassName(string prefix)
{
RandomSelection_Init();
- FOREACH(Items, it.spawnflags & ITEM_FLAG_INSTAGIB,
+ FOREACH(Items, it.spawnflags & ITEM_FLAG_INSTAGIB &&
+ Item_IsDefinitionAllowed(it),
{
- RandomSelection_AddString(it.m_canonical_spawnfunc,
- cvar(sprintf("g_%s_%s_probability", prefix,
- it.m_canonical_spawnfunc)), 1);
+ string cvar_name = sprintf("g_%s_%s_probability", prefix,
+ it.m_canonical_spawnfunc);
+ if (!(cvar_type(cvar_name) & CVAR_TYPEFLAG_EXISTS))
+ {
+ LOG_WARNF("Random items: cvar %s doesn't exist.", cvar_name);
+ continue;
+ }
+ RandomSelection_AddString(it.m_canonical_spawnfunc, cvar(cvar_name), 1);
});
return RandomSelection_chosen_string;
}
{
RandomSelection_Init();
FOREACH(Items, (it.spawnflags & ITEM_FLAG_OVERKILL) &&
- !(it.spawnflags & ITEM_FLAG_MUTATORBLOCKED),
+ !(it.spawnflags & ITEM_FLAG_MUTATORBLOCKED) &&
+ Item_IsDefinitionAllowed(it),
{
- RandomSelection_AddString(it.m_canonical_spawnfunc,
- cvar(sprintf("g_%s_overkill_%s_probability", prefix,
- it.m_canonical_spawnfunc)), 1);
+ string cvar_name = sprintf("g_%s_overkill_%s_probability", prefix,
+ it.m_canonical_spawnfunc);
+ if (!(cvar_type(cvar_name) & CVAR_TYPEFLAG_EXISTS))
+ {
+ LOG_WARNF("Random items: cvar %s doesn't exist.", cvar_name);
+ continue;
+ }
+ RandomSelection_AddString(it.m_canonical_spawnfunc, cvar(cvar_name), 1);
});
- RandomSelection_AddString("weapon_hmg",
- cvar(sprintf("g_%s_overkill_weapon_hmg_probability", prefix)), 1);
- RandomSelection_AddString("weapon_rpc",
- cvar(sprintf("g_%s_overkill_weapon_rpc_probability", prefix)), 1);
+ string cvar_name = sprintf("g_%s_overkill_weapon_okhmg_probability", prefix);
+ if (!(cvar_type(cvar_name) & CVAR_TYPEFLAG_EXISTS))
+ {
+ LOG_WARNF("Random items: cvar %s doesn't exist.", cvar_name);
+ }
+ else
+ {
+ RandomSelection_AddString("weapon_okhmg", cvar(cvar_name), 1);
+ }
+ cvar_name = sprintf("g_%s_overkill_weapon_okrpc_probability", prefix);
+ if (!(cvar_type(cvar_name) & CVAR_TYPEFLAG_EXISTS))
+ {
+ LOG_WARNF("Random items: cvar %s doesn't exist.", cvar_name);
+ }
+ else
+ {
+ RandomSelection_AddString("weapon_okrpc", cvar(cvar_name), 1);
+ }
return RandomSelection_chosen_string;
}
/// \return List of classnames to replace a map item with.
string RandomItems_GetItemReplacementClassNames(entity item)
{
- return cvar_string(sprintf("g_random_items_replace_%s", item.classname));
+ string cvar_name = sprintf("g_random_items_replace_%s", item.classname);
+ if (!(cvar_type(cvar_name) & CVAR_TYPEFLAG_EXISTS))
+ {
+ LOG_WARNF("Random items: cvar %s doesn't exist.", cvar_name);
+ return "";
+ }
+ return cvar_string(cvar_name);
}
string RandomItems_GetRandomItemClassNameWithProperty(string prefix,
.bool item_property)
{
RandomSelection_Init();
- FOREACH(Items, it.item_property && (it.spawnflags & ITEM_FLAG_NORMAL),
+ FOREACH(Items, it.item_property && (it.spawnflags & ITEM_FLAG_NORMAL) &&
+ Item_IsDefinitionAllowed(it),
{
- RandomSelection_AddString(it.m_canonical_spawnfunc,
- cvar(sprintf("g_%s_%s_probability", prefix,
- it.m_canonical_spawnfunc)), 1);
+ string cvar_name = sprintf("g_%s_%s_probability", prefix,
+ it.m_canonical_spawnfunc);
+ if (!(cvar_type(cvar_name) & CVAR_TYPEFLAG_EXISTS))
+ {
+ LOG_WARNF("Random items: cvar %s doesn't exist.", cvar_name);
+ continue;
+ }
+ RandomSelection_AddString(it.m_canonical_spawnfunc, cvar(cvar_name), 1);
});
return RandomSelection_chosen_string;
}
}
random_items_is_spawning = true;
entity new_item;
- if (!expr_evaluate(autocvar_g_overkill))
+ if (!MUTATOR_IS_ENABLED(ok))
{
- new_item = Item_Create(strzone(new_classname), item.origin);
+ new_item = Item_Create(strzone(new_classname), item.origin,
+ Item_ShouldKeepPosition(item));
random_items_is_spawning = false;
if (new_item == NULL)
{
new_item = spawn();
new_item.classname = strzone(new_classname);
new_item.spawnfunc_checked = true;
+ new_item.noalign = Item_ShouldKeepPosition(item);
new_item.ok_item = true;
Item_Initialize(new_item, new_classname);
random_items_is_spawning = false;
spread.z = autocvar_g_random_loot_spread / 2;
spread += randomvec() * autocvar_g_random_loot_spread;
random_items_is_spawning = true;
- if (!expr_evaluate(autocvar_g_overkill))
+ if (!MUTATOR_IS_ENABLED(ok))
{
Item_CreateLoot(class_name, position, spread,
autocvar_g_random_loot_time);