MUTATOR_HOOKFUNCTION(lms, FilterItemDefinition)
{
- if (autocvar_g_lms_items)
+ if (autocvar_g_lms_items || autocvar_g_pickup_items > 0)
return false;
- entity definition = M_ARGV(0, entity);
-
- if (autocvar_g_lms_extra_lives && definition == ITEM_ExtraLife)
- {
+ entity def = M_ARGV(0, entity);
+ if (autocvar_g_powerups && autocvar_g_lms_extra_lives && (def == ITEM_ExtraLife || def == ITEM_HealthMega))
return false;
- }
- return (autocvar_g_pickup_items <= 0); // only allow items if explicitly enabled
-}
-void lms_extralife(entity this)
-{
- StartItem(this, ITEM_ExtraLife);
+ return true;
}
-MUTATOR_HOOKFUNCTION(lms, OnEntityPreSpawn)
+void lms_replace_with_extralife(entity this)
{
- if (MUTATOR_RETURNVALUE) return false;
- if (!autocvar_g_powerups) return false;
- if (!autocvar_g_lms_extra_lives) return false;
-
- entity ent = M_ARGV(0, entity);
-
- // Can't use .itemdef here
- if (ent.classname != "item_health_mega") return false;
+ entity e = new(item_extralife);
+ Item_CopyFields(this, e);
- entity e = spawn();
- setthink(e, lms_extralife);
-
- Item_CopyFields(ent, e);
+ StartItem(e, ITEM_ExtraLife);
+}
- e.nextthink = time + 0.1;
+MUTATOR_HOOKFUNCTION(lms, FilterItem)
+{
+ entity item = M_ARGV(0, entity);
+ entity def = item.itemdef;
+ if(def == ITEM_HealthMega && !(autocvar_g_lms_items || autocvar_g_pickup_items > 0))
+ {
+ if(autocvar_g_powerups && autocvar_g_lms_extra_lives)
+ lms_replace_with_extralife(item);
+ return true;
+ }
- return true;
+ return false;
}
MUTATOR_HOOKFUNCTION(lms, ItemTouch)
{
Send_Notification(NOTIF_ONE, toucher, MSG_CENTER, CENTER_EXTRALIVES, autocvar_g_lms_extra_lives);
GameRules_scoring_add(toucher, LMS_LIVES, autocvar_g_lms_extra_lives);
+ Inventory_pickupitem(item.itemdef, toucher);
return MUT_ITEMTOUCH_PICKUP;
}
bool autocvar_g_instagib_ammo_convert_shells;
bool autocvar_g_instagib_ammo_convert_bullets;
-void instagib_invisibility(entity this)
-{
- this.invisibility_finished = autocvar_g_instagib_invisibility_time;
- StartItem(this, ITEM_Invisibility);
-}
-
-void instagib_extralife(entity this)
-{
- StartItem(this, ITEM_ExtraLife);
-}
-
-void instagib_speed(entity this)
-{
- this.speed_finished = autocvar_g_instagib_speed_time;
- StartItem(this, ITEM_Speed);
-}
-
/// \brief Returns a random classname of the instagib item.
/// \param[in] prefix Prefix of the cvars that hold probabilities.
/// \return Random classname of the instagib item.
M_ARGV(0, string) = "off";
}
-void replace_with_insta_cells(entity item)
+void instagib_replace_item_with(entity this, GameItem def)
{
- entity e = new(item_vaporizer_cells);
- Item_CopyFields(item, e);
- spawnfunc_item_vaporizer_cells(e);
+ entity new_item = NULL;
+ switch (def)
+ {
+ case ITEM_Invisibility:
+ new_item = new(item_invisibility);
+ new_item.invisibility_finished = autocvar_g_instagib_invisibility_time;
+ break;
+ case ITEM_Speed:
+ new_item = new(item_speed);
+ new_item.speed_finished = autocvar_g_instagib_speed_time;
+ break;
+ case ITEM_ExtraLife:
+ new_item = new(item_extralife);
+ break;
+ case ITEM_VaporizerCells:
+ new_item = new(item_vaporizer_cells);
+ break;
+ default:
+ error("Unhandled replacement item.");
+ }
+ Item_CopyFields(this, new_item);
+ StartItem(new_item, def);
}
MUTATOR_HOOKFUNCTION(mutator_instagib, FilterItem)
{
entity item = M_ARGV(0, entity);
-
- if(item.classname == "item_cells")
+ entity def = item.itemdef;
+ if(def == ITEM_Strength || def == ITEM_Shield || def == ITEM_HealthMega || def == ITEM_ArmorMega)
{
- if(autocvar_g_instagib_ammo_convert_cells)
+ if(autocvar_g_powerups)
{
- replace_with_insta_cells(item);
+ float r = random();
+ if (r < 0.3)
+ instagib_replace_item_with(item, ITEM_Invisibility);
+ else if (r < 0.6)
+ instagib_replace_item_with(item, ITEM_ExtraLife);
+ else
+ instagib_replace_item_with(item, ITEM_Speed);
}
return true;
}
- else if(item.classname == "item_rockets")
+
+ if(def == ITEM_Cells)
+ {
+ if(autocvar_g_instagib_ammo_convert_cells)
+ instagib_replace_item_with(item, ITEM_VaporizerCells);
+ return true;
+ }
+ else if(def == ITEM_Rockets)
{
if(autocvar_g_instagib_ammo_convert_rockets)
- {
- replace_with_insta_cells(item);
- }
+ instagib_replace_item_with(item, ITEM_VaporizerCells);
return true;
}
- else if(item.classname == "item_shells")
+ else if(def == ITEM_Shells)
{
if(autocvar_g_instagib_ammo_convert_shells)
- {
- replace_with_insta_cells(item);
- }
+ instagib_replace_item_with(item, ITEM_VaporizerCells);
return true;
}
- else if(item.classname == "item_bullets")
+ else if(def == ITEM_Bullets)
{
if(autocvar_g_instagib_ammo_convert_bullets)
- {
- replace_with_insta_cells(item);
- }
+ instagib_replace_item_with(item, ITEM_VaporizerCells);
return true;
}
if(item.weapon == WEP_DEVASTATOR.m_id || item.weapon == WEP_VORTEX.m_id)
{
- replace_with_insta_cells(item);
+ instagib_replace_item_with(item, ITEM_VaporizerCells);
return true;
}
{
GiveResource(toucher, RES_ARMOR, autocvar_g_instagib_extralives);
Send_Notification(NOTIF_ONE, toucher, MSG_CENTER, CENTER_EXTRALIVES, autocvar_g_instagib_extralives);
+ Inventory_pickupitem(item.itemdef, toucher);
return MUT_ITEMTOUCH_PICKUP;
}
return MUT_ITEMTOUCH_CONTINUE;
}
-MUTATOR_HOOKFUNCTION(mutator_instagib, OnEntityPreSpawn)
-{
- if (MUTATOR_RETURNVALUE) return false;
- if (!autocvar_g_powerups) { return; }
- entity ent = M_ARGV(0, entity);
- // Can't use .itemdef here
- if (!(ent.classname == "item_strength" || ent.classname == "item_shield" || ent.classname == "item_invincible" || ent.classname == "item_health_mega"))
- return;
-
- entity e = spawn();
-
- float r = random();
- if (r < 0.3)
- {
- e.classname = "item_invisibility";
- setthink(e, instagib_invisibility);
- }
- else if (r < 0.6)
- {
- e.classname = "item_extralife";
- setthink(e, instagib_extralife);
- }
- else
- {
- e.classname = "item_speed";
- setthink(e, instagib_speed);
- }
-
- Item_CopyFields(ent, e);
- e.nextthink = time + 0.1;
-
- return true;
-}
-
MUTATOR_HOOKFUNCTION(mutator_instagib, BuildMutatorsString)
{
M_ARGV(0, string) = strcat(M_ARGV(0, string), ":instagib");