Outward Loot Manager
Outward mod that allows you to assign loots to enemies using Mods Communicator to send events.
Deeper Explanation
This mod hooks into the Lootable.OnDeath method and evaluates the
provided LootRules. These rules determine whether your custom loot
should be applied to a dying enemy.
The mod acts as a central Loot Manager that stores simple,
abstracted logic and handles more complex game mechanics internally. Its state
can be saved or loaded using XML.
Other mods can inspect, modify, or react to the LootManager’s
dynamic state and see how different mods interact with it.
How to use it
Firstly, install Mods
Communicator
After that, you can publish and subscribe to LootManager events.
All events are registered and visible in Mods Communicator’s logging system.
However, it is still recommended to read the event descriptions below and
review the examples. Many event fields are optional and give you extra control,
but they are not required.
If the total drop chance of your items exceeds 100, the system automatically
switches to weight-based loot instead of percentages. Providing
maxDiceValue also forces weight mode.
In weight mode, LootManager delegates all weight calculations to
Outward's original system, which assigns minDiceRollValue and
maxDiceRollValue to each item automatically.
You can control drop behavior using emptyDropChance and
maxDiceValue.
Events
Check the parameter tables to understand which values are required. Event
descriptions below are intentionally abstract — always refer to the tables for
the exact field requirements.
Publish
Mod Namespace: gymmed.loot_manager_*
Make sure to publish only after LootManager has initialized. I
recommend adding it as a dependency in your mod, or publishing it before/after
ResourcesPrefabManager.Load has finished.
Add Loot
Event Name: AddLoot
Requires at least one of the following:
-
item
-
itemDropChance
-
ListItemDropChance
Also requires one or more of the filtering fields: enemy / faction / area / uniqueness.
This event is the most flexible one — you can do everything with it.
Other events exist only for convenience.
Examples
Guaranteed Loot
using OutwardModsCommunicator;
...
int myItemId = 4000360; // Dreamers root
var payload = new EventPayload
{
["itemId"] = myItemId,
["enemyName"] = "Hyena",
};
EventBus.Publish("gymmed.loot_manager_*", "AddLoot", payload);
Chance Loot
Providing enemy id ignores other enemy requirements.
This only works for enemy id, other requirements can be combined for
flexibility. By providing dropChance to item it will internally
make emptyDropChance
using OutwardModsCommunicator;
...
int myItemId = 4000360; // Dreamers root
string myEnemyId = "eCz766tEIEOWfK81om19wg"; // Calixa Boss
var payload = new EventPayload
{
["itemId"] = myItemId,
["dropChance"] = 50,
["enemyId"] = myEnemyId,
};
EventBus.Publish("gymmed.loot_manager_*", "AddLoot", payload);
Faction Loot
Additionally added how many items should be dropped(LootManager
tries to build ItemDropChance internally).
using OutwardModsCommunicator;
...
int myItemId = 4000360; // Dreamers root
var payload = new EventPayload
{
["itemId"] = myItemId,
["minDropCount"] = 1,
["maxDropCount"] = 3,
["faction"] = Character.Factions.Bandits,
};
EventBus.Publish("gymmed.loot_manager_*", "AddLoot", payload);
Area Loot
using OutwardModsCommunicator;
...
int myItemId = 4000360; // Dreamers root
var payload = new EventPayload
{
["itemId"] = myItemId,
["area"] = AreaManager.AreaEnum.Abrassar,
};
EventBus.Publish("gymmed.loot_manager_*", "AddLoot", payload);
Area Family Loot
I recommend to make a helper method of finding your AreaFamily by enum/name.
You can find them in AreaManager.AreaFamilies.
using OutwardModsCommunicator;
...
int myItemId = 4000360; // Dreamers root
var payload = new EventPayload
{
["itemId"] = myItemId,
["areaFamily"] = AreaManager.AreaFamilies[2], //Levant Region includes abrassar and all dungeons
// you can combine requirements
["faction"] = Character.Factions.Bandits,
["listExceptNames"] = new List<string>() { "Hyena" },
};
EventBus.Publish("gymmed.loot_manager_*", "AddLoot", payload);
Add Loot By Enemy Name
Event Name: AddLootByEnemyName
Required one of the item/itemDropChance/ListItemDropChance information.
Required enemyName.
Only listExceptIds work.
Example
using OutwardModsCommunicator;
...
ItemDropChance myItem = new ItemDropChance();
myItem.ItemID = 4000360; // Dreamers root
myItem.DropChance = 30;
var payload = new EventPayload
{
["itemDropChance"] = myItem,
["enemyName"] = "Hyena",
["listExceptIds"] = new List<string>() { "yourEnemyId" },
};
EventBus.Publish("gymmed.loot_manager_*", "AddLootByEnemyName", payload);
Add Loot By Enemy Id
Event Name: AddLootByEnemyId
Required one of the item/itemDropChance/ListItemDropChance information.
Required enemyId.
Example
using OutwardModsCommunicator;
...
List<ItemDropChance> drops = new();
ItemDropChance myFirstItem = new ItemDropChance();
myFirstItem.ItemID = 4000360; // Dreamers root
myFirstItem.DropChance = 30;
ItemDropChance mySecondItem = new ItemDropChance();
mySecondItem.ItemID = 6000170; // Purifying quartz
mySecondItem.DropChance = 30;
drops.Add(myFirstItem);
drops.Add(mySecondItem);
var payload = new EventPayload
{
["listOfItemDropChances"] = drops,
["enemyId"] = "JmeufMpL_E6eYnqCYP2r3w", // Elite Burning Man
};
EventBus.Publish("gymmed.loot_manager_*", "AddLootByEnemyId", payload);
Add Loot For Uniques
Makes bosses lootable.
Event Name: AddLootForUniques
Required one of the item/itemDropChance/ListItemDropChance information.
Required one of the isForBosses/isForBossPawns/
isForStoryBosses/isForUniqueArenaBosses/
isForUniqueArenaBosses parameters.
Example
using OutwardModsCommunicator;
...
int myItemId = 4000360; // Dreamers root
var payload = new EventPayload
{
["itemId"] = myItemId,
["isForBosses"] = true, // is for all bosses
};
EventBus.Publish("gymmed.loot_manager_*", "AddLootForUniques", payload);
Load Loots XML
Loads your custom loot-rules XML document into the mod.
Event Name: LootRulesSerializer@LoadCustomLoots
Requires the full path to the XML file, provided as the filePath parameter.
Example
using OutwardModsCommunicator;
...
var payload = new EventPayload
{
["filePath"] = "assemblyLocation/filePath.xml",
};
EventBus.Publish("gymmed.loot_manager", "LootRulesSerializer@SaveLootRulesToXml", payload);
Store Loots to XML
Stores the current LootManager loot rules into an XML document.
Event Name: LootRulesSerializer@SaveLootRulesToXml
Optional: you may provide a full XML file path using the filePath
parameter. If omitted, the file will be stored at:
BepInEx/config/gymmed.Mods_Communicator/Loot_Manager/LootRules-date.xml
Example
using OutwardModsCommunicator;
...
var payload = new EventPayload
{
//["filePath"] = "",
};
EventBus.Publish("gymmed.loot_manager", "LootRulesSerializer@SaveLootRulesToXml", payload);
Subscribe
Mod Namespace: gymmed.loot_manager
You can listen then mod methods a triggered.
Append Loot Rule
Event Name: LootRuleRegistryManager@AppendLootRule
On published and added loot rule gets triggered.
Example
using OutwardModsCommunicator;
...
public awake()
{
...
EventBus.Subscribe(
"gymmed.loot_manager",
"LootRuleRegistryManager@AppendLootRule",
YourMethod
);
}
...
public static void YourMethod(EventPayload payload)
{
if (payload == null) return;
int lootRuleId = payload.Get<int>("lootRuleId", null);
// You would compare it with your registered loot rule id that you can provide
// Your code...
}
Remove Loot Rule
Event Name: LootRuleRegistryManager@RemoveLootRule
On published and removed loot rule gets triggered.
Example
using OutwardModsCommunicator;
...
public awake()
{
...
EventBus.Subscribe(
"gymmed.loot_manager",
"LootRuleRegistryManager@RemoveLootRule",
YourMethod
);
}
...
public static void YourMethod(EventPayload payload)
{
if (payload == null) return;
int lootRuleId = payload.Get<int>("lootRuleId", null);
// You would compare it with your registered loot rule id that you can provide
// Your code...
}
Unique Enemies
If you going to provide only enemyName and that enemy is unique
make sure to provide one of isForBosses,
isForBossPawns, isForStoryBosses,
isForUniqueArenaBosses, isForUniqueEnemies parameters.
Data collected using Outward Scene Tester
Bosses
Below are all included in isForBosses parameter.
Story Bosses
All enemies included in isForStoryBosses. They are all compared by id.
|
Picture
|
Character.Name
|
Character.m_name
|
Character.m_nameLoc
|
Character.UID
|
Wiki location
|
Game location
|
|
Burning Man
|
CrimsonAvatar (1)
|
Undead_BurningMan
|
4eeggsSn2Eyah4IjjqvpYQ
|
Scarlet Sanctuary
|
Scarlet Sanctuary
|
|
Gold Lich
|
LichGold
|
Undead_LichGold
|
EwoPQ0iVwkK-XtNuaVPf3g
|
Oil Refinery
|
Oil Refinery
|
|
Jade Lich
|
LichRust
|
Undead_LichJade
|
shyc5M7b-UGVHBZsJMdP4Q
|
Forgotten Research Laboratory
|
Forgotten Research Laboratory
|
|
Gold Lich
|
LichGold
|
Undead_LichGold
|
EwoPQ0iVwkK-XtNuaVPf3g
|
Spire of Light
|
Spire of Light
|
|
Jade Lich
|
LichJade
|
Undead_LichJade
|
8sjFFBPMvkuJcrcyIYs-KA
|
Dark Ziggurat
|
Dark Ziggurat Interior
|
Boss Pawns
All enemies included in isForBossPawns. They are all compared by id.
|
Picture
|
Character.Name
|
Character.m_name
|
Character.m_nameLoc
|
Character.UID
|
Wiki location
|
Game location
|
Scene name
|
|
Balira
|
KrypteiaGuard
|
name_unpc_balira_01
|
AbvgKMnPLUiffB6LzjaguQ
|
Tower of Regrets Arena
|
Unknown Arena
|
CalderaDungeonsBosses
|
|
Balira
|
KrypteiaMage
|
name_unpc_balira_01
|
MfBjNPYsvkODdyLjYrlXXw
|
Tower of Regrets Arena
|
Unknown Arena
|
CalderaDungeonsBosses
|
|
Obsidian Elemental
|
ObsidianElemental
|
Wildlife_ObsidianElemental
|
RM13rq4JTEqbuANnncMCKA
|
Burning Tree Arena
|
Unknown Arena
|
EmercarDungeonsBosses
|
|
Obsidian Elemental (1)
|
Qrq3e4nUpkS8CH3yd8J-ow
|
Unique Arena Bosses
All enemies included in isForUniqueArenaBosses. They are all compared by id.
|
Picture
|
Character.Name
|
Character.m_name
|
Character.m_nameLoc
|
Character.UID
|
Wiki location
|
Game location
|
Scene name
|
|
Ash Giant Priest
|
EliteAshGiantPriest
|
Giant_Priest
|
UnIXpnDMzUSfBu4S-ZDgsA
|
Giant's Village Arena (south)
|
Unknown Arena
|
HallowedDungeonsBosses
|
|
Desert Bandit
|
EliteBrandSquire
|
Bandit_Desert_Basic
|
sb0TOkOPS06jhp56AOYJCw
|
Conflux Mountain Arena
|
Unknown Arena
|
ChersoneseDungeonsBosses
|
|
Breath of Darkness
|
AncientDwellerDark
|
Elite_Dweller
|
JmeufMpL_E6eYnqCYP2r3w
|
The Vault of Stone
|
The Vault of Stone
|
Caldera_Dungeon8
|
|
Cyrene
|
EliteCalixa
|
Cyrene
|
eCz766tEIEOWfK81om19wg
|
Levant Arena
|
Unknown Arena
|
AbrassarDungeonsBosses
|
|
???
|
NewBandit
|
name_unpc_unknown_01
|
XVuyIaCAVkatv89kId9Uqw
|
Shipwreck (Castaway)
|
CierzoTutorial
|
CierzoTutorial
|
|
Alpha Tuanosaur
|
EliteTuanosaurAlpha
|
Wildlife_TuanosaurAlpha
|
El8bA54i4E6vZraXsVZMow
|
Ziggurat Passage Arena
|
Unknown Arena
|
HallowedDungeonsBosses
|
|
Ash Giant
|
EliteAshGiantPaf
|
Giant_Guard
|
3vXChaIK90qgq03PmsHFCg
|
Unknown Arena
|
Unknown Arena
|
HallowedDungeonsBosses
|
|
EliteAshGiantPif
|
851czvFVDUaB42CgVzfKdg
|
|
EliteAshGiantPouf
|
kNmmOHZzKU-82F3OoX9NXw
|
|
Beast Golem
|
EliteBeastGolem
|
Golem_Beast
|
n83g2QJhwUyUrN469WC4jA
|
Parched Shipwrecks Arena
|
Unknown Arena
|
AbrassarDungeonsBosses
|
|
Blade Dancer
|
BoozuProudBeast
|
Wildlife_BladeDancer
|
2Ef5z9OfYkev7M7Oi9GN-A
|
Mana Lake Arena
|
Unknown Arena
|
AntiqueFieldDungeonsBosses
|
|
Burning Man
|
EliteBurningMan
|
Undead_BurningMan
|
JmeufMpL_E6eYnqCYP2r3w
|
Burning Tree Arena
|
Unknown Arena
|
EmercarDungeonsBosses
|
|
Crescent Shark
|
EliteCrescentShark
|
Wildlife_CrescentShark
|
RM13rq4JTEqbuANnncMCKA
|
Electric Lab Arena
|
Unknown Arena
|
AbrassarDungeonsBosses
|
|
EliteCrescentShark (1)
|
ElDi5-rvqEqJKcXhEdgwBQ
|
|
EliteCrescentShark (2)
|
z3sfjJtqQEmUZ_S6g2RPIg
|
|
Burning Man
|
CrimsonAvatarElite (1)
|
Undead_BurningMan
|
JmeufMpL_E6eYnqCYP2r3w
|
Vault of Stone Arena
|
Unknown Arena
|
CalderaDungeonsBosses
|
|
Shell Horror
|
GargoyleBossMelee (1)
|
Horror_Shell
|
k75QmVu5t0e_zIjHnUFbIQ
|
New Sirocco Arena
|
Unknown Arena
|
CalderaDungeonsBosses
|
|
Shell Horror
|
GargoyleBossMelee (1)
|
Horror_Shell
|
AKBYHSSMJUaH9ddLiz_SZA
|
New Sirocco Arena
|
Unknown Arena
|
CalderaDungeonsBosses
|
|
Shell Horror
|
GargoyleBossMelee (1)
|
Horror_Shell
|
Z6yTTWK4u0GjDPfZ9X332A
|
New Sirocco Arena
|
Unknown Arena
|
CalderaDungeonsBosses
|
|
Mantis Shrimp
|
EliteMantisShrimp
|
Wildlife_Shrimp
|
RM13rq4JTEqbuANnncMCKA
|
Voltaic Hatchery Arena
|
Unknown Arena
|
ChersoneseDungeonsBosses
|
|
Nicolas
|
CageArmorBoss (1)
|
Nicolas
|
X-dfltOoGUm7YlCE_Li1zQ
|
Isolated Windmill Arena
|
Unknown Arena
|
AntiqueFieldDungeonsBosses
|
|
Wildlife_Torcrab
|
TorcrabGiant (1)
|
Wildlife_Torcrab
|
gQDvpLQh3kimgwMmvXJc4g
|
River of Red Arena
|
Unknown Arena
|
CalderaDungeonsBosses
|
|
Ghost
|
Grandmother
|
Undead_Ghost
|
7G5APgUksEGdQrBxKXr04g
|
Tower of Regrets Arena
|
Unknown Arena
|
CalderaDungeonsBosses
|
|
Immaculate
|
EliteImmaculate
|
Horror_Immaculate
|
9jsiejBtHkOzeo4tOyyweg
|
Cabal of Wind Temple Arena
|
Unknown Arena
|
EmercarDungeonsBosses
|
|
Immaculate
|
EliteSupremeShell (1)
|
Horror_Immaculate
|
JsyOv_Cwu0K0HlXyZInRQQ
|
Immaculate's Camp Arena
|
Unknown Arena
|
AntiqueFieldDungeonsBosses
|
|
Gold Lich
|
LichGold (1)
|
Undead_LichGold
|
v9mN1u1uMkaxsncBXhIM9A
|
Spire of Light
|
Unknown Arena
|
EmercarDungeonsBosses
|
|
Jade Lich
|
LichJade (1)
|
Undead_LichJade
|
GfWl16_MZ0uS7UYIKpS5Lg
|
Dark Ziggurat
|
Unknown Arena
|
EmercarDungeonsBosses
|
|
Gold Lich
|
LichGold (1)
|
Undead_LichGold
|
v9mN1u1uMkaxsncBXhIM9A
|
Spire of Light
|
Unknown Arena
|
EmercarDungeonsBosses
|
|
Jade Lich
|
LichJade (1)
|
Undead_LichJade
|
GfWl16_MZ0uS7UYIKpS5Lg
|
Dark Ziggurat
|
Unknown Arena
|
EmercarDungeonsBosses
|
|
Mana Troglodyte
|
TroglodyteMana (1)
|
Troglodyte_Mana
|
pcQlY_whLUCC-FZel18VMg
|
Blister Burrow Arena
|
Unknown Arena
|
ChersoneseDungeonsBosses
|
Definitive Edition Unique Enemies
All enemies included in isForUniqueEnemies. They are all compared by id.
|
Picture
|
Character.Name
|
Character.m_name
|
Character.m_nameLoc
|
Character.UID
|
Wiki location
|
Game location
|
|
Accursed Wendigo
|
WendigoAccursed
|
Unique_DefEd_Wendigo
|
ElxncPIfuEuWkexSKkqFXg
|
Corrupted Tombs
|
Corrupted Tombs
|
|
Altered Gargoyle
|
GargoyleAltered
|
Unique_DefEd_AlteredGargoyle
|
dhQVMNRU5kCIWsWRFYpDdw
|
Ziggurat Passage
|
Ziggurat Passage
|
|
Ancestral General
|
SkeletonBig (1)
|
Unique_DefEd_AncestorBig
|
XVuyIaCAVkatv89kId9Uqw
|
Necropolis
|
Necropolis
|
|
Ancestral Soldier
|
SkeletonSmall (1)
|
Unique_DefEd_AncestorSmall
|
IwZYxBIQZkaXXMWT9HC5nA
|
Necropolis
|
Necropolis
|
|
Bloody Alexis
|
HumanArmoredThug
|
Unique_DefEd_ArmoredThug
|
VfYPPb4wcESdDVSiEq4UhA
|
Undercity Passage
|
Undercity Passage
|
|
Calygrey Hero
|
LionmanElite (1)
|
Elite_Calygrey
|
pMfhK69Stky7MvE9Ro0XMQ
|
Steam Bath Tunnels
|
Steam Bath Tunnels
|
|
Chromatic Arcane Elemental
|
ElementalChromatic
|
Unique_DefEd_ChromaElemental
|
RM13rq4JTEqbuANnncMCKA
|
Compromised Mana Transfer Station
|
Compromised Mana Transfer Station
|
|
Cracked Gargoyle
|
GargoyleCracked
|
Unique_DefEd_CrackedGargoyle
|
-McLNdZsNEa3itw-ny7YBw
|
Ark of the Exiled
|
Ark of the Exiled
|
|
Crescent Shark
|
ElementalParasite
|
Wildlife_CrescentShark
|
YDPy9S-An0-qGuvrJAM8yA
|
Crumbling Loading Docks
|
Crumbling Loading Docks
|
|
Executioner Bug
|
ExecutionerBug
|
Unique_DefEd_ExecutionerBug
|
MWplmyrxokSXELL63oWcAg
|
The Slide
|
The Slide
|
|
Ghost of Vanasse
|
GhostOfVanasse
|
Undead_GhostVanasse
|
R5UngwGS5EGWCH13toZO8Q
|
Chersonese
|
Chersonese
|
|
Giant_Horror
|
GiantHorror
|
Giant_Horror
|
SntMM-EzuE-ptgmqp4qkYQ
|
Crumbling Loading Docks
|
Crumbling Loading Docks
|
|
Glacial Tuanosaur
|
TuanosaurIce
|
Unique_DefEd_GlacialTuano
|
1IKBT9DYc0yIkESwKtU40g
|
Conflux Chambers
|
Conflux Chambers
|
|
Golden Matriarch
|
SpecterMeleeMatriarch
|
Unique_DefEd_GoldenMatriarch
|
GI-aE4Ry7UOIyAYYk7emFg
|
Voltaic Hatchery
|
Voltaic Hatchery
|
|
Grandmother Medyse
|
JellyFishMother
|
Unique_DefEd_GrandmotherMedyse
|
kp9R4kaoG02YfLdS9ROM4w
|
Sulphuric Caverns
|
Sulphuric Caverns
|
|
Greater Grotesque
|
ImmaculateHorrorGreater
|
Unique_DefEd_GreaterGrotestue
|
JmeufMpL_E6eYnqCYP2r3w
|
Lost Golem Manufacturing Facility
|
Lost Golem Manufacturing Facility
|
|
Guardian of the Compass
|
GolemBoss
|
Golem_Basic2
|
BINT--E9xUaCgp4onBM54g
|
The Walled Garden
|
Abrassar
|
|
Kazite Admiral
|
HumanKaziteCaptain
|
Unique_DefEd_KaziteCaptain
|
XVuyIaCAVkatv89kId9Uqw
|
Abandoned Living Quarters
|
Abandoned Living Quarters
|
|
Lightning Dancer
|
BladeDancerLight
|
Unique_DefEd_LightningDancer
|
QRzc3AYY10CWyXOMgrIQTg
|
Ancient Foundry
|
Ancient Foundry
|
|
Liquid-Cooled Golem
|
GolemShieldedIce
|
Unique_DefEd_LiquidGolem
|
8ztut4_yiEmK0-NFLa-XNQ
|
Destroyed Test Chambers
|
Destroyed Test Chambers
|
|
Luke the Pearlescent
|
NewBanditEquip_WhiteScavengerCaptainBoss_A (1)
|
Bandit_Standard_Captain2
|
XVuyIaCAVkatv89kId9Uqw
|
Ruins of Old Levant
|
Abrassar
|
|
Mad Captain’s Bones
|
SkeletFighter
|
Undead_Skeleton2
|
JM_HjGXMlkq7a1Yb6gijgQ
|
Pirates' Hideout
|
Chersonese Misc. Dungeons
|
|
Matriarch Myrmitaur
|
MyrmElite (1)
|
Elite_Myrm
|
6sB4_5lOJU2bWuMHnOL4Ww
|
Myrmitaur’s Haven
|
Myrmitaur’s Haven
|
|
Quartz Elemental
|
ObsidianElementalQuartz
|
Unique_DefEd_QuartzElemental
|
LhhpSt8BO0aRN5mbeSuDrw
|
The Grotto of Chalcedony
|
The Grotto of Chalcedony
|
|
Razorhorn Stekosaur
|
SteakosaurBlack (1)
|
Unique_DefEd_BlackSteko
|
03dSXwJMRUuzGu8s3faATQ
|
Reptilian Lair
|
Reptilian Lair
|
|
The Royal Manticore
|
RoyalManticore
|
Wildlife_Manticore2
|
RM13rq4JTEqbuANnncMCKA
|
Enmerkar Forest
|
Enmerkar Forest
|
|
Rusted Enforcer
|
GolemRusted (1)
|
Unique_DefEd_RustyGolem
|
Ed2bzrgz5k-cRx3bUYTfmg
|
Ghost Pass
|
Ghost Pass
|
|
Sandrose Horror
|
ShelledHorrorBurning
|
Unique_DefEd_SandroseHorror
|
H7HoCKhBl0mC1j9UOECDrQ
|
Sand Rose Cave
|
Sand Rose Cave
|
|
She Who Speaks
|
AncientDwellerSpeak
|
Unique_DefEd_BossDweller
|
MBooN38mU0GPjQJGRuJ95g
|
The Vault of Stone
|
The Vault of Stone
|
|
That Annoying Troglodyte
|
TroglodyteAnnoying
|
Unique_DefEd_AnnoyingTrog
|
no-Z4ibpcEWbNntm_wRwZA
|
Jade Quarry
|
Jade Quarry
|
|
The Crusher
|
HumanCrusher (1)
|
Unique_DefEd_DesertCrusher
|
AZL-EjXmhkOYB1obj0VkTw
|
Ancestor’s Resting Place
|
Ancestor’s Resting Place
|
|
The First Cannibal
|
WendigoCanibal
|
Wildlife_Wendigo2
|
wrYHXXh8J0KMhwoV8AC59w
|
Face of the Ancients
|
Face of the Ancients
|
|
The Last Acolyte
|
HumanAcolyte (1)
|
Unique_DefEd_LastAcolyte
|
YeYzQP-gYUmSivlk5JCJew
|
Stone Titan Caves
|
Stone Titan Caves
|
|
Troglodyte Archmage
|
TroglodyteArcMageDefEd (1)
|
Unique_DefEd_TrogMage
|
syKWNGT3QUO3nXxPt1WEcQ
|
Blister Burrow
|
Blister Burrow
|
|
Jade Lich
|
TitanGolemHalberd
|
Undead_LichJade
|
65aI6XT89kmHa1bwJz5PGQ
|
Ruined Warehouse
|
Ruined Warehouse
|
|
TitanGolemHammer
|
G_Q0oH1ttkWAZXCMuaAHjA
|
|
TitanGolemSword
|
wj3frikyIkqwVv7myrc5gw
|
|
Tyrant of the Hive
|
HiveLord1AID+
|
Undead_Hivelord2
|
yOo-iKN3-0mAtZ2pG16pyw
|
Forest Hives
|
Forest Hives
|
|
Vile Illuminator
|
IlluminatorHorrorVile
|
Unique_DefEd_VileIlluminator
|
l5ignQfsE0Cv4imB9DZJ5w
|
Cabal of Wind Temple
|
Cabal of Wind Temple
|
|
Virulent Hiveman
|
HiveManVirulent
|
Unique_DefEd_VirulentHiveman
|
v1PnLFpcxEmm_IrZaP-eyg
|
Ancient Hive
|
Ancient Hive
|
All Parameters
| Required atleast one of type | Parameter | Type | Description |
| Item | Builds ItemDropChance Internally | itemId | int | Required if itemDropChance/listOfItemDropChances is not provided. Loot item ID. |
| dropChance | int | Optional. Default is 10. Determines chance of dropping item. You can provide ItemDropChance instead if you like. |
| minDropCount | int | Optional. Default is 1. Provides minimum amount of items could be dropped. You can provide ItemDropChance instead if you like. |
| dropChance | int | Optional. Default is 1. Provides maximum amount of items could be dropped. You can provide ItemDropChance instead if you like. |
| minDiceRollValue | int | Optional. Default is 0. Sets the lowest dice roll value at which item drop chances begin to count. Use together with 'maxDiceRollValue' and 'maxDiceValue'. You can provide ItemDropChance instead if you like. |
| maxDiceRollValue | int | Optional. Default is 0. Sets the highest dice roll value considered when calculating item drop chances. Use together with 'minDiceRollValue' and 'maxDiceValue'. You can provide ItemDropChance instead if you like. |
| Choice to provide instead | listOfItemDropChances | List<string> | Optional. Default null. Provide your created list of your ItemDropChance instances to be dropped. |
| itemDropChance | ItemDropChance | Optional. Default null. Provide your created ItemDropChance instance to be dropped. |
| Enemy | enemyId | string | Default null. Determines if drop should be appliead for enemy. You can get this from UnityExplorer mod or logs. |
| enemyName | string | Default null. Determines if drop should be appliead for enemy. You can get this from UnityExplorer mod or logs. |
| area | AreaManager.AreaEnum? | Optional. Default nullable. Determines if drop should be appliead for specific area. You can get this from AreaManager.AreaEnum enum. |
| areaFamily | AreaFamily | Optional. Default null. Determines if drop should be appliead for specific area family(region). You can get this from AreaManager.AreaFamilies variable. |
| faction | Character.Factions? | Optional. Default nullable. Determines if drop should be appliead for specific faction. You can get this from Character.Factions enum. |
| isForBosses | bool | Optional. Default false. Determines if drop should be appliead for all game bosses and pawns. |
| isForBossPawns | bool | Optional. Default false. Should drop be applied for bosses pawns? |
| isForStoryBosses | bool | Optional. Default false. Should drop be applied for story bosses? |
| isForUniqueArenaBosses | bool | Optional. Default false. Should drop be applied for unique arena bosses? |
| isForUniqueEnemies | bool | Optional. Default false. Should drop be applied for unique enemies? |
| Not Required | lootId | string | Optional. You will need loot id if you planning to remove loot later. |
| listExceptIds | List<string> | Optional. Default null. List of enemy ids that will not receive loot. You can get this from Character.UID.Value . |
| listExceptNames | List<string> | Optional. Default null. List of enemy names that will not receive loot. You can get this from Character.Name . |
| minNumberOfDrops | int | Optional. Default is 1. Determines minimum amout of drops for same provided items(ItemDropChance). |
| maxNumberOfDrops | int | Optional. Default is 1. Determines maximum amout of drops for same provided items(ItemDropChance). |
| emptyDropChance | int | Optional. Default is 0. Defines the percentage chance for a drop to be empty. Used together with 'maxDiceValue'. |
|
Parameters used for rules control
|
| Parameter | Type | Description |
| filePath | string | Required. Used for loading custom loots from xml file. |
| filePath | string | Required. Used for loading custom loots from xml file. |
| lootRuleId | string | Provides loot rule id. |
Known Bugs
Unique Enemies
The unique arena boss Grandmother and its pawn enemies, the Kryptia
Warriors, do not drop loot because they never trigger the
Lootable.OnDeath event. Not a priority for me right now to fix it.
Can I find full project example how to use this?
You can view outward enchantments balancer pack here.
How to set up
To manually set up, do the following
- Create the directory:
Outward\BepInEx\plugins\OutwardLootManager\.
- Extract the archive into any directory(recommend empty).
- Move the contents of the plugins\ directory from the archive into the
BepInEx\plugins\OutwardLootManager\ directory you created.
- It should look like
Outward\BepInEx\plugins\OutwardSceneTester\OutwardLootManager.dll
Launch the game.
If you liked the mod leave a star on GitHub it's free