278 lines
No EOL
6 KiB
Text
278 lines
No EOL
6 KiB
Text
===============================================
|
|
EXILE HUNTER'S BESTIARY - ModernUO EDITION
|
|
Final stable version
|
|
Author: Imagine
|
|
Refactored: Expa
|
|
===============================================
|
|
|
|
INSTALL
|
|
|
|
1. Copy the ExileHunterBestiary folder to:
|
|
|
|
Projects/UOContent/Custom/ExileHunterBestiary/
|
|
|
|
2. Make sure the generated death-event file exists:
|
|
|
|
HunterCreatureDeathEvent.cs
|
|
|
|
3. Build the project:
|
|
|
|
dotnet build
|
|
|
|
4. Start the server.
|
|
|
|
IMPORTANT:
|
|
|
|
The final version does not require any changes to BaseCreature.cs.
|
|
|
|
Do not add:
|
|
- EventSink.CreatureDeath
|
|
- a custom Kill() override
|
|
- a custom OnDeath() override
|
|
- a BaseCreature damage patch
|
|
|
|
Do not keep this legacy file:
|
|
|
|
BaseCreature.ExileHunterBestiary.cs
|
|
|
|
Do not keep old patch files such as:
|
|
|
|
PATCH_BaseCreature.txt
|
|
|
|
|
|
ACTIVE DEATH HANDLER
|
|
|
|
Creature deaths are handled by the generated ModernUO event:
|
|
|
|
BaseCreature.CreatureDeathEvent
|
|
|
|
The handler is located in:
|
|
|
|
HunterCreatureDeathEvent.cs
|
|
|
|
This is not an EventSink event. Do not use:
|
|
|
|
EventSink.CreatureDeath
|
|
|
|
|
|
COMBAT TRACKING
|
|
|
|
HunterCombatTracker receives player combat activity through:
|
|
|
|
EventSink.AggressiveAction
|
|
|
|
The tracker stores:
|
|
|
|
- the last player attacker;
|
|
- the player's pet owner when applicable;
|
|
- the creature serial;
|
|
- the creature location;
|
|
- the creature map;
|
|
- the time of the last hit.
|
|
|
|
The stored location is used because ModernUO can remove the creature
|
|
before the generated death event is handled.
|
|
|
|
|
|
CORPSE DROPS
|
|
|
|
The treatise is placed into the creature's corpse.
|
|
|
|
If the corpse is not available immediately, the system retries for a
|
|
short period.
|
|
|
|
The system does not intentionally place the treatise on the ground.
|
|
|
|
If no corpse can be found after the retry period, the drop is canceled.
|
|
|
|
|
|
CONFIGURATION
|
|
|
|
Add these values inside the "settings" object in modernuo.json:
|
|
|
|
"exileBestiary.enabled": "True",
|
|
"exileBestiary.debug": "False",
|
|
"exileBestiary.damage.mode": "Mark",
|
|
"exileBestiary.damage.perCreatureBonus": "0.10",
|
|
"exileBestiary.damage.categoryMilestoneBonus": "0.20",
|
|
"exileBestiary.damage.totalCap": "0.25",
|
|
"exileBestiary.damage.markDuration": "00:00:10",
|
|
"exileBestiary.damage.markTickSeconds": "00:00:02",
|
|
"exileBestiary.damage.markTickPercent": "0.01",
|
|
"exileBestiary.drop.chance": "-1.0",
|
|
"exileBestiary.drop.pityThreshold": "40"
|
|
|
|
Drop chance values:
|
|
|
|
-1.0 Use the creature's registered chance
|
|
1.0 100% chance
|
|
0.5 50% chance
|
|
0.02 2% chance
|
|
0.0 No random drops
|
|
|
|
Example for guaranteed drops:
|
|
|
|
"exileBestiary.drop.chance": "1.0"
|
|
|
|
The configuration must be inside:
|
|
|
|
{
|
|
"settings": {
|
|
...
|
|
}
|
|
}
|
|
|
|
|
|
DAMAGE MODE
|
|
|
|
The recommended mode is:
|
|
|
|
"exileBestiary.damage.mode": "Mark"
|
|
|
|
Mark mode is patch-free and does not require BaseCreature.cs changes.
|
|
|
|
The mark system uses:
|
|
|
|
- EventSink.AggressiveAction
|
|
- a timer
|
|
- public ModernUO APIs
|
|
|
|
It applies periodic bonus damage while the hunter remains near
|
|
the marked creature.
|
|
|
|
|
|
COMMANDS
|
|
|
|
[Bestiary
|
|
|
|
Opens the Hunter's Bestiary.
|
|
|
|
[Bestiario
|
|
|
|
Alias for [Bestiary.
|
|
|
|
[BestiaryTest
|
|
|
|
Game Master command that runs the treatise pipeline against the nearest
|
|
registered creature.
|
|
|
|
The command uses the configured chance and is intended for testing.
|
|
|
|
[BestiaryDiag
|
|
|
|
Game Master diagnostic command that displays combat-tracker counters.
|
|
|
|
|
|
STARTUP CHECK
|
|
|
|
The server should report a bestiary initialization message similar to:
|
|
|
|
Initialized with N creatures across 8 categories.
|
|
|
|
When Mark mode is enabled, it should also report:
|
|
|
|
Hunter's Mark enabled ...
|
|
|
|
|
|
TROUBLESHOOTING
|
|
|
|
No treatise appears:
|
|
|
|
1. Confirm the creature exists in BestiaryData.cs.
|
|
2. Confirm the creature type was registered at startup.
|
|
3. Confirm exileBestiary.enabled is True.
|
|
4. Confirm the player actually damaged the creature.
|
|
5. Confirm EventSink.AggressiveAction is receiving events.
|
|
6. Confirm the generated event file exists.
|
|
7. Confirm no old BaseCreature patch file remains.
|
|
8. Set exileBestiary.drop.chance to 1.0.
|
|
9. Temporarily set exileBestiary.debug to True.
|
|
|
|
No combat events are tracked:
|
|
|
|
Run:
|
|
|
|
[BestiaryDiag
|
|
|
|
The AggressiveAction counter should increase after attacking a creature.
|
|
|
|
Log says "killer not resolved":
|
|
|
|
The system did not receive LastKiller and did not find a valid player
|
|
in HunterCombatTracker.
|
|
|
|
Log says "killer is not a player":
|
|
|
|
The kill was credited to an NPC, an uncontrolled creature, or another
|
|
non-player source.
|
|
|
|
Log says "creature not registered":
|
|
|
|
The creature type is not present in BestiaryData.cs or could not be
|
|
resolved by AssemblyHandler.FindTypeByName.
|
|
|
|
Treatise is already learned:
|
|
|
|
A player receives only one treatise for a creature that has already
|
|
been mastered. Additional drops are blocked for that player.
|
|
|
|
Treatise is not visible:
|
|
|
|
Open the creature corpse and check its contents. The treatise is not
|
|
automatically placed into the player's backpack.
|
|
|
|
|
|
SAVE DATA
|
|
|
|
Profiles are stored at:
|
|
|
|
Data/ExileHunterProfiles.xml
|
|
|
|
Saved data includes:
|
|
|
|
- learned creature IDs;
|
|
- pity counters;
|
|
- player serials.
|
|
|
|
Invalid creature IDs are ignored during loading.
|
|
|
|
|
|
FILES TO KEEP
|
|
|
|
BestiaryCategory.cs
|
|
BestiaryData.cs
|
|
BestiaryRegistry.cs
|
|
DamageMode.cs
|
|
HunterBestiaryEngine.cs
|
|
HunterCombatTracker.cs
|
|
HunterCreatureDeathEvent.cs
|
|
HunterCreatureEntry.cs
|
|
HunterProfile.cs
|
|
HunterProfileStore.cs
|
|
HunterBestiaryGump.cs
|
|
HunterDamageHook.cs
|
|
HunterDeathHook.cs
|
|
HunterMarkHook.cs
|
|
HunterBestiary.cs
|
|
HunterTreatise.cs
|
|
|
|
|
|
LEGACY FILES TO REMOVE
|
|
|
|
BaseCreature.ExileHunterBestiary.cs
|
|
PATCH_BaseCreature.txt
|
|
|
|
Also remove any legacy bestiary file that overrides:
|
|
|
|
BaseCreature.Kill()
|
|
BaseCreature.OnBeforeDeath()
|
|
BaseCreature.OnDeath()
|
|
|
|
|
|
PRODUCTION SETTINGS
|
|
|
|
After confirming the system works, use:
|
|
|
|
"exileBestiary.debug": "False"
|
|
|
|
Keep debug enabled only while diagnosing the drop pipeline. |