158 Commits

Author SHA1 Message Date
GreenComfyTea
bfd9463c9e Merge branch 'main' of https://github.com/GreenComfyTea/MHR-Overlay 2023-09-15 12:58:19 +03:00
GreenComfyTea
ae336eea2f Weapon Skills: Add Arc Shot: Affinity and Arc Shot: Brace 2023-09-15 12:58:03 +03:00
GreenComfyTea
5454bdd48e Skills: Add Partbreaker 2023-09-15 12:57:11 +03:00
GreenComfyTea
80e309a5dd Abnormal Statuses: Fix Error Message 2023-09-15 12:56:41 +03:00
GreenComfyTea
f1102eaa28 Endemic Life Buffs: Add Red and Yellow Lampsquids 2023-09-15 12:55:32 +03:00
GreenComfyTea
bd02dab872 Fix dango_skills error message 2023-09-15 12:54:59 +03:00
GreenComfyTea
8887f3c235 Rename consumables to item_buffs 2023-09-15 12:54:03 +03:00
GreenComfyTea
5177a207a9 Update README.md 2023-09-14 18:54:05 +03:00
GreenComfyTea
50131b08f1 Remove Kushala Daora Soul string 2023-09-06 16:31:54 +03:00
GreenComfyTea
89bb48602d language.lua upd 2023-09-06 16:31:10 +03:00
GreenComfyTea
1580b4c4c2 Add Embolden, Berserk, Powder Mantle, Strife, Inspiration, Blood Awakening Skills, move Kushala Daora Soul to Rampage Skills 2023-09-06 16:30:54 +03:00
GreenComfyTea
5c42502700 Remove Might/Adamant Seeds (covered by Attack/Defense Up) and Dash Juice(covered by Stamina Use Down) 2023-09-06 16:29:56 +03:00
GreenComfyTea
d7a4450a37 Add Stinkmink, remove Peepersects (covered by Stamina Use Down) 2023-09-06 16:28:48 +03:00
GreenComfyTea
590b3b17c2 Remove Dango Bulker (covered by Attack Up) 2023-09-06 16:27:17 +03:00
GreenComfyTea
e20af6479e Move Attack Up, Defense Up, Stamina Use Down to Misc Buffs 2023-09-06 16:26:55 +03:00
GreenComfyTea
6bab1b2435 Add Rampage Skills to Update Function 2023-09-06 16:26:08 +03:00
GreenComfyTea
195252ed70 Abnormal Statuses: Add Falling Asleep 2023-09-06 16:25:09 +03:00
GreenComfyTea
b9a3088658 Add Rampage Skills 2023-09-06 16:24:17 +03:00
GreenComfyTea
a8060c8c58 Rename "Dangos" to "Dango Skills" 2023-09-05 15:03:53 +03:00
GreenComfyTea
49cac58bec Dangos: Add Dango Insurance 2023-09-05 14:19:02 +03:00
GreenComfyTea
af53399c50 Add Dango Flyer, Dango Connector and Super Recovery Dango 2023-09-04 10:43:52 +03:00
GreenComfyTea
a418bb0132 Fix Dango Insurance Defense Up Lv.4 showing all the time 2023-09-04 09:29:30 +03:00
GreenComfyTea
5f609a588a Dangos: Add Dango Insurance Defense Up, Dango Hunter and Dango Connector 2023-09-03 15:53:11 +03:00
GreenComfyTea
8fb02699cc Fix init_names() 2023-09-03 14:16:32 +03:00
GreenComfyTea
b52c903af3 Fix Errors from Previous Commit 2023-09-03 13:58:52 +03:00
GreenComfyTea
8ae3928fdc Pull Most Buff Name from the Game
+ Solve Consumable Buff Timer Collisions
2023-09-03 13:36:03 +03:00
GreenComfyTea
bf282ca13b Weapon Skills: Add All Weapons 2023-08-25 15:10:15 +03:00
GreenComfyTea
c7b9e5b8f9 Skills: Add Bladescale Hone 2023-08-25 15:09:21 +03:00
GreenComfyTea
e67fbf923f Refactoring 2023-08-21 17:29:57 +03:00
GreenComfyTea
1d31a86a3f Cache mValues of ValTypes (Single) 2023-08-21 17:29:16 +03:00
GreenComfyTea
e4108f7fa9 Add Weapon Skills (Great Sword, Switch Axe, Long Sword) 2023-08-21 17:28:36 +03:00
GreenComfyTea
4ede59c8c2 Cache mValue field of ValTypes (Int32 and Single) 2023-08-21 17:25:39 +03:00
GreenComfyTea
2db41e237f utils.type: Add is_boolean(), is_REField(), is_REMethodDefinition() 2023-08-21 17:25:07 +03:00
GreenComfyTea
f9c1d89843 Fix Endemic Life UI not showing 2023-08-20 16:15:25 +03:00
GreenComfyTea
f086ff2d5d Endemic Life Buffs: Add Ruby and Gold Wirebugs 2023-08-20 16:15:00 +03:00
GreenComfyTea
5e5df84308 Otomo Moves: Add Power Drum and Go, Fight, Win 2023-08-20 16:14:19 +03:00
GreenComfyTea
528d7f7238 Skills: Add Status Trigger 2023-08-20 16:13:49 +03:00
GreenComfyTea
1c83b282ef Update Otomo Entity when Swapping Otomos 2023-08-20 13:29:33 +03:00
GreenComfyTea
a41ec08903 Skills: +Peak Performance, Dragonheart, Resentment 2023-08-20 13:27:24 +03:00
GreenComfyTea
89571bd2f4 Buff UI: Add Otomo Moves 2023-08-20 13:26:34 +03:00
GreenComfyTea
1fcb9aea5a Dangos: Add Dango Adrenaline, Fix Dango Defender 2023-08-20 13:26:09 +03:00
GreenComfyTea
13e68d67a9 Stats UI: Add Health and Max Health 2023-08-20 10:48:25 +03:00
GreenComfyTea
67e0e6db6b Update Highlighted Monster every frame 2023-08-20 09:29:50 +03:00
GreenComfyTea
e79660010b Don't display Monster Size if 0 2023-08-20 09:29:30 +03:00
GreenComfyTea
c597d1df09 Skills: Add Maximum Might, Bloodlust, Frenzied Bloodlust 2023-08-19 16:17:03 +03:00
GreenComfyTea
bcb6355b61 Add remove_delay_timer() 2023-08-19 16:15:48 +03:00
GreenComfyTea
4f5350b631 Abnormal Statuses: Add Deadly Poison, Minor/Major Bubbleblight 2023-08-19 16:15:16 +03:00
GreenComfyTea
475cd22610 Remember Customization Open/Closed State per Session Only 2023-08-18 13:00:00 +03:00
GreenComfyTea
a33b196521 Update Large Monster Health when Host on Player Join but it actually works 2023-08-18 10:27:36 +03:00
GreenComfyTea
d5b83eef2a Fix typo 2023-08-18 10:26:49 +03:00
GreenComfyTea
2efdbd5f1a Implement Delay Timers 2023-08-17 12:28:12 +03:00
GreenComfyTea
5125de6701 Fix 2nd buddy appearing on online quests 2023-08-17 12:19:38 +03:00
GreenComfyTea
1c9eff6b06 Update Large Monster Health when Host on Player Join? 2023-08-17 12:18:55 +03:00
GreenComfyTea
6456e3bfaf formatting 2023-08-17 12:17:41 +03:00
GreenComfyTea
f23cce3ba1 Formatting 2023-08-17 09:56:27 +03:00
GreenComfyTea
6528394876 Add Missing Highlighted Cart Count Label Customization 2023-08-17 09:53:19 +03:00
GreenComfyTea
fcfdb33dbf Fix Highlighted Cart Count Label not working 2023-08-17 09:52:48 +03:00
GreenComfyTea
6f742d3234 Use in-game _DieCount instead of Manual Counting 2023-08-17 09:48:24 +03:00
GreenComfyTea
64130aa68c Formatting 2023-08-17 09:47:09 +03:00
GreenComfyTea
1f0cd6e883 Fix Abnormal Statuses showing trash values when teleporting to Training Area 2023-08-16 13:53:34 +03:00
GreenComfyTea
2d669a6c4a Stop using d2d.surface_size() 2023-08-16 12:36:48 +03:00
GreenComfyTea
2d77b78a1c Add more Singletons existence verifications 2023-08-16 12:34:17 +03:00
GreenComfyTea
aac30e7a08 Fix Damage Meter UI bugs
when Hide Total Damage was hiding whole module instead
2023-08-16 12:21:22 +03:00
GreenComfyTea
f2675e6d23 Move players.display_list to damage_meter_UI 2023-08-16 11:41:20 +03:00
GreenComfyTea
5ff6af9108 Move update_quest_time timer to init_global_timers 2023-08-16 10:32:43 +03:00
GreenComfyTea
728b7f990f Move timers initializations into time.lua 2023-08-16 10:30:59 +03:00
GreenComfyTea
758a02bce8 Add Stats UI 2023-08-15 16:02:01 +03:00
GreenComfyTea
9d16048c8d Move logic out from REF D2D loop callback 2023-08-11 16:10:19 +03:00
GreenComfyTea
084dd9667e Abnormal Statuses: Implemented 2023-08-10 16:52:47 +03:00
GreenComfyTea
c509876712 Skills: Refactoring + Added Heroics, Resuscitate 2023-08-10 16:51:34 +03:00
GreenComfyTea
7b63e34ad0 Melody Effects: Use key if missing name 2023-08-10 16:50:19 +03:00
GreenComfyTea
c6a520996f Dangos: Use key if missing name 2023-08-10 16:49:58 +03:00
GreenComfyTea
f6fefb19d4 Consumables: Formatting + Use key if missing name 2023-08-10 16:49:42 +03:00
GreenComfyTea
1c20591b33 Fix Total Damage registering too large values 2023-08-10 16:48:41 +03:00
GreenComfyTea
3e66b920ef Skills: Add more skills
+ Latent Power, Protective Polish, Wind Mantle, Heaven-Sent, Grinder (S), Counterstrike, Affinity Sliding, Coalescence, Adrenaline Rush, Wall Runner, Offensive Guard, Hellfire Cloak, Agitator, Furious.
2023-08-09 16:11:53 +03:00
GreenComfyTea
7f38532026 Buffs: Use default values 2023-08-09 16:09:13 +03:00
GreenComfyTea
b805d88205 Change default values 2023-08-09 16:08:27 +03:00
GreenComfyTea
a100932a02 Melody Effects: move individual melody effect update into separate function 2023-08-09 16:07:53 +03:00
GreenComfyTea
692e911617 Consumables: Refactor most individual methods into 1 universal method 2023-08-09 16:06:51 +03:00
GreenComfyTea
6c2d09b505 Add some dangos, skills and endemic life buffs 2023-08-08 16:23:17 +03:00
GreenComfyTea
26966818b3 Dont update buffs if buff UI is disabled 2023-08-08 13:05:05 +03:00
GreenComfyTea
e09c82278d Optimize small monster UI drawing function 2023-08-08 13:04:40 +03:00
GreenComfyTea
e1d3754733 Fix is_health_initialized variable not being set to true 2023-08-08 12:24:33 +03:00
GreenComfyTea
6b8809b79e Add more quest_status restrictions 2023-08-06 16:20:15 +03:00
GreenComfyTea
d20446fe37 Change default customization menu window height 2023-08-06 16:08:35 +03:00
GreenComfyTea
4e4aae3c68 Update localizations 2023-08-06 16:08:06 +03:00
GreenComfyTea
3e121fbd1c Add Customization Menu status, position and size to config
+ Customization Menu bugfixes
2023-08-06 15:57:48 +03:00
GreenComfyTea
ade8a6bf19 Formatting 2023-08-06 14:43:41 +03:00
GreenComfyTea
0eac453bf4 Add some quest_status restrictions 2023-08-06 14:27:23 +03:00
GreenComfyTea
c4b7f6d195 Fix Health access attempts outside hooks
(large monster updated in previous commit)
2023-08-06 14:26:59 +03:00
GreenComfyTea
e389f6cf53 Remove magical numbers of stealth monster ids + process toadversary properly + Fix Crown Threshold Typo 2023-08-06 14:25:22 +03:00
GreenComfyTea
9e8c77f480 Singletons are not real singletons so track changes 2023-08-06 13:25:05 +03:00
GreenComfyTea
9c2bc59a37 Undo previous commit 2023-08-06 12:24:08 +03:00
GreenComfyTea
effe5579a7 Move env.creature.update_position to draw function 2023-08-06 12:22:09 +03:00
GreenComfyTea
0fbf47f7ff comment out monster update_position 2023-08-06 12:18:02 +03:00
GreenComfyTea
3e508c0e28 Move highlight_id to large_monster from draw function 2023-08-06 12:17:06 +03:00
GreenComfyTea
972d874a99 Clean up 2023-08-06 12:15:42 +03:00
GreenComfyTea
50726b9291 Init Singletons on init_module 2023-08-06 12:15:25 +03:00
GreenComfyTea
c39e5babea Rename list to array 2023-08-06 12:14:59 +03:00
GreenComfyTea
d1f56f4316 Ignore error during REFramework Initialization 2023-08-06 12:14:34 +03:00
GreenComfyTea
d3efcb5b08 Typo 2023-08-06 12:14:13 +03:00
GreenComfyTea
681b865f03 Create missing small monster entries in draw function 2023-08-06 12:13:48 +03:00
GreenComfyTea
6f40a1dfd3 Update localizations 2023-08-06 12:13:12 +03:00
GreenComfyTea
432e115aea Fix fake error when assigning creature name 2023-08-06 12:12:41 +03:00
GreenComfyTea
dfb7893c1a Implement Error Handler 2023-08-05 16:30:15 +03:00
GreenComfyTea
4bdb4ee2e6 Separate Dependency Initializations 2023-08-05 11:24:26 +03:00
GreenComfyTea
30672922c4 Add callback timers 2023-08-05 10:50:36 +03:00
GreenComfyTea
31b5251c75 Fix Follower Otomo Percentage DMG being incorrectly formatted 2023-08-04 19:36:18 +03:00
GreenComfyTea
71b1992710 Add Horn Melody Effects to Buff UI 2023-08-04 19:35:25 +03:00
GreenComfyTea
63ddbff12a Fix Consumable Buff UI not working in online request if not host 2023-08-03 12:21:17 +03:00
GreenComfyTea
0359042c97 Fix Buff timers showing xx:60 sometimes 2023-08-03 12:20:36 +03:00
GreenComfyTea
c8dab31265 Add back(?) label include customization code 2023-08-03 12:20:08 +03:00
GreenComfyTea
405c5e4aad Fix continue labels ambiguity 2023-08-03 12:19:41 +03:00
GreenComfyTea
597d27b935 Uncomment Buff UI code 2023-08-03 12:19:13 +03:00
GreenComfyTea
90190f5af7 Implement Consumable Buffs 2023-06-30 18:57:14 +03:00
GreenComfyTea
b5757e3b1e Fix hotkeys not saving 2023-06-30 13:58:05 +03:00
GreenComfyTea
0992b918a3 Update README.md 2023-06-14 17:36:16 +03:00
GreenComfyTea
7865b3276c Update README.md 2023-06-14 17:07:58 +03:00
GreenComfyTea
cc1fe03272 Update README.md 2023-06-11 13:07:27 +03:00
GreenComfyTea
57585cb5b5 Update README.md 2023-06-11 12:59:11 +03:00
GreenComfyTea
96563f92f7 Update README.md 2023-06-11 12:51:08 +03:00
GreenComfyTea
ea29e20a2c Update README.md 2023-06-10 20:39:20 +03:00
GreenComfyTea
0a84471abc Update README.md 2023-06-10 18:49:22 +03:00
GreenComfyTea
da2af8671a Update README.md 2023-06-10 18:47:56 +03:00
GreenComfyTea
474d0b9eb8 Update README.md 2023-06-10 18:45:12 +03:00
GreenComfyTea
e4057b84f5 Update README.md 2023-06-10 18:38:57 +03:00
GreenComfyTea
3ac048aef9 Update README.md 2023-06-10 18:29:22 +03:00
GreenComfyTea
9c3085198d Update README.md 2023-06-10 18:26:27 +03:00
GreenComfyTea
ecf119dd97 Update README.md 2023-06-10 17:48:58 +03:00
GreenComfyTea
663b456a4f Fix Total Cart Count showing lower value by 1 2023-06-10 14:20:11 +03:00
GreenComfyTea
e571ca62eb Update README.md 2023-06-10 09:38:35 +03:00
GreenComfyTea
3b99512bb6 Merge branch 'main' of https://github.com/GreenComfyTea/MHR-Overlay 2023-06-10 09:34:51 +03:00
GreenComfyTea
0fe53700ae Update ko-kr localization to v2.5 2023-06-10 09:34:44 +03:00
GreenComfyTea
488da17887 Merge pull request #65 from sukiqwq/main 2023-06-09 09:33:35 +03:00
RqLiu
25d0035c16 Update zh-cn.json 2023-06-09 02:56:22 +08:00
RqLiu
34ac9e3c54 Update zh-cn.json 2023-06-09 02:54:51 +08:00
RqLiu
ce212ff757 Update zh-cn.json 2023-06-09 02:51:48 +08:00
GreenComfyTea
cd1d90b66b Map Primordial Malzeno part names 2023-06-08 09:52:38 +03:00
GreenComfyTea
788152aecd Rename mystery core to anomaly core 2023-06-07 19:44:41 +03:00
GreenComfyTea
e51185892a Change Anomaly Core break hook 2023-06-07 19:44:01 +03:00
GreenComfyTea
6862331ca9 Rename damage types 2023-06-06 11:50:29 +03:00
GreenComfyTea
59f11c4933 Add Anomaly Core Break Damage to Total Damage 2023-06-05 19:36:55 +03:00
GreenComfyTea
8bcd5e0c4a Update ru-ru.json 2023-05-28 17:40:27 +03:00
GreenComfyTea
c56976b97f Add Right Shift Alignment 2023-05-28 17:40:10 +03:00
GreenComfyTea
5af7f53962 Bump version to v2.5 2023-05-28 13:54:08 +03:00
GreenComfyTea
8e77df6fed More caching 2023-05-28 13:53:34 +03:00
GreenComfyTea
d68aacc5bf Cache methods and fields 2023-05-28 13:26:13 +03:00
GreenComfyTea
4f34f76ad7 Add Anomaly Core Health Bars to Parts UI 2023-05-28 12:48:46 +03:00
GreenComfyTea
4da0e1f0c8 Update README.md 2023-05-27 11:33:02 +03:00
GreenComfyTea
7ad40bbb89 Add Bar Fill Direction 2023-05-26 13:18:46 +03:00
GreenComfyTea
e2354eedcc Move combo types into their respective UI elements 2023-05-26 13:07:40 +03:00
GreenComfyTea
20dfde17d4 Fix part names not changing localization 2023-05-26 12:15:19 +03:00
GreenComfyTea
72ca959581 Formatting 2023-05-25 12:32:46 +03:00
GreenComfyTea
cd2aa12d3c Add Proper Unicode Glyph Ranges for Each Language 2023-05-25 12:18:34 +03:00
GreenComfyTea
865512f8d6 Fix Chaotic Gore Magala Wingclaws 2023-04-25 17:02:43 +03:00
GreenComfyTea
ecd150eb4d Make debug.lua a separate script 2023-04-21 13:27:34 +03:00
GreenComfyTea
585860666f Merge branch 'main' of https://github.com/GreenComfyTea/MHR-Overlay 2023-04-21 13:16:14 +03:00
GreenComfyTea
e6556e8d9b Check for debug.lua presence before requiring 2023-04-21 13:16:13 +03:00
71 changed files with 13530 additions and 2309 deletions

144
README.md
View File

@@ -1,10 +1,130 @@
# "MHR Overlay" Mod for Monster Hunter: Rise <p align="center">
<h2 align="center"><b>"MHR Overlay" Mod for Monster Hunter: Rise</b></h2>
<p align="center">Exposes internal game data about monsters, creatures, players, damage, buffs and debuffs. Draws a highly customizable UI.</p>
<p align="center">This mod is solely intended to empower players with means of self-improvement. Please don't use the information provided by this tool to make hurtful comments and actions toward other players.</p>
</p>
Exposes in-game data about monsters, creatures, players and damage. Draws a highly customizable UI. <p align="center">
<a href="https://github.com/greencomfytea/mhr-overlay/graphs/contributors">
<img alt="Contributors" src="https://custom-icon-badges.demolab.com/github/contributors/greencomfytea/mhr-overlay?logo=person-add" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/issues">
<img alt="Issues" src="https://custom-icon-badges.demolab.com/github/issues/greencomfytea/mhr-overlay?logo=issue-opened" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/issues">
<img alt="Issues Closed" src="https://custom-icon-badges.demolab.com/github/issues-closed/greencomfytea/mhr-overlay?logo=issue-closed" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/pulls">
<img alt="Pull Requests" src="https://custom-icon-badges.demolab.com/github/issues-pr/greencomfytea/mhr-overlay?logo=git-pull-request" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/pulls">
<img alt="Pull Requests Closed" src="https://custom-icon-badges.demolab.com/github/issues-pr-closed/greencomfytea/mhr-overlay?logo=git-pull-request-closed" />
</a>
<br>
<a href="https://github.com/greencomfytea/mhr-overlay/blob/main/LICENSE">
<img alt="License" src="https://custom-icon-badges.demolab.com/github/license/greencomfytea/mhr-overlay?logo=law" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/releases">
<img alt="Release Version" src="https://custom-icon-badges.demolab.com/github/v/release/greencomfytea/mhr-overlay?logo=tag" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/releases">
<img alt="Release Date" src="https://custom-icon-badges.demolab.com/github/release-date/greencomfytea/mhr-overlay?logo=clock" />
</a>
<a href="">
<img alt="Platform" src="https://custom-icon-badges.demolab.com/badge/platform-win%20%7C%20linux%20%7C%20steam%20deck-blue?logo=device-desktop" />
</a>
<a href="">
<img alt="Maintenance" src="https://custom-icon-badges.demolab.com/maintenance/yes/2023?logo=tools" />
</a>
<br>
<a href="https://www.nexusmods.com/monsterhunterrise/mods/26">
<img alt="REFramework Dependency" src="https://custom-icon-badges.demolab.com/badge/dependency-REFramework%20v1.503%2B-green?logo=package-dependencies" />
</a>
<a href="https://www.nexusmods.com/monsterhunterrise/mods/134">
<img alt="REFramework Direct2D Dependency" src="https://custom-icon-badges.demolab.com/badge/dependency-REFramework%20Direct2D%20v0.4.0%2B-yellow?logo=package-dependencies" />
</a>
<br>
<br>
<a href="https://github.com/greencomfytea/mhr-overlay/commits/main">
<img alt="Commits" src="https://custom-icon-badges.demolab.com/github/commit-activity/t/greencomfytea/mhr-overlay?logo=git-commit" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/commits/main">
<img alt="Last Commit" src="https://custom-icon-badges.demolab.com/github/last-commit/greencomfytea/mhr-overlay?logo=git-commit" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/commits/main">
<img alt="Commits Since" src="https://custom-icon-badges.demolab.com/github/commits-since/greencomfytea/mhr-overlay/latest?logo=git-commit" />
</a>
<br>
<a href="https://github.com/greencomfytea/mhr-overlay/graphs/commit-activity">
<img alt="Commit Activity (Year)" src="https://custom-icon-badges.demolab.com/github/commit-activity/y/greencomfytea/mhr-overlay?logo=pulse" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/graphs/commit-activity">
<img alt="Commit Activity (Month)" src="https://custom-icon-badges.demolab.com/github/commit-activity/m/greencomfytea/mhr-overlay?logo=pulse" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/graphs/commit-activity">
<img alt="Commit Activity (Week)" src="https://custom-icon-badges.demolab.com/github/commit-activity/w/greencomfytea/mhr-overlay?logo=pulse" />
</a>
<br>
<br>
<a href="">
<img alt="Repo Size" src="https://custom-icon-badges.demolab.com/github/repo-size/greencomfytea/mhr-overlay?logo=database" />
</a>
<a href="">
<img alt="Line Count" src="https://sloc.xyz/github/greencomfytea/mhr-overlay" />
</a>
<a href="">
<img alt="COCOMO" src="https://sloc.xyz/github/greencomfytea/mhr-overlay/?category=cocomo" />
</a>
<a href="">
<img alt="Goto Counter" src="https://custom-icon-badges.demolab.com/github/search/greencomfytea/mhr-overlay/goto?logo=git-compare" />
</a>
<br>
<a href="https://github.com/sponsors/greencomfytea">
<img alt="Sponsors" src="https://custom-icon-badges.demolab.com/github/sponsors/greencomfytea?logo=heart" />
</a>
<a href="https://github.com/GreenComfyTea/mhr-overlay/watchers">
<img alt="Watchers" src="https://custom-icon-badges.demolab.com/github/watchers/greencomfytea/mhr-overlay?logo=eye" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/forks">
<img alt="Forks" src="https://custom-icon-badges.demolab.com/github/forks/greencomfytea/mhr-overlay?logo=repo-forked" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/stargazers">
<img alt="Stars" src="https://custom-icon-badges.demolab.com/github/stars/greencomfytea/mhr-overlay?logo=star" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/graphs/traffic">
<img alt="Hits" src="https://custom-icon-badges.demolab.com/endpoint?url=https://hits.dwyl.com/greencomfytea/mhr-overlay.json?color=blue&logo=eye" />
</a>
<br>
<br>
<a href="https://www.nexusmods.com/monsterhunterrise/mods/50">
<img alt="Website" src="https://custom-icon-badges.demolab.com/website?down_color=red&down_message=down&up_color=brightgreen&up_message=up&logo=link&url=https://www.nexusmods.com/monsterhunterrise/mods/50" />
</a>
<a href="https://github.com/greencomfytea?tab=followers">
<img alt="Followers" src="https://custom-icon-badges.demolab.com/github/followers/greencomfytea?logo=people" />
</a>
<a href="https://twitter.com/greencomfytea">
<img alt="Twitter" src="https://img.shields.io/twitter/follow/greencomfytea?logo=twitter" />
</a>
<a href="https://www.twitch.tv/greencomfytea">
<img alt="Twitch" src="https://img.shields.io/twitch/status/greencomfytea?logo=twitch" />
</a>
<br>
<a href="https://github.com/greencomfytea">
<img alt="Author" src="https://custom-icon-badges.demolab.com/badge/author-GreenComfyTea-green?logo=person" />
</a>
<a href="https://github.com/topics/open-source">
<img alt="Open Source" src="https://img.shields.io/badge/open%20source-%20yes-brightgreen?logo=openvpn" />
</a>
<a href="https://cursey.github.io/reframework-book/index.html#lua-scripting">
<img alt="Written in" src="https://custom-icon-badges.demolab.com/badge/written in-lua-000080?logo=terminal" />
</a>
</p>
**This mod is solely intended to empower players with means of self-improvement. Please don't use the information provided by this tool to make hurtful comments and actions toward other players.** <p align="center">
<a>
![50-1659789731-551420562](https://user-images.githubusercontent.com/30152047/183250401-9f2898dd-feb4-4903-802c-c9d398261f11.png) <img align="center" src="https://user-images.githubusercontent.com/30152047/183250401-9f2898dd-feb4-4903-802c-c9d398261f11.png" />
</a>
</p>
# Links # Links
* **[Nexus Mods](https://www.nexusmods.com/monsterhunterrise/mods/50)** * **[Nexus Mods](https://www.nexusmods.com/monsterhunterrise/mods/50)**
@@ -15,13 +135,18 @@ Exposes in-game data about monsters, creatures, players and damage. Draws a high
* **[Troubleshooting](https://github.com/GreenComfyTea/MHR-Overlay/wiki/Troubleshooting)** * **[Troubleshooting](https://github.com/GreenComfyTea/MHR-Overlay/wiki/Troubleshooting)**
# Requirements # Requirements
1. [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26) (v1.3.8 or above); 1. [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26) (v1.503+);
2. [REFramework Direct2D](https://www.nexusmods.com/monsterhunterrise/mods/134) (v0.4.0 or above). 2. [REFramework Direct2D](https://www.nexusmods.com/monsterhunterrise/mods/134) (v0.4.0+) - Needed for Unicode Support.
# How to install: # How to install:
1. Install [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26); 1. Install [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26);
2. (Windows only) Install [REFramework Direct2D](https://www.nexusmods.com/monsterhunterrise/mods/134); 2. Install [REFramework Direct2D](https://www.nexusmods.com/monsterhunterrise/mods/134);
>**:pushpin: NOTE:** Skip this step if you are using Steam Deck/Proton/Wine/Linux. REFramework Direct2D **must not** be installed for the mod to work. >**:pushpin: Windows:** Works normally.
>**:pushpin: Linux:** Latest Experimental Proton seems to have it working normally as well (https://github.com/cursey/reframework-d2d/issues/5).
>**:pushpin: Steam Deck:** I've seen people getting it working but I don't have the exact instructions. You will have to figure it out yourself and/or search the nexus pages for information ([REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26?tab=description), [REFramework Direct2D](https://www.nexusmods.com/monsterhunterrise/mods/134), [MHR Overlay](https://www.nexusmods.com/monsterhunterrise/mods/50)).
3. Download the mod: 3. Download the mod:
* Official release can be downloaded from [Nexus Mods](https://www.nexusmods.com/monsterhunterrise/mods/50); * Official release can be downloaded from [Nexus Mods](https://www.nexusmods.com/monsterhunterrise/mods/50);
* Nightly builds are available in [this repo](https://github.com/GreenComfyTea/MHR-Overlay) and can contain broken functionality, debugging info on screen, bugs and might require the latest [nightly build](https://github.com/praydog/REFramework-nightly/releases) of [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26). Use with caution! * Nightly builds are available in [this repo](https://github.com/GreenComfyTea/MHR-Overlay) and can contain broken functionality, debugging info on screen, bugs and might require the latest [nightly build](https://github.com/praydog/REFramework-nightly/releases) of [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26). Use with caution!
@@ -48,4 +173,3 @@ You can support me by donating! I would appreciate it! But anyway, thank you for
<a href="https://ko-fi.com/greencomfytea"> <a href="https://ko-fi.com/greencomfytea">
<img alt="Qries" src="https://panels.twitch.tv/panel-48897356-image-c2fcf835-87e4-408e-81e8-790789c7acbc"> <img alt="Qries" src="https://panels.twitch.tv/panel-48897356-image-c2fcf835-87e4-408e-81e8-790789c7acbc">
</a> </a>

View File

@@ -30,20 +30,31 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
local debug = require("MHR_Overlay.Misc.debug");
local keyboard = require("MHR_Overlay.Game_Handler.keyboard"); local keyboard = require("MHR_Overlay.Game_Handler.keyboard");
local quest_status = require("MHR_Overlay.Game_Handler.quest_status"); local quest_status = require("MHR_Overlay.Game_Handler.quest_status");
local screen = require("MHR_Overlay.Game_Handler.screen"); local screen = require("MHR_Overlay.Game_Handler.screen");
local singletons = require("MHR_Overlay.Game_Handler.singletons"); local singletons = require("MHR_Overlay.Game_Handler.singletons");
local time = require("MHR_Overlay.Game_Handler.time"); local time = require("MHR_Overlay.Game_Handler.time");
local error_handler = require("MHR_Overlay.Misc.error_handler");
local config = require("MHR_Overlay.Misc.config"); local config = require("MHR_Overlay.Misc.config");
local language = require("MHR_Overlay.Misc.language"); local language = require("MHR_Overlay.Misc.language");
local part_names = require("MHR_Overlay.Misc.part_names"); local part_names = require("MHR_Overlay.Misc.part_names");
local utils = require("MHR_Overlay.Misc.utils"); local utils = require("MHR_Overlay.Misc.utils");
--local buffs = require("MHR_Overlay.Buffs.buffs"); local player_info = require("MHR_Overlay.Misc.player_info");
local buffs = require("MHR_Overlay.Buffs.buffs");
local item_buffs = require("MHR_Overlay.Buffs.item_buffs");
local melody_effects = require("MHR_Overlay.Buffs.melody_effects");
local endemic_life_buffs = require("MHR_Overlay.Buffs.endemic_life_buffs");
local skills = require("MHR_Overlay.Buffs.skills");
local dango_skills = require("MHR_Overlay.Buffs.dango_skills");
local abnormal_statuses = require("MHR_Overlay.Buffs.abnormal_statuses");
local otomo_moves = require("MHR_Overlay.Buffs.otomo_moves");
local weapon_skills = require("MHR_Overlay.Buffs.weapon_skills");
local rampage_skills = require("MHR_Overlay.Buffs.rampage_skills");
local misc_buffs = require("MHR_Overlay.Buffs.misc_buffs");
local players = require("MHR_Overlay.Damage_Meter.players"); local players = require("MHR_Overlay.Damage_Meter.players");
local non_players = require("MHR_Overlay.Damage_Meter.non_players"); local non_players = require("MHR_Overlay.Damage_Meter.non_players");
@@ -65,7 +76,8 @@ local large_monster_UI = require("MHR_Overlay.UI.Modules.large_monster_UI");
local small_monster_UI = require("MHR_Overlay.UI.Modules.small_monster_UI"); local small_monster_UI = require("MHR_Overlay.UI.Modules.small_monster_UI");
local time_UI = require("MHR_Overlay.UI.Modules.time_UI"); local time_UI = require("MHR_Overlay.UI.Modules.time_UI");
local env_creature_UI = require("MHR_Overlay.UI.Modules.env_creature_UI"); local env_creature_UI = require("MHR_Overlay.UI.Modules.env_creature_UI");
--local buff_UI = require("MHR_Overlay.UI.Modules.buff_UI"); local buff_UI = require("MHR_Overlay.UI.Modules.buff_UI");
local stats_UI = require("MHR_Overlay.UI.Modules.stats_UI");
local body_part_UI_entity = require("MHR_Overlay.UI.UI_Entities.body_part_UI_entity"); local body_part_UI_entity = require("MHR_Overlay.UI.UI_Entities.body_part_UI_entity");
local damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.damage_UI_entity"); local damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.damage_UI_entity");
@@ -74,7 +86,7 @@ local stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity"
local rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity"); local rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity");
local ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity"); local ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity");
local ailment_buildup_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_buildup_UI_entity"); local ailment_buildup_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_buildup_UI_entity");
--local buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity"); local buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
local customization_menu = require("MHR_Overlay.UI.customization_menu"); local customization_menu = require("MHR_Overlay.UI.customization_menu");
local label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); local label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
@@ -88,26 +100,102 @@ local body_parts_customization = require("MHR_Overlay.UI.Customizations.body_par
local ailments_customization = require("MHR_Overlay.UI.Customizations.ailments_customization"); local ailments_customization = require("MHR_Overlay.UI.Customizations.ailments_customization");
local ailment_buildups_customization = require("MHR_Overlay.UI.Customizations.ailment_buildups_customization"); local ailment_buildups_customization = require("MHR_Overlay.UI.Customizations.ailment_buildups_customization");
local module_visibility_customization = require("MHR_Overlay.UI.Customizations.module_visibility_customization"); local module_visibility_customization = require("MHR_Overlay.UI.Customizations.module_visibility_customization");
local large_monster_UI_customization = require("MHR_Overlay.UI.Customizations.large_monster_UI_customization"); local large_monster_UI_customization = require("MHR_Overlay.UI.Customizations.large_monster_UI_customization");
local drawing = require("MHR_Overlay.UI.drawing"); local drawing = require("MHR_Overlay.UI.drawing");
if debug ~= nil and debug.enabled then
xy = "";
end
------------------------INIT MODULES------------------------- ------------------------INIT MODULES-------------------------
-- #region -- #region
error_handler.init_dependencies();
screen.init_dependencies();
singletons.init_dependencies();
utils.init_dependencies();
time.init_dependencies();
language.init_dependencies();
config.init_dependencies();
part_names.init_dependencies();
damage_UI_entity.init_dependencies();
health_UI_entity.init_dependencies();
stamina_UI_entity.init_dependencies();
rage_UI_entity.init_dependencies();
ailment_UI_entity.init_dependencies();
ailment_buildup_UI_entity.init_dependencies();
body_part_UI_entity.init_dependencies();
buff_UI_entity.init_dependencies();
player_info.init_dependencies();
buffs.init_dependencies();
item_buffs.init_dependencies();
melody_effects.init_dependencies();
endemic_life_buffs.init_dependencies();
skills.init_dependencies();
dango_skills.init_dependencies();
abnormal_statuses.init_dependencies();
otomo_moves.init_dependencies();
weapon_skills.init_dependencies();
rampage_skills.init_dependencies();
misc_buffs.init_dependencies();
damage_hook.init_dependencies();
players.init_dependencies();
non_players.init_dependencies();
quest_status.init_dependencies();
env_creature_hook.init_dependencies();
env_creature.init_dependencies();
body_part.init_dependencies();
ailments.init_dependencies();
large_monster.init_dependencies();
monster_hook.init_dependencies();
small_monster.init_dependencies();
ailment_hook.init_dependencies();
ailment_buildup.init_dependencies();
label_customization.init_dependencies();
bar_customization.init_dependencies();
line_customization.init_dependencies();
large_monster_UI_customization.init_dependencies();
label_customization.init_dependencies();
bar_customization.init_dependencies();
health_customization.init_dependencies();
stamina_customization.init_dependencies();
rage_customization.init_dependencies();
body_parts_customization.init_dependencies();
ailments_customization.init_dependencies();
ailment_buildups_customization.init_dependencies();
module_visibility_customization.init_dependencies();
customization_menu.init_dependencies();
drawing.init_dependencies();
damage_meter_UI.init_dependencies();
large_monster_UI.init_dependencies();
small_monster_UI.init_dependencies();
time_UI.init_dependencies();
env_creature_UI.init_dependencies();
buff_UI.init_dependencies();
stats_UI.init_dependencies();
keyboard.init_dependencies();
------------------------------------------------------------
error_handler.init_module();
language.init_module();
config.init_module();
part_names.init_module();
screen.init_module(); screen.init_module();
singletons.init_module(); singletons.init_module();
utils.init_module(); utils.init_module();
time.init_module(); time.init_module();
language.init_module();
config.init_module();
part_names.init_module();
damage_UI_entity.init_module(); damage_UI_entity.init_module();
health_UI_entity.init_module(); health_UI_entity.init_module();
stamina_UI_entity.init_module(); stamina_UI_entity.init_module();
@@ -115,9 +203,21 @@ rage_UI_entity.init_module();
ailment_UI_entity.init_module(); ailment_UI_entity.init_module();
ailment_buildup_UI_entity.init_module(); ailment_buildup_UI_entity.init_module();
body_part_UI_entity.init_module(); body_part_UI_entity.init_module();
--buff_UI_entity.init_module(); buff_UI_entity.init_module();
--buffs.init_module(); player_info.init_module();
buffs.init_module();
item_buffs.init_module();
melody_effects.init_module();
endemic_life_buffs.init_module();
skills.init_module();
dango_skills.init_module();
abnormal_statuses.init_module();
otomo_moves.init_module();
weapon_skills.init_module();
rampage_skills.init_module();
misc_buffs.init_module();
damage_hook.init_module(); damage_hook.init_module();
players.init_module(); players.init_module();
@@ -135,7 +235,6 @@ small_monster.init_module();
ailment_hook.init_module(); ailment_hook.init_module();
ailment_buildup.init_module(); ailment_buildup.init_module();
customization_menu.init_module();
label_customization.init_module(); label_customization.init_module();
bar_customization.init_module(); bar_customization.init_module();
line_customization.init_module(); line_customization.init_module();
@@ -150,6 +249,7 @@ body_parts_customization.init_module();
ailments_customization.init_module(); ailments_customization.init_module();
ailment_buildups_customization.init_module(); ailment_buildups_customization.init_module();
module_visibility_customization.init_module(); module_visibility_customization.init_module();
customization_menu.init_module();
drawing.init_module(); drawing.init_module();
@@ -158,7 +258,8 @@ large_monster_UI.init_module();
small_monster_UI.init_module(); small_monster_UI.init_module();
time_UI.init_module(); time_UI.init_module();
env_creature_UI.init_module(); env_creature_UI.init_module();
--buff_UI.init_module(); buff_UI.init_module();
stats_UI.init_module();
keyboard.init_module(); keyboard.init_module();
@@ -169,68 +270,107 @@ log.info("[MHR Overlay] Loaded.");
----------------------------LOOP----------------------------- ----------------------------LOOP-----------------------------
-- #region -- #region
local function draw_modules(module_visibility_config, flow_state_name) local function update_modules(module_visibility_config, flow_state_name)
if module_visibility_config.small_monster_UI and config.current_config.small_monster_UI.enabled then if module_visibility_config.small_monster_UI and config.current_config.small_monster_UI.enabled then
local success = pcall(small_monster_UI.draw); local success = pcall(small_monster_UI.update);
if not success then if not success then
customization_menu.status = string.format("[%s] Small Monster UI Drawing Function threw an Exception", flow_state_name); error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Small Monster UI Update Function threw an Exception", flow_state_name));
end end
end end
local large_monster_UI_config = config.current_config.large_monster_UI; local large_monster_UI_config = config.current_config.large_monster_UI;
local dynamic_enabled = large_monster_UI_config.dynamic.enabled and local dynamic_enabled = large_monster_UI_config.dynamic.enabled and module_visibility_config.large_monster_dynamic_UI;
module_visibility_config.large_monster_dynamic_UI; local static_enabled = large_monster_UI_config.static.enabled and module_visibility_config.large_monster_static_UI;
local static_enabled = large_monster_UI_config.static.enabled and local highlighted_enabled = large_monster_UI_config.highlighted.enabled and module_visibility_config.large_monster_highlighted_UI;
module_visibility_config.large_monster_static_UI;
local highlighted_enabled = large_monster_UI_config.highlighted.enabled and if dynamic_enabled or static_enabled or highlighted_enabled then
module_visibility_config.large_monster_highlighted_UI; local success = pcall(large_monster_UI.update, dynamic_enabled, static_enabled, highlighted_enabled);
if not success then
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Large Monster UI Update Function threw an Exception", flow_state_name));
end
end
if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then
local success = pcall(damage_meter_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Damage Meter UI Update Function threw an Exception", flow_state_name));
end
end
if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then
local success = pcall(env_creature_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Endemic Life UI Update Function threw an Exception", flow_state_name));
end
end
if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then
local success = pcall(buff_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Buff UI Update Function threw an Exception", flow_state_name));
end
end
end
local function draw_modules(module_visibility_config, flow_state_name)
if module_visibility_config.small_monster_UI and config.current_config.small_monster_UI.enabled then
local success = pcall(small_monster_UI.draw);
if not success then
error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Small Monster UI Draw Function threw an Exception", flow_state_name));
end
end
local large_monster_UI_config = config.current_config.large_monster_UI;
local dynamic_enabled = large_monster_UI_config.dynamic.enabled and module_visibility_config.large_monster_dynamic_UI;
local static_enabled = large_monster_UI_config.static.enabled and module_visibility_config.large_monster_static_UI;
local highlighted_enabled = large_monster_UI_config.highlighted.enabled and module_visibility_config.large_monster_highlighted_UI;
if dynamic_enabled or static_enabled or highlighted_enabled then if dynamic_enabled or static_enabled or highlighted_enabled then
local success = pcall(large_monster_UI.draw, dynamic_enabled, static_enabled, highlighted_enabled); local success = pcall(large_monster_UI.draw, dynamic_enabled, static_enabled, highlighted_enabled);
if not success then if not success then
customization_menu.status = string.format("[%s] Large Monster UI Drawing Function threw an Exception", flow_state_name); error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Large Monster UI Draw Function threw an Exception", flow_state_name));
end end
end end
if config.current_config.time_UI.enabled and module_visibility_config.time_UI then if config.current_config.time_UI.enabled and module_visibility_config.time_UI then
local success = pcall(time_UI.draw); local success = pcall(time_UI.draw);
if not success then if not success then
customization_menu.status = string.format("[%s] Time UI Drawing Function threw an Exception", flow_state_name); error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Time UI Draw Function threw an Exception", flow_state_name));
end end
end end
if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then
local success = pcall(damage_meter_UI.draw); local success = pcall(damage_meter_UI.draw);
if not success then if not success then
customization_menu.status = string.format("[%s] Damage Meter UI Drawing Function threw an Exception", flow_state_name); error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Damage Meter UI Draw Function threw an Exception", flow_state_name));
end end
end end
if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then
local success = pcall(env_creature_UI.draw); local success = pcall(env_creature_UI.draw);
if not success then if not success then
customization_menu.status = string.format("[%s] Endemic Life UI Drawing Function threw an Exception", flow_state_name); error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Endemic Life UI Draw Function threw an Exception", flow_state_name));
end end
end end
--[[if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then
local success = truepcall(buff_UI.draw); local success = pcall(buff_UI.draw);
if not success then if not success then
customization_menu.status = string.format("[%s] Buff UI Drawing Function threw an Exception", flow_state_name); error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Buff UI Draw Function threw an Exception", flow_state_name));
end end
end]] end
if config.current_config.stats_UI.enabled and module_visibility_config.stats_UI then
local success = pcall(stats_UI.draw);
if not success then
error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Stats UI Draw Function threw an Exception", flow_state_name));
end
end
end end
local function main_loop() local function update_UI()
customization_menu.status = "OK";
singletons.init();
screen.update_window_size();
players.update_myself_position();
quest_status.update_is_online();
--quest_status.update_is_quest_host();
time.tick();
if quest_status.flow_state == quest_status.flow_states.IN_TRAINING_AREA then if quest_status.flow_state == quest_status.flow_states.IN_TRAINING_AREA then
local large_monster_UI_config = config.current_config.large_monster_UI; local large_monster_UI_config = config.current_config.large_monster_UI;
@@ -240,33 +380,111 @@ local function main_loop()
local static_enabled = large_monster_UI_config.static.enabled and module_visibility_config.large_monster_static_UI; local static_enabled = large_monster_UI_config.static.enabled and module_visibility_config.large_monster_static_UI;
local highlighted_enabled = large_monster_UI_config.highlighted.enabled and module_visibility_config.large_monster_highlighted_UI; local highlighted_enabled = large_monster_UI_config.highlighted.enabled and module_visibility_config.large_monster_highlighted_UI;
if dynamic_enabled or static_enabled or highlighted_enabled then
local success = pcall(large_monster_UI.update, dynamic_enabled, static_enabled, highlighted_enabled);
if not success then
error_handler.report("MHR_Overlay.update_loop", "[In Training Area] Large Monster UI Update Function threw an Exception");
end
end
if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then
local success = pcall(damage_meter_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_modules", "[In Training Area] Damage Meter UI Update Function threw an Exception");
end
end
if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then
local success = pcall(env_creature_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_loop", "[In Training Area] Endemic Life UI Update Function threw an Exception");
end
end
if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then
local success = pcall(buff_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_loop", "[In Training Area] Buff UI Update Function threw an Exception");
end
end
elseif quest_status.flow_state == quest_status.flow_states.CUTSCENE then
update_modules(config.current_config.global_settings.module_visibility.cutscene, "Cutscene");
elseif quest_status.flow_state == quest_status.flow_states.LOADING_QUEST then
update_modules(config.current_config.global_settings.module_visibility.loading_quest, "Loading Quest");
elseif quest_status.flow_state == quest_status.flow_states.QUEST_START_ANIMATION then
update_modules(config.current_config.global_settings.module_visibility.quest_start_animation, "Quest Start Animation");
elseif quest_status.flow_state >= quest_status.flow_states.PLAYING_QUEST and quest_status.flow_state <= quest_status.flow_states.WYVERN_RIDING_START_ANIMATION then
update_modules(config.current_config.global_settings.module_visibility.playing_quest, "Playing Quest");
elseif quest_status.flow_state == quest_status.flow_states.KILLCAM then
update_modules(config.current_config.global_settings.module_visibility.killcam, "Killcam");
elseif quest_status.flow_state == quest_status.flow_states.QUEST_END_TIMER then
update_modules(config.current_config.global_settings.module_visibility.quest_end_timer, "Quest End Timer");
elseif quest_status.flow_state == quest_status.flow_states.QUEST_END_ANIMATION then
update_modules(config.current_config.global_settings.module_visibility.quest_end_animation, "Quest End Animation");
elseif quest_status.flow_state == quest_status.flow_states.QUEST_END_SCREEN then
update_modules(config.current_config.global_settings.module_visibility.quest_end_screen, "Quest End Screen");
elseif quest_status.flow_state == quest_status.flow_states.REWARD_SCREEN then
update_modules(config.current_config.global_settings.module_visibility.reward_screen, "Reward Screen");
elseif quest_status.flow_state == quest_status.flow_states.SUMMARY_SCREEN then
update_modules(config.current_config.global_settings.module_visibility.summary_screen, "Summary Screen");
end
end
local function draw_loop()
if quest_status.flow_state == quest_status.flow_states.IN_LOBBY then
local module_visibility_config = config.current_config.global_settings.module_visibility.in_lobby;
if config.current_config.stats_UI.enabled and module_visibility_config.stats_UI then
local success = pcall(stats_UI.draw);
if not success then
error_handler.report("MHR_Overlay.main_loop", "[In Training Area] Stats UI Draw Function threw an Exception");
end
end
elseif quest_status.flow_state == quest_status.flow_states.IN_TRAINING_AREA then
local large_monster_UI_config = config.current_config.large_monster_UI;
local module_visibility_config = config.current_config.global_settings.module_visibility.in_training_area;
local dynamic_enabled = large_monster_UI_config.dynamic.enabled and module_visibility_config.large_monster_dynamic_UI;
local static_enabled = large_monster_UI_config.static.enabled and module_visibility_config.large_monster_static_UI;
local highlighted_enabled = large_monster_UI_config.highlighted.enabled and module_visibility_config.large_monster_highlighted_UI;
if dynamic_enabled or static_enabled or highlighted_enabled then if dynamic_enabled or static_enabled or highlighted_enabled then
local success = pcall(large_monster_UI.draw, dynamic_enabled, static_enabled, highlighted_enabled); local success = pcall(large_monster_UI.draw, dynamic_enabled, static_enabled, highlighted_enabled);
if not success then if not success then
customization_menu.status = "[In Training Area] Large Monster UI Drawing Function threw an Exception"; error_handler.report("MHR_Overlay.main_loop", "[In Training Area] Large Monster UI Draw Function threw an Exception");
end end
end end
if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then
local success = pcall(damage_meter_UI.draw); local success = pcall(damage_meter_UI.draw);
if not success then if not success then
customization_menu.status = "[In Training Area] Damage Meter UI Drawing Function threw an Exception"; error_handler.report("MHR_Overlay.main_loop", "[In Training Area] Damage Meter UI Draw Function threw an Exception");
end end
end end
if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then
local success = pcall(env_creature_UI.draw); local success = pcall(env_creature_UI.draw);
if not success then if not success then
customization_menu.status = "[In Training Area] Endemic Life UI Drawing Function threw an Exception"; error_handler.report("MHR_Overlay.main_loop", "[In Training Area] Endemic Life UI Draw Function threw an Exception");
end end
end end
--[[if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then
local success = pcall(buff_UI.draw); local success = pcall(buff_UI.draw);
if not success then if not success then
customization_menu.status = "[In Training Area] Buff UI Drawing Function threw an Exception"; error_handler.report("MHR_Overlay.main_loop", "[In Training Area] Buff UI Draw Function threw an Exception");
end end
end]] end
if config.current_config.stats_UI.enabled and module_visibility_config.stats_UI then
local success = pcall(stats_UI.draw);
if not success then
error_handler.report("MHR_Overlay.main_loop", "[In Training Area] Stats UI Draw Function threw an Exception");
end
end
elseif quest_status.flow_state == quest_status.flow_states.CUTSCENE then elseif quest_status.flow_state == quest_status.flow_states.CUTSCENE then
@@ -304,65 +522,38 @@ re.on_draw_ui(function()
end); end);
re.on_frame(function() re.on_frame(function()
if not reframework:is_drawing_ui() then if reframework:is_drawing_ui() then
customization_menu.is_opened = false;
end
if customization_menu.is_opened then
pcall(customization_menu.draw); pcall(customization_menu.draw);
end end
keyboard.update();
end); end);
-- #endregion -- #endregion
--------------------------RE_IMGUI--------------------------- --------------------------RE_IMGUI---------------------------
----------------------------D2D------------------------------ -----------------------Loop Callbacks------------------------
-- #region -- #region
if d2d ~= nil then if d2d ~= nil then
d2d.register(function() d2d.register(function()
drawing.init_font(); drawing.init_font();
end, function() end, function()
if config.current_config.global_settings.renderer.use_d2d_if_available then if config.current_config.global_settings.renderer.use_d2d_if_available then
main_loop(); draw_loop();
end end
end); end);
end end
re.on_frame(function() re.on_frame(function()
time.update_timers();
keyboard.update();
if d2d == nil or not config.current_config.global_settings.renderer.use_d2d_if_available then if d2d == nil or not config.current_config.global_settings.renderer.use_d2d_if_available then
main_loop(); draw_loop();
end end
end); end);
-- #endregion -- #endregion
----------------------------D2D------------------------------ -----------------------Loop Callbacks------------------------
if debug ~= nil and debug.enabled then time.init_global_timers();
if d2d ~= nil then time.new_timer(update_UI, 0.5);
d2d.register(function()
end, function()
if not config.current_config.global_settings.renderer.use_d2d_if_available then
return;
end
if xy ~= "" then
d2d.text(drawing.font, "xy:\n" .. tostring(xy), 256, 71, 0xFF000000);
d2d.text(drawing.font, "xy:\n" .. tostring(xy), 255, 70, 0xFFFFFFFF);
end
end);
end
re.on_frame(function()
if d2d ~= nil and config.current_config.global_settings.renderer.use_d2d_if_available then
return;
end
if xy ~= "" then
draw.text("xy:\n" .. tostring(xy), 256, 31, 0xFF000000);
draw.text("xy:\n" .. tostring(xy), 255, 30, 0xFFFFFFFF);
end
end);
end
if imgui.begin_table == nil then if imgui.begin_table == nil then
re.msg(language.current_language.customization_menu.reframework_outdated); re.msg(language.current_language.customization_menu.reframework_outdated);

View File

@@ -0,0 +1,326 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local time;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
fireblight = nil,
waterblight = nil,
iceblight = nil,
thunderblight = nil,
dragonblight = nil,
blastblight = nil,
minor_bubbleblight = nil,
major_bubbleblight = nil,
hellfireblight = nil,
bloodblight = nil,
poison = nil,
deadly_poison = nil,
stun = nil,
paralysis = nil,
sleep = nil,
defense_down = nil,
resistance_down = nil,
tremor = nil,
roar = nil,
webbed = nil,
stench = nil,
leeched = nil,
whirlwind = nil,
bleeding = nil,
frenzy = nil,
frenzy_overcome = nil,
frenzy_infection = nil,
engulfed = nil,
frostblight = nil,
muck = nil
};
local ailments_type_name = "ailments";
local frenzy_infected_duration = 121;
local player_quest_base_type_def = sdk.find_type_definition("snow.player.PlayerQuestBase");
-- Fireblight
local fire_duration_timer_field = player_quest_base_type_def:get_field("_FireLDurationTimer");
-- Waterblight
local water_duration_timer_field = player_quest_base_type_def:get_field("_WaterLDurationTimer");
-- Iceblight
local ice_duration_timer_field = player_quest_base_type_def:get_field("_IceLDurationTimer");
-- Thunderblight
local thunder_duration_timer_field = player_quest_base_type_def:get_field("_ThunderLDurationTimer");
-- Dragonblight
local dragon_duration_timer_field = player_quest_base_type_def:get_field("_DragonLDurationTimer");
-- blastblight
local bomb_duration_timer_field = player_quest_base_type_def:get_field("_BombDurationTimer");
-- Bubbleblight
local bubble_type_field = player_quest_base_type_def:get_field("_BubbleType");
local bubble_damage_timer_field = player_quest_base_type_def:get_field("_BubbleDamageTimer");
-- Hellfireblight
local oni_bomb_duration_timer_field = player_quest_base_type_def:get_field("_OniBombDurationTimer");
-- Bloodblight
local mystery_debuff_timer_field = player_quest_base_type_def:get_field("_MysteryDebuffTimer");
-- Frostblight
local get_is_frozen_damage_method = player_quest_base_type_def:get_method("get_IsFrozenDamage");
-- Poison
local poison_level_field = player_quest_base_type_def:get_field("_PoisonLv");
local poison_duration_timer_field = player_quest_base_type_def:get_field("_PoisonDurationTimer");
-- Stun
local stun_duration_timer_field = player_quest_base_type_def:get_field("_StunDurationTimer");
-- Falling Sleep
local get_sleep_movable_timer_method = player_quest_base_type_def:get_method("get_SleepMovableTimer");
-- Sleep
local sleep_duration_timer_field = player_quest_base_type_def:get_field("_SleepDurationTimer");
-- Paralysis
local paralyze_duration_timer_field = player_quest_base_type_def:get_field("_ParalyzeDurationTimer");
-- Defense Down
local defense_down_duration_timer_field = player_quest_base_type_def:get_field("_DefenceDownDurationTimer");
-- Resistance Down
local resistance_down_duration_timer_field = player_quest_base_type_def:get_field("_ResistanceDownDurationTimer");
-- Tremor
local quake_duration_timer_field = player_quest_base_type_def:get_field("_QuakeDurationTimer");
-- Roar
local ear_duration_timer_field = player_quest_base_type_def:get_field("_EarDurationTimer");
-- Webbed
local beto_duration_timer_field = player_quest_base_type_def:get_field("_BetoDurationTimer");
-- Stench
local stink_duration_timer_field = player_quest_base_type_def:get_field("_StinkDurationTimer");
-- Leeched
local blooding_enemy_timer_field = player_quest_base_type_def:get_field("_BloodingEnemyTimer");
-- Bleeding
local bleeding_debuff_timer_field = player_quest_base_type_def:get_field("_BleedingDebuffTimer");
-- Engulfed
local get_is_vacuum_damage_method = player_quest_base_type_def:get_method("get__IsVacuumDamage");
-- Muck
local get_is_mud_damage_method = player_quest_base_type_def:get_method("get__IsMudDamage");
local get_is_gold_mud_damage_method = player_quest_base_type_def:get_method("get__IsGoldMudDamage");
-- Frenzy Infected
local virus_accumulator_field = player_quest_base_type_def:get_field("_VirusAccumulator");
local virus_timer_field = player_quest_base_type_def:get_field("_VirusTimer");
-- Frenzy
local virus_onset_timer_field = player_quest_base_type_def:get_field("_VirusOnsetTimer");
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Frenzy Overcome
local virus_overcome_buff_timer_field = player_data_type_def:get_field("_VirusOvercomeBuffTimer");
function this.update(player, player_data)
--local item_parameter = get_ref_item_parameter_method:call(singletons.player_manager);
--if item_parameter == nil then
-- error_handler.report("abnormal_statuses.update", "Failed to access Data: item_parameter");
-- return;
--end
-- Missing:
-- whirlwind?
-- Wind Pressure?
this.update_poison(player);
this.update_bubbleblight(player);
this.update_muck(player);
this.update_frenzy_infection(player);
buffs.update_generic_buff(this.list, ailments_type_name, "fireblight", this.get_abnormal_status_name, nil, nil, player, fire_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "fireblight", this.get_abnormal_status_name, nil, nil, player, fire_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "waterblight", this.get_abnormal_status_name, nil, nil, player, water_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "iceblight", this.get_abnormal_status_name, nil, nil, player, ice_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "thunderblight", this.get_abnormal_status_name, nil, nil, player, thunder_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "dragonblight", this.get_abnormal_status_name, nil, nil, player, dragon_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "blastblight", this.get_abnormal_status_name, nil, nil, player, bomb_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "hellfireblight", this.get_abnormal_status_name, nil, nil, player, oni_bomb_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "bloodblight", this.get_abnormal_status_name, nil, nil, player, mystery_debuff_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "stun", this.get_abnormal_status_name, nil, nil, player, stun_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "paralysis", this.get_abnormal_status_name, nil, nil, player, paralyze_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "falling_asleep", this.get_abnormal_status_name, nil, nil, player, get_sleep_movable_timer_method);
buffs.update_generic_buff(this.list, ailments_type_name, "defense_down", this.get_abnormal_status_name, nil, nil, player, defense_down_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "resistance_down", this.get_abnormal_status_name, nil, nil, player, resistance_down_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "tremor", this.get_abnormal_status_name, nil, nil, player, quake_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "roar", this.get_abnormal_status_name, nil, nil, player, ear_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "webbed", this.get_abnormal_status_name, nil, nil, player, beto_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "stench", this.get_abnormal_status_name, nil, nil, player, stink_duration_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "leeched", this.get_abnormal_status_name, nil, nil, player, blooding_enemy_timer_field, nil, nil, true);
buffs.update_generic_buff(this.list, ailments_type_name, "bleeding", this.get_abnormal_status_name, nil, nil, player, bleeding_debuff_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "frenzy", this.get_abnormal_status_name, nil, nil, player, virus_onset_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "frenzy_overcome", this.get_abnormal_status_name, nil, nil, player_data, virus_overcome_buff_timer_field);
buffs.update_generic_buff(this.list, ailments_type_name, "engulfed", this.get_abnormal_status_name, player, get_is_vacuum_damage_method);
buffs.update_generic_buff(this.list, ailments_type_name, "frostblight", this.get_abnormal_status_name, player, get_is_frozen_damage_method);
this.update_sleep(player);
end
function this.update_poison(player)
local poison_level = poison_level_field:get_data(player);
if poison_level == nil then
error_handler.report("abnormal_statuses.update_poison", "Failed to access Data: poison_level");
return;
end
if poison_level == 0 then
this.list.poison = nil;
this.list.deadly_poison = nil;
return;
end
if poison_level == 1 then
buffs.update_generic_buff(this.list, ailments_type_name, "poison", this.get_abnormal_status_name, player, poison_duration_timer_field);
this.list.deadly_poison = nil;
else
buffs.update_generic_buff(this.list, ailments_type_name, "deadly_poison", this.get_abnormal_status_name, player, poison_duration_timer_field);
this.list.poison = nil;
end
end
function this.update_bubbleblight(player)
local bubble_type = bubble_type_field:get_data(player);
if bubble_type == nil then
error_handler.report("abnormal_statuses.update_bubbleblight", "Failed to access Data: bubble_Type");
return;
end
if bubble_type == 0 then
this.list.minor_bubbleblight = nil;
this.list.major_bubbleblight = nil;
return;
end
if bubble_type == 1 then
buffs.update_generic_buff(this.list, ailments_type_name, "minor_bubbleblight", this.get_abnormal_status_name, player, bubble_damage_timer_field);
this.list.major_bubbleblight = nil;
else
buffs.update_generic_buff(this.list, ailments_type_name, "major_bubbleblight", this.get_abnormal_status_name, player, bubble_damage_timer_field);
this.list.minor_bubbleblight = nil;
end
end
function this.update_muck(player)
local is_mud_damage = get_is_mud_damage_method:call(player);
if is_mud_damage == nil then
error_handler.report("abnormal_statuses.update_generic_boolean_value_method", "Failed to access Data: is_mud_damage");
return;
end
local is_gold_mud_damage = get_is_gold_mud_damage_method:call(player);
if is_gold_mud_damage == nil then
error_handler.report("abnormal_statuses.update_generic_boolean_value_method", "Failed to access Data: is_gold_mud_damage");
return;
end
if not is_mud_damage and not is_gold_mud_damage then
this.list.muck = nil;
return;
end
buffs.update_generic(ailments_type_name, "muck", this.get_abnormal_status_name);
end
function this.update_frenzy_infection(player)
local virus_accumulator_value = virus_accumulator_field:get_data(player);
if virus_accumulator_value == nil then
error_handler.report("abnormal_statuses.update_frenzy_infection", "Failed to access Data: virus_accumulator_value");
return;
end
local virus_timer = virus_timer_field:get_data(player);
if virus_timer == nil then
error_handler.report("abnormal_statuses.update_frenzy_infection", "Failed to access Data: virus_timer");
return;
end
if virus_accumulator_value == 0 and utils.number.is_equal(virus_timer, 0) then
this.list.frenzy_infection = nil;
return;
end
local timer = frenzy_infected_duration - (virus_accumulator_value + virus_timer / 60);
buffs.update_generic(this.list, ailments_type_name, "frenzy_infection", this.get_abnormal_status_name, 1, timer, frenzy_infected_duration);
end
function this.update_sleep(player)
if this.list.falling_asleep ~= nil then
this.list.sleep = nil;
return;
end
buffs.update_generic_buff(this.list, ailments_type_name, "sleep", this.get_abnormal_status_name, nil, nil, player, sleep_duration_timer_field);
end
function this.init_names()
for abnormal_status_key, debuff in pairs(this.list) do
debuff.name = this.get_abnormal_status_name(abnormal_status_key);
end
end
function this.get_abnormal_status_name(abnormal_status_key)
local abnormal_status_name = language.current_language.ailments[abnormal_status_key];
if abnormal_status_name == nil then
return abnormal_status_key;
end
return abnormal_status_name;
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
time = require("MHR_Overlay.Game_Handler.time");
end
function this.init_module()
end
return this;

View File

@@ -2,6 +2,23 @@ local this = {};
local buff_UI_entity; local buff_UI_entity;
local config; local config;
local singletons;
local players;
local item_buffs;
local melody_effects;
local utils;
local language;
local time;
local quest_status;
local error_handler;
local endemic_life_buffs;
local skills;
local dango_skills;
local abnormal_statuses;
local otomo_moves;
local weapon_skills;
local misc_buffs;
local rampage_skills;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -35,14 +52,75 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
this.list = {}; --[[
TODO:
[x] DONE! Wirebug-related skills
[x] DONE! More Dango skills
[x] DONE! Weapon buffs
[x] DONE! Horn music
[x] DONE! abnormal_statuses: Immunity
[x] DONE! item_buffs: Stinkmink
[x] DONE! rampage skills: Chameleos Soul
[x] DONE! skills: powder mantle
[x] DONE! skills: embolden
[x] DONE! skills: strife
[x] DONE! skills: berserk
[x] DONE! skills: dragon conversion
[x] DONE! abnormal_statuses: Pre-Sleep
[x] DONE! skills: charge master
[x] DONE! endemic_life_buffs: Red, Yellow Lampsquid
[x] DONE! weapon skills - Arc Shot: Affinity, Arc Shot: Brace
[x] DONE! Demon Ammo, Armor Ammo
More otomo skills
Add duration detection to skills
Add duration detection to otomo moves
Add duration detection to dango skills
Add duration detection to rampage skills
Add duration detection to endemic life buffs
[x] WONT IMPLEMENT! skills: Furious Buildup
[x] WONT IMPLEMENT! skills: frostcraft
[x] COULDNT FIND! skills: defiance
]]
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_method = player_manager_type_def:get_method("getPlayer");
local find_master_player_method = player_manager_type_def:get_method("findMasterPlayer");
local player_base_type_def = find_master_player_method:get_return_type();
local get_player_data_method = player_base_type_def:get_method("get_PlayerData");
local player_lobby_base_type_def = sdk.find_type_definition("snow.player.PlayerLobbyBase");
local player_base_type_def = sdk.find_type_definition("snow.player.PlayerBase");
local player_weapon_type_field = player_base_type_def:get_field("_playerWeaponType");
function this.new(type, key, name, level, duration)
local is_infinite = false;
if name == nil then
name = utils.constants.uninitialized_string;
end
if duration == nil then
duration = 0;
end
if utils.number.is_equal(duration, 0) then
is_infinite = true;
end
level = level or 1;
function this.new(name)
local buff = {}; local buff = {};
buff.type = type;
buff.key = key;
buff.name = name; buff.name = name;
buff.timer = 0; buff.level = level;
buff.duration = 0;
buff.timer = duration;
buff.duration = duration;
buff.is_active = true; buff.is_active = true;
@@ -51,7 +129,9 @@ function this.new(name)
buff.minutes_left = 0; buff.minutes_left = 0;
buff.seconds_left = 0; buff.seconds_left = 0;
buff.is_infinite = false; buff.is_infinite = is_infinite;
this.update_timer(buff, buff.timer);
this.init_UI(buff); this.init_UI(buff);
@@ -67,42 +147,249 @@ function this.init_UI(buff)
buff.buff_UI = buff_UI_entity.new(cached_config.bar, cached_config.name_label, cached_config.timer_label); buff.buff_UI = buff_UI_entity.new(cached_config.bar, cached_config.name_label, cached_config.timer_label);
end end
function this.init_names()
abnormal_statuses.init_names();
skills.init_names();
weapon_skills.init_names();
misc_buffs.init_names();
end
local tere = {};
function this.update()
if not config.current_config.buff_UI.enabled then
return;
end
if singletons.player_manager == nil then
error_handler.report("buffs.update", "Failed to access Data: player_manager");
return;
end
if quest_status.flow_state <= quest_status.flow_states.IN_LOBBY
or quest_status.flow_state == quest_status.flow_states.CUTSCENE
or quest_status.flow_state >= quest_status.flow_states.QUEST_END_ANIMATION then
return;
end
local master_player = find_master_player_method:call(singletons.player_manager);
if master_player == nil then
error_handler.report("buffs.update", "Failed to access Data: master_player");
return;
end
melody_effects.update(master_player);
local master_player_data = get_player_data_method:call(master_player);
if master_player_data == nil then
error_handler.report("buffs.update", "Failed to access Data: master_player_data");
return;
end
local weapon_type = player_weapon_type_field:get_data(master_player);
if weapon_type == nil then
error_handler.report("skills.update", "Failed to access Data: weapon_type");
return;
end
local is_player_lobby_base = master_player:get_type_definition() == player_lobby_base_type_def;
item_buffs.update(master_player_data);
otomo_moves.update(master_player_data);
rampage_skills.update(master_player_data);
if not is_player_lobby_base then
skills.update(master_player, master_player_data, weapon_type);
dango_skills.update(master_player, master_player_data);
endemic_life_buffs.update(master_player, master_player_data);
abnormal_statuses.update(master_player, master_player_data);
weapon_skills.update(master_player, master_player_data, weapon_type);
misc_buffs.update(master_player, master_player_data);
end
-- xy = "";
-- local fields = master_player_data:get_type_definition():get_fields();
-- for i = 1, 999 do
-- if fields[i] ~= nil then
-- local value = fields[i]:get_data(master_player_data);
-- if value ~= nil then
-- pcall(function()
-- if tere[fields[i]] == nil then
-- tere[fields[i]] = value;
-- elseif not utils.number.is_equal(value, tere[fields[i]]) then
-- xy = string.format("%s%s: %s\n", xy, fields[i]:get_name(), tostring(value));
-- end
-- end);
-- end
-- end
-- end
end
function this.update_timer(buff, timer, duration)
if timer == nil then
return;
end
if timer < 0 then
timer = 0;
end
duration = duration or timer;
if duration > buff.duration then
buff.duration = duration;
end
local minutes_left = math.floor(timer / 60);
buff.timer = timer;
buff.minutes_left = minutes_left;
buff.seconds_left = math.floor(timer - 60 * minutes_left);
if buff.duration ~= 0 then
buff.timer_percentage = timer / buff.duration;
end
end
function this.update_generic_buff(buff_list, buff_type, buff_key, get_name_function,
value_owner, value_holder,
timer_owner, timer_holder,
duration_owner, duration_holder,
is_infinite, minimal_value, level_breakpoints)
if timer_owner == nil then timer_owner = value_owner; end
if duration_owner == nil then duration_owner = value_owner; end
if minimal_value == nil then minimal_value = 1; end
local level = 1;
if value_holder ~= nil then
local value;
if utils.type.is_REField(value_holder) then
value = value_holder:get_data(value_owner);
else
value = value_holder:call(value_owner);
end
if value == nil then
error_handler.report("buffs.update_generic_number", string.format("Failed to access Data: %s_value", buff_key));
return;
end
if utils.type.is_boolean(value) then
if not value then
buff_list[buff_key] = nil;
return;
end
else
if value < minimal_value then
buff_list[buff_key] = nil;
return;
end
if level_breakpoints ~= nil then
local level_breakpoints_count = #level_breakpoints;
for index, breakpoint in ipairs(level_breakpoints) do
if value >= breakpoint then
level = 2 + level_breakpoints_count - index;
break;
end
end
end
end
end
local timer = nil;
if timer_holder ~= nil then
if utils.type.is_REField(timer_holder) then
timer = timer_holder:get_data(timer_owner);
else
timer = timer_holder:call(timer_owner);
end
if timer == nil then
error_handler.report("buffs.update_generic_number", string.format("Failed to access Data: %s_timer", buff_key));
return;
end
if value_holder == nil and utils.number.is_equal(timer, 0) then
buff_list[buff_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
end
local duration = nil;
if duration_holder ~= nil then
if utils.type.is_REField(duration_holder) then
duration = duration_holder:get_data(duration_owner);
else
duration = duration_holder:call(duration_owner);
end
if duration == nil then
error_handler.report("buffs.update_generic_number", string.format("Failed to access Data: %s_duration", buff_key));
return;
end
end
return this.update_generic(buff_list, buff_type, buff_key, get_name_function, level, timer, duration);
end
function this.update_generic(buff_list, buff_type, buff_key, get_name_function, level, timer, duration)
duration = duration or timer;
level = level or 1;
local buff = buff_list[buff_key];
if buff == nil then
local name = get_name_function(buff_key);
buff = this.new(buff_type, buff_key, name, level, duration);
buff_list[buff_key] = buff;
else
buff.level = level;
this.update_timer(buff, timer, duration);
end
return buff;
end
function this.draw(buff, buff_UI, position_on_screen, opacity_scale) function this.draw(buff, buff_UI, position_on_screen, opacity_scale)
buff_UI_entity.draw(buff, buff_UI, position_on_screen, opacity_scale); buff_UI_entity.draw(buff, buff_UI, position_on_screen, opacity_scale);
end end
function this.init_module() function this.init_dependencies()
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity"); buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
item_buffs = require("MHR_Overlay.Buffs.item_buffs");
melody_effects = require("MHR_Overlay.Buffs.melody_effects");
utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language");
time = require("MHR_Overlay.Game_Handler.time");
quest_status = require("MHR_Overlay.Game_Handler.quest_status");
error_handler = require("MHR_Overlay.Misc.error_handler");
endemic_life_buffs = require("MHR_Overlay.Buffs.endemic_life_buffs");
skills = require("MHR_Overlay.Buffs.skills");
dango_skills = require("MHR_Overlay.Buffs.dango_skills");
abnormal_statuses = require("MHR_Overlay.Buffs.abnormal_statuses");
otomo_moves = require("MHR_Overlay.Buffs.otomo_moves");
weapon_skills = require("MHR_Overlay.Buffs.weapon_skills");
rampage_skills = require("MHR_Overlay.Buffs.rampage_skills");
misc_buffs = require("MHR_Overlay.Buffs.misc_buffs");
end
function this.init_module()
local buff = this.new("Enviroment Damage Negated");
buff.duration = 90;
buff.timer = 65;
buff.timer_percentage = 0.66;
buff.minutes_left = 1;
buff.seconds_left = 5
this.list["Enviroment Damage Negated"] = buff;
local buff = this.new("Sharpness Loss Reduced");
buff.duration = 120;
buff.timer = 70;
buff.timer_percentage = 0.583;
buff.minutes_left = 1;
buff.seconds_left = 10
this.list["Sharpness Loss Reduced"] = buff;
local buff = this.new("Sharpness Loss Reduced 2");
buff.duration = 120;
buff.timer = 70;
buff.timer_percentage = 0.583;
buff.minutes_left = 1;
buff.seconds_left = 10
buff.is_infinite = true;
this.list["Sharpness Loss Reduced 2"] = buff;
end end
return this; return this;

View File

@@ -0,0 +1,399 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
dango_adrenaline = nil,
dango_booster = nil,
dango_insurance = nil,
dango_insurance_defense_up = nil,
dango_glutton = nil,
dango_flyer = nil,
dango_defender = nil,
dango_hunter = nil,
dango_connector = nil,
super_recovery_dango = nil
};
local dango_ids = {
-- dango_polisher = 1,
-- dango_rider = 2,
dango_adrenaline = 3,
-- dango_carver_lo = 4,
-- dango_carver_hi = 5,
-- dango_medic_lo = 6,
-- dango_medic_hi = 7,
-- dango_fighter = 8,
-- dango_pyro = 9,
-- dango_specialist = 10,
-- dango_defender_lo = 11,
-- dango_defender_hi = 12,
-- dango_harvester = 13,
-- dango_marksman = 14,
-- dango_fortune_caller = 15,
-- dango_miracle_worker = 16,
-- dango_deflector = 17,
-- dango_weakener = 18,
-- dango_calculator = 19,
-- dango_temper = 20,
-- dango_wall_runner = 21,
-- dango_slugger = 22,
-- dango_money_maker = 23,
-- dango_bombardier = 24,
-- dango_moxie = 25,
-- dango_immunizer = 26,
-- dango_trainer = 27,
dango_booster = 28,
-- dango_feet = 29,
-- dango_bulker = 30,
dango_insurance = 31,
-- dango_reviver = 32,
-- dango_summoner = 33,
-- dango_hurler = 34,
-- dango_fire_res_lo = 35,
-- dango_fire_res_hi = 36,
-- dango_water_res_lo = 37,
-- dango_water_res_hi = 38,
-- dango_thunder_res_lo = 39,
-- dango_thunder_res_hi = 40,
-- dango_ice_res_lo = 41,
-- dango_ice_res_hi = 42,
-- dango_dragon_res_lo = 43,
-- dango_dragon_res_hi = 44,
-- dango_gatherer = 45,
dango_glutton = 46,
-- dango_bird_caller = 47,
dango_flyer = 48,
dango_defender = 49,
-- enhanced_dango_fighter = 50,
-- dango_driver = 51,
dango_hunter = 52,
-- dango_guard = 53,
-- dango_shifter = 54,
dango_connector = 55,
super_recovery_dango = 56
};
this.is_dango_adrenaline_active = false;
local dango_skills_type_name = "dango_skills";
local dango_bulker_attack_up = 15;
local previous_super_recovery_dango_timer = 0;
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_data_method = player_manager_type_def:get_method("get_PlayerData");
local get_player_skill_method = player_manager_type_def:get_method("get_PlayerSkill");
local get_ref_item_parameter_method = player_manager_type_def:get_method("get_RefItemParameter");
local player_user_data_item_parameter_type_def = get_ref_item_parameter_method:get_return_type();
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Dango Defender
local is_enable_kitchen_skill_048_reduce_method = player_data_type_def:get_field("_IsEnable_KitchenSkill048_Reduce");
-- Dango Booster
local kitchen_skill_027_timer_field = player_data_type_def:get_field("_KitchenSkill027Timer");
-- Dango Glutton
local kitchen_skill_045_timer_field = player_data_type_def:get_field("_KitchenSkill045Timer");
-- Dango Insurance
local kitchen_skill_insurance_def_up_lv3_field = player_data_type_def:get_field("_KitchenSkill_Insurance_DefUp_Lv3");
local kitchen_skill_insurance_def_up_lv4_field = player_data_type_def:get_field("_KitchenSkill_Insurance_DefUp_Lv4");
-- Dango Hunter
local kitchen_skill_051_atk_up_timer_field = player_data_type_def:get_field("_KitchenSkill051_AtkUpTimer");
-- Dango Connector
local kitchen_skill_054_timer_field = player_data_type_def:get_field("_KitchenSkill054_Timer");
local player_base_type_def = sdk.find_type_definition("snow.player.PlayerBase");
-- Dango Adrenaline
local is_kitchen_skill_predicament_powerup_method = player_base_type_def:get_method("isKitchenSkillPredicamentPowerUp");
-- Dango Flyer
local get_is_kitchen_skill_wire_stop_heal_spd_method = player_base_type_def:get_method("get_IsKitchenSkill_WireStop_HealSpd");
local get_is_kitchen_skill_wire_stop_regene_method = player_base_type_def:get_method("get_IsKitchenSkill_WireStop_Regene");
-- Super Recovery Dango
local get_kitchen_skill_surume_regene_timer_method = player_base_type_def:get_method("get_KitchenSkill_Surume_RegeneTimer");
local player_quest_base_type_def = sdk.find_type_definition("snow.player.PlayerQuestBase");
local player_skill_list_type_def = sdk.find_type_definition("snow.player.PlayerSkillList");
local has_kitchen_skill_method = player_skill_list_type_def:get_method("hasKitchenSkill");
local data_shortcut_type_def = sdk.find_type_definition("snow.data.DataShortcut");
local get_name_method = data_shortcut_type_def:get_method("getName(snow.data.DataDef.PlKitchenSkillId)");
local quest_manager_type_def = sdk.find_type_definition("snow.QuestManager");
local flag_cat_skill_insurance_field = quest_manager_type_def:get_field("_FlagCatSkillInsurance");
local is_cat_skill_insurance_method = quest_manager_type_def:get_method("isCatSkillInsurance");
local system_array_type_def = sdk.find_type_definition("System.Array");
local get_length_method = system_array_type_def:get_method("get_Length");
local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)");
function this.update(player, player_data)
local item_parameter = get_ref_item_parameter_method:call(singletons.player_manager);
if item_parameter == nil then
error_handler.report("dango_skills.update", "Failed to access Data: item_parameter");
return;
end
this.update_dango_adrenaline();
this.update_dango_hunter(player_data);
this.update_dango_insurance();
this.update_dango_insurance_defense_up(player_data);
this.update_dango_flyer(player);
this.update_super_recovery_dango(player);
buffs.update_generic_buff(this.list, dango_skills_type_name, "dango_defender", this.get_dango_name,
player_data, is_enable_kitchen_skill_048_reduce_method, nil, nil, nil, nil, true);
buffs.update_generic_buff(this.list, dango_skills_type_name, "dango_booster", this.get_dango_name,
nil, nil, player_data, kitchen_skill_027_timer_field);
buffs.update_generic_buff(this.list, dango_skills_type_name, "dango_glutton", this.get_dango_name,
nil, nil, player_data, kitchen_skill_045_timer_field);
buffs.update_generic_buff(this.list, dango_skills_type_name, "dango_connector", this.get_dango_name,
nil, nil, player_data, kitchen_skill_054_timer_field);
end
function this.update_dango_adrenaline()
if not this.is_dango_adrenaline_active then
this.list.dango_adrenaline = nil;
return;
end
buffs.update_generic(this.list, dango_skills_type_name, "dango_adrenaline", this.get_dango_name);
end
function this.update_dango_insurance()
if singletons.player_manager == nil then
error_handler.report("dango_skills.update_dango_insurance", "Failed to access Data: player_manager");
return;
end
if singletons.quest_manager == nil then
error_handler.report("dango_skills.update_dango_insurance", "Failed to access Data: quest_manager");
return;
end
local player_skill_list_array = get_player_skill_method:call(singletons.player_manager);
if player_skill_list_array == nil then
error_handler.report("dango_skills.update_dango_insurance", "Failed to access Data: player_skill_list_array");
return;
end
local player_skill_list_array_length = get_length_method:call(player_skill_list_array);
if player_skill_list_array_length == nil then
error_handler.report("dango_skills.update_dango_insurance", "Failed to access Data: player_skill_array_list_length");
return;
end
local length = player_skill_list_array_length - 1;
local has_insurance_skill = false;
for player_id = 0, length do
if players.list[player_id] == nil then
goto continue;
end
local player_skill_list = get_value_method:call(player_skill_list_array, player_id);
if player_skill_list_array_length == nil then
error_handler.report("dango_skills.update_dango_insurance", "Failed to access Data: player_skill_list No. " .. tostring(player_id));
goto continue;
end
local kitchen_skill = has_kitchen_skill_method:call(player_skill_list, dango_ids.dango_insurance);
if kitchen_skill == nil then
error_handler.report("dango_skills.update_dango_insurance", "Failed to access Data: kitchen_skill No. " .. tostring(player_id));
goto continue;
end
if kitchen_skill then
has_insurance_skill = true;
break;
end
::continue::
end
local flag_cat_skill_insurance = flag_cat_skill_insurance_field:get_data(singletons.quest_manager);
if flag_cat_skill_insurance == nil then
error_handler.report("dango_skills.update_dango_insurance", "Failed to access Data: flag_cat_skill_insurance");
return;
end
local is_cat_skill_insurance = is_cat_skill_insurance_method:call(singletons.quest_manager, flag_cat_skill_insurance);
if is_cat_skill_insurance == nil then
error_handler.report("dango_skills.update_dango_insurance", "Failed to access Data: is_cat_skill_insurance");
return;
end
if not has_insurance_skill or is_cat_skill_insurance then
this.list.dango_insurance = nil;
return;
end
buffs.update_generic(this.list, dango_skills_type_name, "dango_insurance", this.get_dango_name, 1);
end
function this.update_dango_insurance_defense_up(player_data)
local level = 3;
local insurance_def_up_lv3 = kitchen_skill_insurance_def_up_lv3_field:get_data(player_data);
if insurance_def_up_lv3 == nil then
error_handler.report("dango_skills.update_dango_insurance_defense_up", "Failed to access Data: insurance_def_up_lv3");
return;
end
if not insurance_def_up_lv3 then
local insurance_def_up_lv4 = kitchen_skill_insurance_def_up_lv4_field:get_data(player_data);
if insurance_def_up_lv4 == nil then
error_handler.report("dango_skills.update_dango_insurance_defense_up", "Failed to access Data: insurance_def_up_lv4");
return;
end
if not insurance_def_up_lv4 then
this.list.dango_insurance_defense_up = nil;
return;
end
level = 4;
end
buffs.update_generic(this.list, dango_skills_type_name, "dango_insurance_defense_up", this.get_dango_name, level);
end
function this.update_dango_flyer(player)
local level = 4;
local is_kitchen_skill_wire_stop_regene = get_is_kitchen_skill_wire_stop_regene_method:call(player);
if is_kitchen_skill_wire_stop_regene == nil then
error_handler.report("dango_skills.update_dango_flyer", "Failed to access Data: is_kitchen_skill_wire_stop_regene");
return;
end
if not is_kitchen_skill_wire_stop_regene then
local is_kitchen_skill_wire_stop_heal_spd = get_is_kitchen_skill_wire_stop_heal_spd_method:call(player);
if is_kitchen_skill_wire_stop_heal_spd == nil then
error_handler.report("dango_skills.update_dango_flyer", "Failed to access Data: is_kitchen_skill_wire_stop_heal_spd");
return;
end
if not is_kitchen_skill_wire_stop_regene then
this.list.dango_flyer = nil;
return;
end
level = 3;
end
buffs.update_generic(this.list, dango_skills_type_name, "dango_flyer", this.get_dango_name, level);
end
function this.update_dango_hunter(player_data)
local dango_hunter_buff = buffs.update_generic_buff(this.list, dango_skills_type_name, "dango_hunter", this.get_dango_name,
nil, nil, player_data, kitchen_skill_051_atk_up_timer_field);
if dango_hunter_buff then
dango_hunter_buff.level = 4;
end
end
function this.update_super_recovery_dango(player)
local kitchen_skill_surume_regene_timer = get_kitchen_skill_surume_regene_timer_method:call(player);
if kitchen_skill_surume_regene_timer == nil then
error_handler.report("dango_skills.update_super_recovery_dango", "Failed to access Data: kitchen_skill_surume_regene_timer");
return;
end
if utils.number.is_equal(kitchen_skill_surume_regene_timer, 0)
and utils.number.is_equal(previous_super_recovery_dango_timer, 0) then
this.list.super_recovery_dango = nil;
return;
end
previous_super_recovery_dango_timer = kitchen_skill_surume_regene_timer;
buffs.update_generic(this.list, dango_skills_type_name, "super_recovery_dango", this.get_dango_name);
end
function this.get_dango_name(dango_key)
if dango_ids[dango_key] == nil then
local dango_skill_name = language.current_language.dango_skills[dango_key];
if dango_skill_name == nil then
return dango_key;
end
return dango_skill_name;
end
local dango_skill_name = get_name_method:call(nil, dango_ids[dango_key]);
if dango_skill_name == nil then
error_handler.report("dango_skills.get_dango_name", string.format("Failed to access Data: %s_name", dango_key));
return dango_key;
end
return dango_skill_name;
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,221 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local env_creature;
local item_buffs;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
clothfly = nil,
stinkmink = nil,
butterflame = nil,
-- peepersects = nil,
cutterfly = nil,
ruby_wirebug = nil,
gold_wirebug = nil,
red_lampsquid = nil,
yellow_lampsquid = nil
};
this.peepersects_duration = 90;
local endemic_life_buffs_type_name = "endemic_life_buffs";
local marionette_mode_types = { "ruby_wirebug", "gold_wirebug" };
local butterflame_attack_up = 25;
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_data_method = player_manager_type_def:get_method("get_PlayerData");
local get_ref_item_parameter_method = player_manager_type_def:get_method("get_RefItemParameter");
local player_user_data_item_parameter_type_def = get_ref_item_parameter_method:get_return_type();
local demondrug_atk_up_field = player_user_data_item_parameter_type_def:get_field("_DemondrugAtkUp");
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Cutterfly
local crit_up_ec_second_timer_field = player_data_type_def:get_field("_CritUpEcSecondTimer");
-- Clothfly
local def_up_buff_second_rate_timer_field = player_data_type_def:get_field("_DefUpBuffSecondRateTimer");
-- Ruby/Gold Wirebugs
local wirebug_powerup_timer_field = player_data_type_def:get_field("_WireBugPowerUpTimer");
-- Butterflame
local atk_up_buff_second_field = player_data_type_def:get_field("_AtkUpBuffSecond");
local atk_up_buff_second_timer_field = player_data_type_def:get_field("_AtkUpBuffSecondTimer");
-- Stinkmink
local lead_enemy_timer_field = player_data_type_def:get_field("_LeadEnemyTimer");
-- Red Lampsquid
local atk_up_ec_second_timer_field = player_data_type_def:get_field("_AtkUpEcSecondTimer");
-- Yellow Lampsquid
local def_up_ec_second_timer_field = player_data_type_def:get_field("_DefUpEcSecondTimer");
local player_quest_base_type_def = sdk.find_type_definition("snow.player.PlayerQuestBase");
-- Ruby/Gold Wirebugs
local get_marionette_mode_type_method = player_quest_base_type_def:get_method("get_MarionetteModeType");
local message_manager_type_def = sdk.find_type_definition("snow.gui.MessageManager");
local get_env_creature_name_message_method = message_manager_type_def:get_method("getEnvCreatureNameMessage");
function this.update(player, player_data, item_parameter)
this.update_ruby_and_gold_wirebugs(player, player_data);
this.update_butterflame(player_data);
buffs.update_generic_buff(this.list, endemic_life_buffs_type_name, "cutterfly", this.get_endemic_life_name,
nil, nil, player_data, crit_up_ec_second_timer_field);
buffs.update_generic_buff(this.list, endemic_life_buffs_type_name, "clothfly", this.get_endemic_life_name,
nil, nil, player_data, def_up_buff_second_rate_timer_field);
buffs.update_generic_buff(this.list, endemic_life_buffs_type_name, "stinkmink", this.get_endemic_life_name,
nil, nil, player_data, lead_enemy_timer_field);
buffs.update_generic_buff(this.list, endemic_life_buffs_type_name, "red_lampsquid", this.get_endemic_life_name,
nil, nil, player_data, atk_up_ec_second_timer_field);
buffs.update_generic_buff(this.list, endemic_life_buffs_type_name, "yellow_lampsquid", this.get_endemic_life_name,
nil, nil, player_data, def_up_ec_second_timer_field);
end
function this.update_ruby_and_gold_wirebugs(player, player_data)
local marionette_mode_type = get_marionette_mode_type_method:call(player);
if marionette_mode_type == nil then
error_handler.report("endemic_life_buffs.update_ruby_and_gold_wirebugs", "Failed to access Data: marionette_mode_type");
end
if marionette_mode_type ~= 1 and marionette_mode_type ~= 2 then
this.list.ruby_wirebug = nil;
this.list.gold_wirebug = nil;
return;
elseif marionette_mode_type ~= 1 then
this.list.ruby_wirebug = nil;
else
this.list.gold_wirebug = nil;
end
local endemic_life_buff_key = marionette_mode_types[marionette_mode_type];
buffs.update_generic_buff(this.list, endemic_life_buffs_type_name, endemic_life_buff_key, this.get_endemic_life_name,
nil, nil, player_data, wirebug_powerup_timer_field);
end
function this.update_butterflame(player_data)
local atk_up_buff_second = atk_up_buff_second_field:get_data(player_data);
if atk_up_buff_second == nil then
error_handler.report("item_buffs.update_butterflame", "Failed to access Data: atk_up_buff_second");
return;
end
if atk_up_buff_second ~= butterflame_attack_up then
this.list.butterflame = nil;
return;
end
buffs.update_generic_buff(this.list, endemic_life_buffs_type_name, "butterflame", this.get_endemic_life_name,
nil, nil, player_data, atk_up_buff_second_timer_field);
end
function this.update_peepersects(player_data)
local stamina_up_buff_second_timer = stamina_up_buff_second_timer_field:get_data(player_data);
if stamina_up_buff_second_timer == nil then
error_handler.report("item_buffs.update_peepersects", "Failed to access Data: stamina_up_buff_second_timer");
return;
end
if utils.number.is_equal(stamina_up_buff_second_timer, 0) then
this.list.peepersects = nil;
return;
end
local timer = stamina_up_buff_second_timer / 60;
local peepersects_buff = this.list.peepersects;
if peepersects_buff == nil and item_buffs.list.dash_juice ~= nil and timer <= item_buffs.list.dash_juice.timer then
return;
end
if peepersects_buff == nil
or (peepersects_buff ~= nil and timer > peepersects_buff.timer) then
local timer_percentage = timer / this.peepersects_duration;
if timer_percentage < 0.95 or timer_percentage > 1.05 then
this.list.peepersects = nil;
return;
end
end
buffs.update_generic(this.list, endemic_life_buffs_type_name, "peepersects", this.get_endemic_life_name, 1, timer, this.peepersects_duration);
end
function this.get_endemic_life_name(endemic_life_buff_key)
if singletons.message_manager == nil then
error_handler.report("endemic_life_buffs.get_endemic_life_name", "Failed to access Data: message_manager");
return endemic_life_buff_key;
end
local endemic_life_name = get_env_creature_name_message_method:call(singletons.message_manager, env_creature.creature_ids[endemic_life_buff_key]);
if endemic_life_name == nil then
error_handler.report("endemic_life_buffs.get_endemic_life_name", string.format("Failed to access Data: %s_name", endemic_life_buff_key));
return endemic_life_buff_key;
end
return endemic_life_name;
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
item_buffs = require("MHR_Overlay.Buffs.item_buffs");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,253 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local endemic_life_buffs;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
demondrug = nil,
mega_demondrug = nil,
armorskin = nil,
mega_armorskin = nil,
-- might_seed = nil,
-- adamant_seed = nil,
demon_powder = nil,
hardshell_powder = nil,
immunizer = nil,
-- dash_juice = nil,
gourmet_fish = nil,
};
local item_ids = {
demondrug = 68157917,
mega_demondrug = 68157918,
armorskin = 68157922,
mega_armorskin = 68157923,
--might_seed = 68157919,
--adamant_seed = 68157924,
demon_powder = 68157920,
hardshell_powder = 68157925,
immunizer = 68157911,
--dash_juice = 68157913,
gourmet_fish = 68157909,
demon_ammo = 68157595,
armor_ammo = 68157596
}
local item_buffs_type_name = "item_buffs";
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_data_method = player_manager_type_def:get_method("get_PlayerData");
local get_ref_item_parameter_method = player_manager_type_def:get_method("get_RefItemParameter");
local player_user_data_item_parameter_type_def = get_ref_item_parameter_method:get_return_type();
local demondrug_atk_up_field = player_user_data_item_parameter_type_def:get_field("_DemondrugAtkUp");
local great_demondrug_atk_up_field = player_user_data_item_parameter_type_def:get_field("_GreatDemondrugAtkUp");
local armorskin_def_up_field = player_user_data_item_parameter_type_def:get_field("_ArmorSkinDefUp");
local great_armorskin_def_up_field = player_user_data_item_parameter_type_def:get_field("_GreatArmorSkinDefUp");
local might_seed_atk_up_field = player_user_data_item_parameter_type_def:get_field("_MightSeedAtkUp");
local might_seed_timer_field = player_user_data_item_parameter_type_def:get_field("_MightSeedTimer");
local adamant_seed_timer_field = player_user_data_item_parameter_type_def:get_field("_AdamantSeedTimer");
local demondrug_powder_timer_field = player_user_data_item_parameter_type_def:get_field("_DemondrugPowderTimer");
local armorskin_powder_timer_field = player_user_data_item_parameter_type_def:get_field("_ArmorSkinPowderTimer");
local vitalizer_timer_const_field = player_user_data_item_parameter_type_def:get_field("_VitalizerTimer");
local stamina_up_buff_second_field = player_user_data_item_parameter_type_def:get_field("_StaminaUpBuffSecond");
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Demondrug/Mega Demondrug
local atk_up_alive_field = player_data_type_def:get_field("_AtkUpAlive");
-- Armorskin/Mega Armorskin
local def_up_alive_field = player_data_type_def:get_field("_DefUpAlive");
-- Demon Powder
local atk_up_item_second_field = player_data_type_def:get_field("_AtkUpItemSecond");
local atk_up_item_second_timer_field = player_data_type_def:get_field("_AtkUpItemSecondTimer");
-- Hardshell Powder
local def_up_item_second_field = player_data_type_def:get_field("_DefUpItemSecond");
local def_up_item_second_timer_field = player_data_type_def:get_field("_DefUpItemSecondTimer");
-- Immunizer
local vitalizer_timer_field = player_data_type_def:get_field("_VitalizerTimer");
-- Gourmet Fish
local fish_regene_enable_field = player_data_type_def:get_field("_FishRegeneEnableTimer");
-- Demon Ammo
local kijin_bullet_timer_field = player_data_type_def:get_field("_KijinBulletTimer");
-- Armor Ammo
local kouka_bullet_timer_field = player_data_type_def:get_field("_KoukaBulletTimer");
local data_shortcut_type_def = sdk.find_type_definition("snow.data.DataShortcut");
local get_name_method = data_shortcut_type_def:get_method("getName(snow.data.ContentsIdSystem.ItemId)");
function this.update(player_data)
local item_parameter = get_ref_item_parameter_method:call(singletons.player_manager);
if item_parameter == nil then
error_handler.report("item_buffs.update", "Failed to access Data: item_parameter");
return;
end
local cached_language = language.current_language;
this.update_demondrug(player_data, item_parameter);
this.update_armorskin(player_data, item_parameter);
buffs.update_generic_buff(this.list, item_buffs_type_name, "demon_powder", this.get_item_name,
player_data, atk_up_item_second_field, player_data, atk_up_item_second_timer_field, item_parameter, demondrug_powder_timer_field);
buffs.update_generic_buff(this.list, item_buffs_type_name, "hardshell_powder", this.get_item_name,
player_data, def_up_item_second_field, player_data, def_up_item_second_timer_field, item_parameter, armorskin_powder_timer_field);
buffs.update_generic_buff(this.list, item_buffs_type_name, "immunizer", this.get_item_name,
nil, nil, player_data, vitalizer_timer_field, item_parameter, vitalizer_timer_const_field);
buffs.update_generic_buff(this.list, item_buffs_type_name, "gourmet_fish", this.get_item_name,
nil, nil, player_data, fish_regene_enable_field);
buffs.update_generic_buff(this.list, item_buffs_type_name, "demon_ammo", this.get_item_name,
nil, nil, player_data, kijin_bullet_timer_field);
buffs.update_generic_buff(this.list, item_buffs_type_name, "armor_ammo", this.get_item_name,
nil, nil, player_data, kouka_bullet_timer_field);
end
function this.update_demondrug(player_data, item_parameter)
local demondrug_value = atk_up_alive_field:get_data(player_data);
if demondrug_value == nil then
error_handler.report("item_buffs.update_demondrug", "Failed to access Data: demondrug_value");
return;
end
if demondrug_value == 0 then
this.list.demondrug = nil;
this.list.mega_demondrug = nil;
return;
end
local demondrug_const_value = demondrug_atk_up_field:get_data(item_parameter);
if demondrug_const_value == nil then
error_handler.report("item_buffs.update_demondrug", "Failed to access Data: demondrug_const_value");
return;
end
local mega_demondrug_const_value = great_demondrug_atk_up_field:get_data(item_parameter);
if mega_demondrug_const_value == nil then
error_handler.report("item_buffs.update_demondrug", "Failed to access Data: mega_demondrug_const_value");
return;
end
local item_key;
if demondrug_value == demondrug_const_value then
item_key = "demondrug";
this.list.mega_demondrug = nil;
elseif demondrug_value == mega_demondrug_const_value then
item_key = "mega_demondrug";
this.list.demondrug = nil;
end
buffs.update_generic(this.list, item_buffs_type_name, item_key, this.get_item_name);
end
function this.update_armorskin(player_data, item_parameter)
local armorskin_value = def_up_alive_field:get_data(player_data);
if armorskin_value == nil then
error_handler.report("item_buffs.update_armorskin", "Failed to access Data: armorskin_value");
return;
end
if armorskin_value == 0 then
this.list.armorskin = nil;
this.list.mega_armorskin = nil;
return;
end
local armorskin_const_value = armorskin_def_up_field:get_data(item_parameter);
if armorskin_const_value == nil then
error_handler.report("item_buffs.update_armorskin", "Failed to access Data: armorskin_const_value");
return;
end
local mega_armorskin_const_value = great_armorskin_def_up_field:get_data(item_parameter);
if mega_armorskin_const_value == nil then
error_handler.report("item_buffs.update_armorskin", "Failed to access Data: mega_armorskin_const_value");
return;
end
local item_key;
if armorskin_value == armorskin_const_value then
item_key = "armorskin";
this.list.mega_armorskin = nil;
elseif armorskin_value == mega_armorskin_const_value then
item_key = "mega_armorskin";
this.list.armorskin = nil;
end
buffs.update_generic(this.list, item_buffs_type_name, item_key, this.get_item_name);
end
function this.get_item_name(item_key)
local item_name = get_name_method:call(nil, item_ids[item_key]);
if item_name == nil then
error_handler.report("item_buffs.get_item_name", string.format("Failed to access Data: %s_name", item_key));
return item_key;
end
return item_name;
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
endemic_life_buffs = require("MHR_Overlay.Buffs.endemic_life_buffs");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,168 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
--[[local melody_effect_ids = {
self_improvement = 0,
attack_up = 1,
defense_up = 2,
affinity_up = 3,
elemental_attack_boost = 4,
attack_and_defense_up = 5,
attack_and_affinity_up = 6,
knockbacks_negated = 7,
earplugs_s = 8,
earplugs_l = 9,
tremors_negated = 10,
wind_pressure_negated = 11,
stun_negated = 12,
blight_negated = 13,
divine_protection = 14,
health_recovery_s = 15,
health_recovery_l = 16,
health_recovery_s_antidote = 17,
health_regeneration = 18,
stamina_use_reduced = 19,
stamina_recovery_up = 20,
sharpness_loss_reduced = 21,
environment_damage_negated = 22,
sonic_wave = 23,
sonic_barrier = 24,
infernal_melody = 25,
sharpness_regeneration = 26,
sharpness_extension = 27
};]]
this.list = {};
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local find_master_player_method = player_manager_type_def:get_method("findMasterPlayer");
local player_base_type_def = find_master_player_method:get_return_type();
local music_data_field = player_base_type_def:get_field("_MusicData");
local music_data_type_def = sdk.find_type_definition("snow.player.Horn.MusicData");
local time_field = music_data_type_def:get_field("_Time");
local system_array_type_def = sdk.find_type_definition("System.Array");
local get_length_method = system_array_type_def:get_method("get_Length");
local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)");
local data_shortcut_type_def = sdk.find_type_definition("snow.data.DataShortcut");
local get_name_method = data_shortcut_type_def:get_method("getName(snow.data.DataDef.HornConcertId)");
function this.update(master_player)
local music_data_array = music_data_field:get_data(master_player);
if music_data_array == nil then
error_handler.report("melody_effects.update", "Failed to access Data: music_data_array");
return;
end
local length = get_length_method:call(music_data_array) - 1;
if length == nil then
error_handler.report("melody_effects.update", "Failed to access Data: music_data_array -> length");
return;
end
for i = 0, length do
local music_data = get_value_method:call(music_data_array, i);
if music_data == nil then
error_handler.report("melody_effects.update", "Failed to access Data: music_data No." .. tostring(i));
goto continue;
end
this.update_melody_effect(i, music_data);
::continue::
end
end
function this.update_melody_effect(index, melody_data)
local lua_index = index + 1;
local melody_timer = time_field:get_data(melody_data);
if melody_timer == nil then
error_handler.report("melody_effects.update_melody_effect", "Failed to access Data: melody_timer No. " .. tostring(index));
return;
end
if utils.number.is_equal(melody_timer, 0) then
this.list[lua_index] = nil;
return;
end
local melody_effect = this.list[lua_index];
if melody_effect == nil then
local melody_effect_name = this.get_melody_effect_name(index);
melody_effect = buffs.new("melody_effects", lua_index, melody_effect_name, 1, melody_timer / 60);
this.list[lua_index] = melody_effect;
else
buffs.update_timer(melody_effect, melody_timer / 60);
end
end
function this.get_melody_effect_name(melody_effect_id)
local melody_effect_name = get_name_method:call(nil, melody_effect_id);
if melody_effect_name == nil then
local name = string.format("Melody Effect No. %d", melody_effect_id);
error_handler.report("melody_effects.get_melody_effect_name", "Failed to access Data: " .. melody_effect_name);
return name;
end
return melody_effect_name;
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,125 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local endemic_life_buffs;
local item_buffs;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
attack_up = nil,
defense_up = nil,
stamina_use_down = nil,
};
local misc_buffs_type_name = "misc_buffs";
-- Attack Up
-- Might Seed +10 3min
-- Dango Bulker + 15 30sec
-- Chameleos Souls +15 30sec
-- Defense Up
-- Adamant Seed +20 3min
-- Chameleos Souls +20 30sec
-- Stamina Use Down
-- Dash Juice 3min
-- Peepersects 1.5min
-- Chameleos Soul 30sec
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Attack Up
local atk_up_buff_second_field = player_data_type_def:get_field("_AtkUpBuffSecond");
local atk_up_buff_second_timer_field = player_data_type_def:get_field("_AtkUpBuffSecondTimer");
-- Defense Up
local def_up_buff_second_field = player_data_type_def:get_field("_DefUpBuffSecond");
local def_up_buff_second_timer_field = player_data_type_def:get_field("_DefUpBuffSecondTimer");
-- Stamina Use Down
local stamina_up_buff_second_timer_field = player_data_type_def:get_field("_StaminaUpBuffSecondTimer");
-- Immunity
local debuff_prevention_timer_field = player_data_type_def:get_field("_DebuffPreventionTimer");
function this.update(player, player_data)
buffs.update_generic_buff(this.list, misc_buffs_type_name, "stamina_use_down", this.get_misc_buff_name,
nil, nil, player_data, stamina_up_buff_second_timer_field);
buffs.update_generic_buff(this.list, misc_buffs_type_name, "attack_up", this.get_misc_buff_name,
player_data, atk_up_buff_second_field, player_data, atk_up_buff_second_timer_field);
buffs.update_generic_buff(this.list, misc_buffs_type_name, "defense_up", this.get_misc_buff_name,
player_data, def_up_buff_second_field, player_data, def_up_buff_second_timer_field);
buffs.update_generic_buff(this.list, misc_buffs_type_name, "immunity", this.get_misc_buff_name,
nil, nil, player_data, debuff_prevention_timer_field);
end
function this.init_names()
for misc_buff_key, dango in pairs(this.list) do
dango.name = this.get_misc_buff_name(misc_buff_key);
end
end
function this.get_misc_buff_name(misc_buff_key)
local misc_buff_name = language.current_language.misc_buffs[misc_buff_key];
if misc_buff_name == nil then
return misc_buff_key;
end
return misc_buff_name;
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
endemic_life_buffs = require("MHR_Overlay.Buffs.endemic_life_buffs");
item_buffs = require("MHR_Overlay.Buffs.item_buffs");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,142 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local env_creature;
local player_info;
local time;
local abnormal_statuses;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
rousing_roar = nil,
go_fight_win = nil,
power_drum = nil
};
local otomo_moves_ids = {
herbaceous_healing = 1,
felyne_silkbind = 2,
felyne_wyvernblast = 3,
rousing_roar = 4,
endemic_life_barrage = 5,
health_horn = 6,
healing_bubble = 7,
vase_of_vitality = 8,
furbidden_acorn = 9,
poison_purr_ison = 10,
summeown_endemic_life = 11,
shock_purr_ison = 12,
go_fight_win = 13,
giga_barrel_bombay = 14,
flash_bombay = 15,
anti_monster_mine = 16,
zap_blast_spinner = 17,
furr_ious = 18,
power_drum = 19,
fleet_foot_feat = 20,
whirlwind_assault = 21,
pilfer = 22,
shock_tripper = 23,
mega_boomerang = 24,
camouflage = 25,
healing_clover_bat = 26,
felyne_firewors = 27,
lottery_box = 28,
felyne_powered_up = 29,
ameowzing_mist = 30
};
local otomo_moves_type_name = "otomo_moves";
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_data_method = player_manager_type_def:get_method("get_PlayerData");
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Palico: Rousing Roar
local beast_roar_otomo_timer_field = player_data_type_def:get_field("_BeastRoarOtomoTimer");
-- Palico: Power Drum
local kijin_otomo_timer_field = player_data_type_def:get_field("_KijinOtomoTimer");
-- Palico: Go, Fight, Win
local runhigh_otomo_timer_field = player_data_type_def:get_field("_RunhighOtomoTimer");
local data_shortcut_type_def = sdk.find_type_definition("snow.data.DataShortcut");
local get_name_method = data_shortcut_type_def:get_method("getName(snow.data.DataDef.OtSupportActionId)");
function this.update(player_data)
buffs.update_generic_buff(this.list, otomo_moves_type_name, "rousing_roar", this.get_otomo_move_name,
nil, nil, player_data, beast_roar_otomo_timer_field);
buffs.update_generic_buff(this.list, otomo_moves_type_name, "go_fight_win", this.get_otomo_move_name,
nil, nil, player_data, runhigh_otomo_timer_field);
buffs.update_generic_buff(this.list, otomo_moves_type_name, "power_drum", this.get_otomo_move_name,
nil, nil, player_data, kijin_otomo_timer_field);
end
function this.get_otomo_move_name(otomo_move_key)
local otomo_move_name = get_name_method:call(nil, otomo_moves_ids[otomo_move_key]);
if otomo_move_name == nil then
error_handler.report("otomo_moves.get_otomo_move_name", string.format("Failed to access Data: %s_name", otomo_move_key));
return otomo_move_key;
end
return otomo_move_name;
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
player_info = require("MHR_Overlay.Misc.player_info");
time = require("MHR_Overlay.Game_Handler.time");
abnormal_statuses = require("MHR_Overlay.Buffs.abnormal_statuses");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,160 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local env_creature;
local player_info;
local time;
local abnormal_statuses;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local skills_type_name = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
burst = nil,
kushala_daora_soul = nil,
intrepid_heart = nil,
dereliction = nil,
latent_power = nil,
protective_polish = nil,
wind_mantle = nil,
grinder_s = nil,
counterstrike = nil,
affinity_sliding = nil,
coalescence = nil,
adrenaline_rush = nil,
wall_runner = nil,
offensive_guard = nil,
hellfire_cloak = nil,
agitator = nil,
furious = nil,
status_trigger = nil,
heaven_sent = nil,
heroics = nil,
resuscitate = nil,
maximum_might = nil,
bloodlust = nil,
frenzied_bloodlust = nil,
peak_performance = nil,
dragonheart = nil,
resentment = nil,
bladescale_hone = nil,
spiribirds_call = nil,
embolden = nil,
berserk = nil,
powder_mantle_red = nil,
powder_mantle_blue = nil,
strife = nil,
inspiration = nil,
blood_awakening = nil
};
local rampage_skills_type_name = "rampage_skills";
local rampage_skill_ids = {
chameleos_soul = 250,
kushala_daora_soul = 251,
};
local kushara_daora_soul_breakpoint = 5;
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_data_method = player_manager_type_def:get_method("get_PlayerData");
local get_ref_item_parameter_method = player_manager_type_def:get_method("get_RefItemParameter");
local player_user_data_item_parameter_type_def = get_ref_item_parameter_method:get_return_type();
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Kushala Daora Soul
local hyakuryu_dragon_power_up_count_field = player_data_type_def:get_field("_HyakuryuDragonPowerUpCnt");
local hyakuryu_dragon_power_up_timer_field = player_data_type_def:get_field("_HyakuryuDragonPowerUpTimer");
-- Chameleos Soul
local hyakuryu_onazuti_power_up_interval_field = player_data_type_def:get_field("_HyakuryuHyakuryuOnazutiPowerUpInterval");
local data_shortcut_type_def = sdk.find_type_definition("snow.data.DataShortcut");
local get_name_method = data_shortcut_type_def:get_method("getName(snow.data.DataDef.PlHyakuryuSkillId)");
function this.update(player_data)
--local item_parameter = get_ref_item_parameter_method:call(singletons.player_manager);
--if item_parameter == nil then
-- error_handler.report("skills.update", "Failed to access Data: item_parameter");
-- return;
--end
buffs.update_generic_buff(this.list, rampage_skills_type_name, "kushala_daora_soul", this.get_skill_name,
player_data, hyakuryu_dragon_power_up_count_field, player_data, hyakuryu_dragon_power_up_timer_field, nil, nil, false, nil, {kushara_daora_soul_breakpoint});
buffs.update_generic_buff(this.list, rampage_skills_type_name, "chameleos_soul", this.get_skill_name,
nil, nil, player_data, hyakuryu_onazuti_power_up_interval_field);
end
function this.init_names()
for rampage_skill_key, skill in pairs(this.list) do
skill.name = this.get_skill_name(rampage_skill_key);
end
end
function this.get_skill_name(rampage_skill_key)
local rampage_skill_name = get_name_method:call(nil, rampage_skill_ids[rampage_skill_key]);
if rampage_skill_name == nil then
error_handler.report("skills.get_skill_name", string.format("Failed to access Data: %s_name", rampage_skill_key));
return rampage_skill_key;
end
return rampage_skill_name;
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
player_info = require("MHR_Overlay.Misc.player_info");
time = require("MHR_Overlay.Game_Handler.time");
abnormal_statuses = require("MHR_Overlay.Buffs.abnormal_statuses");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,819 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local env_creature;
local player_info;
local time;
local abnormal_statuses;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local skills_type_name = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
burst = nil,
intrepid_heart = nil,
dereliction = nil,
latent_power = nil,
protective_polish = nil,
wind_mantle = nil,
grinder_s = nil,
counterstrike = nil,
affinity_sliding = nil,
coalescence = nil,
adrenaline_rush = nil,
wall_runner = nil,
offensive_guard = nil,
hellfire_cloak = nil,
agitator = nil,
furious = nil,
status_trigger = nil,
heaven_sent = nil,
heroics = nil,
resuscitate = nil,
maximum_might = nil,
bloodlust = nil,
frenzied_bloodlust = nil,
peak_performance = nil,
dragonheart = nil,
resentment = nil,
bladescale_hone = nil,
spiribirds_call = nil,
embolden = nil,
berserk = nil,
powder_mantle_red = nil,
powder_mantle_blue = nil,
strife = nil,
inspiration = nil,
blood_awakening = nil,
partbreaker = nil
};
local skills_type_name = "skills";
local skill_data_list = {
-- attack_boost = { id = 1 },
agitator = { id = 2 },
peak_performance = { id = 3, level = 0, is_equipped = false },
resentment = { id = 4, level = 0, is_equipped = false },
resuscitate = { id = 5, level = 0, is_equipped = false },
-- critical_eye = { id = 6 },
-- critical_boost = { id = 7 },
-- weakness_exploit = { id = 8 },
latent_power = { id = 9 },
maximum_might = { id = 10, level = 0, is_equipped = false },
-- critical_element = { id = 11 },
-- masters_touch = { id = 12 },
-- fire_attack = { id = 13 },
-- water_attack = { id = 14 },
-- ice_attack = { id = 15 },
-- thunder_attack = { id = 16 },
-- dragon_attack = { id = 17 },
-- poison_attack = { id = 18 },
-- paralysis_attack = { id = 19 },
-- sleep_attack = { id = 20 },
-- blast_attack = { id = 21 },
-- handicraft = { id = 22 },
-- razor_sharp = { id = 23 },
-- spare_shot = { id = 24 },
protective_polish = { id = 25 },
-- minds_eye = { id = 26 },
-- ballistics = { id = 27 },
-- bludgeoner = { id = 28 },
-- bow_charge_plus = { id = 29 },
-- focus = { id = 30 },
-- power_prolonger = { id = 31 },
-- marathon_runner = { id = 32 },
-- constitution = { id = 33 },
-- stamina_surge = { id = 34 },
-- guard = { id = 35 },
-- guard_up = { id = 36 },
offensive_guard = { id = 37 },
-- critical_draw = { id = 38 },
-- punishing_draw = { id = 39 },
-- quick_sheathe = { id = 40 },
-- slugger = { id = 41 },
-- stamina_thief = { id = 42 },
affinity_sliding = { id = 43 },
-- horn_maestro = { id = 44 },
-- artillery = { id = 45 },
-- load_shells = { id = 46 },
-- special_ammo_boost = { id = 47 },
-- normal_rapid_up = { id = 48 },
-- pierce_up = { id = 49 },
-- spread_up = { id = 50 },
-- ammo_up = { id = 51 },
-- reload_speed = { id = 52 },
-- recoil_down = { id = 53 },
-- steadiness = { id = 54 },
-- rapid_fire_up = { id = 55 },
-- defense_boost = { id = 56 },
-- divine_blessing = { id = 57 },
-- recovery_up = { id = 58 },
-- recovery_speed = { id = 59 },
-- speed_eating = { id = 60 },
-- earplugs = { id = 61 },
-- windproof = { id = 62 },
-- tremor_resistance = { id = 63 },
-- bubbly_dance = { id = 64 },
-- evade_window = { id = 65 },
-- evade_extender = { id = 66 },
-- fire_resistance = { id = 67 },
-- water_resistance = { id = 68 },
-- ice_resistance = { id = 69 },
-- thunder_resistance = { id = 70 },
-- dragon_resistance = { id = 71 },
-- blight_resistance = { id = 72 },
-- poison_resistance = { id = 73 },
-- paralysis_resistance = { id = 74 },
-- sleep_resistance = { id = 75 },
-- stun_resistance = { id = 76 },
-- muck_resistance = { id = 77 },
-- blast_resistance = { id = 78 },
-- botanist = { id = 79 },
-- geologist = { id = 80 },
partbreaker = { id = 81, level = 0, is_equipped = false },
-- capture_master = { id = 82 },
-- carving_master = { id = 83 },
-- good_luck = { id = 84 },
-- speed_sharpening = { id = 85 },
-- bombardier = { id = 86 },
-- mushroomancer = { id = 87 },
-- item_prolonger = { id = 88 },
-- wide_range = { id = 89 },
-- free_meal = { id = 90 },
heroics = { id = 91, level = 0, is_equipped = false },
-- fortify = { id = 92 },
-- flinch_free = { id = 93 },
-- jump_master = { id = 94 },
-- carving_pro = { id = 95 },
-- hunger_resistance = { id = 96 },
-- leap_of_faith = { id = 97 },
-- diversion = { id = 98 },
-- master_mounter = { id = 99 },
-- chameleos_blessing = { id = 100 },
-- kushala_blessing = { id = 101 },
-- teostra_blessing = { id = 102 },
dragonheart = { id = 103, level = 0, is_equipped = false },
-- wirebug_whisperer = { id = 104 },
wall_runner = { id = 105 },
counterstrike = { id = 106 },
-- rapid_morph = { id = 107 },
hellfire_cloak = { id = 108 },
-- wind_alignment = { id = 109 },
-- thunder_alignment = { id = 110 },
-- stormsoul = { id = 111 },
-- blood_rite = { id = 112 },
dereliction = { id = 113, level = 0, is_equipped = false },
furious = { id = 114 },
-- mail_of_hellfire = { id = 115 },
coalescence = { id = 116 },
bloodlust = { id = 117, level = 0, is_equipped = false },
-- defiance = { id = 118 },
-- sneak_attack = { id = 119 },
adrenaline_rush = { id = 120 },
embolden = { id = 121 },
-- redirection = { id = 122 },
spiribirds_call = { id = 123 },
charge_master = { id = 124 },
-- foray = { id = 125 },
-- tune_up = { id = 126 },
grinder_s = { id = 127 },
bladescale_hone = { id = 128 },
-- wall_runner_boost = { id = 129 },
-- element_exploit = { id = 130 },
burst = { id = 131 },
-- guts = { id = 132 },
-- quick_breath = { id = 133 },
status_trigger = { id = 134 },
intrepid_heart = { id = 135 },
-- buildup_boost = { id = 136 },
berserk = { id = 137 },
wind_mantle = { id = 138 },
-- powder_mantle = { id = 139 },
-- frostcraft = { id = 140 },
-- dragon_conversion = { id = 141 },
heaven_sent = { id = 142 },
frenzied_bloodlust = { id = 143 },
blood_awakening = { id = 144 },
strife = { id = 145, level = 0, is_equipped = false },
-- shock_absorber = { id = 146 },
inspiration = { id = 147 },
}
local intrepid_heart_minimal_value = 400;
local burst_breakpoints = { 5 };
local dereliction_breakpoints = { 100, 50 };
local dragonheart_breakpoints = { 0.5, 0.5, 0.7, 0.7, 0.8 };
local strife_breakpoints = { { 10 }, { 15 }, { 20 } };
local blood_awakening_breakpoints = { 2 };
local wind_mantle_breakpoints = { 20, 10 }; -- Sword & Shield, Lance, Hammer, Switch Axe, Insect Glaive, Long Sword, Hunting Horn
local wind_mantle_special_breakpoints = {
[0] = { 10, 5 }, -- Great Sword
[3] = { 60, 30 }, -- Light Bowgun
[4] = { 60, 30 }, -- Heavy Bowgun
[6] = { 30, 15 }, -- Gunlance
[9] = { 40, 20 }, -- Dual Blades
[11] = { 30, 15 }, -- Charge Blade
[13] = { 60, 30 }, -- Bow
};
local maximum_might_delay_timer = nil;
local maximum_might_previous_timer_value = 0;
local frenzied_bloodlust_duration = 0;
local frenzied_bloodlust_sheathed_duration = 0;
local spiribirds_call_duration = 60;
local wind_mantle_duration = 15;
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_data_method = player_manager_type_def:get_method("get_PlayerData");
local get_ref_item_parameter_method = player_manager_type_def:get_method("get_RefItemParameter");
local player_user_data_item_parameter_type_def = get_ref_item_parameter_method:get_return_type();
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Burst
local rengeki_power_up_count_field = player_data_type_def:get_field("_RengekiPowerUpCnt");
local rengeki_power_up_timer_field = player_data_type_def:get_field("_RengekiPowerUpTimer");
-- Intrepid Heart
local equip_skill_223_accumulator_field = player_data_type_def:get_field("_EquipSkill223Accumulator");
-- Derelection
local symbiosis_skill_lost_vital_field = player_data_type_def:get_field("_SymbiosisSkillLostVital");
-- Grinder (S)
local brand_new_sharpness_adjust_up_timer_field = player_data_type_def:get_field("_BrandNewSharpnessAdjustUpTimer");
-- Counterstrike
local counterattack_powerup_timer_field = player_data_type_def:get_field("_CounterattackPowerupTimer");
-- Affinity Sliding
local sliding_powerup_timer_field = player_data_type_def:get_field("_SlidingPowerupTimer");
-- Coalescence
local disaster_turn_powerup_timer_field = player_data_type_def:get_field("_DisasterTurnPowerUpTimer");
-- Adrenaline Rush
local equip_skill_208_atk_up_field = player_data_type_def:get_field("_EquipSkill208_AtkUpTimer");
-- Wall Runner
local wall_run_powerup_timer_field = player_data_type_def:get_field("_WallRunPowerupTimer");
-- Offensive Guard
local equip_skill_036_timer_field = player_data_type_def:get_field("_EquipSkill_036_Timer");
-- Hellfire Cloak
local onibi_powerup_timer_field = player_data_type_def:get_field("_OnibiPowerUpTiemr");
-- Agitator
local challenge_timer_field = player_data_type_def:get_field("_ChallengeTimer");
-- Furious
local furious_skill_stamina_buff_second_timer_field = player_data_type_def:get_field("_FuriousSkillStaminaBuffSecondTimer");
-- Maximum Might
local whole_body_timer_field = player_data_type_def:get_field("_WholeBodyTimer");
-- Frenzied Bloodlust
local equip_skill_231_wire_num_timer_field = player_data_type_def:get_field("_EquipSkill231_WireNumTimer");
local equip_skill_231_wp_off_timer_field = player_data_type_def:get_field("_EquipSkill231_WpOffTimer");
-- Resentment
local r_vital_field = player_data_type_def:get_field("_r_Vital");
-- Status Trigger
local equip_skill_222_timer_field = player_data_type_def:get_field("_EquipSkill222_Timer");
-- Spiritbird's Call
local equip_skill_211_timer_field = player_data_type_def:get_field("_EquipSkill211_Timer");
-- Powder Mantle
local equip_skill_227_state_field = player_data_type_def:get_field("_EquipSkill227State");
local equip_skill_227_state_timer_field = player_data_type_def:get_field("_EquipSkill227StateTimer");
-- Inspiration
local equip_skill_235_atk_up_second_timer_field = player_data_type_def:get_field("_EquipSkill235AtkUpSecondTimer");
-- Blood Awakening
local equip_skill_232_timer_field = player_data_type_def:get_field("_EquipSkill232Timer");
local player_base_type_def = sdk.find_type_definition("snow.player.PlayerBase");
local player_weapon_type_field = player_base_type_def:get_field("_playerWeaponType");
local get_player_skill_list_method = player_base_type_def:get_method("get_PlayerSkillList");
-- Latent Power
local power_freedom_timer_field = player_base_type_def:get_field("_PowerFreedomTimer");
-- Protective Polish
local sharpness_gauge_boost_timer_field = player_base_type_def:get_field("_SharpnessGaugeBoostTimer");
-- Heroics
local is_predicament_power_up_method = player_base_type_def:get_method("isPredicamentPowerUp");
-- Berserk
local get_is_enable_equip_skill_225_method = player_base_type_def:get_method("get_IsEnableEquipSkill225");
-- Dragon Conversion
local equip_skill_229_sum_resist_field = player_base_type_def:get_field("_EquipSkill229SumResist");
-- Resuscitate
local is_debuff_state_method = player_base_type_def:get_method("isDebuffState");
local player_skill_list_type_def = get_player_skill_list_method:get_return_type();
local get_skill_data_method = player_skill_list_type_def:get_method("getSkillData");
local skill_data_type_def = get_skill_data_method:get_return_type();
local skill_lv_field = skill_data_type_def:get_field("SkillLv");
local player_quest_base_type_def = sdk.find_type_definition("snow.player.PlayerQuestBase");
-- Wind Mantle
local is_equip_skill_226_enable_field = player_quest_base_type_def:get_field("_IsEquipSkill226Enable");
local equip_skill_226_attack_count_field = player_quest_base_type_def:get_field("_EquipSkill226AttackCount");
local equip_skill_226_attack_off_timer_field = player_quest_base_type_def:get_field("_EquipSkill226AttackOffTimer");
-- Heaven-Sent
local is_active_equip_skill_230_method = player_quest_base_type_def:get_method("isActiveEquipSkill230");
-- Frenzied Bloodlust
local get_hunter_wire_skill_231_num_method = player_quest_base_type_def:get_method("get_HunterWireSkill231Num");
-- Embolden
local get_active_equip_209_method = player_quest_base_type_def:get_method("getActiveEquipSkill209");
-- Dragon Conversion
local equip_skill_229_use_up_flag_field = player_quest_base_type_def:get_field("_EquipSkill229UseUpFlg");
-- Strife
local get_affinity_equip_skill_233_method = player_quest_base_type_def:get_method("getAffinityEquipSkill233");
-- Blood Awakening
local get_equip_skill_232_lv_method = player_quest_base_type_def:get_method("getEquipSkill232Lv");
local get_equip_skill_232_param_method = player_quest_base_type_def:get_method("getEquipSkill232Param");
local equip_skill_232_param_type_def = get_equip_skill_232_param_method:get_return_type();
local activation_time_lv_1_field = equip_skill_232_param_type_def:get_field("_ActivationTime_Lv1");
local activation_time_lv_2_field = equip_skill_232_param_type_def:get_field("_ActivationTime_Lv2");
local bow_type_def = sdk.find_type_definition("snow.player.Bow");
local _equip_skill_216_bottle_up_timer_field = bow_type_def:get_field("_EquipSkill216_BottleUpTimer");
local data_shortcut_type_def = sdk.find_type_definition("snow.data.DataShortcut");
local get_name_method = data_shortcut_type_def:get_method("getName(snow.data.DataDef.PlEquipSkillId)");
function this.update(player, player_data, weapon_type)
--local item_parameter = get_ref_item_parameter_method:call(singletons.player_manager);
--if item_parameter == nil then
-- error_handler.report("skills.update", "Failed to access Data: item_parameter");
-- return;
--end
this.update_equipped_skill_data(player);
this.update_wind_mantle(player, weapon_type);
this.update_maximum_might(player_data);
this.update_bloodlust();
this.update_frenzied_bloodlust(player, player_data);
this.update_peak_performance();
this.update_dragonheart();
this.update_resentment(player_data);
this.update_bladescale_hone(player, weapon_type);
this.update_spiribirds_call(player_data);
this.update_powder_mantle(player_data);
this.update_blood_awakening(player, player_data);
this.update_generic_skill("dereliction", player_data, symbiosis_skill_lost_vital_field,
nil, nil, nil, nil, true, nil, dereliction_breakpoints);
this.update_generic_skill("burst", player_data, rengeki_power_up_count_field,
player_data, rengeki_power_up_timer_field, nil, nil, false, nil, burst_breakpoints);
this.update_generic_skill("intrepid_heart", player_data, equip_skill_223_accumulator_field,
nil, nil, nil, nil, true, intrepid_heart_minimal_value);
this.update_generic_skill("latent_power", nil, nil, player, power_freedom_timer_field);
this.update_generic_skill("protective_polish", nil, nil, player, sharpness_gauge_boost_timer_field);
this.update_generic_skill("grinder_s", nil, nil, player_data, brand_new_sharpness_adjust_up_timer_field);
this.update_generic_skill("counterstrike", nil, nil, player_data, counterattack_powerup_timer_field);
this.update_generic_skill("affinity_sliding", nil, nil, player_data, sliding_powerup_timer_field);
this.update_generic_skill("coalescence", nil, nil, player_data, disaster_turn_powerup_timer_field);
this.update_generic_skill("adrenaline_rush", nil, nil, player_data, equip_skill_208_atk_up_field);
this.update_generic_skill("wall_runner", nil, nil, player_data, wall_run_powerup_timer_field);
this.update_generic_skill("offensive_guard", nil, nil, player_data, equip_skill_036_timer_field);
this.update_generic_skill("hellfire_cloak", nil, nil, player_data, onibi_powerup_timer_field);
this.update_generic_skill("agitator", nil, nil, player_data, challenge_timer_field, nil, nil, true);
this.update_generic_skill("furious", nil, nil, player_data, furious_skill_stamina_buff_second_timer_field);
this.update_generic_skill("status_trigger", nil, nil, player_data, equip_skill_222_timer_field);
this.update_generic_skill("inspiration", nil, nil, player_data, equip_skill_235_atk_up_second_timer_field);
this.update_generic_skill("heaven_sent", player, is_active_equip_skill_230_method);
this.update_generic_skill("heroics", player, is_predicament_power_up_method);
this.update_generic_skill("resuscitate", player, is_debuff_state_method);
this.update_generic_skill("embolden", player, get_active_equip_209_method);
this.update_generic_skill("berserk", player, get_is_enable_equip_skill_225_method);
this.update_generic_skill("dragon_conversion_elemental_attack_up", player, equip_skill_229_sum_resist_field);
this.update_generic_skill("dragon_conversion_elemental_res_up", player, equip_skill_229_use_up_flag_field);
this.update_generic_skill("partbreaker", nil, nil, nil, nil, nil, nil, true);
this.update_generic_skill("strife", player, get_affinity_equip_skill_233_method,
nil, nil, nil, nil, nil, nil, strife_breakpoints[skill_data_list.strife.level]);
end
function this.update_generic_skill(skill_key, value_owner, value_holder, timer_owner, timer_holder, duration_owner, duration_holder,
is_infinite, minimal_value, level_breakpoints)
local skill_data = skill_data_list[skill_key];
if skill_data ~= nil and skill_data.is_equipped ~= nil and not skill_data.is_equipped then
this.list[skill_key] = nil;
return;
end
buffs.update_generic_buff(this.list, skills_type_name, skill_key, this.get_skill_name,
value_owner, value_holder, timer_owner, timer_holder, duration_owner, duration_holder,
is_infinite, minimal_value, level_breakpoints);
end
function this.update_equipped_skill_data(player)
local player_skill_list = get_player_skill_list_method:call(player);
if player_skill_list == nil then
error_handler.report("skills.update_equipped_skill_data", "Failed to access Data: player_skill_list");
return;
end
for skill_key, skill_data in pairs(skill_data_list) do
if skill_data.is_equipped == nil then
goto continue;
end
local re_skill_data = get_skill_data_method:call(player_skill_list, skill_data.id);
if re_skill_data == nil then
skill_data.is_equipped = false;
skill_data.level = 0;
goto continue;
end
local skill_level = skill_lv_field:get_data(re_skill_data);
if skill_level == nil then
error_handler.report("skills.update_equipped_skill_data", string.format("Failed to access Data: %s -> skill_level", skill_key));
goto continue;
end
if skill_level <= 0 then
skill_data.is_equipped = false;
skill_data.level = 0;
goto continue;
end
skill_data.is_equipped = true;
skill_data.level = skill_level;
::continue::
end
end
function this.update_wind_mantle(player, weapon_type)
local is_wind_mantle_enable = is_equip_skill_226_enable_field:get_data(player);
if is_wind_mantle_enable == nil then
error_handler.report("skills.update_wind_mantle", "Failed to access Data: is_wind_mantle_enable");
return;
end
if not is_wind_mantle_enable then
this.list.wind_mantle = nil;
return;
end
local wind_mantle_timer = equip_skill_226_attack_off_timer_field:get_data(player);
if wind_mantle_timer == nil then
error_handler.report("skills.update_wind_mantle", "Failed to access Data: wind_mantle_timer");
return;
end
local wind_mantle_value = equip_skill_226_attack_count_field:get_data(player);
if wind_mantle_value == nil then
error_handler.report("skills.update_wind_mantle", "Failed to access Data: wind_mantle_value");
return;
end
local level = 1;
local breakpoints = wind_mantle_special_breakpoints[weapon_type] or wind_mantle_breakpoints;
local breakpoint_count = #breakpoints;
for index, breakpoint in ipairs(breakpoints) do
if wind_mantle_value >= breakpoint then
level = 2 + breakpoint_count - index;
break;
end
end
buffs.update_generic(this.list, skills_type_name, "wind_mantle", this.get_skill_name, level, wind_mantle_duration - (wind_mantle_timer / 60), wind_mantle_duration);
end
function this.update_maximum_might(player_data)
if not skill_data_list.maximum_might.is_equipped then
this.list.maximum_might = nil;
return;
end
local whole_body_timer = whole_body_timer_field:get_data(player_data);
if whole_body_timer == nil then
error_handler.report("skills.update_maximum_might", "Failed to access Data: whole_body_timer");
return;
end
if player_info.list.max_stamina == -1 then
return;
end
local skill = this.list.maximum_might;
local is_timer_zero = utils.number.is_equal(whole_body_timer, 0);
if player_info.list.stamina ~= player_info.list.max_stamina then
if skill ~= nil and whole_body_timer < maximum_might_previous_timer_value then
this.list.maximum_might = nil;
end
elseif skill == nil then
local maximum_might_name = this.get_skill_name("maximum_might");
if whole_body_timer < maximum_might_previous_timer_value then
this.list.maximum_might = buffs.new(skills_type_name, "maximum_might", maximum_might_name, 1);
elseif is_timer_zero then
if maximum_might_delay_timer == nil then
maximum_might_delay_timer = time.new_delay_timer(function()
maximum_might_delay_timer = nil;
this.list.maximum_might = buffs.new(skills_type_name, "maximum_might", maximum_might_name, 1);
end, 3.5);
end
else
time.remove_delay_timer(maximum_might_delay_timer);
end
end
maximum_might_previous_timer_value = whole_body_timer;
end
function this.update_bloodlust()
if not skill_data_list.bloodlust.is_equipped then
this.list.bloodlust = nil;
return;
end
if not abnormal_statuses.list.frenzy_infection
and not abnormal_statuses.list.frenzy_overcome then
this.list.bloodlust = nil;
return;
end
if this.list.bloodlust == nil then
local bloodlust_name = this.get_skill_name("bloodlust");
if bloodlust_name == nil then
error_handler.report("skills.update_generic_buff", "Failed to access Data: bloodlust_name");
return;
end
this.list.bloodlust = buffs.new(skills_type_name, "bloodlust", bloodlust_name);
end
end
function this.update_frenzied_bloodlust(player, player_data)
local hunter_wire_skill_231_num = get_hunter_wire_skill_231_num_method:call(player);
if hunter_wire_skill_231_num == nil then
error_handler.report("skills.update_frenzied_bloodlust", "Failed to access Data: hunter_wire_skill_231_num");
return;
end
if hunter_wire_skill_231_num == 0 then
this.list.frenzied_bloodlust = nil;
frenzied_bloodlust_duration = 0;
frenzied_bloodlust_sheathed_duration = 0;
return;
end
local equip_skill_231_wire_num_timer = equip_skill_231_wire_num_timer_field:get_data(player_data);
if equip_skill_231_wire_num_timer == nil then
error_handler.report("skills.update_frenzied_bloodlust", "Failed to access Data: equip_skill_231_wire_num_timer");
return;
end
local equip_skill_231_wp_off_timer = equip_skill_231_wp_off_timer_field:get_data(player_data);
if equip_skill_231_wp_off_timer == nil then
error_handler.report("skills.update_frenzied_bloodlust", "Failed to access Data: equip_skill_231_wp_off_timer");
return;
end
local is_wire_num_timer_zero = utils.number.is_equal(equip_skill_231_wire_num_timer, 0);
if is_wire_num_timer_zero then
this.list.frenzied_bloodlust = nil;
return;
end
if equip_skill_231_wire_num_timer > frenzied_bloodlust_duration then
frenzied_bloodlust_duration = equip_skill_231_wire_num_timer;
end
if equip_skill_231_wp_off_timer > frenzied_bloodlust_sheathed_duration then
frenzied_bloodlust_sheathed_duration = equip_skill_231_wp_off_timer;
end
local is_wp_off_timer_max = utils.number.is_equal(equip_skill_231_wp_off_timer, frenzied_bloodlust_sheathed_duration);
local timer = equip_skill_231_wire_num_timer;
if not is_wp_off_timer_max then
timer = equip_skill_231_wp_off_timer;
end
local skill = buffs.update_generic(this.list, skills_type_name, "frenzied_bloodlust", this.get_skill_name, 1, timer / 60);
if is_wp_off_timer_max then
skill.duration = frenzied_bloodlust_duration / 60;
else
skill.duration = frenzied_bloodlust_sheathed_duration / 60;
end
end
function this.update_peak_performance()
if not skill_data_list.peak_performance.is_equipped then
this.list.peak_performance = nil;
return;
end
if player_info.list.health ~= player_info.list.max_health then
this.list.peak_performance = nil;
return;
end
buffs.update_generic(this.list, skills_type_name, "peak_performance", this.get_skill_name);
end
function this.update_dragonheart()
if not skill_data_list.dragonheart.is_equipped then
this.list.dragonheart = nil;
return;
end
local breakpoint = dragonheart_breakpoints[skill_data_list.dragonheart.level];
local health_percentage = 1;
local max_health = player_info.list.max_health;
if max_health ~= 0 then
health_percentage = player_info.list.health / max_health;
end
if health_percentage > breakpoint then
this.list.dragonheart = nil;
return;
end
buffs.update_generic(this.list, skills_type_name, "dragonheart", this.get_skill_name);
end
function this.update_resentment(player_data)
if not skill_data_list.resentment.is_equipped then
this.list.resentment = nil;
return;
end
local r_vital = r_vital_field:get_data(player_data);
if r_vital == nil then
error_handler.report("skills.update_resentment", "Failed to access Data: r_vital");
return;
end
if player_info.list.health >= r_vital then
this.list.resentment = nil;
return;
end
buffs.update_generic(this.list, skills_type_name, "resentment", this.get_skill_name);
end
function this.update_bladescale_hone(player, weapon_type)
if weapon_type ~= 13 then -- 13 = Bow
this.list.bladescale_hone = nil;
return;
end
this.update_generic_skill("bladescale_hone", nil, nil, player, _equip_skill_216_bottle_up_timer_field);
end
function this.update_spiribirds_call(player_data)
local equip_skill_211_timer = equip_skill_211_timer_field:get_data(player_data);
if equip_skill_211_timer == nil then
error_handler.report("skills.update_spiribirds_call", "Failed to access Data: equip_skill_211_timer");
return;
end
if utils.number.is_equal(equip_skill_211_timer, 0) then
this.list.spiribirds_call = nil;
return;
end
local timer = spiribirds_call_duration - (equip_skill_211_timer / 60);
buffs.update_generic(this.list, skills_type_name, "spiribirds_call", this.get_skill_name, 1, timer, spiribirds_call_duration);
end
function this.update_powder_mantle(player_data)
this.update_generic_skill("powder_mantle_blue", player_data, equip_skill_227_state_field,
player_data, equip_skill_227_state_timer_field, nil, nil, nil, 2);
if this.list.powder_mantle_blue ~= nil then
this.list.powder_mantle_red = nil;
return;
end
this.update_generic_skill("powder_mantle_red", player_data, equip_skill_227_state_field,
player_data, equip_skill_227_state_timer_field, nil, nil, nil);
end
function this.update_blood_awakening(player, player_data)
this.update_generic_skill("blood_awakening", player, get_equip_skill_232_lv_method,
player_data, equip_skill_232_timer_field,
nil, nil,
nil, nil, blood_awakening_breakpoints);
local blood_awakening = this.list.blood_awakening;
if this.list.blood_awakening == nil then
return;
end
local activation_time_field = activation_time_lv_1_field;
if blood_awakening.level == 2 then
activation_time_field = activation_time_lv_2_field;
end
local blood_awakening_param = get_equip_skill_232_param_method:call(player);
local blood_awakening_duration = activation_time_field:get_data(blood_awakening_param);
blood_awakening.duration = blood_awakening_duration / 60;
end
function this.init_names()
for skill_key, skill in pairs(this.list) do
skill.name = this.get_skill_name(skill_key);
end
end
function this.get_skill_name(skill_key)
local skill_data = skill_data_list[skill_key];
if skill_data == nil then
local skill_name = language.current_language.skills[skill_key];
if skill_name == nil then
return skill_key;
end
return skill_name;
end
local skill_name = get_name_method:call(nil, skill_data_list[skill_key].id);
if skill_name == nil then
error_handler.report("skills.get_skill_name", string.format("Failed to access Data: %s_name", skill_key));
return skill_key;
end
return skill_name;
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
player_info = require("MHR_Overlay.Misc.player_info");
time = require("MHR_Overlay.Game_Handler.time");
abnormal_statuses = require("MHR_Overlay.Buffs.abnormal_statuses");
end
function this.init_module()
end
return this;

File diff suppressed because it is too large Load Diff

View File

@@ -8,6 +8,7 @@ local ailments;
local singletons; local singletons;
local non_players; local non_players;
local utils; local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -50,6 +51,7 @@ local is_boss_enemy_method = enemy_character_base_type_def:get_method("get_isBos
local check_die_method = enemy_character_base_type_def:get_method("checkDie"); local check_die_method = enemy_character_base_type_def:get_method("checkDie");
local stock_direct_marionette_finish_shoot_hit_parts_damage_method = enemy_character_base_type_def:get_method("stockDirectMarionetteFinishShootHitPartsDamage"); local stock_direct_marionette_finish_shoot_hit_parts_damage_method = enemy_character_base_type_def:get_method("stockDirectMarionetteFinishShootHitPartsDamage");
local get_mystery_core_break_damage_rate_method = enemy_character_base_type_def:get_method("getMysteryCoreBreakDamageRate");
local enemy_calc_damage_info_type_def = sdk.find_type_definition("snow.hit.EnemyCalcDamageInfo.AfterCalcInfo_DamageSide"); local enemy_calc_damage_info_type_def = sdk.find_type_definition("snow.hit.EnemyCalcDamageInfo.AfterCalcInfo_DamageSide");
local get_attacker_id_method = enemy_calc_damage_info_type_def:get_method("get_AttackerID"); local get_attacker_id_method = enemy_calc_damage_info_type_def:get_method("get_AttackerID");
@@ -69,8 +71,6 @@ local get_condition_type2_method = enemy_calc_damage_info_type_def:get_method("g
local get_condition_damage3_method = enemy_calc_damage_info_type_def:get_method("get_ConditionDamage3"); local get_condition_damage3_method = enemy_calc_damage_info_type_def:get_method("get_ConditionDamage3");
local get_condition_type3_method = enemy_calc_damage_info_type_def:get_method("get_ConditionDamageType3"); local get_condition_type3_method = enemy_calc_damage_info_type_def:get_method("get_ConditionDamageType3");
local stock_mystery_core_break_damage_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase.stockMysteryCoreBreakDamage");
local quest_manager_type_def = sdk.find_type_definition("snow.QuestManager"); local quest_manager_type_def = sdk.find_type_definition("snow.QuestManager");
local quest_forfeit_method = quest_manager_type_def:get_method("questForfeit"); local quest_forfeit_method = quest_manager_type_def:get_method("questForfeit");
@@ -79,24 +79,27 @@ local packet_quest_forfeit_type_def = sdk.find_type_definition("snow.QuestManage
local dead_player_id_field = packet_quest_forfeit_type_def:get_field("_DeadPlIndex"); local dead_player_id_field = packet_quest_forfeit_type_def:get_field("_DeadPlIndex");
local is_from_host_field = packet_quest_forfeit_type_def:get_field("_IsFromQuestHostPacket"); local is_from_host_field = packet_quest_forfeit_type_def:get_field("_IsFromQuestHostPacket");
local enemy_mystery_core_parts_type_def = sdk.find_type_definition("snow.enemy.EnemyMysteryCoreParts");
local on_break_method = enemy_mystery_core_parts_type_def:get_method("onBreak");
function this.get_damage_source_type(damage_source_type_id, is_marionette_attack) function this.get_damage_source_type(damage_source_type_id, is_marionette_attack)
if is_marionette_attack then if is_marionette_attack then
return "wyvern riding"; return players.damage_types.wyvern_riding;
elseif damage_source_type_id == 0 or damage_source_type_id == 7 or damage_source_type_id == 11 or damage_source_type_id == 13 then elseif damage_source_type_id == 0 or damage_source_type_id == 7 or damage_source_type_id == 11 or damage_source_type_id == 13 then
return "player"; return players.damage_types.player;
elseif damage_source_type_id == 1 or damage_source_type_id == 8 then elseif damage_source_type_id == 1 or damage_source_type_id == 8 then
return "bomb"; return players.damage_types.bombs;
elseif damage_source_type_id == 9 then elseif damage_source_type_id == 9 then
return "kunai"; return players.damage_types.kunai;
elseif damage_source_type_id >= 14 and damage_source_type_id <= 20 then elseif damage_source_type_id >= 14 and damage_source_type_id <= 20 then
return "installation"; return players.damage_types.installations;
elseif damage_source_type_id >= 21 and damage_source_type_id <= 23 then elseif damage_source_type_id >= 21 and damage_source_type_id <= 23 then
return "otomo"; return players.damage_types.otomo;
elseif damage_source_type_id >= 25 and damage_source_type_id <= 32 then elseif damage_source_type_id >= 25 and damage_source_type_id <= 32 then
return "endemic life"; return players.damage_types.endemic_life;
end end
return "other"; return players.damage_types.other;
end end
-- snow.hit.EnemyCalcDamageInfo.AfterCalcInfo_DamageSide -- snow.hit.EnemyCalcDamageInfo.AfterCalcInfo_DamageSide
@@ -104,11 +107,13 @@ function this.update_damage(enemy, enemy_calc_damage_info)
local is_large_monster = is_boss_enemy_method:call(enemy); local is_large_monster = is_boss_enemy_method:call(enemy);
if is_large_monster == nil then if is_large_monster == nil then
error_handler.report("damage_hook.update_damage", "Failed to access Data: is_large_monster");
return; return;
end end
local dead_or_captured = check_die_method:call(enemy); local dead_or_captured = check_die_method:call(enemy);
if dead_or_captured == nil then if dead_or_captured == nil then
error_handler.report("damage_hook.update_damage", "Failed to access Data: dead_or_captured");
return; return;
end end
@@ -226,23 +231,40 @@ function this.update_damage(enemy, enemy_calc_damage_info)
players.update_damage(players.total, damage_source_type, is_large_monster, damage_object); players.update_damage(players.total, damage_source_type, is_large_monster, damage_object);
players.update_damage(player, damage_source_type, is_large_monster, damage_object); players.update_damage(player, damage_source_type, is_large_monster, damage_object);
--[[xy = string.format(
PhysicalPartsVitalDamage(): %s
PhysicalPartsBreakVitalDamage(): %s
PhysicalPartsLossVitalDamage(): %s
PhysicalMultiPartsVitalDamage(): %s
ElementPartsVitalDamage(): %s
ElementPartsBreakVitalDamage(): %s
ElementPartsLossVitalDamage(): %s
ElementMultiPartsVitalDamage(): %s
IsBreakPartsDamage(): %s
,
tostring(enemy_calc_damage_info:get_PhysicalPartsVitalDamage()),
tostring(enemy_calc_damage_info:get_PhysicalPartsBreakVitalDamage()),
tostring(enemy_calc_damage_info:get_PhysicalPartsLossVitalDamage()),
tostring(enemy_calc_damage_info:get_PhysicalMultiPartsVitalDamage()),
tostring(enemy_calc_damage_info:get_ElementPartsVitalDamage()),
tostring(enemy_calc_damage_info:get_ElementPartsBreakVitalDamage()),
tostring(enemy_calc_damage_info:get_ElementPartsLossVitalDamage()),
tostring(enemy_calc_damage_info:get_ElementMultiPartsVitalDamage()),
tostring(enemy_calc_damage_info:get_IsBreakPartsDamage())
);]]
end end
--function damage_hook.on_mystery_core_break(enemy)
--end
function this.cart(dead_player_id, flag_cat_skill_insurance) function this.cart(dead_player_id, flag_cat_skill_insurance)
-- flag_cat_skill_insurance = 0 -- flag_cat_skill_insurance = 0
-- flag_cat_skill_insurance = 1 -- flag_cat_skill_insurance = 1
local player = players.list[dead_player_id];
if player == nil then
return;
end
player.cart_count = player.cart_count + 1; quest_status.update_cart_count();
quest_status.get_cart_count();
end end
function this.on_stock_direct_marionette_finish_shoot_hit_parts_damage(enemy, damage_rate, is_endure, is_ignore_multi_rate, category, no) function this.on_stock_direct_marionette_finish_shoot_hit_parts_damage(enemy, damage_rate, is_endure, is_ignore_multi_rate, category, no)
@@ -270,6 +292,7 @@ function this.on_stock_direct_marionette_finish_shoot_hit_parts_damage(enemy, da
end end
if player == nil then if player == nil then
error_handler.report("damage_hook.on_stock_direct_marionette_finish_shoot_hit_parts_damage", "Failed to create Player Entry");
return; return;
end end
@@ -309,7 +332,48 @@ function this.on_stock_direct_marionette_finish_shoot_hit_parts_damage(enemy, da
players.update_damage(player, damage_source_type, true, large_monster_damage_object); players.update_damage(player, damage_source_type, true, large_monster_damage_object);
end end
function this.init_module() function this.on_anomaly_core_break(anomaly_core_part)
local anomaly_monster = nil;
for enemy, monster in pairs(large_monster.list) do
if monster.is_anomaly then
for part_id, part in pairs(monster.parts) do
if part.anomaly_core_ref == anomaly_core_part then
anomaly_monster = monster;
break;
end
end
if anomaly_monster ~= nil then
break;
end
end
end
if anomaly_monster == nil then
error_handler.report("damage_hook.on_anomaly_core_break", "No Anomaly Monster Found");
return;
end
local anomaly_core_break_damage_rate = get_mystery_core_break_damage_rate_method:call(anomaly_monster.enemy);
if anomaly_core_break_damage_rate == nil then
error_handler.report("damage_hook.on_anomaly_core_break", "Failed to access Data: anomaly_core_break_damage_rate");
return;
end
local anomaly_core_break_damage = utils.math.round(anomaly_core_break_damage_rate * anomaly_monster.max_health);
local damage_object = {};
damage_object.total_damage = anomaly_core_break_damage;
damage_object.physical_damage = 0;
damage_object.elemental_damage = 0;
damage_object.ailment_damage = anomaly_core_break_damage;
players.update_damage(players.total, players.damage_types.anomaly_core, true, damage_object);
end
function this.init_dependencies()
quest_status = require("MHR_Overlay.Game_Handler.quest_status"); quest_status = require("MHR_Overlay.Game_Handler.quest_status");
players = require("MHR_Overlay.Damage_Meter.players"); players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster"); small_monster = require("MHR_Overlay.Monsters.small_monster");
@@ -318,7 +382,10 @@ function this.init_module()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
non_players = require("MHR_Overlay.Damage_Meter.non_players"); non_players = require("MHR_Overlay.Damage_Meter.non_players");
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
sdk.hook(stock_direct_marionette_finish_shoot_hit_parts_damage_method, function(args) sdk.hook(stock_direct_marionette_finish_shoot_hit_parts_damage_method, function(args)
local enemy = sdk.to_managed_object(args[2]); local enemy = sdk.to_managed_object(args[2]);
local damage_rate = sdk.to_float(args[3]); local damage_rate = sdk.to_float(args[3]);
@@ -344,11 +411,15 @@ function this.init_module()
return retval; return retval;
end); end);
--sdk.hook(stock_mystery_core_break_damage_type_def, function(args) sdk.hook(on_break_method, function(args)
-- pcall(damage_hook.on_mystery_core_break, sdk.to_managed_object(args[2])); -- break core group is same as hit group?
--end, function(retval) -- break core group is part id which exploded
-- return retval; local anomaly_core_part = sdk.to_managed_object(args[2]);
--end);
this.on_anomaly_core_break(anomaly_core_part);
end, function(retval)
return retval;
end);
end end
return this; return this;

View File

@@ -9,6 +9,8 @@ local quest_status;
local drawing; local drawing;
local language; local language;
local players; local players;
local error_handler;
local utils;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -55,8 +57,8 @@ function this.new(id, name, level, type)
non_player.type = type; non_player.type = type;
non_player.join_time = -1; non_player.join_time = utils.constants.uninitialized_int;
non_player.first_hit_time = -1; non_player.first_hit_time = utils.constants.uninitialized_int;
non_player.dps = 0; non_player.dps = 0;
non_player.small_monsters = players.init_damage_sources() non_player.small_monsters = players.init_damage_sources()
@@ -132,17 +134,19 @@ function this.update_servant_list()
local cached_config = config.current_config.damage_meter_UI; local cached_config = config.current_config.damage_meter_UI;
if singletons.servant_manager == nil then if singletons.servant_manager == nil then
error_handler.report("non_players.update_servant_list", "Failed to access Data: servant_manager");
return; return;
end end
local quest_servant_id_list = get_quest_servant_id_list_method:call(singletons.servant_manager); local quest_servant_id_list = get_quest_servant_id_list_method:call(singletons.servant_manager);
if quest_servant_id_list == nil then if quest_servant_id_list == nil then
error_handler.report("non_players.update_servant_list", "Failed to access Data: quest_servant_id_list");
return; return;
end end
local servant_count = servant_get_count_method:call(quest_servant_id_list); local servant_count = servant_get_count_method:call(quest_servant_id_list);
if servant_count == nil then if servant_count == nil then
customization_menu.status = "No quest servant id list count"; error_handler.report("non_players.update_servant_list", "Failed to access Data: servant_count");
return; return;
end end
@@ -150,19 +154,20 @@ function this.update_servant_list()
for i = 0, servant_count - 1 do for i = 0, servant_count - 1 do
local servant_id = servant_get_item_method:call(quest_servant_id_list, i); local servant_id = servant_get_item_method:call(quest_servant_id_list, i);
if servant_id == nil then if servant_id == nil then
error_handler.report("non_players.update_servant_list", "Failed to access Data: servant_id No." .. tostring(i));
goto continue; goto continue;
end end
local ai_control = get_ai_control_by_servant_id_method:call(singletons.servant_manager, servant_id); local ai_control = get_ai_control_by_servant_id_method:call(singletons.servant_manager, servant_id);
if ai_control == nil then if ai_control == nil then
customization_menu.status = "No quest servant ai control"; error_handler.report("non_players.update_servant_list", "Failed to access Data: ai_control No." .. tostring(i));
goto continue; goto continue;
end end
local servant_info = get_servant_info_method:call(ai_control); local servant_info = get_servant_info_method:call(ai_control);
if servant_info == nil then if servant_info == nil then
customization_menu.status = "No quest servant info"; error_handler.report("non_players.update_servant_list", "Failed to access Data: servant_info No." .. tostring(i));
goto continue; goto continue;
end end
@@ -180,15 +185,16 @@ function this.update_servant_list()
this.servant_list[id] = this.new(id, name, 0, players.types.servant); this.servant_list[id] = this.new(id, name, 0, players.types.servant);
end end
if not cached_config.settings.hide_servants then
table.insert(players.display_list, this.servant_list[id]);
end
::continue:: ::continue::
end end
end end
function this.update_otomo_list(is_on_quest, is_online) function this.update_otomo_list(is_on_quest, is_online)
if singletons.otomo_manager == nil then
error_handler.report("non_players.update_otomo_list", "Failed to access Data: otomo_manager");
return;
end
if is_online then if is_online then
if is_on_quest then if is_on_quest then
--non_players.update_my_otomos(); --non_players.update_my_otomos();
@@ -213,35 +219,45 @@ function this.update_my_otomos()
local cached_config = config.current_config.damage_meter_UI; local cached_config = config.current_config.damage_meter_UI;
local first_otomo = get_master_otomo_info_method:call(singletons.otomo_manager, 0); local first_otomo = get_master_otomo_info_method:call(singletons.otomo_manager, 0);
if first_otomo ~= nil then if first_otomo == nil then
error_handler.report("non_players.update_my_otomos", "Failed to access Data: first_otomo");
else
local name = otomo_create_data_name_field:get_data(first_otomo); local name = otomo_create_data_name_field:get_data(first_otomo);
if name == nil then
error_handler.report("non_players.update_my_otomos", "Failed to access Data: first_otomo -> name");
end
if name ~= nil and name ~= "" then if name ~= nil and name ~= "" then
local level = otomo_create_data_level_field:get_data(first_otomo) or 0; local level = otomo_create_data_level_field:get_data(first_otomo) or 0;
local myself_id = players.myself.id; local myself_id = players.myself.id;
if this.otomo_list[myself_id] == nil then local otomo = this.otomo_list[myself_id];
this.otomo_list[myself_id] = this.new(0, name, level, players.types.my_otomo); if otomo == nil or name ~= otomo.name then
end otomo = this.new(0, name, level, players.types.my_otomo);
this.otomo_list[myself_id] = otomo;
if cached_config.settings.show_my_otomos_separately then
table.insert(players.display_list, this.otomo_list[myself_id]);
end end
end end
end end
local second_otomo = get_master_otomo_info_method:call(singletons.otomo_manager, 1); local second_otomo = get_master_otomo_info_method:call(singletons.otomo_manager, 1);
if second_otomo ~= nil then if second_otomo == nil then
error_handler.report("non_players.update_my_otomos", "Failed to access Data: second_otomo");
else
local name = otomo_create_data_name_field:get_data(second_otomo); local name = otomo_create_data_name_field:get_data(second_otomo);
if name ~= nil and name ~= "" then if name == nil then
error_handler.report("non_players.update_my_otomos", "Failed to access Data: second_otomo -> name");
return;
end
if name ~= "" then
local level = otomo_create_data_level_field:get_data(second_otomo) or 0; local level = otomo_create_data_level_field:get_data(second_otomo) or 0;
-- the secondary otomo is actually the 4th one! -- the secondary otomo is actually the 4th one!
if this.otomo_list[this.my_second_otomo_id] == nil then local otomo = this.otomo_list[this.my_second_otomo_id];
this.otomo_list[this.my_second_otomo_id] = this.new(this.my_second_otomo_id, name, level, players.types.my_otomo);
end
if cached_config.settings.show_my_otomos_separately then if otomo == nil or name ~= otomo.name then
table.insert(players.display_list, this.otomo_list[this.my_second_otomo_id]); otomo = this.new(this.my_second_otomo_id, name, level, players.types.my_otomo);
this.otomo_list[this.my_second_otomo_id] = otomo;
end end
end end
end end
@@ -252,20 +268,21 @@ function this.update_servant_otomos()
local servant_otomo_list = get_servant_otomo_list_method:call(singletons.otomo_manager); local servant_otomo_list = get_servant_otomo_list_method:call(singletons.otomo_manager);
if servant_otomo_list == nil then if servant_otomo_list == nil then
customization_menu.status = "No servant otomo list"; error_handler.report("non_players.update_servant_otomos", "Failed to access Data: servant_otomo_list");
return; return;
end end
local count = otomo_get_count_method:call(servant_otomo_list); local count = otomo_get_count_method:call(servant_otomo_list);
if count == nil then if count == nil then
customization_menu.status = "No servant otomo list count"; error_handler.report("non_players.update_servant_otomos", "Failed to access Data: servant_otomo_list -> count");
return; return;
end end
for i = 0, count - 1 do for i = 0, count - 1 do
local servant_otomo = otomo_get_item_method:call(servant_otomo_list, i); local servant_otomo = otomo_get_item_method:call(servant_otomo_list, i);
if servant_otomo == nil then if servant_otomo == nil then
goto continue error_handler.report("non_players.update_servant_otomos", "Failed to access Data: servant_otomo No. " .. tostring(i));
goto continue;
end end
local otomo_create_data = servant_otomo:call("get_OtCreateData"); local otomo_create_data = servant_otomo:call("get_OtCreateData");
@@ -275,15 +292,15 @@ function this.update_servant_otomos()
local member_id = otomo_create_data:get_field("MemberID"); local member_id = otomo_create_data:get_field("MemberID");
if name == nil then if name == nil then
error_handler.report("non_players.update_servant_otomos", string.format("Failed to access Data: servant_otomo No. %d -> name", i));
goto continue; goto continue;
end end
if this.otomo_list[member_id] == nil then local otomo = this.otomo_list[member_id];
this.otomo_list[member_id] = this.new(member_id, name, level, players.types.servant_otomo);
end
if cached_config.settings.show_servant_otomos_separately then if otomo == nil then
table.insert(players.display_list, this.otomo_list[member_id]); otomo = this.new(member_id, name, level, players.types.servant_otomo);
this.otomo_list[member_id] = otomo;
end end
end end
@@ -296,30 +313,33 @@ function this.update_otomos(otomo_info_field_)
local cached_config = config.current_config.damage_meter_UI; local cached_config = config.current_config.damage_meter_UI;
if singletons.lobby_manager == nil then if singletons.lobby_manager == nil then
error_handler.report("non_players.update_otomos", "Failed to access Data: lobby_manager");
return; return;
end end
-- other players -- other players
local otomo_info_list = otomo_info_field_:get_data(singletons.lobby_manager); local otomo_info_list = otomo_info_field_:get_data(singletons.lobby_manager);
if otomo_info_list == nil then if otomo_info_list == nil then
customization_menu.status = "No otomo info list"; error_handler.report("non_players.update_otomos", "Failed to access Data: otomo_info_list");
return; return;
end end
local count = otomo_info_get_count_method:call(otomo_info_list); local count = otomo_info_get_count_method:call(otomo_info_list);
if count == nil then if count == nil then
customization_menu.status = "No otomo info list count"; error_handler.report("non_players.update_otomos", "Failed to access Data: otomo_info_list -> count");
return; return;
end end
for id = 0, count - 1 do for id = 0, count - 1 do
local otomo_info = otomo_info_get_item_method:call(otomo_info_list, id); local otomo_info = otomo_info_get_item_method:call(otomo_info_list, id);
if otomo_info == nil then if otomo_info == nil then
error_handler.report("non_players.update_otomos", "Failed to access Data: otomo_info No. " .. tostring(id));
goto continue; goto continue;
end end
local name = otomo_info_name_field:get_data(otomo_info); local name = otomo_info_name_field:get_data(otomo_info);
if name == nil then if name == nil then
error_handler.report("non_players.update_otomos", string.format("Failed to access Data: otomo_info No. %d -> name", id));
goto continue; goto continue;
end end
@@ -345,20 +365,6 @@ function this.update_otomos(otomo_info_field_)
end end
end end
if id == players.myself.id then
if cached_config.settings.show_my_otomos_separately then
table.insert(players.display_list, otomo);
end
elseif id >= 4 then
if cached_config.settings.show_servant_otomos_separately then
table.insert(players.display_list, otomo);
end
else
if cached_config.settings.show_other_player_otomos_separately then
table.insert(players.display_list, otomo);
end
end
::continue:: ::continue::
end end
end end
@@ -377,7 +383,7 @@ function this.init_UI(non_player)
end end
end end
function this.init_module() function this.init_dependencies()
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
@@ -387,7 +393,11 @@ function this.init_module()
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
players = require("MHR_Overlay.Damage_Meter.players"); players = require("MHR_Overlay.Damage_Meter.players");
error_handler = require("MHR_Overlay.Misc.error_handler");
utils = require("MHR_Overlay.Misc.utils");
end
function this.init_module()
this.init(); this.init();
end end

View File

@@ -9,6 +9,9 @@ local quest_status;
local drawing; local drawing;
local language; local language;
local non_players; local non_players;
local utils;
local error_handler;
local large_monster;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -47,10 +50,24 @@ this.myself = nil;
this.myself_position = Vector3f.new(0, 0, 0); this.myself_position = Vector3f.new(0, 0, 0);
this.total = nil; this.total = nil;
this.display_list = {};
this.highlighted_damage_UI = nil; this.highlighted_damage_UI = nil;
this.damage_types = {
["player"] = "player",
["bombs"] = "bombs",
["kunai"] = "kunai",
["installations"] = "installations",
["otomo"] = "otomo",
["wyvern_riding"] = "wyvern_riding",
["poison"] = "poison",
["otomo_poison"] = "otomo_poison",
["blast"] = "blast",
["otomo_blast"] = "otomo_blast",
["endemic_life"] = "endemic_life",
["anomaly_core"] = "anomaly_core",
["other"] = "other"
};
this.types = { this.types = {
["myself"] = 0, ["myself"] = 0,
["other_player"] = 1, ["other_player"] = 1,
@@ -60,8 +77,7 @@ this.types = {
["servant_otomo"] = 16, ["servant_otomo"] = 16,
["total"] = 32, ["total"] = 32,
["highlight"] = 64 ["highlight"] = 64
};
}
function this.new(id, name, master_rank, hunter_rank, type) function this.new(id, name, master_rank, hunter_rank, type)
local player = {}; local player = {};
@@ -74,11 +90,11 @@ function this.new(id, name, master_rank, hunter_rank, type)
player.cart_count = 0; player.cart_count = 0;
player.join_time = -1; player.join_time = utils.constants.uninitialized_int;
player.first_hit_time = -1; player.first_hit_time = utils.constants.uninitialized_int;
player.dps = 0; player.dps = 0;
player.small_monsters = this.init_damage_sources() player.small_monsters = this.init_damage_sources();
player.large_monsters = this.init_damage_sources(); player.large_monsters = this.init_damage_sources();
player.display = {}; player.display = {};
@@ -99,77 +115,14 @@ end
function this.init_damage_sources() function this.init_damage_sources()
local monster_type = {}; local monster_type = {};
monster_type.total_damage = 0; for damage_type_name, _ in pairs(this.damage_types) do
monster_type.physical_damage = 0; monster_type[damage_type_name] = {
monster_type.elemental_damage = 0; total_damage = 0,
monster_type.ailment_damage = 0; physical_damage = 0,
elemental_damage = 0,
monster_type.bombs = {}; ailment_damage = 0
monster_type.bombs.total_damage = 0; };
monster_type.bombs.physical_damage = 0; end
monster_type.bombs.elemental_damage = 0;
monster_type.bombs.ailment_damage = 0;
monster_type.kunai = {};
monster_type.kunai.total_damage = 0;
monster_type.kunai.physical_damage = 0;
monster_type.kunai.elemental_damage = 0;
monster_type.kunai.ailment_damage = 0;
monster_type.installations = {};
monster_type.installations.total_damage = 0;
monster_type.installations.physical_damage = 0;
monster_type.installations.elemental_damage = 0;
monster_type.installations.ailment_damage = 0;
monster_type.otomo = {};
monster_type.otomo.total_damage = 0;
monster_type.otomo.physical_damage = 0;
monster_type.otomo.elemental_damage = 0;
monster_type.otomo.ailment_damage = 0;
monster_type.wyvern_riding = {};
monster_type.wyvern_riding.total_damage = 0;
monster_type.wyvern_riding.physical_damage = 0;
monster_type.wyvern_riding.elemental_damage = 0;
monster_type.wyvern_riding.ailment_damage = 0;
monster_type.poison = {};
monster_type.poison.total_damage = 0;
monster_type.poison.physical_damage = 0;
monster_type.poison.elemental_damage = 0;
monster_type.poison.ailment_damage = 0;
monster_type.otomo_poison = {};
monster_type.otomo_poison.total_damage = 0;
monster_type.otomo_poison.physical_damage = 0;
monster_type.otomo_poison.elemental_damage = 0;
monster_type.otomo_poison.ailment_damage = 0;
monster_type.blast = {};
monster_type.blast.total_damage = 0;
monster_type.blast.physical_damage = 0;
monster_type.blast.elemental_damage = 0;
monster_type.blast.ailment_damage = 0;
monster_type.otomo_blast = {};
monster_type.otomo_blast.total_damage = 0;
monster_type.otomo_blast.physical_damage = 0;
monster_type.otomo_blast.elemental_damage = 0;
monster_type.otomo_blast.ailment_damage = 0;
monster_type.endemic_life = {};
monster_type.endemic_life.total_damage = 0;
monster_type.endemic_life.physical_damage = 0;
monster_type.endemic_life.elemental_damage = 0;
monster_type.endemic_life.ailment_damage = 0;
monster_type.other = {};
monster_type.other.total_damage = 0;
monster_type.other.physical_damage = 0;
monster_type.other.elemental_damage = 0;
monster_type.other.ailment_damage = 0;
return monster_type; return monster_type;
end end
@@ -183,45 +136,19 @@ function this.get_player(player_id)
end end
function this.update_damage(player, damage_source_type, is_large_monster, damage_object) function this.update_damage(player, damage_source_type, is_large_monster, damage_object)
if player == nil then if player == nil then
return; return;
end end
if player.first_hit_time == -1 then if player.first_hit_time == utils.constants.uninitialized_int then
player.first_hit_time = time.total_elapsed_script_seconds; player.first_hit_time = time.total_elapsed_script_seconds;
end end
local player_monster_type = player.small_monsters;
if is_large_monster then if is_large_monster then
player_monster_type = player.large_monsters; this.merge_damage(player.large_monsters[damage_source_type], damage_object);
end
if damage_source_type == "player" then
this.merge_damage(player_monster_type, damage_object);
elseif damage_source_type == "bomb" then
this.merge_damage(player_monster_type.bombs, damage_object);
elseif damage_source_type == "kunai" then
this.merge_damage(player_monster_type.kunai, damage_object);
elseif damage_source_type == "installation" then
this.merge_damage(player_monster_type.installations, damage_object);
elseif damage_source_type == "otomo" then
this.merge_damage(player_monster_type.otomo, damage_object);
elseif damage_source_type == "wyvern riding" then
this.merge_damage(player_monster_type.wyvern_riding, damage_object);
elseif damage_source_type == "poison" then
this.merge_damage(player_monster_type.poison, damage_object);
elseif damage_source_type == "blast" then
this.merge_damage(player_monster_type.blast, damage_object);
elseif damage_source_type == "otomo poison" then
this.merge_damage(player_monster_type.otomo_poison, damage_object);
elseif damage_source_type == "otomo blast" then
this.merge_damage(player_monster_type.otomo_blast, damage_object);
elseif damage_source_type == "endemic life" then
this.merge_damage(player_monster_type.endemic_life, damage_object);
elseif damage_source_type == "other" then
this.merge_damage(player_monster_type.other, damage_object);
else else
this.merge_damage(player_monster_type, damage_object); this.merge_damage(player.small_monsters[damage_source_type], damage_object);
end end
this.update_display(player); this.update_display(player);
@@ -229,6 +156,7 @@ end
function this.update_display(player) function this.update_display(player)
if player == nil then if player == nil then
error_handler.report("players.update_display", "Missing Parameter: player");
return; return;
end end
@@ -250,23 +178,23 @@ function this.update_display(player)
end end
for _, monster_type in ipairs(monster_types) do for _, monster_type in ipairs(monster_types) do
if cached_config.tracked_damage_types.player_damage then if cached_config.tracked_damage_types.players then
this.merge_damage(player.display, monster_type); this.merge_damage(player.display, monster_type.player);
end end
if cached_config.tracked_damage_types.bomb_damage then if cached_config.tracked_damage_types.bombs then
this.merge_damage(player.display, monster_type.bombs); this.merge_damage(player.display, monster_type.bombs);
end end
if cached_config.tracked_damage_types.kunai_damage then if cached_config.tracked_damage_types.kunai then
this.merge_damage(player.display, monster_type.kunai); this.merge_damage(player.display, monster_type.kunai);
end end
if cached_config.tracked_damage_types.installation_damage then if cached_config.tracked_damage_types.installations then
this.merge_damage(player.display, monster_type.installations); this.merge_damage(player.display, monster_type.installations);
end end
if cached_config.tracked_damage_types.otomo_damage then if cached_config.tracked_damage_types.otomos then
if player.type == this.types.myself then if player.type == this.types.myself then
if not cached_config.settings.show_my_otomos_separately then if not cached_config.settings.show_my_otomos_separately then
@@ -303,11 +231,11 @@ function this.update_display(player)
end end
end end
if cached_config.tracked_damage_types.wyvern_riding_damage then if cached_config.tracked_damage_types.wyvern_riding then
this.merge_damage(player.display, monster_type.wyvern_riding); this.merge_damage(player.display, monster_type.wyvern_riding);
end end
if cached_config.tracked_damage_types.poison_damage then if cached_config.tracked_damage_types.poison then
this.merge_damage(player.display, monster_type.poison); this.merge_damage(player.display, monster_type.poison);
if player.type == this.types.myself then if player.type == this.types.myself then
@@ -347,7 +275,7 @@ function this.update_display(player)
end end
end end
if cached_config.tracked_damage_types.blast_damage then if cached_config.tracked_damage_types.blast then
this.merge_damage(player.display, monster_type.blast); this.merge_damage(player.display, monster_type.blast);
if player.type == this.types.myself then if player.type == this.types.myself then
@@ -386,11 +314,15 @@ function this.update_display(player)
end end
end end
if cached_config.tracked_damage_types.endemic_life_damage then if cached_config.tracked_damage_types.endemic_life then
this.merge_damage(player.display, monster_type.endemic_life); this.merge_damage(player.display, monster_type.endemic_life);
end end
if cached_config.tracked_damage_types.other_damage then if cached_config.tracked_damage_types.anomaly_cores then
this.merge_damage(player.display, monster_type.anomaly_core);
end
if cached_config.tracked_damage_types.other then
this.merge_damage(player.display, monster_type.other); this.merge_damage(player.display, monster_type.other);
end end
end end
@@ -429,7 +361,7 @@ end
function this.update_player_dps(player) function this.update_player_dps(player)
local cached_config = config.current_config.damage_meter_UI.settings; local cached_config = config.current_config.damage_meter_UI.settings;
if player.join_time == -1 then if player.join_time == utils.constants.uninitialized_int then
player.join_time = time.total_elapsed_script_seconds; player.join_time = time.total_elapsed_script_seconds;
end end
@@ -450,54 +382,6 @@ function this.update_player_dps(player)
this.total.dps = this.total.dps + player.dps; this.total.dps = this.total.dps + player.dps;
end end
function this.sort_players()
local cached_config = config.current_config.damage_meter_UI;
if cached_config.settings.my_damage_bar_location == "Normal" then
table.insert(this.display_list, this.myself);
end
-- sort here
if cached_config.sorting.type == "Normal" then
if cached_config.sorting.reversed_order then
table.sort(this.display_list, function(left, right)
return left.id > right.id;
end);
else
table.sort(this.display_list, function(left, right)
return left.id < right.id;
end);
end
elseif cached_config.sorting.type == "DPS" then
if cached_config.sorting.reversed_order then
table.sort(this.display_list, function(left, right)
return left.dps < right.dps;
end);
else
table.sort(this.display_list, function(left, right)
return left.dps > right.dps;
end);
end
else
if cached_config.sorting.reversed_order then
table.sort(this.display_list, function(left, right)
return left.display.total_damage < right.display.total_damage;
end);
else
table.sort(this.display_list, function(left, right)
return left.display.total_damage > right.display.total_damage;
end);
end
end
if cached_config.settings.my_damage_bar_location == "First" then
table.insert(this.display_list, 1, this.myself);
elseif cached_config.settings.my_damage_bar_location == "Last" then
table.insert(this.display_list, this.myself);
end
end
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager"); local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local find_master_player_method = player_manager_type_def:get_method("findMasterPlayer"); local find_master_player_method = player_manager_type_def:get_method("findMasterPlayer");
@@ -506,27 +390,33 @@ local get_pos_field = player_base_type_def:get_method("get_Pos");
function this.update_myself_position() function this.update_myself_position()
if singletons.player_manager == nil then if singletons.player_manager == nil then
customization_menu.status = "No player manager"; error_handler.report("players.update_myself_position", "Failed to access Data: player_manager");
return;
end
if quest_status.flow_state == quest_status.flow_states.NONE
or quest_status.flow_state == quest_status.flow_states.CUTSCENE then
return; return;
end end
local master_player = find_master_player_method:call(singletons.player_manager); local master_player = find_master_player_method:call(singletons.player_manager);
if master_player == nil then if master_player == nil then
customization_menu.status = "No master player"; error_handler.report("players.update_myself_position", "Failed to access Data: master_player");
return; return;
end end
local position = get_pos_field:call(master_player); local position = get_pos_field:call(master_player);
if position ~= nil then if position == nil then
this.myself_position = position; error_handler.report("players.update_myself_position", "Failed to access Data: position");
end end
this.myself_position = position;
end end
function this.init() function this.init()
this.list = {}; this.list = {};
this.display_list = {};
this.total = this.new(0, "Total", 0, 0, this.types.total); this.total = this.new(0, "Total", 0, 0, this.types.total);
this.myself = this.new(-1, "DummyMHROverlay", -1, -1, this.types.myself); this.myself = this.new(-1, "MHROverlayDummy", -1, -1, this.types.myself);
end end
local lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager"); local lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager");
@@ -556,35 +446,45 @@ local get_master_rank_method = progress_manager_type_def:get_method("get_MasterR
local get_master_player_id_method = player_manager_type_def:get_method("getMasterPlayerID"); local get_master_player_id_method = player_manager_type_def:get_method("getMasterPlayerID");
function this.update_player_list(is_on_quest) function this.update_players()
local is_on_quest = quest_status.flow_state ~= quest_status.flow_states.IN_LOBBY and quest_status.flow_state ~= quest_status.flow_states.IN_TRAINING_AREA;
if is_on_quest then if is_on_quest then
this.update_player_list_(quest_hunter_info_field); this.update_player_list(quest_hunter_info_field);
else else
this.update_player_list_(hunter_info_field); this.update_player_list(hunter_info_field);
end end
non_players.update_servant_list();
non_players.update_otomo_list(is_on_quest, quest_status.is_online);
this.update_dps(false);
quest_status.update_cart_count();
end end
function this.update_player_list_(hunter_info_field_) function this.update_player_list(hunter_info_field_)
local cached_config = config.current_config.damage_meter_UI; local cached_config = config.current_config.damage_meter_UI;
if singletons.lobby_manager == nil then if singletons.lobby_manager == nil then
error_handler.report("players.update_player_list", "Failed to access Data: lobby_manager");
return; return;
end end
if singletons.progress_manager == nil then if singletons.progress_manager == nil then
error_handler.report("players.update_player_list", "Failed to access Data: progress_manager");
return; return;
end end
-- myself player -- myself player
local myself_player_info = my_hunter_info_field:get_data(singletons.lobby_manager); local myself_player_info = my_hunter_info_field:get_data(singletons.lobby_manager);
if myself_player_info == nil then if myself_player_info == nil then
customization_menu.status = "No myself player info list"; error_handler.report("players.update_player_list", "Failed to access Data: myself_player_info");
return; return;
end end
local myself_player_name = name_field:get_data(myself_player_info); local myself_player_name = name_field:get_data(myself_player_info);
if myself_player_name == nil then if myself_player_name == nil then
customization_menu.status = "No myself player name"; error_handler.report("players.update_player_list", "Failed to access Data: myself_player_name");
return; return;
end end
@@ -594,7 +494,7 @@ function this.update_player_list_(hunter_info_field_)
local myself_id = get_master_player_id_method:call(singletons.player_manager); local myself_id = get_master_player_id_method:call(singletons.player_manager);
if myself_id == nil then if myself_id == nil then
customization_menu.status = "No myself player id"; error_handler.report("players.update_player_list", "Failed to access Data: myself_id");
return; return;
end end
@@ -605,28 +505,29 @@ function this.update_player_list_(hunter_info_field_)
end end
-- other players -- other players
local player_info_list = hunter_info_field_:get_data(singletons.lobby_manager); local player_info_array = hunter_info_field_:get_data(singletons.lobby_manager);
if player_info_list == nil then if player_info_array == nil then
customization_menu.status = "No player info list"; error_handler.report("players.update_player_list", "Failed to access Data: player_info_array");
return; return;
end end
local count = get_count_method:call(player_info_list); local count = get_count_method:call(player_info_array);
if count == nil then if count == nil then
customization_menu.status = "No player info list count"; error_handler.report("players.update_player_list", "Failed to access Data: player_info_array -> count");
return; return;
end end
for i = 0, count - 1 do for i = 0, count - 1 do
local player_info = get_item_method:call(player_info_list, i); local player_info = get_item_method:call(player_info_array, i);
if player_info == nil then if player_info == nil then
goto continue error_handler.report("players.update_player_list", "Failed to access Data: player_info No. " .. tostring(i));
goto continue;
end end
local id = member_index_field:get_data(player_info); local id = member_index_field:get_data(player_info);
if id == nil then if id == nil then
goto continue error_handler.report("players.update_player_list", string.format("Failed to access Data: player_info No. %d -> id", i));
goto continue;
end end
local hunter_rank = hunter_rank_field:get_data(player_info) or 0; local hunter_rank = hunter_rank_field:get_data(player_info) or 0;
@@ -634,13 +535,13 @@ function this.update_player_list_(hunter_info_field_)
local name = name_field:get_data(player_info); local name = name_field:get_data(player_info);
if name == nil then if name == nil then
goto continue error_handler.report("players.update_player_list", string.format("Failed to access Data: player_info No. %d -> name", i));
goto continue;
end end
local player = this.list[id]; local player = this.list[id];
if player == nil then if player == nil then
if name == this.myself.name then if name == this.myself.name then
player = this.new(id, name, master_rank, hunter_rank, this.types.myself); player = this.new(id, name, master_rank, hunter_rank, this.types.myself);
this.myself = player; this.myself = player;
@@ -662,10 +563,6 @@ function this.update_player_list_(hunter_info_field_)
end end
end end
if player ~= this.myself then
table.insert(this.display_list, player);
end
::continue:: ::continue::
end end
end end
@@ -692,7 +589,7 @@ function this.draw(player, position_on_screen, opacity_scale, top_damage, top_dp
damage_UI_entity.draw(player, position_on_screen, opacity_scale, top_damage, top_dps); damage_UI_entity.draw(player, position_on_screen, opacity_scale, top_damage, top_dps);
end end
function this.init_module() function this.init_dependencies()
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
@@ -702,7 +599,12 @@ function this.init_module()
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
non_players = require("MHR_Overlay.Damage_Meter.non_players"); non_players = require("MHR_Overlay.Damage_Meter.non_players");
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
large_monster = require("MHR_Overlay.Monsters.large_monster");
end
function this.init_module()
this.init(); this.init();
end end

View File

@@ -5,6 +5,7 @@ local customization_menu;
local singletons; local singletons;
local config; local config;
local utils; local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -40,6 +41,18 @@ local package = package;
this.list = {}; this.list = {};
this.creature_ids = {
clothfly = 7,
stinkmink = 23,
butterflame = 28,
peepersects = 29,
red_lampsquid = 34,
yellow_lampsquid = 35,
cutterfly = 50,
ruby_wirebug = 62,
gold_wirebug = 63,
};
function this.new(REcreature) function this.new(REcreature)
local creature = {}; local creature = {};
@@ -80,15 +93,18 @@ local get_pos_method = environment_creature_base_type_def:get_method("get_Pos");
function this.init(creature, REcreature) function this.init(creature, REcreature)
local creature_type = creature_type_field:get_data(REcreature); local creature_type = creature_type_field:get_data(REcreature);
if creature_type == nil then if creature_type == nil then
customization_menu.status = "No env creature type"; error_handler.report("env_creature.init", "Failed to access Data: creature_type");
return; return;
end end
local creature_name = get_env_creature_name_message_method:call(singletons.message_manager, local creature_name = get_env_creature_name_message_method:call(singletons.message_manager, creature_type);
creature_type); if creature_name == nil then
if creature_name ~= nil then error_handler.report("env_creature.init", "Failed to access Data: creature_name");
creature.name = creature_name; return;
end end
creature.name = creature_name;
creature.id = creature_type;
end end
function this.init_UI(creature) function this.init_UI(creature)
@@ -110,9 +126,11 @@ function this.update_position(REcreature, creature)
end end
local position = get_pos_method:call(REcreature); local position = get_pos_method:call(REcreature);
if position ~= nil then if position == nil then
creature.position = position; error_handler.report("env_creature.update_position", "Failed to access Data: position");
end end
creature.position = position;
end end
function this.update(REcreature, creature) function this.update(REcreature, creature)
@@ -125,9 +143,11 @@ function this.update(REcreature, creature)
end end
local is_inactive = creature_is_inactive_field:get_data(REcreature); local is_inactive = creature_is_inactive_field:get_data(REcreature);
if is_inactive ~= nil then if is_inactive == nil then
creature.is_inactive = is_inactive; error_handler.report("env_creature.update", "Failed to access Data: is_inactive");
end end
creature.is_inactive = is_inactive;
end end
function this.draw(creature, position_on_screen, opacity_scale) function this.draw(creature, position_on_screen, opacity_scale)
@@ -136,14 +156,14 @@ function this.draw(creature, position_on_screen, opacity_scale)
position_on_screen.x = position_on_screen.x - text_width / 2; position_on_screen.x = position_on_screen.x - text_width / 2;
end end
drawing.draw_label(creature.name_label, position_on_screen, opacity_scale, creature.name); drawing.draw_label(creature.name_label, position_on_screen, opacity_scale, creature.name .. " " .. creature.id);
end end
function this.init_list() function this.init_list()
this.list = {}; this.list = {};
end end
function this.init_module() function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -154,6 +174,10 @@ function this.init_module()
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
--ailments = require("MHR_Overlay.Monsters.ailments"); --ailments = require("MHR_Overlay.Monsters.ailments");
--ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity"); --ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -3,6 +3,7 @@ local this = {};
local env_creature; local env_creature;
local config; local config;
local time; local time;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -45,11 +46,14 @@ function this.update(REcreature)
env_creature.update_position(REcreature, creature); env_creature.update_position(REcreature, creature);
end end
function this.init_module() function this.init_dependencies()
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature"); env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
time = require("MHR_Overlay.Game_Handler.time"); time = require("MHR_Overlay.Game_Handler.time");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
sdk.hook(update_method, function(args) sdk.hook(update_method, function(args)
pcall(this.update, sdk.to_managed_object(args[2])); pcall(this.update, sdk.to_managed_object(args[2]));
end, function(retval) end, function(retval)

View File

@@ -8,6 +8,7 @@ local small_monster;
local large_monster; local large_monster;
local damage_meter_UI; local damage_meter_UI;
local time; local time;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -333,16 +334,15 @@ this.keys = {
--[254] = "Clear" --[254] = "Clear"
}; };
function this.update() function this.update()
if singletons.game_keyboard == nil then if singletons.game_keyboard == nil then
customization_menu.status = "No game keyboard"; error_handler.report("keyboard.update", "Failed to access Data: game_keyboard");
return; return;
end end
local hard_keyboard = hard_keyboard_field:get_data(singletons.game_keyboard); local hard_keyboard = hard_keyboard_field:get_data(singletons.game_keyboard);
if hard_keyboard == nil then if hard_keyboard == nil then
customization_menu.status = "No hard keyboard"; error_handler.report("keyboard.update", "Failed to access Data: hard_keyboard");
return; return;
end end
@@ -350,10 +350,8 @@ function this.update()
local new_hotkey_registered = this.register_hotkey(hard_keyboard); local new_hotkey_registered = this.register_hotkey(hard_keyboard);
if new_hotkey_registered then if new_hotkey_registered then
config.save(); config.save_current();
else else
this.check_hotkeys(hard_keyboard); this.check_hotkeys(hard_keyboard);
end end
@@ -491,10 +489,15 @@ function this.check_hotkeys(hard_keyboard)
local cached_config = config.current_config.global_settings.hotkeys_with_modifiers; local cached_config = config.current_config.global_settings.hotkeys_with_modifiers;
if not (cached_config.all_UI.ctrl and not this.hotkey_modifiers_down.ctrl) if not (cached_config.all_UI.ctrl and not this.hotkey_modifiers_down.ctrl)
and not (cached_config.all_UI.shift and not this.hotkey_modifiers_down.shift) and not (cached_config.all_UI.shift and not this.hotkey_modifiers_down.shift)
and not (cached_config.all_UI.alt and not this.hotkey_modifiers_down.alt) then and not (cached_config.all_UI.alt and not this.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard, math.tointeger(cached_config.all_UI.key)) then
local all_UI_key_release = get_release_method:call(hard_keyboard, math.tointeger(cached_config.all_UI.key));
if all_UI_key_release == nil then
error_handler.report("keyboard.check_hotkeys", "Failed to access Data: all_UI_key_release");
elseif all_UI_key_release then
local is_any_enabled = config.current_config.time_UI.enabled local is_any_enabled = config.current_config.time_UI.enabled
or config.current_config.small_monster_UI.enabled or config.current_config.small_monster_UI.enabled
or config.current_config.large_monster_UI.dynamic.enabled or config.current_config.large_monster_UI.dynamic.enabled
@@ -512,17 +515,29 @@ function this.check_hotkeys(hard_keyboard)
end end
if not (cached_config.small_monster_UI.ctrl and not this.hotkey_modifiers_down.ctrl) if not (cached_config.small_monster_UI.ctrl and not this.hotkey_modifiers_down.ctrl)
and not (cached_config.small_monster_UI.shift and not this.hotkey_modifiers_down.shift) and not (cached_config.small_monster_UI.shift and not this.hotkey_modifiers_down.shift)
and not (cached_config.small_monster_UI.alt and not this.hotkey_modifiers_down.alt) then and not (cached_config.small_monster_UI.alt and not this.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard, math.tointeger(cached_config.small_monster_UI.key)) then
local small_monster_UI_key_release = get_release_method:call(hard_keyboard, math.tointeger(cached_config.small_monster_UI.key));
if small_monster_UI_key_release == nil then
error_handler.report("keyboard.check_hotkeys", "Failed to access Data: small_monster_UI_key_release");
elseif small_monster_UI_key_release then
config.current_config.small_monster_UI.enabled = not config.current_config.small_monster_UI.enabled; config.current_config.small_monster_UI.enabled = not config.current_config.small_monster_UI.enabled;
end end
end end
if not (cached_config.large_monster_UI.ctrl and not this.hotkey_modifiers_down.ctrl) if not (cached_config.large_monster_UI.ctrl and not this.hotkey_modifiers_down.ctrl)
and not (cached_config.large_monster_UI.shift and not this.hotkey_modifiers_down.shift) and not (cached_config.large_monster_UI.shift and not this.hotkey_modifiers_down.shift)
and not (cached_config.large_monster_UI.alt and not this.hotkey_modifiers_down.alt) then and not (cached_config.large_monster_UI.alt and not this.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard, math.tointeger(cached_config.large_monster_UI.key)) then
local large_monster_UI_key_release = get_release_method:call(hard_keyboard, math.tointeger(cached_config.large_monster_UI.key));
if large_monster_UI_key_release == nil then
error_handler.report("keyboard.check_hotkeys", "Failed to access Data: large_monster_UI_key_release");
elseif large_monster_UI_key_release then
local is_any_enabled = config.current_config.large_monster_UI.dynamic.enabled local is_any_enabled = config.current_config.large_monster_UI.dynamic.enabled
or config.current_config.large_monster_UI.static.enabled or config.current_config.large_monster_UI.static.enabled
or config.current_config.large_monster_UI.highlighted.enabled; or config.current_config.large_monster_UI.highlighted.enabled;
@@ -534,53 +549,85 @@ function this.check_hotkeys(hard_keyboard)
end end
if not (cached_config.large_monster_dynamic_UI.ctrl and not this.hotkey_modifiers_down.ctrl) if not (cached_config.large_monster_dynamic_UI.ctrl and not this.hotkey_modifiers_down.ctrl)
and not (cached_config.large_monster_dynamic_UI.shift and not this.hotkey_modifiers_down.shift) and not (cached_config.large_monster_dynamic_UI.shift and not this.hotkey_modifiers_down.shift)
and not (cached_config.large_monster_dynamic_UI.alt and not this.hotkey_modifiers_down.alt) then and not (cached_config.large_monster_dynamic_UI.alt and not this.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard,
math.tointeger(cached_config.large_monster_dynamic_UI.key)) then local large_monster_dynamic_UI_key_release = get_release_method:call(hard_keyboard, math.tointeger(cached_config.large_monster_dynamic_UI.key));
if large_monster_dynamic_UI_key_release == nil then
error_handler.report("keyboard.check_hotkeys", "Failed to access Data: large_monster_dynamic_UI_key_release");
elseif large_monster_dynamic_UI_key_release then
config.current_config.large_monster_UI.dynamic.enabled = not config.current_config.large_monster_UI.dynamic.enabled; config.current_config.large_monster_UI.dynamic.enabled = not config.current_config.large_monster_UI.dynamic.enabled;
end end
end end
if not (cached_config.large_monster_static_UI.ctrl and not this.hotkey_modifiers_down.ctrl) if not (cached_config.large_monster_static_UI.ctrl and not this.hotkey_modifiers_down.ctrl)
and not (cached_config.large_monster_static_UI.shift and not this.hotkey_modifiers_down.shift) and not (cached_config.large_monster_static_UI.shift and not this.hotkey_modifiers_down.shift)
and not (cached_config.large_monster_static_UI.alt and not this.hotkey_modifiers_down.alt) then and not (cached_config.large_monster_static_UI.alt and not this.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard,
math.tointeger(cached_config.large_monster_static_UI.key)) then local large_monster_static_UI_key_release = get_release_method:call(hard_keyboard, math.tointeger(cached_config.large_monster_static_UI.key));
if large_monster_static_UI_key_release == nil then
error_handler.report("keyboard.check_hotkeys", "Failed to access Data: large_monster_static_UI_key_release");
elseif large_monster_static_UI_key_release then
config.current_config.large_monster_UI.static.enabled = not config.current_config.large_monster_UI.static.enabled; config.current_config.large_monster_UI.static.enabled = not config.current_config.large_monster_UI.static.enabled;
end end
end end
if not (cached_config.large_monster_highlighted_UI.ctrl and not this.hotkey_modifiers_down.ctrl) if not (cached_config.large_monster_highlighted_UI.ctrl and not this.hotkey_modifiers_down.ctrl)
and not (cached_config.large_monster_highlighted_UI.shift and not this.hotkey_modifiers_down.shift) and not (cached_config.large_monster_highlighted_UI.shift and not this.hotkey_modifiers_down.shift)
and not (cached_config.large_monster_highlighted_UI.alt and not this.hotkey_modifiers_down.alt) then and not (cached_config.large_monster_highlighted_UI.alt and not this.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard,
math.tointeger(cached_config.large_monster_highlighted_UI.key)) then local large_monster_highlighted_UI_key_release = get_release_method:call(hard_keyboard, math.tointeger(cached_config.large_monster_highlighted_UI.key));
config.current_config.large_monster_UI.highlighted.enabled = not
config.current_config.large_monster_UI.highlighted.enabled; if large_monster_highlighted_UI_key_release == nil then
error_handler.report("keyboard.check_hotkeys", "Failed to access Data: large_monster_highlighted_UI_key_release");
elseif large_monster_highlighted_UI_key_release then
config.current_config.large_monster_UI.highlighted.enabled = not config.current_config.large_monster_UI.highlighted.enabled;
end end
end end
if not (cached_config.time_UI.ctrl and not this.hotkey_modifiers_down.ctrl) if not (cached_config.time_UI.ctrl and not this.hotkey_modifiers_down.ctrl)
and not (cached_config.time_UI.shift and not this.hotkey_modifiers_down.shift) and not (cached_config.time_UI.shift and not this.hotkey_modifiers_down.shift)
and not (cached_config.time_UI.alt and not this.hotkey_modifiers_down.alt) then and not (cached_config.time_UI.alt and not this.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard, math.tointeger(cached_config.time_UI.key)) then
local time_UI_key_release = get_release_method:call(hard_keyboard, math.tointeger(cached_config.time_UI.key));
if time_UI_key_release == nil then
error_handler.report("keyboard.check_hotkeys", "Failed to access Data: time_UI_key_release");
elseif time_UI_key_release then
config.current_config.time_UI.enabled = not config.current_config.time_UI.enabled; config.current_config.time_UI.enabled = not config.current_config.time_UI.enabled;
end end
end end
if not (cached_config.damage_meter_UI.ctrl and not this.hotkey_modifiers_down.ctrl) if not (cached_config.damage_meter_UI.ctrl and not this.hotkey_modifiers_down.ctrl)
and not (cached_config.damage_meter_UI.shift and not this.hotkey_modifiers_down.shift) and not (cached_config.damage_meter_UI.shift and not this.hotkey_modifiers_down.shift)
and not (cached_config.damage_meter_UI.alt and not this.hotkey_modifiers_down.alt) then and not (cached_config.damage_meter_UI.alt and not this.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard, math.tointeger(cached_config.damage_meter_UI.key)) then
local damage_meter_UI_key_release = get_release_method:call(hard_keyboard, math.tointeger(cached_config.damage_meter_UI.key));
if damage_meter_UI_key_release == nil then
error_handler.report("keyboard.check_hotkeys", "Failed to access Data: damage_meter_UI_key_release");
elseif damage_meter_UI_key_release then
config.current_config.damage_meter_UI.enabled = not config.current_config.damage_meter_UI.enabled; config.current_config.damage_meter_UI.enabled = not config.current_config.damage_meter_UI.enabled;
end end
end end
if not (cached_config.endemic_life_UI.ctrl and not this.hotkey_modifiers_down.ctrl) if not (cached_config.endemic_life_UI.ctrl and not this.hotkey_modifiers_down.ctrl)
and not (cached_config.endemic_life_UI.shift and not this.hotkey_modifiers_down.shift) and not (cached_config.endemic_life_UI.shift and not this.hotkey_modifiers_down.shift)
and not (cached_config.endemic_life_UI.alt and not this.hotkey_modifiers_down.alt) then and not (cached_config.endemic_life_UI.alt and not this.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard, math.tointeger(cached_config.endemic_life_UI.key)) then
local endemic_life_UI_key_release = get_release_method:call(hard_keyboard, math.tointeger(cached_config.endemic_life_UI.key));
if endemic_life_UI_key_release == nil then
error_handler.report("keyboard.check_hotkeys", "Failed to access Data: endemic_life_UI_key_release");
elseif endemic_life_UI_key_release then
config.current_config.endemic_life_UI.enabled = not config.current_config.endemic_life_UI.enabled; config.current_config.endemic_life_UI.enabled = not config.current_config.endemic_life_UI.enabled;
end end
end end
@@ -604,7 +651,7 @@ function this.get_hotkey_name(hotkey)
return hotkey_name .. tostring(this.keys[hotkey.key]); return hotkey_name .. tostring(this.keys[hotkey.key]);
end end
function this.init_module() function this.init_dependencies()
config = require "MHR_Overlay.Misc.config" config = require "MHR_Overlay.Misc.config"
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
@@ -613,6 +660,10 @@ function this.init_module()
large_monster = require("MHR_Overlay.Monsters.large_monster"); large_monster = require("MHR_Overlay.Monsters.large_monster");
damage_meter_UI = require("MHR_Overlay.UI.Modules.damage_meter_UI"); damage_meter_UI = require("MHR_Overlay.UI.Modules.damage_meter_UI");
time = require("MHR_Overlay.Game_Handler.time"); time = require("MHR_Overlay.Game_Handler.time");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -9,6 +9,7 @@ local damage_meter_UI;
local time; local time;
local env_creature; local env_creature;
local non_players; local non_players;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -116,6 +117,16 @@ local unique_event_manager_type_def = sdk.find_type_definition("snow.eventcut.Un
local play_event_common_method = unique_event_manager_type_def:get_method("playEventCommon"); local play_event_common_method = unique_event_manager_type_def:get_method("playEventCommon");
local event_manager_dispose_method = unique_event_manager_type_def:get_method("dispose"); local event_manager_dispose_method = unique_event_manager_type_def:get_method("dispose");
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_data_method = player_manager_type_def:get_method("get_PlayerData");
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
local die_count_field = player_data_type_def:get_field("_DieCount");
local system_array_type_def = sdk.find_type_definition("System.Array");
local get_length_method = system_array_type_def:get_method("get_Length");
local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)");
function this.get_flow_state_name(flow_state, new_line) function this.get_flow_state_name(flow_state, new_line)
for key, value in pairs(this.flow_states) do for key, value in pairs(this.flow_states) do
if value == flow_state then if value == flow_state then
@@ -144,25 +155,90 @@ function this.set_flow_state(new_flow_state)
small_monster.init_list(); small_monster.init_list();
large_monster.init_list(); large_monster.init_list();
env_creature.init_list(); env_creature.init_list();
damage_meter_UI.last_displayed_players = {}; damage_meter_UI.last_displayed_players = {};
elseif this.flow_state == this.flow_states.LOADING_QUEST then
players.init();
non_players.init();
small_monster.init_list();
large_monster.init_list();
env_creature.init_list();
damage_meter_UI.last_displayed_players = {};
this.get_max_cart_count();
elseif this.flow_state >= this.flow_states.LOADING_QUEST then elseif this.flow_state >= this.flow_states.LOADING_QUEST then
this.get_cart_count();
this.get_max_cart_count(); this.get_max_cart_count();
end end
players.update_players();
end end
function this.get_cart_count() function this.update_cart_count()
if singletons.quest_manager == nil then
error_handler.report("quest_status.update_cart_count", "Failed to access Data: quest_manager");
return;
end
local death_num = get_death_num_method:call(singletons.quest_manager); local death_num = get_death_num_method:call(singletons.quest_manager);
if death_num ~= nil then if death_num == nil then
error_handler.report("quest_status.update_cart_count", "Failed to access Data: death_num");
else
this.cart_count = death_num; this.cart_count = death_num;
end end
if singletons.player_manager == nil then
error_handler.report("quest_status.update_cart_count", "Failed to access Data: player_manager");
return;
end
local player_data_array = get_player_data_method:call(singletons.player_manager);
if player_data_array == nil then
error_handler.report("quest_status.update_cart_count", "Failed to access Data: player_data_array");
return;
end
local player_data_array_length = get_length_method:call(player_data_array);
if player_data_array_length == nil then
error_handler.report("quest_status.update_cart_count", "Failed to access Data: player_data_array_length");
return;
end
for i = 0, player_data_array_length - 1 do
local player_data = get_value_method:call(player_data_array, i);
if player_data_array_length == nil then
error_handler.report("quest_status.update_cart_count", string.format("Failed to access Data: player_data No. %d", i));
goto continue;
end
local die_count = die_count_field:get_data(player_data);
if die_count == nil then
error_handler.report("quest_status.update_cart_count", string.format("Failed to access Data: die_count No. %d", i));
goto continue;
end
local player = players.list[i];
if player ~= nil then
player.cart_count = die_count;
end
::continue::
end
end end
function this.get_max_cart_count() function this.get_max_cart_count()
local quest_life = get_quest_life_method:call(singletons.quest_manager); if singletons.quest_manager == nil then
if quest_life ~= nil then error_handler.report("quest_status.get_max_cart_count", "Failed to access Data: quest_manager");
this.max_cart_count = quest_life; return;
end end
local quest_life = get_quest_life_method:call(singletons.quest_manager);
if quest_life == nil then
error_handler.report("quest_status.get_max_cart_count", "Failed to access Data: quest_life");
end
this.max_cart_count = quest_life;
end end
--type 2 = quest start --type 2 = quest start
@@ -170,6 +246,7 @@ end
--type 5 = end screen --type 5 = end screen
function this.on_demo_request_activation(request_data_base) function this.on_demo_request_activation(request_data_base)
if request_data_base == nil then if request_data_base == nil then
error_handler.report("quest_status.on_demo_request_activation", "Missing Parameter: request_data_base");
return; return;
end end
@@ -179,6 +256,7 @@ function this.on_demo_request_activation(request_data_base)
local request_data_type = request_data_base:call("get_Type"); local request_data_type = request_data_base:call("get_Type");
if request_data_type == nil then if request_data_type == nil then
error_handler.report("quest_status.on_demo_request_activation", "Failed to access Data: request_data_type");
return; return;
end end
@@ -278,6 +356,7 @@ end
function this.on_village_fast_travel(area) function this.on_village_fast_travel(area)
if area == nil then if area == nil then
error_handler.report("quest_status.on_village_fast_travel", "Missing Parameter: area");
return; return;
end end
@@ -289,6 +368,11 @@ function this.on_village_fast_travel(area)
end end
function this.on_changed_game_status(new_quest_status) function this.on_changed_game_status(new_quest_status)
if new_quest_status == nil then
error_handler.report("quest_status.on_changed_game_status", "Missing Parameter: new_quest_status");
return;
end
this.index = new_quest_status; this.index = new_quest_status;
if this.index == 0 then if this.index == 0 then
@@ -304,12 +388,13 @@ end
function this.init() function this.init()
if singletons.quest_manager == nil then if singletons.quest_manager == nil then
error_handler.report("quest_status.init", "Failed to access Data: quest_manager");
return; return;
end end
local new_quest_status = get_status_method:call(singletons.game_manager); local new_quest_status = get_status_method:call(singletons.game_manager);
if new_quest_status == nil then if new_quest_status == nil then
customization_menu.status = "No quest status"; error_handler.report("quest_status.init", "Failed to access Data: new_quest_status");
return; return;
end end
@@ -330,11 +415,13 @@ end
function this.update_is_online() function this.update_is_online()
if singletons.lobby_manager == nil then if singletons.lobby_manager == nil then
error_handler.report("quest_status.update_is_online", "Failed to access Data: lobby_manager");
return; return;
end end
local is_quest_online = is_quest_online_method:call(singletons.lobby_manager); local is_quest_online = is_quest_online_method:call(singletons.lobby_manager);
if is_quest_online == nil then if is_quest_online == nil then
error_handler.report("quest_status.update_is_online", "Failed to access Data: is_quest_online");
return; return;
end end
@@ -343,11 +430,13 @@ end
--[[function quest_status.update_is_quest_host() --[[function quest_status.update_is_quest_host()
if singletons.lobby_manager == nil then if singletons.lobby_manager == nil then
error_handler.report("quest_status.update_is_quest_host", "Failed to access Data: lobby_manager");
return; return;
end end
local is_quest_host = is_quest_host_method:call(singletons.lobby_manager, true); local is_quest_host = is_quest_host_method:call(singletons.lobby_manager, true);
if is_quest_host == nil then if is_quest_host == nil then
error_handler.report("quest_status.update_is_quest_host", "Failed to access Data: is_quest_host");
return; return;
end end
@@ -356,21 +445,22 @@ end--]]
function this.update_is_training_area() function this.update_is_training_area()
if singletons.village_area_manager == nil then if singletons.village_area_manager == nil then
customization_menu.status = "No village area manager"; error_handler.report("quest_status.update_is_training_area", "Failed to access Data: village_area_manager");
return; return;
end end
local _is_training_area = check_current_area_training_area_method:call(singletons.village_area_manager); local is_training_area = check_current_area_training_area_method:call(singletons.village_area_manager);
if _is_training_area == nil then if is_training_area == nil then
error_handler.report("quest_status.update_is_training_area", "Failed to access Data: is_training_area");
return; return;
end end
if _is_training_area then if is_training_area then
this.set_flow_state(this.flow_states.IN_TRAINING_AREA); this.set_flow_state(this.flow_states.IN_TRAINING_AREA);
end end
end end
function this.init_module() function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
players = require("MHR_Overlay.Damage_Meter.players"); players = require("MHR_Overlay.Damage_Meter.players");
@@ -380,7 +470,10 @@ function this.init_module()
time = require("MHR_Overlay.Game_Handler.time"); time = require("MHR_Overlay.Game_Handler.time");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature"); env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
non_players = require("MHR_Overlay.Damage_Meter.non_players"); non_players = require("MHR_Overlay.Damage_Meter.non_players");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
this.init(); this.init();
sdk.hook(on_changed_game_status_method, function(args) sdk.hook(on_changed_game_status_method, function(args)

View File

@@ -2,6 +2,9 @@ local this = {};
local config; local config;
local singletons; local singletons;
local utils;
local time;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -42,11 +45,13 @@ function this.update_window_size()
local width; local width;
local height; local height;
if d2d ~= nil and config.current_config.global_settings.renderer.use_d2d_if_available then -- if d2d ~= nil and config.current_config.global_settings.renderer.use_d2d_if_available then
width, height = d2d.surface_size(); -- width, height = d2d.surface_size();
else -- else
width, height = this.get_game_window_size(); -- width, height = this.get_game_window_size();
end -- end
width, height = this.get_game_window_size();
if width ~= nil then if width ~= nil then
this.width = width; this.width = width;
@@ -70,26 +75,26 @@ function this.get_game_window_size()
scene_view = sdk.call_native_func(singletons.scene_manager, sdk.find_type_definition("via.SceneManager") , "get_MainView"); scene_view = sdk.call_native_func(singletons.scene_manager, sdk.find_type_definition("via.SceneManager") , "get_MainView");
if scene_view == nil then if scene_view == nil then
--log.error("[MHR_Overlay.lua] No scene view"); error_handler.report("screen.get_game_window_size", "Failed to access Data: scene_view");
return; return;
end end
end end
local size = get_size_method:call(scene_view); local size = get_size_method:call(scene_view);
if size == nil then if size == nil then
--log.error("[MHR_Overlay.lua] No scene view size"); error_handler.report("screen.get_game_window_size", "Failed to access Data: size");
return; return;
end end
local screen_width = width_field:get_data(size); local screen_width = width_field:get_data(size);
if screen_width == nil then if screen_width == nil then
--log.error("[MHR_Overlay.lua] No screen width"); error_handler.report("screen.get_game_window_size", "Failed to access Data: screen_width");
return; return;
end end
local screen_height = height_field:get_data(size); local screen_height = height_field:get_data(size);
if screen_height == nil then if screen_height == nil then
--log.error("[MHR_Overlay.lua] No screen height"); error_handler.report("screen.get_game_window_size", "Failed to access Data: screen_height");
return; return;
end end
@@ -131,9 +136,15 @@ function this.calculate_absolute_coordinates(position)
return { x = _position.x, y = _position.y }; return { x = _position.x, y = _position.y };
end end
function this.init_module() function this.init_dependencies()
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
time = require("MHR_Overlay.Game_Handler.time");
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -1,5 +1,9 @@
local this = {}; local this = {};
local time;
local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
local pairs = pairs; local pairs = pairs;
@@ -58,42 +62,33 @@ function this.init()
this.init_game_manager(); this.init_game_manager();
this.init_servant_manager(); this.init_servant_manager();
this.init_otomo_manager(); this.init_otomo_manager();
this.init_long_sword_shell_manager();
this.init_light_bowgun_shell_manager();
this.init_horn_shell_manager();
end end
function this.init_message_manager() function this.init_message_manager()
if this.message_manager ~= nil then
return;
end
this.message_manager = sdk.get_managed_singleton("snow.gui.MessageManager"); this.message_manager = sdk.get_managed_singleton("snow.gui.MessageManager");
if this.message_manager == nil then if this.message_manager == nil then
--log.error("[MHR Overlay] No message manager"); error_handler.report("singletons.init_message_manager", "Failed to access Data: message_manager");
end end
return this.message_manager; return this.message_manager;
end end
function this.init_enemy_manager() function this.init_enemy_manager()
if this.enemy_manager ~= nil then
return;
end
this.enemy_manager = sdk.get_managed_singleton("snow.enemy.EnemyManager"); this.enemy_manager = sdk.get_managed_singleton("snow.enemy.EnemyManager");
if this.enemy_manager == nil then if this.enemy_manager == nil then
--log.error("[MHR Overlay] No enemy manager"); error_handler.report("singletons.init_enemy_manager", "Failed to access Data: enemy_manager");
end end
return this.enemy_manager; return this.enemy_manager;
end end
function this.init_lobby_manager() function this.init_lobby_manager()
if this.lobby_manager ~= nil then
return;
end
this.lobby_manager = sdk.get_managed_singleton("snow.LobbyManager"); this.lobby_manager = sdk.get_managed_singleton("snow.LobbyManager");
if this.lobby_manager == nil then if this.lobby_manager == nil then
--log.error("[MHR Overlay] No lobby manager"); error_handler.report("singletons.init_lobby_manager", "Failed to access Data: lobby_manager");
return false; return false;
end end
@@ -101,13 +96,9 @@ function this.init_lobby_manager()
end end
function this.init_progress_manager() function this.init_progress_manager()
if this.progress_manager ~= nil then
return;
end
this.progress_manager = sdk.get_managed_singleton("snow.progress.ProgressManager"); this.progress_manager = sdk.get_managed_singleton("snow.progress.ProgressManager");
if this.progress_manager == nil then if this.progress_manager == nil then
--log.error("[MHR Overlay] No progress manager"); error_handler.report("singletons.init_lobby_manager", "Failed to access Data: progress_manager");
return false; return false;
end end
@@ -115,122 +106,120 @@ function this.init_progress_manager()
end end
function this.init_quest_manager() function this.init_quest_manager()
if this.quest_manager ~= nil then
return;
end
this.quest_manager = sdk.get_managed_singleton("snow.QuestManager"); this.quest_manager = sdk.get_managed_singleton("snow.QuestManager");
if this.quest_manager == nil then if this.quest_manager == nil then
--log.error("[MHR Overlay] No quest manager"); error_handler.report("singletons.init_quest_manager", "Failed to access Data: quest_manager");
end end
return this.quest_manager; return this.quest_manager;
end end
function this.init_player_manager() function this.init_player_manager()
if this.player_manager ~= nil then
return;
end
this.player_manager = sdk.get_managed_singleton("snow.player.PlayerManager"); this.player_manager = sdk.get_managed_singleton("snow.player.PlayerManager");
if this.player_manager == nil then if this.player_manager == nil then
--log.error("[MHR Overlay] No player manager"); error_handler.report("singletons.init_player_manager", "Failed to access Data: player_manager");
end end
return this.player_manager; return this.player_manager;
end end
function this.init_village_area_manager() function this.init_village_area_manager()
if this.village_area_manager ~= nil then
return;
end
this.village_area_manager = sdk.get_managed_singleton("snow.VillageAreaManager"); this.village_area_manager = sdk.get_managed_singleton("snow.VillageAreaManager");
if this.village_area_manager == nil then if this.village_area_manager == nil then
--log.error("[MHR Overlay] No village area manager"); error_handler.report("singletons.init_village_area_manager", "Failed to access Data: village_area_manager");
end end
return this.village_area_manager; return this.village_area_manager;
end end
function this.init_gui_manager() function this.init_gui_manager()
if this.gui_manager ~= nil then
return;
end
this.gui_manager = sdk.get_managed_singleton("snow.gui.GuiManager"); this.gui_manager = sdk.get_managed_singleton("snow.gui.GuiManager");
if this.gui_manager == nil then if this.gui_manager == nil then
--log.error("[MHR Overlay] No gui manager"); error_handler.report("singletons.init_gui_manager", "Failed to access Data: gui_manager");
end end
return this.gui_manager; return this.gui_manager;
end end
function this.init_game_keyboard() function this.init_game_keyboard()
if this.game_keyboard ~= nil then
return;
end
this.game_keyboard = sdk.get_managed_singleton("snow.GameKeyboard"); this.game_keyboard = sdk.get_managed_singleton("snow.GameKeyboard");
if this.game_keyboard == nil then if this.game_keyboard == nil then
--log.error("[MHR Overlay] No game keyboard"); error_handler.report("singletons.init_game_keyboard", "Failed to access Data: game_keyboard");
end end
return this.game_keyboard; return this.game_keyboard;
end end
function this.init_scene_manager() function this.init_scene_manager()
if this.scene_manager ~= nil then
return;
end
this.scene_manager = sdk.get_native_singleton("via.SceneManager"); this.scene_manager = sdk.get_native_singleton("via.SceneManager");
if this.scene_manager == nil then if this.scene_manager == nil then
--log.error("[MHR Overlay] No enemy manager"); error_handler.report("singletons.init_scene_manager", "Failed to access Data: scene_manager");
end end
return this.scene_manager; return this.scene_manager;
end end
function this.init_game_manager() function this.init_game_manager()
if this.game_manager ~= nil then
return;
end
this.game_manager = sdk.get_managed_singleton("snow.SnowGameManager"); this.game_manager = sdk.get_managed_singleton("snow.SnowGameManager");
if this.game_manager == nil then if this.game_manager == nil then
--log.error("[MHR Overlay] No enemy manager"); error_handler.report("singletons.init_game_manager", "Failed to access Data: game_manager");
end end
return this.game_manager; return this.game_manager;
end end
function this.init_servant_manager() function this.init_servant_manager()
if this.servant_manager ~= nil then
return;
end
this.servant_manager = sdk.get_managed_singleton("snow.ai.ServantManager"); this.servant_manager = sdk.get_managed_singleton("snow.ai.ServantManager");
if this.servant_manager == nil then if this.servant_manager == nil then
--log.error("[MHR Overlay] No enemy manager"); error_handler.report("singletons.init_servant_manager", "Failed to access Data: servant_manager");
end end
return this.servant_manager; return this.servant_manager;
end end
function this.init_otomo_manager() function this.init_otomo_manager()
if this.otomo_manager ~= nil then
return;
end
this.otomo_manager = sdk.get_managed_singleton("snow.otomo.OtomoManager"); this.otomo_manager = sdk.get_managed_singleton("snow.otomo.OtomoManager");
if this.otomo_manager == nil then if this.otomo_manager == nil then
--log.error("[MHR Overlay] No enemy manager"); error_handler.report("singletons.init_otomo_manager", "Failed to access Data: otomo_manager");
end end
return this.otomo_manager; return this.otomo_manager;
end end
function this.init_long_sword_shell_manager()
this.long_sword_shell_manager = sdk.get_managed_singleton("snow.shell.LongSwordShellManager");
if this.long_sword_shell_manager == nil then
error_handler.report("singletons.init_long_sword_shell_manager", "Failed to access Data: long_sword_shell_manager");
end
return this.long_sword_shell_manager;
end
function this.init_light_bowgun_shell_manager()
this.light_bowgun_shell_manager = sdk.get_managed_singleton("snow.shell.LightBowgunShellManager");
if this.light_bowgun_shell_manager == nil then
error_handler.report("singletons.init_light_bowgun_shell_manager", "Failed to access Data: light_bowgun_shell_manager");
end
return this.light_bowgun_shell_manager;
end
function this.init_horn_shell_manager()
this.horn_shell_manager = sdk.get_managed_singleton("snow.shell.HornShellManager");
if this.horn_shell_manager == nil then
error_handler.report("singletons.init_horn_shell_manager", "Failed to access Data: horn_shell_manager");
end
return this.horn_shell_manager;
end
function this.init_dependencies()
time = require("MHR_Overlay.Game_Handler.time");
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module() function this.init_module()
this.init(); this.init();
end end

View File

@@ -7,6 +7,11 @@ local players;
local non_players; local non_players;
local config; local config;
local small_monster; local small_monster;
local utils;
local error_handler;
local screen;
local buffs;
local player_info;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -49,51 +54,115 @@ this.elapsed_minutes = 0;
this.elapsed_seconds = 0; this.elapsed_seconds = 0;
this.total_elapsed_script_seconds = 0; this.total_elapsed_script_seconds = 0;
this.last_elapsed_script_seconds = 0;
this.timer_list = {};
this.delay_timer_list = {};
function this.new_timer(callback, cooldown_seconds, start_offset_seconds)
start_offset_seconds = start_offset_seconds or utils.math.random();
if callback == nil or cooldown_seconds == nil then
return;
end
local timer = {};
timer.callback = callback;
timer.cooldown = cooldown_seconds;
timer.last_trigger_time = os.clock() + start_offset_seconds;
this.timer_list[callback] = timer;
end
function this.new_delay_timer(callback, delay)
if callback == nil or delay == nil then
return;
end
local delay_timer = {};
delay_timer.callback = callback;
delay_timer.delay = delay;
delay_timer.init_time = os.clock();
this.delay_timer_list[callback] = delay_timer;
return delay_timer;
end
function this.remove_delay_timer(delay_timer)
this.delay_timer_list[delay_timer.callback] = nil;
end
function this.init_global_timers()
this.new_timer(singletons.init, 1);
this.new_timer(screen.update_window_size, 1);
this.new_timer(quest_status.update_is_online, 1);
this.new_timer(this.update_quest_time, 1 / 60);
this.new_timer(players.update_players, 0.5);
this.new_timer(players.update_myself_position, 1);
this.new_timer(buffs.update, 1/60);
this.new_timer(player_info.update, 0.5);
end
function this.update_timers()
this.update_script_time();
for callback, timer in pairs(this.timer_list) do
if this.total_elapsed_script_seconds - timer.last_trigger_time > timer.cooldown then
timer.last_trigger_time = this.total_elapsed_script_seconds;
callback();
end
end
local remove_list = {};
for callback, delay_timer in pairs(this.delay_timer_list) do
if this.total_elapsed_script_seconds - delay_timer.init_time > delay_timer.delay then
callback();
table.insert(remove_list, callback);
end
end
for i, callback in ipairs(remove_list) do
this.delay_timer_list[callback] = nil;
end
end
function this.update_script_time() function this.update_script_time()
this.total_elapsed_script_seconds = os.clock(); this.total_elapsed_script_seconds = os.clock();
end end
function this.tick() function this.update_quest_time()
this.update_script_time();
if singletons.quest_manager == nil then if singletons.quest_manager == nil then
return; return;
end end
if quest_status.flow_state == quest_status.flow_states.IN_LOBBY
or quest_status.flow_state >= quest_status.flow_states.QUEST_END_TIMER then
return;
end
local quest_time_elapsed_minutes = get_quest_elapsed_time_min_method:call(singletons.quest_manager); local quest_time_elapsed_minutes = get_quest_elapsed_time_min_method:call(singletons.quest_manager);
if quest_time_elapsed_minutes == nil then if quest_time_elapsed_minutes == nil then
customization_menu.status = "No quest time elapsed minutes"; error_handler.report("time.update_quest_time", "Failed to access Data: quest_time_elapsed_minutes");
else else
this.elapsed_minutes = quest_time_elapsed_minutes; this.elapsed_minutes = quest_time_elapsed_minutes;
end end
local quest_time_total_elapsed_seconds = get_quest_elapsed_time_sec_method:call(singletons.quest_manager); local quest_time_total_elapsed_seconds = get_quest_elapsed_time_sec_method:call(singletons.quest_manager);
if quest_time_total_elapsed_seconds == nil then if quest_time_total_elapsed_seconds == nil then
customization_menu.status = "No quest time total elapsed seconds"; error_handler.report("time.update_quest_time", "Failed to access Data: quest_time_total_elapsed_seconds");
else else
this.total_elapsed_seconds = quest_time_total_elapsed_seconds; this.total_elapsed_seconds = quest_time_total_elapsed_seconds;
end end
this.elapsed_seconds = quest_time_total_elapsed_seconds - quest_time_elapsed_minutes * 60; this.elapsed_seconds = quest_time_total_elapsed_seconds - quest_time_elapsed_minutes * 60;
if this.total_elapsed_script_seconds - this.last_elapsed_script_seconds > 0.5 then
this.last_elapsed_script_seconds = this.total_elapsed_script_seconds;
local is_on_quest = quest_status.flow_state ~= quest_status.flow_states.IN_LOBBY and quest_status.flow_state ~= quest_status.flow_states.IN_TRAINING_AREA;
players.display_list = {};
players.update_player_list(is_on_quest);
non_players.update_servant_list();
non_players.update_otomo_list(is_on_quest, quest_status.is_online);
players.update_dps(false);
players.sort_players();
end
end end
function this.init_module() function this.init_dependencies()
players = require("MHR_Overlay.Damage_Meter.players"); players = require("MHR_Overlay.Damage_Meter.players");
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
@@ -101,6 +170,14 @@ function this.init_module()
small_monster = require("MHR_Overlay.Monsters.small_monster"); small_monster = require("MHR_Overlay.Monsters.small_monster");
quest_status = require("MHR_Overlay.Game_Handler.quest_status"); quest_status = require("MHR_Overlay.Game_Handler.quest_status");
non_players = require("MHR_Overlay.Damage_Meter.non_players"); non_players = require("MHR_Overlay.Damage_Meter.non_players");
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
screen = require("MHR_Overlay.Game_Handler.screen");
buffs = require("MHR_Overlay.Buffs.buffs");
player_info = require("MHR_Overlay.Misc.player_info");
end
function this.init_module()
end end
return this; return this;

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +0,0 @@
local this = {};
this.enabled = false;
return this;

View File

@@ -0,0 +1,92 @@
local this = {};
local time;
local utils;
local config;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {};
this.is_empty = true;
this.history = {};
function this.report(error_key, error_message)
if error_key == nil or error_key == ""
or error_message == nil or error_message == "" then
return;
end
local error_time = time.total_elapsed_script_seconds;
if utils.number.is_equal(error_time, 0) then
return;
end
local error = {
key = error_key,
time = error_time,
message = error_message
};
this.list[error_key] = error;
this.is_empty = false;
this.add_to_history(error_key, error);
end
function this.add_to_history(error_key, error)
this.clear_history();
table.insert(this.history, error);
end
function this.clear_history()
local history_size = config.current_config.debug.history_size;
while #this.history >= history_size do
table.remove(this.history, 1);
end
end
function this.init_dependencies()
time = require("MHR_Overlay.Game_Handler.time");
utils = require("MHR_Overlay.Misc.utils");
config = require("MHR_Overlay.Misc.config");
end
function this.init_module()
end
return this;

View File

@@ -1,6 +1,7 @@
local this = {}; local this = {};
local utils; local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -36,11 +37,47 @@ local package = package;
this.language_folder = "MHR Overlay\\languages\\"; this.language_folder = "MHR Overlay\\languages\\";
--[[
EXAMPLE:
unicode_glyph_ranges = {
0x0020, 0x00FF, -- Basic Latin + Latin Supplement
0x2000, 0x206F, -- General Punctuation
0x3000, 0x30FF, -- CJK Symbols and Punctuations, Hiragana, Katakana
0x31F0, 0x31FF, -- Katakana Phonetic Extensions
0x4e00, 0x9FAF, -- CJK Ideograms
0xFF00, 0xFFEF, -- Half-width characters
0
},
]]
--[[
EXAMPLE:
unicode_glyph_ranges = {
0x0020, 0x00FF, -- Basic Latin + Latin Supplement
0x0400, 0x052F, -- Cyrillic
0x2000, 0x206F, -- General Punctuation
0xFF00, 0xFFEF, -- Half-width characters
0
},
]]
--[[
EXAMPLE:
unicode_glyph_ranges = {
0x0020, 0x00FF, -- Basic Latin + Latin Supplement
0x1100, 0x11FF, -- Hangul Jamo
0x2000, 0x206F, -- General Punctuation
0x3130, 0x318F, -- Hangul Compatibility Jamo
0xAC00, 0xD7AF, -- Hangul Syllables
0xFF00, 0xFFEF, -- Half-width characters
0
},
]]
this.current_language = {}; this.current_language = {};
this.default_language = { this.default_language = {
font_name = "NotoSansKR-Bold.otf", font_name = "",
unicode_glyph_ranges = {0},
parts = { parts = {
head = "Head", head = "Head",
neck = "Neck", neck = "Neck",
@@ -134,12 +171,15 @@ this.default_language = {
sleep = "Sleep", sleep = "Sleep",
stun = "Stun", stun = "Stun",
flash = "Flash", flash = "Flash",
poison = "Poison",
blast = "Blast", blast = "Blast",
exhaust = "Exhaust", exhaust = "Exhaust",
ride = "Wyvern Riding", ride = "Wyvern Riding",
waterblight = "Waterblight",
poison = "Poison",
deadly_poison = "Deadly Poison",
fireblight = "Fireblight", fireblight = "Fireblight",
waterblight = "Waterblight",
iceblight = "Iceblight", iceblight = "Iceblight",
thunderblight = "Thunderblight", thunderblight = "Thunderblight",
@@ -150,7 +190,103 @@ this.default_language = {
steel_fang = "Steel Fang", steel_fang = "Steel Fang",
quick_sand = "Quick Sand", quick_sand = "Quick Sand",
fall_otomo_trap = "Fall Buddy Trap", fall_otomo_trap = "Fall Buddy Trap",
shock_otomo_trap = "Shock Buddy Trap" shock_otomo_trap = "Shock Buddy Trap",
dragonblight = "Dragonblight",
blastblight = "Blastblight",
hellfireblight = "Hellfireblight",
bloodblight = "Bloodblight",
frostblight = "Frostblight",
minor_bubbleblight = "Minor Bubbleblight",
major_bubbleblight = "Major Bubbleblight",
defense_down = "Defense Down",
resistance_down = "Resistance Down",
falling_asleep = "Falling Asleep",
tremor = "Tremor",
roar = "Roar",
webbed = "Webbed",
stench = "Stench",
leeched = "Leeched",
bleeding = "Bleeding",
engulfed = "Engulfed",
muck = "Muck",
frenzy = "Frenzy",
frenzy_infection = "Frenzy Infection",
frenzy_overcome = "Frenzy Overcome"
},
dango_skills = {
dango_insurance_defense_up = "Dango Insurance Defense Up"
},
skills = {
powder_mantle_red = "Powder Mantle (Red)",
powder_mantle_blue = "Powder Mantle (Blue)",
dragon_conversion_elemental_attack_up = "Dragon Conversion Elem. Atk Up",
dragon_conversion_elemental_res_up = "Dragon Conversion Elem. Res Up",
},
weapon_skills = {
-- Great Sword
power_sheathe = "Power Sheathe",
-- Switch Axe
amped_state = "Amped State",
switch_charger = "Switch Charger",
axe_heavy_slam = "Axe: Heavy Slam",
-- Long Sword
spirit_gauge_autofill = "Spirit Gauge Autofill", -- Soaring Kick, Iai Slash
spirit_gauge = "Spirit Gauge",
--harvest_moon = "Harvest Moon",
-- Light Bowgun
--fanning_maneuver = "Fanning Maneuver",
wyvernblast_reload = "Wyvernblast Reload",
-- Heavy Bowgun
--counter_charger = "Counter Charger",
--rising_moon = "Rising Moon",
--setting_sun = "Setting Sun",
overheat = "Overheat",
wyvernsnipe_reload = "Wyvernsnipe Reload",
-- Hammer
--impact_burst = "Impact Burst",
-- Gunlance
--ground_splitter = "Ground Splitter",
--erupting_cannon = "Erupting Cannon",
-- Lance
--anchor_rage = "Anchor Rage",
--spiral_thrust = "Spiral Thrust",
twin_wine = "Twin Wine",
-- Sword & Shield
--destroyer_oil = "Destroyer Oil",
-- Dual Blades
ironshine_silk = "Ironshine Silk",
archdemon_mode = "Archdemon Mode",
-- Hunting Horn
--silkbind_shockwave = "Silkbind Shockwave",
--bead_of_resonance = "Bead of Resonance",
--sonic_bloom = "Sonic Bloom",
-- Charge Blade
element_boost = "Element Boost",
sword_boost_mode ="Sword Boost Mode",
-- Insect Glaive
red_extract = "Red Extract",
white_extract = "White Extract",
orange_extract = "Orange Extract",
all_extracts_mix = "All Extracts Mix",
-- Bow
herculean_draw = "Herculean Draw",
--bolt_boost = "Bolt Boost",
arc_shot_affinity = "Arc Shot: Affinity",
arc_shot_brace = "Arc Shot: Brace",
},
misc_buffs = {
attack_up = "Attack Up",
defense_up = "Defense Up",
stamina_use_down = "Stamina Use Down",
immunity = "Immunity"
}, },
UI = { UI = {
@@ -166,9 +302,12 @@ this.default_language = {
total_buildup = "Total Buildup", total_buildup = "Total Buildup",
part_break = "Break", part_break = "Break",
part_sever = "Sever", part_sever = "Sever",
part_anomaly_core = "Anomaly Core",
otomo = "Buddy", otomo = "Buddy",
servant = "Follower", servant = "Follower",
lv = ""
}, },
customization_menu = { customization_menu = {
@@ -283,6 +422,7 @@ this.default_language = {
rage = "Rage", rage = "Rage",
body_parts = "Body Parts", body_parts = "Body Parts",
hide_undamaged_parts = "Hide Undamaged Parts", hide_undamaged_parts = "Hide Undamaged Parts",
render_inactive_anomaly_cores = "Render Inactive Anomaly Cores",
part_name = "Part Name", part_name = "Part Name",
flinch_count = "Flinch Count", flinch_count = "Flinch Count",
break_count = "Break Count", break_count = "Break Count",
@@ -339,14 +479,18 @@ this.default_language = {
small_monsters = "Small Monsters", small_monsters = "Small Monsters",
large_monsters = "Large Monsters", large_monsters = "Large Monsters",
player_damage = "Player Damage", players = "Players",
bomb_damage = "Bomb Damage", bombs = "Bombs",
kunai_damage = "Kunai Damage", kunai = "Kunai",
installation_damage = "Installation Damage", installations = "Installations",
otomo_damage = "Buddy Damage", otomos = "Buddies",
monster_damage = "Monster Damage", monsters = "Monsters",
poison_damage = "Poison Damage", wyvern_riding = "Wyvern Riding",
blast_damage = "Blast Damage", poison = "Poison",
blast = "Blast",
endemic_life = "Endemic Life",
anomaly_cores = "Anomaly Cores",
other = "Other",
damage = "Damage", damage = "Damage",
@@ -417,6 +561,8 @@ this.default_language = {
break_health_percentage = "Break Health Percentage", break_health_percentage = "Break Health Percentage",
loss_health = "Sever Health", loss_health = "Sever Health",
loss_health_percentage = "Sever Health Percentage", loss_health_percentage = "Sever Health Percentage",
anomaly_health = "Anomaly Core Health",
anomaly_health_percentage = "Anomaly Core Health Percentage",
monster_id = "Monster ID", monster_id = "Monster ID",
@@ -426,10 +572,6 @@ this.default_language = {
master_rank = "Master Rank", master_rank = "Master Rank",
other_damage = "Other Damage",
wyvern_riding_damage = "Wyvern Riding Damage",
endemic_life_damage = "Endemic Life Damage",
hide_myself = "Hide Myself", hide_myself = "Hide Myself",
hide_other_players = "Hide Other Players", hide_other_players = "Hide Other Players",
hide_servants = "Hide Followers", hide_servants = "Hide Followers",
@@ -446,14 +588,24 @@ this.default_language = {
freeze_dps_on_quest_end = "Freeze DPS on Quest End", freeze_dps_on_quest_end = "Freeze DPS on Quest End",
health_break_sever_anomaly_filter = "Health + Break + Sever + Anomaly Core",
health_break_sever_filter = "Health + Break + Sever",
health_break_anomaly_filter = "Health + Break + Anomaly Core",
health_sever_anomaly_filter = "Health + Sever + Anomaly Core",
break_sever_anomaly_filter = "Break + Sever + Anomaly Core",
health_break_severe_filter = "Health + Break + Severe",
health_break_filter = "Health + Break", health_break_filter = "Health + Break",
health_severe_filter = "Health + Severe", health_sever_filter = "Health + Sever",
health_anomaly_filter = "Health + Anomaly Core",
break_sever_filter = "Break + Sever",
break_anomaly_filter = "Break + Anomaly Core",
sever_anomaly_filter = "Sever + Anomaly Core",
health_filter = "Health", health_filter = "Health",
break_severe_filter = "Break + Severe",
break_filter = "Break", break_filter = "Break",
severe_filter = "Severe", sever_filter = "Sever",
anomaly_filter = "Anomaly Core",
outline = "Outline", outline = "Outline",
thickness = "Thickness", thickness = "Thickness",
@@ -505,7 +657,57 @@ this.default_language = {
filter_mode = "Filter Mode", filter_mode = "Filter Mode",
current_state = "Current State", current_state = "Current State",
default_state = "Default State" default_state = "Default State",
fill_direction = "Fill Direction",
left_to_right = "Left to Right",
right_to_left = "Right to Left",
top_to_bottom = "Top to Bottom",
bottom_to_top = "Bottom to Top",
right_alignment_shift = "Right Alignment Shift",
debug = "Debug",
current_time = "Current Time",
everything_seems_to_be_ok = "Everything seems to be OK!",
history = "History",
history_size = "History Size",
value = "Value",
stats_UI = "Stats UI",
health_label = "Health Label",
stamina_label = "Stamina Label",
attack_label = "Attack Label",
defense_label = "Defense Label",
affinity_label = "Affinity Label",
fire_resistance_label = "Fire Resistance Label",
water_resistance_label = "Water Resistance Label",
thunder_resistance_label = "Thunder Resistance Label",
ice_resistance_label = "Ice Resistance Label",
dragon_resistance_label = "Dragon Resistance Label",
element_label = "Element Label",
element_2_label = "Element 2 Label"
},
stats = {
attack = "Attack",
defense = "Defense",
affinity = "Affinity",
fire_resistance = "Fire Res";
water_resistance = "Water Res";
thunder_resistance = "Thunder Res";
ice_resistance = "Ice Res";
dragon_resistance = "Dragon Res";
stamina = "Stamina",
fire = "Fire",
water = "Water",
thunder = "Thunder",
ice = "Ice",
dragon = "Dragon",
} }
}; };
@@ -524,18 +726,17 @@ function this.load()
local loaded_language = json.load_file(language_file_name); local loaded_language = json.load_file(language_file_name);
if loaded_language ~= nil then if loaded_language ~= nil then
log.info(string.format("[MHR Overlay] %s.json Loaded Successfully", language_file_name));
log.info("[MHR Overlay] " .. language_file_name .. ".json loaded successfully");
table.insert(this.language_names, language_name); table.insert(this.language_names, language_name);
local merged_language = utils.table.merge(this.default_language, loaded_language); local merged_language = utils.table.merge(this.default_language, loaded_language);
table.insert(this.languages, merged_language); table.insert(this.languages, merged_language);
this.save(language_file_name, merged_language); this.save(language_file_name, merged_language);
else else
log.error("[MHR Overlay] Failed to load " .. language_file_name .. ".json"); error_handler.report("language.load", string.format("Failed to load %s.json", language_file_name));
log.error(string.format("[MHR Overlay] Failed to Load %s.json", language_file_name));
end end
end end
end end
@@ -543,9 +744,10 @@ end
function this.save(file_name, language_table) function this.save(file_name, language_table)
local success = json.dump_file(file_name, language_table); local success = json.dump_file(file_name, language_table);
if success then if success then
log.info("[MHR Overlay] " .. file_name .. " saved successfully"); log.info(string.format("[MHR Overlay] %s Saved Successfully", file_name));
else else
log.error("[MHR Overlay] Failed to save " .. file_name); error_handler.report("language.save", string.format("[MHR Overlay] Failed to Save %s", file_name));
log.error(string.format("[MHR Overlay] Failed to Save %s", file_name));
end end
end end
@@ -557,9 +759,12 @@ function this.update(index)
this.current_language = this.languages[index]; this.current_language = this.languages[index];
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
this.save_default(); this.save_default();
this.load(); this.load();
this.current_language = this.default_language; this.current_language = this.default_language;

View File

@@ -1,6 +1,7 @@
local this = {}; local this = {};
local language; local language;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -543,7 +544,7 @@ function this.init()
language.current_language.parts.right_foreleg, language.current_language.parts.right_foreleg,
language.current_language.parts.hind_legs, language.current_language.parts.hind_legs,
language.current_language.parts.wings, language.current_language.parts.wings,
language.current_language.parts.tail, language.current_language.parts.tail
}, },
[19] = -- Daimyo Hermitaur 19 [19] = -- Daimyo Hermitaur 19
{ {
@@ -826,11 +827,12 @@ function this.init()
language.current_language.parts.head, language.current_language.parts.head,
language.current_language.parts.torso, language.current_language.parts.torso,
language.current_language.parts.wings, language.current_language.parts.wings,
language.current_language.parts.wingclaws, language.current_language.parts.right_wingclaw,
language.current_language.parts.forelegs, language.current_language.parts.forelegs,
language.current_language.parts.hind_legs, language.current_language.parts.hind_legs,
language.current_language.parts.tail, language.current_language.parts.tail,
language.current_language.parts.antenna language.current_language.parts.antenna,
language.current_language.parts.left_wingclaw
}, },
[2072] = -- Risen Kushala Daora 2072 [2072] = -- Risen Kushala Daora 2072
@@ -919,6 +921,27 @@ function this.init()
language.current_language.parts.left_leg, language.current_language.parts.left_leg,
language.current_language.parts.right_leg language.current_language.parts.right_leg
}, },
--SUNBREAK BONUS UPDATE
[1412] = -- Primordial Malzeno 1412
{
language.current_language.parts.head,
language.current_language.parts.torso,
language.current_language.parts.left_foreleg,
language.current_language.parts.right_foreleg,
language.current_language.parts.hind_legs,
language.current_language.parts.wings,
language.current_language.parts.tail,
}
}; };
end end
@@ -932,9 +955,12 @@ function this.get_part_name(monster_id, part_id)
return part_name; return part_name;
end end
function this.init_module() function this.init_dependencies()
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
this.init(); this.init();
end end

View File

@@ -0,0 +1,327 @@
local this = {};
local drawing;
local customization_menu;
local singletons;
local config;
local utils;
local error_handler;
local quest_status;
local time;
local dango_skills;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
health = 0;
max_health = 0;
attack = 0;
defense = 0;
affinity = 0;
stamina = 0;
max_stamina = -1;
element_type = 0;
element_attack = 0;
element_type_2 = 0;
element_attack_2 = 0;
fire_resistance = 0;
water_resistance = 0;
thunder_resistance = 0;
ice_resistance = 0;
dragon_resistance = 0;
};
local should_health_update = true;
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_method = player_manager_type_def:get_method("getPlayer");
local find_master_player_method = player_manager_type_def:get_method("findMasterPlayer");
local player_base_type_def = find_master_player_method:get_return_type();
local get_player_data_method = player_base_type_def:get_method("get_PlayerData");
local player_data_type_def = get_player_data_method:get_return_type();
local get_vital_method = player_data_type_def:get_method("get_vital");
local attack_field = player_data_type_def:get_field("_Attack");
local defence_field = player_data_type_def:get_field("_Defence");
local critical_rate_field = player_data_type_def:get_field("_CriticalRate");
local vital_max_field = player_data_type_def:get_field("_vitalMax");
local stamina_field = player_data_type_def:get_field("_stamina");
local stamina_max_field = player_data_type_def:get_field("_staminaMax");
local element_type_field = player_data_type_def:get_field("_ElementType");
local element_attack_field = player_data_type_def:get_field("_ElementAttack");
local element_type_2nd_field = player_data_type_def:get_field("_ElementType2nd");
local element_attack_2nd_field = player_data_type_def:get_field("_ElementAttack2nd");
local resistance_element_field = player_data_type_def:get_field("_ResistanceElement");
local system_array_type_def = sdk.find_type_definition("System.Array");
local get_length_method = system_array_type_def:get_method("get_Length");
local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)");
local player_quest_base_type_def = sdk.find_type_definition("snow.player.PlayerQuestBase");
local player_quest_base_update_method = player_quest_base_type_def:get_method("update");
local is_master_player_method = player_quest_base_type_def:get_method("isMasterPlayer");
local player_base_type_def = sdk.find_type_definition("snow.player.PlayerBase");
-- Dango Adrenaline
local is_kitchen_skill_predicament_powerup_method = player_base_type_def:get_method("isKitchenSkillPredicamentPowerUp");
local single_type_def = sdk.find_type_definition("System.Single");
local mvalue_field = single_type_def:get_field("mValue");
local master_player_ref = nil;
local master_player_data_ref = nil;
function this.update()
if quest_status.flow_state == quest_status.flow_states.NONE then
return;
end
local cached_config = config.current_config;
if not cached_config.buff_UI.enabled
and not cached_config.stats_UI.enabled then
return;
end
if singletons.player_manager == nil then
error_handler.report("player_info.update", "Failed to access Data: player_manager");
return;
end
local master_player = find_master_player_method:call(singletons.player_manager);
if master_player == nil then
error_handler.report("player_info.update", "Failed to access Data: master_player");
return;
end
local master_player_data = get_player_data_method:call(master_player);
if master_player_data == nil then
error_handler.report("player_info.update", "Failed to access Data: master_player_data");
end
master_player_ref = master_player;
master_player_data_ref = master_player_data;
should_health_update = true;
this.update_generic("max_health", master_player_data, vital_max_field);
this.update_generic("stamina", master_player_data, stamina_field);
this.list.stamina = math.floor(this.list.stamina / 30);
this.update_generic("max_stamina", master_player_data, stamina_max_field);
this.list.max_stamina = math.floor(this.list.max_stamina / 30);
if not cached_config.stats_UI.enabled then
return;
end
this.update_generic("attack", master_player_data, attack_field);
this.update_generic("affinity", master_player_data, critical_rate_field);
this.update_generic("defense", master_player_data, defence_field);
this.update_generic("element_type", master_player_data, element_type_field);
this.update_generic("element_attack", master_player_data, element_attack_field);
this.update_generic("element_type_2", master_player_data, element_type_2nd_field);
this.update_generic("element_attack_2", master_player_data, element_attack_2nd_field);
this.update_resistances(master_player_data);
end
function this.update_generic(key, player_data, field)
local value = field:get_data(player_data);
if value == nil then
error_handler.report("player_info.update_generic", string.format("Failed to access Data: %s_value", key));
return;
end
this.list[key] = math.floor(value);
end
function this.update_resistances(player_data)
local resistance_element_array = resistance_element_field:get_data(player_data);
if resistance_element_array == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: resistance_element_array");
return;
end
-- Fire Resistance
local fire_resistance_single_valtype = get_value_method:call(resistance_element_array, 0);
if fire_resistance_single_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: fire_resistance_single_valtype");
return;
end
local fire_resistance = mvalue_field:get_data(fire_resistance_single_valtype);
if fire_resistance ~= nil then
this.list.fire_resistance = math.floor(fire_resistance);
else
error_handler.report("player_info.update_resistances", "Failed to access Data: fire_resistance");
return;
end
-- Water Resistance
local water_resistance_single_valtype = get_value_method:call(resistance_element_array, 1);
if water_resistance_single_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: water_resistance_single_valtype");
return;
end
local water_resistance = mvalue_field:get_data(water_resistance_single_valtype);
if water_resistance ~= nil then
this.list.water_resistance = math.floor(water_resistance);
else
error_handler.report("player_info.update_resistances", "Failed to access Data: water_resistance");
return;
end
-- Thunder Resistance
local thunder_resistance_single_valtype = get_value_method:call(resistance_element_array, 2);
if thunder_resistance_single_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: thunder_resistance_single_valtype");
return;
end
local thunder_resistance = mvalue_field:get_data(thunder_resistance_single_valtype);
if thunder_resistance ~= nil then
this.list.thunder_resistance = math.floor(thunder_resistance);
else
error_handler.report("player_info.update_resistances", "Failed to access Data: thunder_resistance");
return;
end
-- Ice Resistance
local ice_resistance_single_valtype = get_value_method:call(resistance_element_array, 3);
if ice_resistance_single_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: ice_resistance_single_valtype");
return;
end
local ice_resistance = mvalue_field:get_data(ice_resistance_single_valtype);
if ice_resistance ~= nil then
this.list.ice_resistance = math.floor(ice_resistance);
else
error_handler.report("player_info.update_resistances", "Failed to access Data: ice_resistance");
return;
end
-- Dragon Resistance
local dragon_resistance_single_valtype = get_value_method:call(resistance_element_array, 4);
if dragon_resistance_single_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: dragon_resistance_single_valtype");
return;
end
local dragon_resistance = mvalue_field:get_data(dragon_resistance_single_valtype);
if dragon_resistance ~= nil then
this.list.dragon_resistance = math.floor(dragon_resistance);
else
error_handler.report("player_info.update_resistances", "Failed to access Data: dragon_resistance");
return;
end
end
function this.on_pre_player_update(quest_player_base)
if not should_health_update then
return;
end
if quest_player_base ~= master_player_ref then
return;
end
this.update_health(quest_player_base);
this.update_dango_adrenaline(quest_player_base);
should_health_update = false;
end
function this.update_health(quest_player_base)
local vital = get_vital_method:call(master_player_data_ref);
if vital == nil then
error_handler.report("player_info.update_health", "Failed to access Data: vital");
return;
end
this.list.health = vital;
end
function this.update_dango_adrenaline(quest_player_base)
local is_kitchen_skill_predicament_powerup = is_kitchen_skill_predicament_powerup_method:call(master_player_ref);
if is_kitchen_skill_predicament_powerup == nil then
error_handler.report("player_info.update_dango_adrenaline", "Failed to access Data: is_kitchen_skill_predicament_powerup");
return;
end
dango_skills.is_dango_adrenaline_active = is_kitchen_skill_predicament_powerup;
end
function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
--health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_UI_entity");
--stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity");
--screen = require("MHR_Overlay.Game_Handler.screen");
drawing = require("MHR_Overlay.UI.drawing");
--ailments = require("MHR_Overlay.Monsters.ailments");
--ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity");
error_handler = require("MHR_Overlay.Misc.error_handler");
quest_status = require("MHR_Overlay.Game_Handler.quest_status");
time = require("MHR_Overlay.Game_Handler.time");
dango_skills = require("MHR_Overlay.Buffs.dango_skills");
end
function this.init_module()
sdk.hook(player_quest_base_update_method, function(args)
local quest_player_base = sdk.to_managed_object(args[2]);
this.on_pre_player_update(quest_player_base);
end, function(retval)
return retval;
end);
end
return this;

View File

@@ -1,5 +1,7 @@
local this = {}; local this = {};
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
local pairs = pairs; local pairs = pairs;
@@ -39,8 +41,10 @@ local is_empty;
local unicode_map; local unicode_map;
local unicode_relative_position; local unicode_relative_position;
local unicode_chars; local unicode_chars;
local epsilon = 0.000001;
this.table = {}; this.table = {};
this.type = {};
this.number = {}; this.number = {};
this.string = {}; this.string = {};
this.vec2 = {}; this.vec2 = {};
@@ -48,6 +52,12 @@ this.vec3 = {};
this.vec4 = {}; this.vec4 = {};
this.math = {}; this.math = {};
this.unicode = {}; this.unicode = {};
this.sdk = {};
this.constants = {};
this.constants.uninitialized_int = -420;
this.constants.uninitialized_string = "Uninitialized";
this.constants.epsilon = epsilon;
function this.table.tostring(table_) function this.table.tostring(table_)
if type(table_) == "number" or type(table_) == "boolean" or type(table_) == "string" then if type(table_) == "number" or type(table_) == "boolean" or type(table_) == "string" then
@@ -207,6 +217,18 @@ function this.table.merge(...)
return result; return result;
end end
function this.type.is_boolean(value)
return value == true or value == false;
end
function this.type.is_REField(value)
return value.get_return_type == nil;
end
function this.type.is_REMethodDefinition(value)
return value.get_return_type ~= nil;
end
function this.number.is_NaN(value) function this.number.is_NaN(value)
return tostring(value) == tostring(0/0); return tostring(value) == tostring(0/0);
end end
@@ -215,6 +237,22 @@ function this.number.round(value)
return math.floor(value + 0.5); return math.floor(value + 0.5);
end end
function this.number.is_odd(value)
return value % 2 ~= 0;
end
function this.number.is_even(value)
return value % 2 == 0;
end
function this.number.is_equal(value1, value2)
if math.abs(value1 - value2) < epsilon then
return true;
end
return false;
end
function this.string.trim(str) function this.string.trim(str)
return str:match("^%s*(.-)%s*$"); return str:match("^%s*(.-)%s*$");
end end
@@ -405,6 +443,44 @@ function this.unicode.sub(str, i, j)
return string.sub(str, i, b + c - 1); return string.sub(str, i, b + c - 1);
end end
function this.sdk.generate_enum(type_def)
if not type_def then
return {};
end
local fields = type_def:get_fields();
local enum = {};
for i, field in ipairs(fields) do
if field:is_static() then
local name = field:get_name();
local raw_value = field:get_data(nil);
local enum_entry = {
name = name,
value = raw_value;
};
table.insert(enum, enum_entry);
end
end
return enum;
end
function this.sdk.generate_enum_by_typename(type_name)
local type_def = sdk.find_type_definition(type_name);
if not type_def then
return {};
end;
return this.sdk.generate_enum(type_def);
end
function this.init_dependencies()
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module() function this.init_module()
end end

View File

@@ -9,6 +9,7 @@ local time;
local small_monster; local small_monster;
local large_monster; local large_monster;
local drawing; local drawing;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -52,28 +53,27 @@ function this.draw(monster, ailment_buildup_UI, cached_config, ailment_buildups_
return; return;
end end
for id, ailment in pairs(monster.ailments) do for id, ailment in pairs(monster.ailments) do
if id == ailments.stun_id then if id == ailments.stun_id then
if not cached_config.filter.stun then if not cached_config.filter.stun then
goto continue goto continue;
end end
elseif id == ailments.poison_id then elseif id == ailments.poison_id then
if not cached_config.filter.poison then if not cached_config.filter.poison then
goto continue goto continue;
end end
elseif id == ailments.blast_id then elseif id == ailments.blast_id then
if not cached_config.filter.blast then if not cached_config.filter.blast then
goto continue goto continue;
end end
else else
goto continue goto continue;
end end
if cached_config.settings.time_limit ~= 0 and if cached_config.settings.time_limit ~= 0 and
time.total_elapsed_script_seconds - ailment.last_change_time > cached_config.settings.time_limit then time.total_elapsed_script_seconds - ailment.last_change_time > cached_config.settings.time_limit then
goto continue goto continue;
end end
@@ -154,7 +154,7 @@ function this.draw(monster, ailment_buildup_UI, cached_config, ailment_buildups_
end end
if total_buildup == 0 then if total_buildup == 0 then
goto continue goto continue;
end end
if cached_config.sorting.type == "Normal" then if cached_config.sorting.type == "Normal" then
@@ -227,11 +227,9 @@ function this.draw(monster, ailment_buildup_UI, cached_config, ailment_buildups_
::continue:: ::continue::
end end
end end
function this.init_module() function this.init_dependencies()
players = require("MHR_Overlay.Damage_Meter.players"); players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -241,6 +239,10 @@ function this.init_module()
small_monster = require("MHR_Overlay.Monsters.small_monster"); small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster"); large_monster = require("MHR_Overlay.Monsters.large_monster");
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -4,6 +4,7 @@ local small_monster;
local large_monster; local large_monster;
local config; local config;
local ailments; local ailments;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -47,7 +48,7 @@ local enemy_condition_damage_param_base_type_def = sdk.find_type_definition("sno
local get_enemy_method = enemy_condition_damage_param_base_type_def:get_method("get_Em"); local get_enemy_method = enemy_condition_damage_param_base_type_def:get_method("get_Em");
local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase"); local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase");
local damage_param_field = enemy_character_base_type_def:get_field("<DamageParam>k__BackingField"); local get_damage_param_method = enemy_character_base_type_def:get_method("get_DamageParam");
local is_boss_enemy_method = enemy_character_base_type_def:get_method("get_isBossEnemy"); local is_boss_enemy_method = enemy_character_base_type_def:get_method("get_isBossEnemy");
local enemy_damage_param_type_def = sdk.find_type_definition("snow.enemy.EnemyDamageParam"); local enemy_damage_param_type_def = sdk.find_type_definition("snow.enemy.EnemyDamageParam");
@@ -62,16 +63,19 @@ local blast_adjust_rate_method = blast_param_type:get_method("get_BlastDamageAdj
function this.poison_proc(poison_param) function this.poison_proc(poison_param)
if poison_param == nil then if poison_param == nil then
error_handler.report("ailment_hook.poison_proc", "Missing Parameter: poison_param");
return; return;
end end
local enemy = get_enemy_method:call(poison_param); local enemy = get_enemy_method:call(poison_param);
if enemy == nil then if enemy == nil then
error_handler.report("ailment_hook.poison_proc", "Failed to access Data: enemy");
return; return;
end end
local is_large = is_boss_enemy_method:call(enemy); local is_large = is_boss_enemy_method:call(enemy);
if is_large == nil then if is_large == nil then
error_handler.report("ailment_hook.poison_proc", "Failed to access Data: is_large");
return; return;
end end
@@ -90,16 +94,19 @@ end
function this.blast_proc(blast_param) function this.blast_proc(blast_param)
if blast_param == nil then if blast_param == nil then
error_handler.report("ailment_hook.blast_proc", "Missing Parameter: blast_param");
return; return;
end end
local enemy = get_enemy_method:call(blast_param); local enemy = get_enemy_method:call(blast_param);
if enemy == nil then if enemy == nil then
error_handler.report("ailment_hook.blast_proc", "Failed to access Data: enemy");
return; return;
end end
local is_large = is_boss_enemy_method:call(enemy); local is_large = is_boss_enemy_method:call(enemy);
if is_large == nil then if is_large == nil then
error_handler.report("ailment_hook.blast_proc", "Failed to access Data: is_large");
return; return;
end end
@@ -113,43 +120,55 @@ function this.blast_proc(blast_param)
local blast_damage = blast_damage_method:call(blast_param); local blast_damage = blast_damage_method:call(blast_param);
local blast_adjust_rate = blast_adjust_rate_method:call(blast_param); local blast_adjust_rate = blast_adjust_rate_method:call(blast_param);
ailments.apply_ailment_damage(monster, ailments.blast_id, blast_damage * blast_adjust_rate); ailments.apply_ailment_damage(monster, ailments.blast_id, blast_damage * blast_adjust_rate);
ailments.clear_ailment_contribution(monster, ailments.blast_id); ailments.clear_ailment_contribution(monster, ailments.blast_id);
end end
function this.stock_damage() function this.stock_damage()
for enemy, monster in pairs(large_monster.list) do for enemy, monster in pairs(large_monster.list) do
local damage_param = damage_param_field:get_data(enemy); local damage_param = get_damage_param_method:call(enemy);
if damage_param == nil then if damage_param == nil then
goto continue error_handler.report("ailment_hook.stock_damage", "Failed to access Data: large_monster -> damage_param");
goto continue;
end end
local poison_param = poison_param_field:get_data(damage_param); local poison_param = poison_param_field:get_data(damage_param);
if poison_param == nil then
error_handler.report("ailment_hook.stock_damage", "Failed to access Data: large_monster -> poison_param");
goto continue;
end
ailments.update_poison(monster, poison_param); ailments.update_poison(monster, poison_param);
::continue:: ::continue::
end end
for enemy, monster in pairs(small_monster.list) do for enemy, monster in pairs(small_monster.list) do
local damage_param = damage_param_field:get_data(enemy); local damage_param = get_damage_param_method:call(enemy);
if damage_param == nil then if damage_param == nil then
goto continue error_handler.report("ailment_hook.stock_damage", "Failed to access Data: small_monster -> damage_param");
goto continue;
end end
local poison_param = poison_param_field:get_data(damage_param); local poison_param = poison_param_field:get_data(damage_param);
if poison_param == nil then
error_handler.report("ailment_hook.stock_damage", "Failed to access Data: small_monster -> poison_param");
goto continue;
end
ailments.update_poison(monster, poison_param); ailments.update_poison(monster, poison_param);
::continue:: ::continue::
end end
end end
function this.init_module() function this.init_dependencies()
small_monster = require("MHR_Overlay.Monsters.small_monster"); small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster"); large_monster = require("MHR_Overlay.Monsters.large_monster");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
ailments = require("MHR_Overlay.Monsters.ailments"); ailments = require("MHR_Overlay.Monsters.ailments");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
sdk.hook(stock_damage_method, function(args) sdk.hook(stock_damage_method, function(args)
pcall(this.stock_damage, sdk.to_managed_object(args[2])); pcall(this.stock_damage, sdk.to_managed_object(args[2]));
end, function(retval) end, function(retval)

View File

@@ -9,6 +9,8 @@ local time;
local small_monster; local small_monster;
local large_monster; local large_monster;
local non_players; local non_players;
local error_handler;
local utils;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -94,7 +96,7 @@ function this.new(_ailments, ailment_id)
new_ailment.buildup_percentage = 0; new_ailment.buildup_percentage = 0;
new_ailment.timer = 0; new_ailment.timer = 0;
new_ailment.duration = 100000; new_ailment.duration = 0;
new_ailment.timer_percentage = 0; new_ailment.timer_percentage = 0;
new_ailment.minutes_left = 0; new_ailment.minutes_left = 0;
@@ -245,20 +247,18 @@ function this.init_ailment_names(_ailments)
end end
local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase"); local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase");
local get_damage_param_method = enemy_character_base_type_def:get_method("get_DamageParam");
local damage_param_type_def = get_damage_param_method:get_return_type();
local get_condition_param_method = damage_param_type_def:get_method("get_ConditionParam");
local stun_param_field = damage_param_type_def:get_field("_StunParam");
local poison_param_field = damage_param_type_def:get_field("_PoisonParam");
local blast_param_field = damage_param_type_def:get_field("_BlastParam");
local blast_param_type_def = blast_param_field:get_type();
local enemy_condition_damage_param_base_type_def = sdk.find_type_definition("snow.enemy.EnemyConditionDamageParamBase"); local enemy_condition_damage_param_base_type_def = sdk.find_type_definition("snow.enemy.EnemyConditionDamageParamBase");
local damage_param_field = enemy_character_base_type_def:get_field("<DamageParam>k__BackingField");
local damage_param_type = damage_param_field:get_type();
local get_condition_param_method = damage_param_type:get_method("get_ConditionParam");
local stun_param_field = damage_param_type:get_field("_StunParam");
local poison_param_field = damage_param_type:get_field("_PoisonParam");
local blast_param_field = damage_param_type:get_field("_BlastParam");
local poison_param_type = poison_param_field:get_type();
local blast_param_type = blast_param_field:get_type();
local get_is_enable_method = enemy_condition_damage_param_base_type_def:get_method("get_IsEnable"); local get_is_enable_method = enemy_condition_damage_param_base_type_def:get_method("get_IsEnable");
local get_is_active_method = enemy_condition_damage_param_base_type_def:get_method("get_IsActive"); local get_is_active_method = enemy_condition_damage_param_base_type_def:get_method("get_IsActive");
local get_activate_count_method = enemy_condition_damage_param_base_type_def:get_method("get_ActivateCount"); local get_activate_count_method = enemy_condition_damage_param_base_type_def:get_method("get_ActivateCount");
@@ -267,19 +267,29 @@ local get_limit_method = enemy_condition_damage_param_base_type_def:get_method("
local get_active_time_method = enemy_condition_damage_param_base_type_def:get_method("get_ActiveTime"); local get_active_time_method = enemy_condition_damage_param_base_type_def:get_method("get_ActiveTime");
local get_active_timer_method = enemy_condition_damage_param_base_type_def:get_method("get_ActiveTimer"); local get_active_timer_method = enemy_condition_damage_param_base_type_def:get_method("get_ActiveTimer");
local poison_damage_field = poison_param_type:get_field("<Damage>k__BackingField"); local poison_param_type_def = poison_param_field:get_type();
local poison_get_is_damage_method = poison_param_type:get_method("get_IsDamage"); local poison_damage_field = poison_param_type_def:get_field("<Damage>k__BackingField");
local poison_get_is_damage_method = poison_param_type_def:get_method("get_IsDamage");
local system_array_type_def = sdk.find_type_definition("System.Array"); local system_array_type_def = sdk.find_type_definition("System.Array");
local length_method = system_array_type_def:get_method("get_Length"); local get_length_method = system_array_type_def:get_method("get_Length");
local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)"); local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)");
local int32_type_def = sdk.find_type_definition("System.Int32");
local int32_mvalue_field = int32_type_def:get_field("mValue");
local single_type_def = sdk.find_type_definition("System.Single");
local single_mvalue_field = single_type_def:get_field("mValue");
function this.update_ailments(enemy, monster) function this.update_ailments(enemy, monster)
if enemy == nil then if enemy == nil then
error_handler.report("ailments.update_ailments", "Missing Parameter: enemy");
return; return;
end end
local damage_param = damage_param_field:get_data(enemy);
local damage_param = get_damage_param_method:call(enemy);
if damage_param == nil then if damage_param == nil then
error_handler.report("ailments.update_ailments", "Failed to access Data: damage_param");
return; return;
end end
@@ -296,24 +306,26 @@ function this.update_ailments(enemy, monster)
end end
local condition_param_array = get_condition_param_method:call(damage_param); local condition_param_array = get_condition_param_method:call(damage_param);
if condition_param_array == nil then if condition_param_array == nil then
error_handler.report("ailments.update_ailments", "Failed to access Data: condition_param_array");
return; return;
end end
local condition_param_array_length = length_method:call(condition_param_array); local condition_param_array_length = get_length_method:call(condition_param_array);
if condition_param_array_length == nil then if condition_param_array_length == nil then
error_handler.report("ailments.update_ailments", "Failed to access Data: condition_param_array_length");
return; return;
end end
for id = 0, condition_param_array_length - 1 do for id = 0, condition_param_array_length - 1 do
if id == this.stun_id or id == this.poison_id or id == this.blast_id then if id == this.stun_id or id == this.poison_id or id == this.blast_id then
goto continue goto continue;
end end
local ailment_param = get_value_method:call(condition_param_array, id); local ailment_param = get_value_method:call(condition_param_array, id);
if ailment_param == nil then if ailment_param == nil then
goto continue error_handler.report("ailments.update_ailments", "Failed to access Data: ailment_param No. " .. tostring(id));
goto continue;
end end
this.update_ailment(monster, ailment_param, id); this.update_ailment(monster, ailment_param, id);
@@ -325,16 +337,22 @@ function this.update_stun_poison_blast_ailments(monster, damage_param)
local stun_param = stun_param_field:get_data(damage_param); local stun_param = stun_param_field:get_data(damage_param);
if stun_param ~= nil then if stun_param ~= nil then
this.update_ailment(monster, stun_param, this.stun_id); this.update_ailment(monster, stun_param, this.stun_id);
else
error_handler.report("ailments.update_stun_poison_blast_ailments", "Failed to access Data: stun_param");
end end
local poison_param = poison_param_field:get_data(damage_param); local poison_param = poison_param_field:get_data(damage_param);
if poison_param ~= nil then if poison_param ~= nil then
this.update_ailment(monster, poison_param, this.poison_id); this.update_ailment(monster, poison_param, this.poison_id);
else
error_handler.report("ailments.update_stun_poison_blast_ailments", "Failed to access Data: poison_param");
end end
local blast_param = blast_param_field:get_data(damage_param); local blast_param = blast_param_field:get_data(damage_param);
if blast_param ~= nil then if blast_param ~= nil then
this.update_ailment(monster, blast_param, this.blast_id); this.update_ailment(monster, blast_param, this.blast_id);
else
error_handler.report("ailments.update_stun_poison_blast_ailments", "Failed to access Data: blast_param");
end end
end end
@@ -347,65 +365,71 @@ function this.update_ailment(monster, ailment_param, id)
local duration = get_active_time_method:call(ailment_param); local duration = get_active_time_method:call(ailment_param);
local is_active = get_is_active_method:call(ailment_param); local is_active = get_is_active_method:call(ailment_param);
local activate_count = -999; local activate_count = nil;
local buildup = -999; local buildup = nil;
local buildup_limit = 9999; local buildup_limit = nil;
if activate_count_array ~= nil then if activate_count_array ~= nil then
local activate_count_array_length = length_method:call(activate_count_array); local activate_count_array_length = get_length_method:call(activate_count_array);
if activate_count_array_length ~= nil then if activate_count_array_length ~= nil then
if activate_count_array_length > 0 then if activate_count_array_length > 0 then
local activate_count_valuetype = get_value_method:call(activate_count_array, 0); local activate_count_valtype = get_value_method:call(activate_count_array, 0);
if activate_count_valuetype ~= nil then if activate_count_valtype ~= nil then
local _activate_count = activate_count_valuetype:get_field("mValue"); activate_count = int32_mvalue_field:get_data(activate_count_valtype);
else
if _activate_count ~= nil then error_handler.report("ailments.update_ailment", "Failed to access Data: activate_count_valtype");
activate_count = _activate_count;
end
end end
end end
else
error_handler.report("ailments.update_ailment", "Failed to access Data: activate_count_array_length");
end end
else
error_handler.report("ailments.update_ailment", "Failed to access Data: activate_count_array");
end end
if buildup_array ~= nil then if buildup_array ~= nil then
local buildup_array_length = length_method:call(buildup_array); local buildup_array_length = get_length_method:call(buildup_array);
if buildup_array_length ~= nil then if buildup_array_length ~= nil then
if buildup_array_length > 0 then if buildup_array_length > 0 then
local buildup_valuetype = get_value_method:call(buildup_array, 0); local buildup_valtype = get_value_method:call(buildup_array, 0);
if buildup_valuetype ~= nil then if buildup_valtype ~= nil then
local _buildup = buildup_valuetype:get_field("mValue"); buildup = single_mvalue_field:get_data(buildup_valtype);
else
if _buildup ~= nil then error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_valtype");
buildup = _buildup;
end
end end
end end
else
error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_array_length");
end end
else
error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_array");
end end
if buildup_limit_array ~= nil then if buildup_limit_array ~= nil then
local buildup_limit_array_length = length_method:call(buildup_limit_array); local buildup_limit_array_length = get_length_method:call(buildup_limit_array);
if buildup_limit_array_length ~= nil then if buildup_limit_array_length ~= nil then
if buildup_limit_array_length > 0 then if buildup_limit_array_length > 0 then
local buildup_limit_valuetype = get_value_method:call(buildup_limit_array, 0); local buildup_limit_valtype = get_value_method:call(buildup_limit_array, 0);
if buildup_limit_valuetype ~= nil then if buildup_limit_valtype ~= nil then
local _buildup_limit = buildup_limit_valuetype:get_field("mValue"); buildup_limit = single_mvalue_field:get_data(buildup_limit_valtype);
else
if _buildup_limit ~= nil then error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_limit_valtype");
buildup_limit = _buildup_limit;
end
end end
end end
else
error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_limit_array_length");
end end
else
error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_limit_array");
end end
if is_enable == nil then if is_enable == nil then
@@ -428,6 +452,8 @@ function this.update_ailment(monster, ailment_param, id)
end end
monster.ailments[id].activate_count = activate_count; monster.ailments[id].activate_count = activate_count;
else
error_handler.report("ailments.update_ailment", "Failed to access Data: activate_count");
end end
if buildup ~= nil then if buildup ~= nil then
@@ -436,6 +462,8 @@ function this.update_ailment(monster, ailment_param, id)
end end
monster.ailments[id].total_buildup = buildup; monster.ailments[id].total_buildup = buildup;
else
error_handler.report("ailments.update_ailment", "Failed to access Data: buildup");
end end
if buildup_limit ~= nil then if buildup_limit ~= nil then
@@ -444,6 +472,8 @@ function this.update_ailment(monster, ailment_param, id)
end end
monster.ailments[id].buildup_limit = buildup_limit; monster.ailments[id].buildup_limit = buildup_limit;
else
error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_limit");
end end
if buildup ~= nil and buildup_limit ~= nil and buildup_limit ~= 0 then if buildup ~= nil and buildup_limit ~= nil and buildup_limit ~= 0 then
@@ -502,18 +532,33 @@ end
-- Code by coavins -- Code by coavins
function this.update_poison(monster, poison_param) function this.update_poison(monster, poison_param)
if monster == nil then if monster == nil then
error_handler.report("ailments.update_poison", "Missing Parameter: monster");
return; return;
end end
if poison_param ~= nil then if poison_param == nil then
--if poison tick, apply damage error_handler.report("ailments.update_poison", "Missing Parameter: poison_param");
local is_damage = poison_get_is_damage_method:call(poison_param); return;
if is_damage then
local poison_damage = poison_damage_field:get_data(poison_param);
this.apply_ailment_damage(monster, this.poison_id, poison_damage);
end
end end
--if poison tick, apply damage
local is_damage = poison_get_is_damage_method:call(poison_param);
if is_damage == nil then
error_handler.report("ailments.update_poison", "Failed to access Data: is_damage");
return;
end
if not is_damage then
return;
end
local poison_damage = poison_damage_field:get_data(poison_param);
if poison_damage == nil then
error_handler.report("ailments.update_poison", "Failed to access Data: poison_damage");
return;
end
this.apply_ailment_damage(monster, this.poison_id, poison_damage);
end end
function this.draw(monster, ailment_UI, cached_config, ailments_position_on_screen, opacity_scale) function this.draw(monster, ailment_UI, cached_config, ailments_position_on_screen, opacity_scale)
@@ -525,115 +570,118 @@ function this.draw(monster, ailment_UI, cached_config, ailments_position_on_scre
for id, ailment in pairs(monster.ailments) do for id, ailment in pairs(monster.ailments) do
if id == this.paralyze_id then if id == this.paralyze_id then
if not cached_config.filter.paralysis then if not cached_config.filter.paralysis then
goto continue goto continue;
end end
elseif id == this.sleep_id then elseif id == this.sleep_id then
if not cached_config.filter.sleep then if not cached_config.filter.sleep then
goto continue goto continue;
end end
elseif id == this.stun_id then elseif id == this.stun_id then
if not cached_config.filter.stun then if not cached_config.filter.stun then
goto continue goto continue;
end end
elseif id == this.flash_id then elseif id == this.flash_id then
if not cached_config.filter.flash then if not cached_config.filter.flash then
goto continue goto continue;
end end
elseif id == this.poison_id then elseif id == this.poison_id then
if not cached_config.filter.poison then if not cached_config.filter.poison then
goto continue goto continue;
end end
elseif id == this.blast_id then elseif id == this.blast_id then
if not cached_config.filter.blast then if not cached_config.filter.blast then
goto continue goto continue;
end end
elseif id == this.exhaust_id then elseif id == this.exhaust_id then
if not cached_config.filter.exhaust then if not cached_config.filter.exhaust then
goto continue goto continue;
end end
elseif id == this.ride_id then elseif id == this.ride_id then
if not cached_config.filter.ride then if not cached_config.filter.ride then
goto continue goto continue;
end end
elseif id == this.water_id then elseif id == this.water_id then
if not cached_config.filter.waterblight then if not cached_config.filter.waterblight then
goto continue goto continue;
end end
elseif id == this.fire_id then elseif id == this.fire_id then
if not cached_config.filter.fireblight then if not cached_config.filter.fireblight then
goto continue goto continue;
end end
elseif id == this.ice_id then elseif id == this.ice_id then
if not cached_config.filter.iceblight then if not cached_config.filter.iceblight then
goto continue goto continue;
end end
elseif id == this.thunder_id then elseif id == this.thunder_id then
if not cached_config.filter.thunderblight then if not cached_config.filter.thunderblight then
goto continue goto continue;
end end
elseif id == this.fall_trap_id then elseif id == this.fall_trap_id then
if not cached_config.filter.fall_trap then if not cached_config.filter.fall_trap then
goto continue goto continue;
end end
elseif id == this.shock_trap_id then elseif id == this.shock_trap_id then
if not cached_config.filter.shock_trap then if not cached_config.filter.shock_trap then
goto continue goto continue;
end end
elseif id == this.capture_id then elseif id == this.capture_id then
if not cached_config.filter.tranq_bomb then if not cached_config.filter.tranq_bomb then
goto continue goto continue;
end end
elseif id == this.koyashi_id then elseif id == this.koyashi_id then
if not cached_config.filter.dung_bomb then if not cached_config.filter.dung_bomb then
goto continue goto continue;
end end
elseif id == this.steel_fang_id then elseif id == this.steel_fang_id then
if not cached_config.filter.steel_fang then if not cached_config.filter.steel_fang then
goto continue goto continue;
end end
elseif id == this.fall_quick_sand_id then elseif id == this.fall_quick_sand_id then
if not cached_config.filter.quick_sand then if not cached_config.filter.quick_sand then
goto continue goto continue;
end end
elseif id == this.fall_otomo_trap_id then elseif id == this.fall_otomo_trap_id then
if not cached_config.filter.fall_otomo_trap then if not cached_config.filter.fall_otomo_trap then
goto continue goto continue;
end end
elseif id == this.shock_otomo_trap_id then elseif id == this.shock_otomo_trap_id then
if not cached_config.filter.shock_otomo_trap then if not cached_config.filter.shock_otomo_trap then
goto continue goto continue;
end end
else else
goto continue goto continue;
end end
if cached_config.settings.hide_ailments_with_zero_buildup and ailment.total_buildup == 0 and if cached_config.settings.hide_ailments_with_zero_buildup
ailment.buildup_limit ~= 0 and ailment.total_buildup == 0
and ailment.activate_count == 0 and not ailment.is_active then and ailment.buildup_limit ~= 0
goto continue and ailment.activate_count == 0
and not ailment.is_active then
goto continue;
end end
if cached_config.settings.hide_inactive_ailments_with_no_buildup_support and ailment.buildup_limit == 0 and if cached_config.settings.hide_inactive_ailments_with_no_buildup_support
not ailment.is_active then and ailment.buildup_limit == 0
goto continue and not ailment.is_active then
goto continue;
end end
if cached_config.settings.hide_all_inactive_ailments and not ailment.is_active then if cached_config.settings.hide_all_inactive_ailments and not ailment.is_active then
goto continue goto continue;
end end
if cached_config.settings.hide_all_active_ailments and ailment.is_active then if cached_config.settings.hide_all_active_ailments and ailment.is_active then
goto continue goto continue;
end end
if cached_config.settings.hide_disabled_ailments and not ailment.is_enable then if cached_config.settings.hide_disabled_ailments and not ailment.is_enable then
goto continue goto continue;
end end
if cached_config.settings.time_limit ~= 0 and if cached_config.settings.time_limit ~= 0
time.total_elapsed_script_seconds - ailment.last_change_time > cached_config.settings.time_limit and and time.total_elapsed_script_seconds - ailment.last_change_time > cached_config.settings.time_limit
not ailment.is_active then and not ailment.is_active then
goto continue goto continue;
end end
table.insert(displayed_ailments, ailment); table.insert(displayed_ailments, ailment);
@@ -681,14 +729,21 @@ function this.draw(monster, ailment_UI, cached_config, ailments_position_on_scre
ailment_UI_entity.draw(ailment, ailment_UI, cached_config, ailment_position_on_screen, opacity_scale); ailment_UI_entity.draw(ailment, ailment_UI, cached_config, ailment_position_on_screen, opacity_scale);
end end
end end
function this.apply_ailment_buildup(monster, player, otomo, ailment_type, ailment_buildup) function this.apply_ailment_buildup(monster, player, otomo, ailment_type, ailment_buildup)
if monster == nil or if monster == nil then
(ailment_type ~= this.poison_id and ailment_type ~= this.blast_id and ailment_type ~= this.stun_id) error_handler.report("ailments.apply_ailment_buildup", "Missing Parameter: monster");
or (ailment_buildup == 0 or ailment_buildup == nil) then return;
end
if ailment_buildup == nil then
error_handler.report("ailments.apply_ailment_buildup", "Missing Parameter: ailment_buildup");
return;
end
if (ailment_type ~= this.poison_id and ailment_type ~= this.blast_id and ailment_type ~= this.stun_id)
or ailment_buildup == 0 then
return; return;
end end
@@ -708,7 +763,6 @@ function this.apply_ailment_buildup(monster, player, otomo, ailment_type, ailmen
monster.ailments[ailment_type].otomo_buildup[otomo] = (monster.ailments[ailment_type].otomo_buildup[otomo] or 0) + ailment_buildup; monster.ailments[ailment_type].otomo_buildup[otomo] = (monster.ailments[ailment_type].otomo_buildup[otomo] or 0) + ailment_buildup;
end end
this.calculate_ailment_contribution(monster, ailment_type); this.calculate_ailment_contribution(monster, ailment_type);
end end
@@ -750,24 +804,34 @@ end
-- Code by coavins -- Code by coavins
function this.apply_ailment_damage(monster, ailment_type, ailment_damage) function this.apply_ailment_damage(monster, ailment_type, ailment_damage)
-- we only track poison and blast for now -- we only track poison and blast for now
if ailment_type == nil or ailment_damage == nil then if monster == nil then
error_handler.report("ailments.apply_ailment_damage", "Missing Parameter: monster");
end
if ailment_type == nil then
error_handler.report("ailments.apply_ailment_damage", "Missing Parameter: ailment_type");
return; return;
end end
local damage_source_type = ""; if ailment_damage == nil then
local otomo_damage_source_type = ""; error_handler.report("ailments.apply_ailment_damage", "Missing Parameter: ailment_damage");
return;
end
local damage_source_type = players.damage_types.other;
local otomo_damage_source_type = players.damage_types.other;
local buildup_share = monster.ailments[ailment_type].buildup_share; local buildup_share = monster.ailments[ailment_type].buildup_share;
local otomo_buildup_share = monster.ailments[ailment_type].otomo_buildup_share; local otomo_buildup_share = monster.ailments[ailment_type].otomo_buildup_share;
if ailment_type == this.poison_id then if ailment_type == this.poison_id then
damage_source_type = "poison"; damage_source_type = players.damage_types.poison;
otomo_damage_source_type = "otomo poison"; otomo_damage_source_type = players.damage_types.otomo_poison;
buildup_share = monster.ailments[ailment_type].cached_buildup_share; buildup_share = monster.ailments[ailment_type].cached_buildup_share;
otomo_buildup_share = monster.ailments[ailment_type].cached_otomo_buildup_share; otomo_buildup_share = monster.ailments[ailment_type].cached_otomo_buildup_share;
elseif ailment_type == this.blast_id then elseif ailment_type == this.blast_id then
damage_source_type = "blast"; damage_source_type = players.damage_types.blast;
otomo_damage_source_type = "otomo blast"; otomo_damage_source_type = players.damage_types.otomo_blast;
else else
return; return;
end end
@@ -797,10 +861,7 @@ function this.apply_ailment_damage(monster, ailment_type, ailment_damage)
local player = players.get_player(otomo.id); local player = players.get_player(otomo.id);
if player ~= nil then players.update_damage(player, otomo_damage_source_type, monster.is_large, damage_object);
players.update_damage(player, otomo_damage_source_type, monster.is_large, damage_object);
end
players.update_damage(otomo, otomo_damage_source_type, monster.is_large, damage_object); players.update_damage(otomo, otomo_damage_source_type, monster.is_large, damage_object);
end end
@@ -813,7 +874,7 @@ function this.apply_ailment_damage(monster, ailment_type, ailment_damage)
players.update_damage(players.total, damage_source_type, monster.is_large, damage_object); players.update_damage(players.total, damage_source_type, monster.is_large, damage_object);
end end
function this.init_module() function this.init_dependencies()
players = require("MHR_Overlay.Damage_Meter.players"); players = require("MHR_Overlay.Damage_Meter.players");
non_players = require("MHR_Overlay.Damage_Meter.non_players"); non_players = require("MHR_Overlay.Damage_Meter.non_players");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
@@ -823,6 +884,11 @@ function this.init_module()
time = require("MHR_Overlay.Game_Handler.time"); time = require("MHR_Overlay.Game_Handler.time");
small_monster = require("MHR_Overlay.Monsters.small_monster"); small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster"); large_monster = require("MHR_Overlay.Monsters.large_monster");
error_handler = require("MHR_Overlay.Misc.error_handler");
utils = require("MHR_Overlay.Misc.utils");
end
function this.init_module()
end end
return this; return this;

View File

@@ -11,6 +11,8 @@ local screen;
local drawing; local drawing;
local part_names; local part_names;
local time; local time;
local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -50,31 +52,43 @@ function this.new(id, name)
local part = {}; local part = {};
part.id = id; part.id = id;
part.name = name;
part.health = 9999; part.health = -9;
part.max_health = 99999; part.max_health = -10;
part.health_percentage = 0; part.health_percentage = 0;
part.break_health = 9999; part.break_health = -9;
part.break_max_health = 99999; part.break_max_health = -10;
part.break_health_percentage = 0; part.break_health_percentage = 0;
part.lost_health = 9999; part.lost_health = -9;
part.loss_max_health = 99999; part.loss_max_health = -10;
part.loss_health_percentage = 0; part.loss_health_percentage = 0;
part.name = name;
part.flinch_count = 0; part.flinch_count = 0;
part.break_count = 0; part.break_count = 0;
part.break_max_count = 0; part.break_max_count = 0;
part.anomaly_ref = nil;
part.anomaly_health = -9;
part.anomaly_max_health = -10;
part.anomaly_health_percentage = 0;
part.anomaly_is_active = false;
part.last_change_time = time.total_elapsed_script_seconds; part.last_change_time = time.total_elapsed_script_seconds;
return part; return part;
end end
function this.init_part_names(monster_id, parts)
for part_id, part in pairs(parts) do
part.name = part_names.get_part_name(monster_id, part_id);
end
end
function this.update_flinch(part, part_current, part_max) function this.update_flinch(part, part_current, part_max)
if part_current > part.health then if part_current > part.health and part.max_health > 0 then
part.flinch_count = part.flinch_count + 1; part.flinch_count = part.flinch_count + 1;
end end
@@ -147,6 +161,125 @@ function this.update_loss(part, part_loss_current, part_loss_max, is_severed)
end end
function this.update_anomaly(part, part_anomaly_ref, part_anomaly_current, part_anomaly_max, part_is_active)
if part.anomaly_health ~= part_anomaly_current then
part.last_change_time = time.total_elapsed_script_seconds;
end
if part.anomaly_max_health ~= part_anomaly_max then
part.last_change_time = time.total_elapsed_script_seconds;
end
if part.anomaly_is_active ~= part_is_active then
part.last_change_time = time.total_elapsed_script_seconds;
end
part.anomaly_core_ref = part_anomaly_ref;
part.anomaly_health = part_anomaly_current;
part.anomaly_max_health = part_anomaly_max;
part.anomaly_is_active = part_is_active;
if part.anomaly_max_health ~= 0 then
part.anomaly_health_percentage = part.anomaly_health / part.anomaly_max_health;
end
end
function this.is_filtered_out(cached_config, health_supported, break_supported, sever_supported, anomaly_supported)
if health_supported then
if break_supported then
if sever_supported then
if anomaly_supported then
if not cached_config.filter.health_break_sever_anomaly then
return true;
end
else
if not cached_config.filter.health_break_sever then
return true;
end
end
else
if anomaly_supported then
if not cached_config.filter.health_break_anomaly then
return true;
end
else
if not cached_config.filter.health_break then
return true;
end
end
end
else
if sever_supported then
if anomaly_supported then
if not cached_config.filter.health_sever_anomaly then
return true;
end
else
if not cached_config.filter.health_sever then
return true;
end
end
else
if anomaly_supported then
if not cached_config.filter.health_anomaly then
return true;
end
else
if not cached_config.filter.health then
return true;
end
end
end
end
else
if break_supported then
if sever_supported then
if anomaly_supported then
if not cached_config.filter.break_sever_anomaly then
return true;
end
else
if not cached_config.filter.break_sever then
return true;
end
end
else
if anomaly_supported then
if not cached_config.filter.break_anomaly then
return true;
end
else
if not cached_config.filter.break_ then
return true;
end
end
end
else
if sever_supported then
if anomaly_supported then
if not cached_config.filter.sever_anomaly then
return true;
end
else
if not cached_config.filter.sever then
return true;
end
end
else
if anomaly_supported then
if not cached_config.filter.anomaly then
return true;
end
else
return true;
end
end
end
end
return false;
end
function this.draw(monster, part_UI, cached_config, parts_position_on_screen, opacity_scale) function this.draw(monster, part_UI, cached_config, parts_position_on_screen, opacity_scale)
local cached_config = cached_config.body_parts; local cached_config = cached_config.body_parts;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier; local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
@@ -155,78 +288,47 @@ function this.draw(monster, part_UI, cached_config, parts_position_on_screen, op
for REpart, part in pairs(monster.parts) do for REpart, part in pairs(monster.parts) do
local health_supported = part.max_health > 0; local health_supported = part.max_health > 0;
local break_supported = part.break_max_health > 0; local break_supported = part.break_max_health > 0;
local severe_supported = part.loss_max_health > 0; local sever_supported = part.loss_max_health > 0;
local anomaly_supported = part.anomaly_max_health > 0;
if cached_config.settings.filter_mode == "Current State" then if cached_config.settings.filter_mode == "Current State" then
if break_supported and part.break_count >= part.break_max_count then if break_supported and part.break_count >= part.break_max_count then
break_supported = false; break_supported = false;
end end
if severe_supported and part.is_severed then if sever_supported and part.is_severed then
severe_supported = false; sever_supported = false;
end
if anomaly_supported and not part.anomaly_is_active then
anomaly_supported = false;
end end
end end
if health_supported then local is_filtered_out = this.is_filtered_out(cached_config, health_supported, break_supported, sever_supported, anomaly_supported);
if break_supported then if is_filtered_out then
if severe_supported then goto continue;
if not cached_config.filter.health_break_severe then
goto continue
end
else
if not cached_config.filter.health_break then
goto continue
end
end
else
if severe_supported then
if not cached_config.filter.health_severe then
goto continue
end
else
if not cached_config.filter.health then
goto continue
end
end
end
else
if break_supported then
if severe_supported then
if not cached_config.filter.break_severe then
goto continue
end
else
if not cached_config.filter.break_ then
goto continue
end
end
else
if severe_supported then
if not cached_config.filter.severe then
goto continue
end
else
goto continue
end
end
end end
if cached_config.settings.hide_undamaged_parts if cached_config.settings.hide_undamaged_parts
and ((part.health == part.max_health and part.flinch_count == 0) or not health_supported) and ((part.health == part.max_health and part.flinch_count == 0) or not health_supported)
and ((part.break_health == part.break_max_health and part.break_count == 0) or not break_supported) and ((part.break_health == part.break_max_health and part.break_count == 0) or not break_supported)
and ((part.loss_health == part.loss_max_health and not part.is_severed) or not severe_supported) then and ((part.loss_health == part.loss_max_health and not part.is_severed) or not sever_supported)
goto continue and ((part.anomaly_health == part.anomaly_max_health) or not anomaly_supported) then
goto continue;
end end
if (not part_UI.flinch_visibility or not health_supported) if (not part_UI.flinch_visibility or not health_supported)
and (not part_UI.break_visibility or not break_supported or part.break_count >= part.break_max_count) and (not part_UI.break_visibility or not break_supported or part.break_count >= part.break_max_count)
and (not part_UI.loss_visibility or not severe_supported or part.is_severed) then and (not part_UI.loss_visibility or not sever_supported or part.is_severed)
goto continue and (not part_UI.anomaly_visibility or not anomaly_supported) then
goto continue;
end end
if cached_config.settings.time_limit ~= 0 and if cached_config.settings.time_limit ~= 0 and
time.total_elapsed_script_seconds - part.last_change_time > cached_config.settings.time_limit then time.total_elapsed_script_seconds - part.last_change_time > cached_config.settings.time_limit then
goto continue goto continue;
end end
table.insert(displayed_parts, part); table.insert(displayed_parts, part);
@@ -323,6 +425,26 @@ function this.draw(monster, part_UI, cached_config, parts_position_on_screen, op
return left.loss_health_percentage < right.loss_health_percentage; return left.loss_health_percentage < right.loss_health_percentage;
end); end);
end end
elseif cached_config.sorting.type == "Anomaly Core Health" then
if cached_config.sorting.reversed_order then
table.sort(displayed_parts, function(left, right)
return left.anomaly_health > right.anomaly_health;
end);
else
table.sort(displayed_parts, function(left, right)
return left.anomaly_health < right.anomaly_health;
end);
end
elseif cached_config.sorting.type == "Anomaly Core Health Percentage" then
if cached_config.sorting.reversed_order then
table.sort(displayed_parts, function(left, right)
return left.anomaly_health_percentage > right.anomaly_health_percentage;
end);
else
table.sort(displayed_parts, function(left, right)
return left.anomaly_health_percentage < right.anomaly_health_percentage;
end);
end
end end
local last_part_position_on_screen; local last_part_position_on_screen;
@@ -340,7 +462,7 @@ function this.draw(monster, part_UI, cached_config, parts_position_on_screen, op
return last_part_position_on_screen; return last_part_position_on_screen;
end end
function this.init_module() function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -352,6 +474,11 @@ function this.init_module()
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
part_names = require("MHR_Overlay.Misc.part_names"); part_names = require("MHR_Overlay.Misc.part_names");
time = require("MHR_Overlay.Game_Handler.time"); time = require("MHR_Overlay.Game_Handler.time");
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

File diff suppressed because it is too large Load Diff

View File

@@ -6,6 +6,7 @@ local config;
local ailments; local ailments;
local players; local players;
local quest_status; local quest_status;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -118,8 +119,8 @@ function this.update_large_monster(enemy)
local cached_config = config.current_config.large_monster_UI; local cached_config = config.current_config.large_monster_UI;
if not cached_config.dynamic.enabled and if not cached_config.dynamic.enabled and
not cached_config.static.enabled and not cached_config.static.enabled and
not cached_config.highlighted.enabled then not cached_config.highlighted.enabled then
return; return;
end end
@@ -153,9 +154,11 @@ function this.update_large_monster(enemy)
large_monster.update_stamina_timer(enemy, monster, nil); large_monster.update_stamina_timer(enemy, monster, nil);
large_monster.update_rage_timer(enemy, monster, nil); large_monster.update_rage_timer(enemy, monster, nil);
if quest_status.is_online and players.myself.id ~= 0 then if (quest_status.is_online and players.myself.id ~= 0)
or monster.is_health_update_requested then
local physical_param = large_monster.update_health(enemy, monster); local physical_param = large_monster.update_health(enemy, monster);
pcall(large_monster.update_parts, enemy, monster, physical_param); pcall(large_monster.update_parts, enemy, monster, physical_param);
pcall(large_monster.update_anomaly_parts, enemy, monster, nil);
end end
large_monster.update(enemy, monster); large_monster.update(enemy, monster);
@@ -193,7 +196,8 @@ function this.update_small_monster(enemy)
small_monster.update(enemy, monster); small_monster.update(enemy, monster);
if quest_status.is_online and players.myself.id ~= 0 then if (quest_status.is_online and players.myself.id ~= 0)
or not monster.is_health_initialized then
small_monster.update_health(enemy, monster); small_monster.update_health(enemy, monster);
end end
end end
@@ -201,11 +205,13 @@ end
function this.update_health(enemy_damage_check) function this.update_health(enemy_damage_check)
local enemy = get_ref_enemy:call(enemy_damage_check); local enemy = get_ref_enemy:call(enemy_damage_check);
if enemy == nil then if enemy == nil then
error_handler.report("monster_hook.update_health", "Failed to access Data: enemy");
return; return;
end end
local is_large = is_boss_enemy_method:call(enemy); local is_large = is_boss_enemy_method:call(enemy);
if is_large == nil then if is_large == nil then
error_handler.report("monster_hook.update_health", "Failed to access Data: is_large");
return; return;
end end
@@ -214,6 +220,7 @@ function this.update_health(enemy_damage_check)
local physical_param = large_monster.update_health(enemy, monster); local physical_param = large_monster.update_health(enemy, monster);
pcall(large_monster.update_parts, enemy, monster, physical_param); pcall(large_monster.update_parts, enemy, monster, physical_param);
pcall(large_monster.update_anomaly_parts, enemy, monster, nil);
else else
local monster = small_monster.get_monster(enemy); local monster = small_monster.get_monster(enemy);
small_monster.update_health(enemy, monster); small_monster.update_health(enemy, monster);
@@ -227,6 +234,7 @@ function this.update_stamina(stamina_param, stamina_sub)
local enemy = get_enemy_method:call(stamina_param); local enemy = get_enemy_method:call(stamina_param);
if enemy == nil then if enemy == nil then
error_handler.report("monster_hook.update_stamina", "Failed to access Data: enemy");
return; return;
end end
@@ -253,14 +261,17 @@ function this.update_rage_timer(anger_param, enemy)
large_monster.update_rage_timer(enemy, monster, anger_param); large_monster.update_rage_timer(enemy, monster, anger_param);
end end
function this.init_module() function this.init_dependencies()
small_monster = require("MHR_Overlay.Monsters.small_monster"); small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster"); large_monster = require("MHR_Overlay.Monsters.large_monster");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
ailments = require("MHR_Overlay.Monsters.ailments"); ailments = require("MHR_Overlay.Monsters.ailments");
players = require("MHR_Overlay.Damage_Meter.players"); players = require("MHR_Overlay.Damage_Meter.players");
quest_status = require("MHR_Overlay.Game_Handler.quest_status"); quest_status = require("MHR_Overlay.Game_Handler.quest_status");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
sdk.hook(enemy_character_base_update_method, function(args) sdk.hook(enemy_character_base_update_method, function(args)
pcall(this.update_monster, sdk.to_managed_object(args[2])); pcall(this.update_monster, sdk.to_managed_object(args[2]));
end, function(retval) end, function(retval)

View File

@@ -12,6 +12,7 @@ local ailments;
local ailment_UI_entity; local ailment_UI_entity;
local ailment_buildup; local ailment_buildup;
local ailment_buildup_UI_entity; local ailment_buildup_UI_entity;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -52,7 +53,7 @@ function this.new(enemy)
monster.is_large = false; monster.is_large = false;
monster.health = 0; monster.health = 0;
monster.max_health = 999999; monster.max_health = 0;
monster.health_percentage = 0; monster.health_percentage = 0;
monster.missing_health = 0; monster.missing_health = 0;
monster.capture_health = 0; monster.capture_health = 0;
@@ -70,7 +71,6 @@ function this.new(enemy)
this.init_UI(monster); this.init_UI(monster);
this.update_position(enemy, monster); this.update_position(enemy, monster);
this.update_health(enemy, monster);
this.update(enemy, monster); this.update(enemy, monster);
if this.list[enemy] == nil then if this.list[enemy] == nil then
@@ -98,16 +98,18 @@ local get_enemy_name_message_method = message_manager_type_def:get_method("getEn
function this.init(monster, enemy) function this.init(monster, enemy)
local enemy_type = enemy_type_field:get_data(enemy); local enemy_type = enemy_type_field:get_data(enemy);
if enemy_type == nil then if enemy_type == nil then
customization_menu.status = "No enemy type"; error_handler.report("small_monster.init", "Failed to access Data: enemy_type");
return; return;
end end
monster.id = enemy_type; monster.id = enemy_type;
local enemy_name = get_enemy_name_message_method:call(singletons.message_manager, enemy_type); local enemy_name = get_enemy_name_message_method:call(singletons.message_manager, enemy_type);
if enemy_name ~= nil then if enemy_name == nil then
monster.name = enemy_name; error_handler.report("small_monster.init", "Failed to access Data: enemy_name");
end end
monster.name = enemy_name;
end end
function this.init_UI(monster) function this.init_UI(monster)
@@ -151,17 +153,17 @@ function this.init_UI(monster)
); );
end end
local physical_param_field = enemy_character_base_type_def:get_field("<PhysicalParam>k__BackingField"); local get_physical_param_method = enemy_character_base_type_def:get_method("get_PhysicalParam");
local check_die_method = enemy_character_base_type_def:get_method("checkDie"); local check_die_method = enemy_character_base_type_def:get_method("checkDie");
local physical_param_type = physical_param_field:get_type(); local physical_param_type = get_physical_param_method:get_return_type();
local get_vital_method = physical_param_type:get_method("getVital"); local get_vital_method = physical_param_type:get_method("getVital");
local vital_param_type = get_vital_method:get_return_type(); local vital_param_type = get_vital_method:get_return_type();
local get_current_method = vital_param_type:get_method("get_Current"); local get_current_method = vital_param_type:get_method("get_Current");
local get_max_method = vital_param_type:get_method("get_Max"); local get_max_method = vital_param_type:get_method("get_Max");
local get_pos_field = enemy_character_base_type_def:get_method("get_Pos"); local get_pos_method = enemy_character_base_type_def:get_method("get_Pos");
function this.update_position(enemy, monster) function this.update_position(enemy, monster)
local cached_config = config.current_config.small_monster_UI; local cached_config = config.current_config.small_monster_UI;
@@ -174,10 +176,13 @@ function this.update_position(enemy, monster)
return; return;
end end
local position = get_pos_field:call(enemy);
if position ~= nil then local position = get_pos_method:call(enemy);
monster.position = position; if position == nil then
error_handler.report("small_monster.update_position", "Failed to access Data: position");
end end
monster.position = position;
end end
function this.update(enemy, monster) function this.update(enemy, monster)
@@ -188,6 +193,8 @@ function this.update(enemy, monster)
local dead_or_captured = check_die_method:call(enemy); local dead_or_captured = check_die_method:call(enemy);
if dead_or_captured ~= nil then if dead_or_captured ~= nil then
monster.dead_or_captured = dead_or_captured; monster.dead_or_captured = dead_or_captured;
else
error_handler.report("small_monster.update", "Failed to access Data: dead_or_captured");
end end
pcall(ailments.update_ailments, enemy, monster); pcall(ailments.update_ailments, enemy, monster);
@@ -198,26 +205,40 @@ function this.update_health(enemy, monster)
return; return;
end end
local physical_param = physical_param_field:get_data(enemy) local physical_param = get_physical_param_method:call(enemy);
if physical_param == nil then if physical_param == nil then
customization_menu.status = "No physical param"; error_handler.report("small_monster.update_health", "Failed to access Data: physical_param");
return; return;
end end
local vital_param = get_vital_method:call(physical_param, 0, 0); local vital_param = get_vital_method:call(physical_param, 0, 0);
if vital_param == nil then if vital_param == nil then
customization_menu.status = "No vital param"; error_handler.report("small_monster.update_health", "Failed to access Data: vital_param");
return; return;
end end
monster.health = get_current_method:call(vital_param) or monster.health; local health = get_current_method:call(vital_param);
monster.max_health = get_max_method:call(vital_param) or monster.max_health; if health ~= nil then
monster.health = health;
monster.missing_health = monster.max_health - monster.health; else
if monster.max_health ~= 0 then error_handler.report("small_monster.update_health", "Failed to access Data: health");
monster.health_percentage = monster.health / monster.max_health; return;
monster.capture_percentage = monster.capture_health / monster.max_health;
end end
local max_health = get_max_method:call(vital_param);
if max_health ~= nil then
monster.max_health = max_health;
else
error_handler.report("small_monster.update_health", "Failed to access Data: max_health");
return;
end
monster.missing_health = max_health - health;
if max_health ~= 0 then
monster.health_percentage = health / max_health;
end
monster.is_health_initialized = true;
end end
function this.draw(monster, cached_config, position_on_screen, opacity_scale) function this.draw(monster, cached_config, position_on_screen, opacity_scale)
@@ -249,7 +270,7 @@ function this.init_list()
this.list = {}; this.list = {};
end end
function this.init_module() function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -262,6 +283,10 @@ function this.init_module()
ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity"); ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity");
ailment_buildup = require("MHR_Overlay.Monsters.ailment_buildup"); ailment_buildup = require("MHR_Overlay.Monsters.ailment_buildup");
ailment_buildup_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_buildup_UI_entity"); ailment_buildup_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_buildup_UI_entity");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -14,6 +14,7 @@ local keyboard;
local customization_menu; local customization_menu;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -47,6 +48,61 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
this.ailment_buildups_sorting_types = {};
this.displayed_ailment_buildups_sorting_types = {};
this.highlighted_buildup_bar_types = {};
this.displayed_highlighted_buildup_bar_types = {};
this.buildup_bar_relative_types = {};
this.displayed_buildup_bar_relative_types = {};
function this.init()
local default = language.default_language.customization_menu;
local current = language.current_language.customization_menu;
this.ailment_buildups_sorting_types =
{
default.normal,
default.buildup,
default.buildup_percentage
};
this.displayed_ailment_buildups_sorting_types =
{
current.normal,
current.buildup,
current.buildup_percentage
};
this.highlighted_buildup_bar_types =
{
default.me,
default.top_buildup,
default.none
};
this.displayed_highlighted_buildup_bar_types =
{
current.me,
current.top_buildup,
current.none
};
this.buildup_bar_relative_types =
{
default.total_buildup,
default.top_buildup
};
this.displayed_buildup_bar_relative_types =
{
current.total_buildup,
current.top_buildup
};
end
function this.draw(cached_config) function this.draw(cached_config)
local changed = false; local changed = false;
local config_changed = false; local config_changed = false;
@@ -103,24 +159,24 @@ function this.draw(cached_config)
if imgui.tree_node(language.current_language.customization_menu.settings) then if imgui.tree_node(language.current_language.customization_menu.settings) then
changed, index = imgui.combo( changed, index = imgui.combo(
language.current_language.customization_menu.highlighted_bar, language.current_language.customization_menu.highlighted_bar,
utils.table.find_index(customization_menu.highlighted_buildup_bar_types, cached_config.settings.highlighted_bar), utils.table.find_index(this.highlighted_buildup_bar_types, cached_config.settings.highlighted_bar),
customization_menu.displayed_highlighted_buildup_bar_types); this.displayed_highlighted_buildup_bar_types);
config_changed = config_changed or changed; config_changed = config_changed or changed;
if changed then if changed then
cached_config.settings.highlighted_bar = customization_menu.highlighted_buildup_bar_types[index]; cached_config.settings.highlighted_bar = this.highlighted_buildup_bar_types[index];
end end
changed, index = imgui.combo( changed, index = imgui.combo(
language.current_language.customization_menu.buildup_bars_are_relative_to, language.current_language.customization_menu.buildup_bars_are_relative_to,
utils.table.find_index(customization_menu.displayed_buildup_bar_relative_types, cached_config.settings.buildup_bar_relative_to), utils.table.find_index(this.displayed_buildup_bar_relative_types, cached_config.settings.buildup_bar_relative_to),
customization_menu.displayed_buildup_bar_relative_types); this.displayed_buildup_bar_relative_types);
config_changed = config_changed or changed; config_changed = config_changed or changed;
if changed then if changed then
cached_config.settings.buildup_bar_relative_to = customization_menu.displayed_buildup_bar_relative_types[index]; cached_config.settings.buildup_bar_relative_to = this.displayed_buildup_bar_relative_types[index];
end end
changed, cached_config.settings.time_limit = imgui.drag_float( changed, cached_config.settings.time_limit = imgui.drag_float(
@@ -134,13 +190,13 @@ function this.draw(cached_config)
if imgui.tree_node(language.current_language.customization_menu.sorting) then if imgui.tree_node(language.current_language.customization_menu.sorting) then
changed, index = imgui.combo( changed, index = imgui.combo(
language.current_language.customization_menu.type, language.current_language.customization_menu.type,
utils.table.find_index(customization_menu.ailment_buildups_sorting_types, cached_config.sorting.type), utils.table.find_index(this.ailment_buildups_sorting_types, cached_config.sorting.type),
customization_menu.displayed_ailment_buildups_sorting_types); this.displayed_ailment_buildups_sorting_types);
config_changed = config_changed or changed; config_changed = config_changed or changed;
if changed then if changed then
cached_config.sorting.type = customization_menu.ailment_buildups_sorting_types[index]; cached_config.sorting.type = this.ailment_buildups_sorting_types[index];
end end
changed, cached_config.sorting.reversed_order = imgui.checkbox( changed, cached_config.sorting.reversed_order = imgui.checkbox(
@@ -200,7 +256,7 @@ function this.draw(cached_config)
return config_changed; return config_changed;
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -216,6 +272,10 @@ function this.init_module()
label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -14,6 +14,7 @@ local keyboard;
local customization_menu; local customization_menu;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -47,6 +48,27 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
this.ailments_sorting_types = {};
this.displayed_ailments_sorting_types = {};
function this.init()
local default = language.default_language.customization_menu;
local current = language.current_language.customization_menu;
this.ailments_sorting_types = {
default.normal,
default.buildup,
default.buildup_percentage
};
this.displayed_ailments_sorting_types = {
current.normal,
current.buildup,
current.buildup_percentage
};
end
function this.draw(cached_config) function this.draw(cached_config)
local changed = false; local changed = false;
local config_changed = false; local config_changed = false;
@@ -143,13 +165,13 @@ function this.draw(cached_config)
if imgui.tree_node(language.current_language.customization_menu.sorting) then if imgui.tree_node(language.current_language.customization_menu.sorting) then
changed, index = imgui.combo( changed, index = imgui.combo(
language.current_language.customization_menu.type, language.current_language.customization_menu.type,
utils.table.find_index(customization_menu.ailments_sorting_types, cached_config.sorting.type), utils.table.find_index(this.ailments_sorting_types, cached_config.sorting.type),
customization_menu.displayed_ailments_sorting_types); this.displayed_ailments_sorting_types);
config_changed = config_changed or changed; config_changed = config_changed or changed;
if changed then if changed then
cached_config.sorting.type = customization_menu.ailments_sorting_types[index]; cached_config.sorting.type = this.ailments_sorting_types[index];
end end
changed, cached_config.sorting.reversed_order = imgui.checkbox( changed, cached_config.sorting.reversed_order = imgui.checkbox(
@@ -365,7 +387,7 @@ function this.draw(cached_config)
return config_changed; return config_changed;
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -380,6 +402,10 @@ function this.init_module()
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -13,6 +13,7 @@ local time_UI;
local keyboard; local keyboard;
local customization_menu; local customization_menu;
local line_customization; local line_customization;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -46,72 +47,122 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
local outline_styles = {};
local displayed_outline_styles = {};
local directions = {};
local displayed_directions = {};
function this.init()
local default = language.default_language.customization_menu;
local current = language.current_language.customization_menu;
outline_styles = {
default.inside,
default.center,
default.outside
};
displayed_outline_styles = {
current.inside,
current.center,
current.outside
};
directions = {
default.left_to_right,
default.right_to_left,
default.top_to_bottom,
default.bottom_to_top
};
displayed_directions = {
current.left_to_right,
current.right_to_left,
current.top_to_bottom,
current.bottom_to_top
};
end
function this.draw(bar_name, bar) function this.draw(bar_name, bar)
if bar == nil then if bar == nil then
return false; return false;
end end
local cached_language = language.current_language.customization_menu;
local bar_changed = false; local bar_changed = false;
local changed = false; local changed = false;
local index = 1; local index = 1;
if imgui.tree_node(bar_name) then if imgui.tree_node(bar_name) then
changed, bar.visibility = imgui.checkbox(language.current_language.customization_menu.visible changed, bar.visibility = imgui.checkbox(cached_language.visible
, bar.visibility); , bar.visibility);
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.offset) then if imgui.tree_node(cached_language.settings) then
changed, bar.offset.x = imgui.drag_float(language.current_language.customization_menu.x, local fill_direction_index = utils.table.find_index(directions, bar.settings.fill_direction);
changed, fill_direction_index = imgui.combo(cached_language.fill_direction, fill_direction_index, displayed_directions);
bar_changed = bar_changed or changed;
if changed then
bar.settings.fill_direction = directions[fill_direction_index];
end
imgui.tree_pop();
end
if imgui.tree_node(cached_language.offset) then
changed, bar.offset.x = imgui.drag_float(cached_language.x,
bar.offset.x, 0.1, -screen.width, screen.width, "%.1f"); bar.offset.x, 0.1, -screen.width, screen.width, "%.1f");
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
changed, bar.offset.y = imgui.drag_float(language.current_language.customization_menu.y, changed, bar.offset.y = imgui.drag_float(cached_language.y,
bar.offset.y, 0.1, -screen.height, screen.height, "%.1f"); bar.offset.y, 0.1, -screen.height, screen.height, "%.1f");
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.size) then if imgui.tree_node(cached_language.size) then
changed, bar.size.width = imgui.drag_float(language.current_language.customization_menu.width, changed, bar.size.width = imgui.drag_float(cached_language.width,
bar.size.width, 0.1, 0, screen.width, "%.1f"); bar.size.width, 0.1, 0, screen.width, "%.1f");
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
changed, bar.size.height = imgui.drag_float(language.current_language.customization_menu.height, changed, bar.size.height = imgui.drag_float(cached_language.height,
bar.size.height, 0.1, 0, screen.height, "%.1f"); bar.size.height, 0.1, 0, screen.height, "%.1f");
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.outline) then if imgui.tree_node(cached_language.outline) then
changed, bar.outline.visibility = imgui.checkbox(language.current_language.customization_menu.visible changed, bar.outline.visibility = imgui.checkbox(cached_language.visible
, bar.outline.visibility); , bar.outline.visibility);
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
changed, bar.outline.thickness = imgui.drag_float(language.current_language.customization_menu.thickness, changed, bar.outline.thickness = imgui.drag_float(cached_language.thickness,
bar.outline.thickness, 0.1, 0, screen.width, "%.1f"); bar.outline.thickness, 0.1, 0, screen.width, "%.1f");
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
changed, bar.outline.offset = imgui.drag_float(language.current_language.customization_menu.offset, changed, bar.outline.offset = imgui.drag_float(cached_language.offset,
bar.outline.offset, 0.1, -screen.height, screen.height, "%.1f"); bar.outline.offset, 0.1, -screen.height, screen.height, "%.1f");
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
changed, index = imgui.combo(cached_language.style,
changed, index = imgui.combo(language.current_language.customization_menu.style, utils.table.find_index(outline_styles, bar.outline.style),
utils.table.find_index(customization_menu.outline_styles, displayed_outline_styles);
bar.outline.style),
customization_menu.displayed_outline_styles);
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
if changed then if changed then
bar.outline.style = customization_menu.outline_styles[index]; bar.outline.style = outline_styles[index];
end end
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.colors) then if imgui.tree_node(cached_language.colors) then
local colors = nil; local colors = nil;
if bar.colors ~= nil then if bar.colors ~= nil then
colors = bar.colors; colors = bar.colors;
@@ -119,7 +170,7 @@ function this.draw(bar_name, bar)
colors = bar.normal_colors; colors = bar.normal_colors;
end end
if imgui.tree_node(language.current_language.customization_menu.foreground) then if imgui.tree_node(cached_language.foreground) then
changed, colors.foreground = imgui.color_picker_argb("", colors.foreground, changed, colors.foreground = imgui.color_picker_argb("", colors.foreground,
customization_menu.color_picker_flags); customization_menu.color_picker_flags);
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
@@ -127,7 +178,7 @@ function this.draw(bar_name, bar)
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.background) then if imgui.tree_node(cached_language.background) then
changed, colors.background = imgui.color_picker_argb("", colors.background, changed, colors.background = imgui.color_picker_argb("", colors.background,
customization_menu.color_picker_flags); customization_menu.color_picker_flags);
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
@@ -135,7 +186,7 @@ function this.draw(bar_name, bar)
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.outline) then if imgui.tree_node(cached_language.outline) then
changed, colors.outline = imgui.color_picker_argb("", colors.outline, changed, colors.outline = imgui.color_picker_argb("", colors.outline,
customization_menu.color_picker_flags); customization_menu.color_picker_flags);
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
@@ -144,8 +195,8 @@ function this.draw(bar_name, bar)
end end
if bar.capture_colors ~= nil then if bar.capture_colors ~= nil then
if imgui.tree_node(language.current_language.customization_menu.monster_can_be_captured) then if imgui.tree_node(cached_language.monster_can_be_captured) then
if imgui.tree_node(language.current_language.customization_menu.foreground) then if imgui.tree_node(cached_language.foreground) then
changed, bar.capture_colors.foreground = imgui.color_picker_argb("", changed, bar.capture_colors.foreground = imgui.color_picker_argb("",
bar.capture_colors.foreground bar.capture_colors.foreground
, ,
@@ -155,7 +206,7 @@ function this.draw(bar_name, bar)
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.background) then if imgui.tree_node(cached_language.background) then
changed, bar.capture_colors.background = imgui.color_picker_argb("", changed, bar.capture_colors.background = imgui.color_picker_argb("",
bar.capture_colors.background bar.capture_colors.background
, ,
@@ -165,7 +216,7 @@ function this.draw(bar_name, bar)
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.outline) then if imgui.tree_node(cached_language.outline) then
changed, bar.capture_colors.outline = imgui.color_picker_argb("", changed, bar.capture_colors.outline = imgui.color_picker_argb("",
bar.capture_colors.outline bar.capture_colors.outline
, ,
@@ -182,7 +233,7 @@ function this.draw(bar_name, bar)
imgui.tree_pop(); imgui.tree_pop();
end end
changed = line_customization.draw(language.current_language.customization_menu.capture_line, bar.capture_line); changed = line_customization.draw(cached_language.capture_line, bar.capture_line);
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
@@ -191,7 +242,7 @@ function this.draw(bar_name, bar)
return bar_changed; return bar_changed;
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -205,6 +256,10 @@ function this.init_module()
keyboard = require("MHR_Overlay.Game_Handler.keyboard"); keyboard = require("MHR_Overlay.Game_Handler.keyboard");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
line_customization = require("MHR_Overlay.UI.Customizations.line_customization"); line_customization = require("MHR_Overlay.UI.Customizations.line_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -14,6 +14,7 @@ local keyboard;
local customization_menu; local customization_menu;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -47,171 +48,279 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
this.large_monster_UI_parts_sorting_types = {};
this.displayed_large_monster_UI_parts_sorting_types = {};
this.large_monster_UI_parts_filter_types = {};
this.displayed_large_monster_UI_parts_filter_types = {};
function this.init()
local default = language.default_language.customization_menu;
local current = language.current_language.customization_menu;
this.large_monster_UI_parts_sorting_types =
{
default.normal,
default.health,
default.health_percentage,
default.flinch_count,
default.break_health,
default.break_health_percentage,
default.break_count,
default.loss_health,
default.loss_health_percentage,
default.anomaly_health,
default.anomaly_health_percentage
};
this.displayed_large_monster_UI_parts_sorting_types =
{
current.normal,
current.health,
current.health_percentage,
current.flinch_count,
current.break_health,
current.break_health_percentage,
current.break_count,
current.loss_health,
current.loss_health_percentage,
current.anomaly_health,
current.anomaly_health_percentage
};
this.large_monster_UI_parts_filter_types =
{
default.current_state,
default.default_state
};
this.displayed_large_monster_UI_parts_filter_types =
{
current.current_state,
current.default_state
};
end
function this.draw(cached_config) function this.draw(cached_config)
local cached_language = language.current_language.customization_menu;
local changed = false; local changed = false;
local config_changed = false; local config_changed = false;
local index = 0; local index = 0;
if imgui.tree_node(language.current_language.customization_menu.body_parts) then if imgui.tree_node(cached_language.body_parts) then
changed, cached_config.visibility = imgui.checkbox( changed, cached_config.visibility = imgui.checkbox(
language.current_language.customization_menu.visible, cached_config.visibility); cached_language.visible, cached_config.visibility);
config_changed = config_changed or changed; config_changed = config_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.offset) then if imgui.tree_node(cached_language.offset) then
changed, cached_config.offset.x = imgui.drag_float( changed, cached_config.offset.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.offset.x, 0.1, -screen.width, screen.width, "%.1f"); cached_language.x, cached_config.offset.x, 0.1, -screen.width, screen.width, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.offset.y = imgui.drag_float( changed, cached_config.offset.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.offset.y, 0.1, -screen.height, screen.height, "%.1f"); cached_language.y, cached_config.offset.y, 0.1, -screen.height, screen.height, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.spacing) then if imgui.tree_node(cached_language.spacing) then
changed, cached_config.spacing.x = imgui.drag_float( changed, cached_config.spacing.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.spacing.x, 0.1, -screen.width, screen.width, "%.1f"); cached_language.x, cached_config.spacing.x, 0.1, -screen.width, screen.width, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.spacing.y = imgui.drag_float( changed, cached_config.spacing.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.spacing.y, 0.1, -screen.height, screen.height, "%.1f"); cached_language.y, cached_config.spacing.y, 0.1, -screen.height, screen.height, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.settings) then if imgui.tree_node(cached_language.settings) then
changed, cached_config.settings.hide_undamaged_parts = imgui.checkbox( changed, cached_config.settings.hide_undamaged_parts = imgui.checkbox(
language.current_language.customization_menu.hide_undamaged_parts, cached_config.settings.hide_undamaged_parts); cached_language.hide_undamaged_parts, cached_config.settings.hide_undamaged_parts);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, index = imgui.combo(language.current_language.customization_menu.filter_mode, changed, cached_config.settings.render_inactive_anomaly_cores = imgui.checkbox(
utils.table.find_index(customization_menu.large_monster_UI_parts_filter_types, cached_config.settings.filter_mode), cached_language.render_inactive_anomaly_cores, cached_config.settings.render_inactive_anomaly_cores);
customization_menu.displayed_large_monster_UI_parts_filter_types);
config_changed = config_changed or changed;
changed, index = imgui.combo(cached_language.filter_mode,
utils.table.find_index(this.large_monster_UI_parts_filter_types, cached_config.settings.filter_mode),
this.displayed_large_monster_UI_parts_filter_types);
config_changed = config_changed or changed; config_changed = config_changed or changed;
if changed then if changed then
cached_config.settings.filter_mode = customization_menu.large_monster_UI_parts_filter_types[index]; cached_config.settings.filter_mode = this.large_monster_UI_parts_filter_types[index];
end end
changed, cached_config.settings.time_limit = imgui.drag_float( changed, cached_config.settings.time_limit = imgui.drag_float(
language.current_language.customization_menu.time_limit, cached_config.settings.time_limit, 0.1, 0, 99999, "%.1f"); cached_language.time_limit, cached_config.settings.time_limit, 0.1, 0, 99999, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.sorting) then if imgui.tree_node(cached_language.sorting) then
changed, index = imgui.combo( changed, index = imgui.combo(
language.current_language.customization_menu.type, cached_language.type,
utils.table.find_index(customization_menu.large_monster_UI_parts_sorting_types, cached_config.sorting.type), utils.table.find_index(this.large_monster_UI_parts_sorting_types, cached_config.sorting.type),
customization_menu.displayed_large_monster_UI_parts_sorting_types); this.displayed_large_monster_UI_parts_sorting_types);
config_changed = config_changed or changed; config_changed = config_changed or changed;
if changed then if changed then
cached_config.sorting.type = customization_menu.large_monster_UI_parts_sorting_types[index]; cached_config.sorting.type = this.large_monster_UI_parts_sorting_types[index];
end end
changed, cached_config.sorting.reversed_order = imgui.checkbox( changed, cached_config.sorting.reversed_order = imgui.checkbox(
language.current_language.customization_menu.reversed_order, cached_config.sorting.reversed_order); cached_language.reversed_order, cached_config.sorting.reversed_order);
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.filter) then if imgui.tree_node(cached_language.filter) then
changed, cached_config.filter.health_break_severe = imgui.checkbox( changed, cached_config.filter.health_break_sever_anomaly = imgui.checkbox(
language.current_language.customization_menu.health_break_severe_filter, cached_config.filter.health_break_severe); cached_language.health_break_sever_anomaly_filter, cached_config.filter.health_break_sever_anomaly);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.filter.health_break_sever = imgui.checkbox(
cached_language.health_break_sever_filter, cached_config.filter.health_break_sever);
config_changed = config_changed or changed;
changed, cached_config.filter.health_break_anomaly = imgui.checkbox(
cached_language.health_break_anomaly_filter, cached_config.filter.health_break_anomaly);
config_changed = config_changed or changed;
changed, cached_config.filter.health_sever_anomaly = imgui.checkbox(
cached_language.health_sever_anomaly_filter, cached_config.filter.health_sever_anomaly);
config_changed = config_changed or changed;
changed, cached_config.filter.break_sever_anomaly = imgui.checkbox(
cached_language.break_sever_anomaly_filter, cached_config.filter.break_sever_anomaly);
config_changed = config_changed or changed;
changed, cached_config.filter.health_break = imgui.checkbox( changed, cached_config.filter.health_break = imgui.checkbox(
language.current_language.customization_menu.health_break_filter, cached_config.filter.health_break); cached_language.health_break_filter, cached_config.filter.health_break);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.filter.health_severe = imgui.checkbox( changed, cached_config.filter.health_sever = imgui.checkbox(
language.current_language.customization_menu.health_severe_filter, cached_config.filter.health_severe); cached_language.health_sever_filter, cached_config.filter.health_sever);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.filter.health_anomaly = imgui.checkbox(
cached_language.health_anomaly_filter, cached_config.filter.health_anomaly);
config_changed = config_changed or changed;
changed, cached_config.filter.break_sever = imgui.checkbox(
cached_language.break_sever_filter, cached_config.filter.break_sever);
config_changed = config_changed or changed;
changed, cached_config.filter.break_anomaly = imgui.checkbox(
cached_language.break_anomaly_filter, cached_config.filter.break_anomaly);
config_changed = config_changed or changed;
changed, cached_config.filter.sever_anomaly = imgui.checkbox(
cached_language.sever_anomaly_filter, cached_config.filter.sever_anomaly);
config_changed = config_changed or changed;
changed, cached_config.filter.health = imgui.checkbox( changed, cached_config.filter.health = imgui.checkbox(
language.current_language.customization_menu.health_filter, cached_config.filter.health); cached_language.health_filter, cached_config.filter.health);
config_changed = config_changed or changed;
changed, cached_config.filter.break_severe = imgui.checkbox(
language.current_language.customization_menu.break_severe_filter, cached_config.filter.break_severe);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.filter.break_ = imgui.checkbox( changed, cached_config.filter.break_ = imgui.checkbox(
language.current_language.customization_menu.break_filter, cached_config.filter.break_); cached_language.break_filter, cached_config.filter.break_);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.filter.severe = imgui.checkbox( changed, cached_config.filter.sever = imgui.checkbox(
language.current_language.customization_menu.severe_filter, cached_config.filter.severe); cached_language.sever_filter, cached_config.filter.sever);
config_changed = config_changed or changed;
changed, cached_config.filter.anomaly = imgui.checkbox(
cached_language.anomaly_filter, cached_config.filter.anomaly);
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.part_name_label) then if imgui.tree_node(cached_language.part_name_label) then
changed, cached_config.part_name_label.visibility = imgui.checkbox( changed, cached_config.part_name_label.visibility = imgui.checkbox(
language.current_language.customization_menu.visible, cached_config.part_name_label.visibility); cached_language.visible, cached_config.part_name_label.visibility);
config_changed = config_changed or changed; config_changed = config_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.include) then if imgui.tree_node(cached_language.include) then
changed, cached_config.part_name_label.include.part_name = imgui.checkbox( changed, cached_config.part_name_label.include.part_name = imgui.checkbox(
language.current_language.customization_menu.part_name, cached_config.part_name_label.include.part_name); cached_language.part_name, cached_config.part_name_label.include.part_name);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.part_name_label.include.flinch_count = imgui.checkbox( changed, cached_config.part_name_label.include.flinch_count = imgui.checkbox(
language.current_language.customization_menu.flinch_count, cached_config.part_name_label.include.flinch_count); cached_language.flinch_count, cached_config.part_name_label.include.flinch_count);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.part_name_label.include.break_count = imgui.checkbox( changed, cached_config.part_name_label.include.break_count = imgui.checkbox(
language.current_language.customization_menu.break_count, cached_config.part_name_label.include.break_count); cached_language.break_count, cached_config.part_name_label.include.break_count);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.part_name_label.include.break_max_count = imgui.checkbox( changed, cached_config.part_name_label.include.break_max_count = imgui.checkbox(
language.current_language.customization_menu.break_max_count, cached_config.part_name_label.include.break_max_count); cached_language.break_max_count, cached_config.part_name_label.include.break_max_count);
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.offset) then if imgui.tree_node(cached_language.offset) then
changed, cached_config.part_name_label.offset.x = imgui.drag_float( changed, cached_config.part_name_label.offset.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.part_name_label.offset.x, 0.1, -screen.width, screen.width, "%.1f"); cached_language.x, cached_config.part_name_label.offset.x, 0.1, -screen.width, screen.width, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.part_name_label.offset.y = imgui.drag_float( changed, cached_config.part_name_label.offset.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.part_name_label.offset.y, 0.1, -screen.height, screen.height, "%.1f"); cached_language.y, cached_config.part_name_label.offset.y, 0.1, -screen.height, screen.height, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.color) then if imgui.tree_node(cached_language.color) then
changed, cached_config.part_name_label.color = imgui.color_picker_argb( changed, cached_config.part_name_label.color = imgui.color_picker_argb(
"", cached_config.part_name_label.color, customization_menu.color_picker_flags); "", cached_config.part_name_label.color, customization_menu.color_picker_flags);
@@ -220,21 +329,21 @@ function this.draw(cached_config)
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.shadow) then if imgui.tree_node(cached_language.shadow) then
changed, cached_config.part_name_label.shadow.visibility = imgui.checkbox( changed, cached_config.part_name_label.shadow.visibility = imgui.checkbox(
language.current_language.customization_menu.visible, cached_config.part_name_label.shadow.visibility); cached_language.visible, cached_config.part_name_label.shadow.visibility);
config_changed = config_changed or changed; config_changed = config_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.offset) then if imgui.tree_node(cached_language.offset) then
changed, cached_config.part_name_label.shadow.offset.x = imgui.drag_float( changed, cached_config.part_name_label.shadow.offset.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.part_name_label.shadow.offset.x, cached_language.x, cached_config.part_name_label.shadow.offset.x,
0.1, -screen.width, screen.width, "%.1f"); 0.1, -screen.width, screen.width, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.part_name_label.shadow.offset.y = imgui.drag_float( changed, cached_config.part_name_label.shadow.offset.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.part_name_label.shadow.offset.y, cached_language.y, cached_config.part_name_label.shadow.offset.y,
0.1, -screen.height, screen.height, "%.1f"); 0.1, -screen.height, screen.height, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
@@ -242,7 +351,7 @@ function this.draw(cached_config)
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.color) then if imgui.tree_node(cached_language.color) then
changed, cached_config.part_name_label.shadow.color = imgui.color_picker_argb( changed, cached_config.part_name_label.shadow.color = imgui.color_picker_argb(
"",cached_config.part_name_label.shadow.color, customization_menu.color_picker_flags); "",cached_config.part_name_label.shadow.color, customization_menu.color_picker_flags);
@@ -257,106 +366,141 @@ function this.draw(cached_config)
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.part_health) then if imgui.tree_node(cached_language.part_health) then
changed, cached_config.part_health.visibility = imgui.checkbox( changed, cached_config.part_health.visibility = imgui.checkbox(
language.current_language.customization_menu.visible, cached_config.part_health.visibility); cached_language.visible, cached_config.part_health.visibility);
config_changed = config_changed or changed; config_changed = config_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.offset) then if imgui.tree_node(cached_language.offset) then
changed, cached_config.part_health.offset.x = imgui.drag_float( changed, cached_config.part_health.offset.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.part_health.offset.x, 0.1, -screen.width, screen.width, "%.1f"); cached_language.x, cached_config.part_health.offset.x, 0.1, -screen.width, screen.width, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.part_health.offset.y = imgui.drag_float( changed, cached_config.part_health.offset.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.part_health.offset.y, 0.1, -screen.height, screen.height, "%.1f"); cached_language.y, cached_config.part_health.offset.y, 0.1, -screen.height, screen.height, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
changed = label_customization.draw(language.current_language.customization_menu.text_label, cached_config.part_health.text_label); changed = label_customization.draw(cached_language.text_label, cached_config.part_health.text_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.value_label, cached_config.part_health.value_label); changed = label_customization.draw(cached_language.value_label, cached_config.part_health.value_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.percentage_label, cached_config.part_health.percentage_label); changed = label_customization.draw(cached_language.percentage_label, cached_config.part_health.percentage_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed = bar_customization.draw(language.current_language.customization_menu.bar, cached_config.part_health.bar); changed = bar_customization.draw(cached_language.bar, cached_config.part_health.bar);
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.break_health) then if imgui.tree_node(cached_language.break_health) then
changed, cached_config.part_break.visibility = imgui.checkbox( changed, cached_config.part_break.visibility = imgui.checkbox(
language.current_language.customization_menu.visible, cached_config.part_break.visibility); cached_language.visible, cached_config.part_break.visibility);
config_changed = config_changed or changed; config_changed = config_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.offset) then if imgui.tree_node(cached_language.offset) then
changed, cached_config.part_break.offset.x = imgui.drag_float( changed, cached_config.part_break.offset.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.part_break.offset.x, 0.1, -screen.width, screen.width, "%.1f"); cached_language.x, cached_config.part_break.offset.x, 0.1, -screen.width, screen.width, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.part_break.offset.y = imgui.drag_float( changed, cached_config.part_break.offset.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.part_break.offset.y, 0.1, -screen.height, screen.height, "%.1f"); cached_language.y, cached_config.part_break.offset.y, 0.1, -screen.height, screen.height, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
changed = label_customization.draw(language.current_language.customization_menu.text_label, cached_config.part_break.text_label); changed = label_customization.draw(cached_language.text_label, cached_config.part_break.text_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.value_label, cached_config.part_break.value_label); changed = label_customization.draw(cached_language.value_label, cached_config.part_break.value_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.percentage_label, cached_config.part_break.percentage_label); changed = label_customization.draw(cached_language.percentage_label, cached_config.part_break.percentage_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed = bar_customization.draw(language.current_language.customization_menu.bar, cached_config.part_break.bar); changed = bar_customization.draw(cached_language.bar, cached_config.part_break.bar);
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.loss_health) then if imgui.tree_node(cached_language.loss_health) then
changed, cached_config.part_loss.visibility = imgui.checkbox( changed, cached_config.part_loss.visibility = imgui.checkbox(
language.current_language.customization_menu.visible, cached_config.part_loss.visibility); cached_language.visible, cached_config.part_loss.visibility);
config_changed = config_changed or changed; config_changed = config_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.offset) then if imgui.tree_node(cached_language.offset) then
changed, cached_config.part_loss.offset.x = imgui.drag_float( changed, cached_config.part_loss.offset.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.part_loss.offset.x, 0.1, -screen.width, screen.width, "%.1f"); cached_language.x, cached_config.part_loss.offset.x, 0.1, -screen.width, screen.width, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed, cached_config.part_loss.offset.y = imgui.drag_float( changed, cached_config.part_loss.offset.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.part_loss.offset.y, 0.1, -screen.height, screen.height, "%.1f"); cached_language.y, cached_config.part_loss.offset.y, 0.1, -screen.height, screen.height, "%.1f");
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
changed = label_customization.draw(language.current_language.customization_menu.text_label, cached_config.part_loss.text_label); changed = label_customization.draw(cached_language.text_label, cached_config.part_loss.text_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.value_label, cached_config.part_loss.value_label); changed = label_customization.draw(cached_language.value_label, cached_config.part_loss.value_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.percentage_label, cached_config.part_loss.percentage_label); changed = label_customization.draw(cached_language.percentage_label, cached_config.part_loss.percentage_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed = bar_customization.draw(language.current_language.customization_menu.bar, cached_config.part_loss.bar); changed = bar_customization.draw(cached_language.bar, cached_config.part_loss.bar);
config_changed = config_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(cached_language.anomaly_health) then
changed, cached_config.part_anomaly.visibility = imgui.checkbox(
cached_language.visible, cached_config.part_anomaly.visibility);
config_changed = config_changed or changed;
if imgui.tree_node(cached_language.offset) then
changed, cached_config.part_anomaly.offset.x = imgui.drag_float(
cached_language.x, cached_config.part_anomaly.offset.x, 0.1, -screen.width, screen.width, "%.1f");
config_changed = config_changed or changed;
changed, cached_config.part_anomaly.offset.y = imgui.drag_float(
cached_language.y, cached_config.part_anomaly.offset.y, 0.1, -screen.height, screen.height, "%.1f");
config_changed = config_changed or changed;
imgui.tree_pop();
end
changed = label_customization.draw(cached_language.text_label, cached_config.part_anomaly.text_label);
config_changed = config_changed or changed;
changed = label_customization.draw(cached_language.value_label, cached_config.part_anomaly.value_label);
config_changed = config_changed or changed;
changed = label_customization.draw(cached_language.percentage_label, cached_config.part_anomaly.percentage_label);
config_changed = config_changed or changed;
changed = bar_customization.draw(cached_language.bar, cached_config.part_anomaly.bar);
config_changed = config_changed or changed; config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
@@ -368,7 +512,7 @@ function this.draw(cached_config)
return config_changed; return config_changed;
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -383,6 +527,10 @@ function this.init_module()
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -13,6 +13,7 @@ local keyboard;
local customization_menu; local customization_menu;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -88,7 +89,7 @@ function this.draw(cached_config)
return config_changed; return config_changed;
end end
function this.init_module() function this.init_dependencies()
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen"); screen = require("MHR_Overlay.Game_Handler.screen");
@@ -102,6 +103,10 @@ function this.init_module()
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -11,6 +11,7 @@ local part_names;
local time_UI; local time_UI;
local keyboard; local keyboard;
local customization_menu; local customization_menu;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -45,17 +46,26 @@ local ValueType = ValueType;
local package = package; local package = package;
function this.draw(label_name, label) function this.draw(label_name, label)
local cached_language = language.current_language.customization_menu;
local label_changed = false; local label_changed = false;
local changed = false; local changed = false;
if imgui.tree_node(label_name) then if imgui.tree_node(label_name) then
changed, label.visibility = imgui.checkbox(language.current_language.customization_menu.visible, label.visibility); changed, label.visibility = imgui.checkbox(cached_language.visible, label.visibility);
label_changed = label_changed or changed; label_changed = label_changed or changed;
if imgui.tree_node(cached_language.settings) then
changed, label.settings.right_alignment_shift = imgui.slider_int(cached_language.right_alignment_shift, label.settings.right_alignment_shift, 0, 64);
label_changed = label_changed or changed;
imgui.tree_pop();
end
if label.include ~= nil then if label.include ~= nil then
if imgui.tree_node(language.current_language.customization_menu.include) then if imgui.tree_node(cached_language.include) then
for include_name, include in pairs(label.include) do for include_name, include in pairs(label.include) do
changed, label.include[include_name] = imgui.checkbox(language.current_language.customization_menu[include_name], include); changed, label.include[include_name] = imgui.checkbox(cached_language[include_name], label.include[include_name]);
label_changed = label_changed or changed; label_changed = label_changed or changed;
end end
@@ -63,42 +73,40 @@ function this.draw(label_name, label)
end end
end end
-- add text format if imgui.tree_node(cached_language.offset) then
changed, label.offset.x = imgui.drag_float(cached_language.x, label.offset.x, 0.1, -screen.width, screen.width, "%.1f");
if imgui.tree_node(language.current_language.customization_menu.offset) then
changed, label.offset.x = imgui.drag_float(language.current_language.customization_menu.x, label.offset.x, 0.1, -screen.width, screen.width, "%.1f");
label_changed = label_changed or changed; label_changed = label_changed or changed;
changed, label.offset.y = imgui.drag_float(language.current_language.customization_menu.y, label.offset.y, 0.1, -screen.height, screen.height, "%.1f"); changed, label.offset.y = imgui.drag_float(cached_language.y, label.offset.y, 0.1, -screen.height, screen.height, "%.1f");
label_changed = label_changed or changed; label_changed = label_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.color) then if imgui.tree_node(cached_language.color) then
changed, label.color = imgui.color_picker_argb("", label.color, customization_menu.color_picker_flags); changed, label.color = imgui.color_picker_argb("", label.color, customization_menu.color_picker_flags);
label_changed = label_changed or changed; label_changed = label_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.shadow) then if imgui.tree_node(cached_language.shadow) then
changed, label.shadow.visibility = imgui.checkbox(language.current_language.customization_menu.visible, label.shadow.visibility); changed, label.shadow.visibility = imgui.checkbox(cached_language.visible, label.shadow.visibility);
label_changed = label_changed or changed; label_changed = label_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.offset) then if imgui.tree_node(cached_language.offset) then
changed, label.shadow.offset.x = imgui.drag_float(language.current_language.customization_menu.x, changed, label.shadow.offset.x = imgui.drag_float(cached_language.x,
label.shadow.offset.x, 0.1, -screen.width, screen.width, "%.1f"); label.shadow.offset.x, 0.1, -screen.width, screen.width, "%.1f");
label_changed = label_changed or changed; label_changed = label_changed or changed;
changed, label.shadow.offset.y = imgui.drag_float(language.current_language.customization_menu.y, changed, label.shadow.offset.y = imgui.drag_float(cached_language.y,
label.shadow.offset.y, 0.1, -screen.height, screen.height, "%.1f"); label.shadow.offset.y, 0.1, -screen.height, screen.height, "%.1f");
label_changed = label_changed or changed; label_changed = label_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
if imgui.tree_node(language.current_language.customization_menu.color) then if imgui.tree_node(cached_language.color) then
changed, label.shadow.color = imgui.color_picker_argb("", label.shadow.color, changed, label.shadow.color = imgui.color_picker_argb("", label.shadow.color,
customization_menu.color_picker_flags); customization_menu.color_picker_flags);
label_changed = label_changed or changed; label_changed = label_changed or changed;
@@ -115,7 +123,7 @@ function this.draw(label_name, label)
return label_changed; return label_changed;
end end
function this.init_module() function this.init_dependencies()
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen"); screen = require("MHR_Overlay.Game_Handler.screen");
@@ -127,6 +135,10 @@ function this.init_module()
time_UI = require("MHR_Overlay.UI.Modules.time_UI"); time_UI = require("MHR_Overlay.UI.Modules.time_UI");
keyboard = require("MHR_Overlay.Game_Handler.keyboard"); keyboard = require("MHR_Overlay.Game_Handler.keyboard");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -11,6 +11,7 @@ local part_names;
local time_UI; local time_UI;
local keyboard; local keyboard;
local customization_menu; local customization_menu;
local error_handler;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
@@ -81,7 +82,7 @@ function this.draw(cached_config)
return config_changed; return config_changed;
end end
function this.init_module() function this.init_dependencies()
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen"); screen = require("MHR_Overlay.Game_Handler.screen");
@@ -93,9 +94,10 @@ function this.init_module()
time_UI = require("MHR_Overlay.UI.Modules.time_UI"); time_UI = require("MHR_Overlay.UI.Modules.time_UI");
keyboard = require("MHR_Overlay.Game_Handler.keyboard"); keyboard = require("MHR_Overlay.Game_Handler.keyboard");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
error_handler = require("MHR_Overlay.Misc.error_handler");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
health_customization = require("MHR_Overlay.UI.Customizations.health_customization"); health_customization = require("MHR_Overlay.UI.Customizations.health_customization");
stamina_customization = require("MHR_Overlay.UI.Customizations.stamina_customization"); stamina_customization = require("MHR_Overlay.UI.Customizations.stamina_customization");
rage_customization = require("MHR_Overlay.UI.Customizations.rage_customization"); rage_customization = require("MHR_Overlay.UI.Customizations.rage_customization");
@@ -104,4 +106,7 @@ function this.init_module()
ailment_buildups_customization = require("MHR_Overlay.UI.Customizations.ailment_buildups_customization"); ailment_buildups_customization = require("MHR_Overlay.UI.Customizations.ailment_buildups_customization");
end end
function this.init_module()
end
return this; return this;

View File

@@ -11,6 +11,7 @@ local part_names;
local time_UI; local time_UI;
local keyboard; local keyboard;
local customization_menu; local customization_menu;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -95,7 +96,7 @@ function this.draw(line_name, line)
return line_changed; return line_changed;
end end
function this.init_module() function this.init_dependencies()
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen"); screen = require("MHR_Overlay.Game_Handler.screen");
@@ -107,6 +108,10 @@ function this.init_module()
time_UI = require("MHR_Overlay.UI.Modules.time_UI"); time_UI = require("MHR_Overlay.UI.Modules.time_UI");
keyboard = require("MHR_Overlay.Game_Handler.keyboard"); keyboard = require("MHR_Overlay.Game_Handler.keyboard");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -13,6 +13,7 @@ local keyboard;
local customization_menu; local customization_menu;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -92,16 +93,20 @@ function this.draw(cached_config)
config_changed = config_changed or changed; config_changed = config_changed or changed;
--[[changed, cached_config.buff_UI = imgui.checkbox( changed, cached_config.buff_UI = imgui.checkbox(
language.current_language.customization_menu.buff_UI, language.current_language.customization_menu.buff_UI,
cached_config.buff_UI); cached_config.buff_UI);
config_changed = config_changed or changed;]] changed, cached_config.stats_UI = imgui.checkbox(
language.current_language.customization_menu.stats_UI,
cached_config.stats_UI);
config_changed = config_changed or changed;
return config_changed; return config_changed;
end end
function this.init_module() function this.init_dependencies()
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen"); screen = require("MHR_Overlay.Game_Handler.screen");
@@ -113,6 +118,10 @@ function this.init_module()
time_UI = require("MHR_Overlay.UI.Modules.time_UI"); time_UI = require("MHR_Overlay.UI.Modules.time_UI");
keyboard = require("MHR_Overlay.Game_Handler.keyboard"); keyboard = require("MHR_Overlay.Game_Handler.keyboard");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -13,6 +13,7 @@ local keyboard;
local customization_menu; local customization_menu;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -91,7 +92,7 @@ function this.draw(cached_config)
return config_changed; return config_changed;
end end
function this.init_module() function this.init_dependencies()
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen"); screen = require("MHR_Overlay.Game_Handler.screen");
@@ -105,6 +106,10 @@ function this.init_module()
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -13,6 +13,7 @@ local keyboard;
local customization_menu; local customization_menu;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -91,7 +92,7 @@ function this.draw(cached_config)
return config_changed; return config_changed;
end end
function this.init_module() function this.init_dependencies()
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen"); screen = require("MHR_Overlay.Game_Handler.screen");
@@ -105,6 +106,10 @@ function this.init_module()
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -3,7 +3,19 @@ local this = {};
local buff_UI_entity; local buff_UI_entity;
local config; local config;
local buffs; local buffs;
local item_buffs;
local melody_effects;
local endemic_life_buff;
local screen; local screen;
local utils;
local error_handler;
local skills;
local dango_skills;
local abnormal_statuses;
local otomo_moves;
local weapon_skills;
local misc_buffs;
local rampage_skills;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -37,67 +49,166 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
function this.draw() local displayed_buffs = {};
function this.update()
local cached_config = config.current_config.buff_UI; local cached_config = config.current_config.buff_UI;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
local displayed_buffs = {}; local _displayed_buffs = {};
for _, buff in pairs(buffs.list) do for key, item_buff in pairs(item_buffs.list) do
if not buff.is_active then if not item_buff.is_active then
goto continue goto continue;
end end
table.insert(displayed_buffs, buff); table.insert(_displayed_buffs, item_buff);
::continue:: ::continue::
end end
-- sort for _, melody_effect in pairs(melody_effects.list) do
if cached_config.sorting.type == "Name" then
if cached_config.sorting.reversed_order then if not melody_effect.is_active then
table.sort(displayed_buffs, function(left, right) goto continue2;
end
table.insert(_displayed_buffs, melody_effect);
::continue2::
end
for key, endemic_life_buff in pairs(endemic_life_buff.list) do
if not endemic_life_buff.is_active then
goto continue3;
end
table.insert(_displayed_buffs, endemic_life_buff);
::continue3::
end
for key, skill in pairs(skills.list) do
if not skill.is_active then
goto continue4;
end
table.insert(_displayed_buffs, skill);
::continue4::
end
for key, dango_skill in pairs(dango_skills.list) do
if not dango_skill.is_active then
goto continue5;
end
table.insert(_displayed_buffs, dango_skill);
::continue5::
end
for key, abnormal_status in pairs(abnormal_statuses.list) do
if not abnormal_status.is_active then
goto continue6;
end
table.insert(_displayed_buffs, abnormal_status);
::continue6::
end
for key, otomo_move in pairs(otomo_moves.list) do
if not otomo_move.is_active then
goto continue7;
end
table.insert(_displayed_buffs, otomo_move);
::continue7::
end
for key, weapon_skill in pairs(weapon_skills.list) do
if not weapon_skill.is_active then
goto continue8;
end
table.insert(_displayed_buffs, weapon_skill);
::continue8::
end
for key, rampage_skill in pairs(rampage_skills.list) do
if not rampage_skill.is_active then
goto continue9;
end
table.insert(_displayed_buffs, rampage_skill);
::continue9::
end
for key, misc_buffs in pairs(misc_buffs.list) do
if not misc_buffs.is_active then
goto continue10;
end
table.insert(_displayed_buffs, misc_buffs);
::continue10::
end
displayed_buffs = this.sort_buffs(_displayed_buffs, cached_config);
end
function this.sort_buffs(_displayed_buffs, cached_config)
cached_config = cached_config.sorting;
if cached_config.type == "Name" then
if cached_config.reversed_order then
table.sort(_displayed_buffs, function(left, right)
return left.name > right.name; return left.name > right.name;
end); end);
else else
table.sort(displayed_buffs, function(left, right) table.sort(_displayed_buffs, function(left, right)
return left.name < right.name; return left.name < right.name;
end); end);
end end
elseif cached_config.sorting.type == "Timer" then elseif cached_config.type == "Timer" then
if cached_config.sorting.reversed_order then if cached_config.reversed_order then
table.sort(displayed_buffs, function(left, right) table.sort(_displayed_buffs, function(left, right)
return left.timer > right.timer; return left.timer > right.timer;
end); end);
else else
table.sort(displayed_buffs, function(left, right) table.sort(_displayed_buffs, function(left, right)
return left.timer < right.timer; return left.timer < right.timer;
end); end);
end end
else else
if cached_config.sorting.reversed_order then if cached_config.reversed_order then
table.sort(displayed_buffs, function(left, right) table.sort(_displayed_buffs, function(left, right)
return left.duration > right.duration; return left.duration > right.duration;
end); end);
else else
table.sort(displayed_buffs, function(left, right) table.sort(_displayed_buffs, function(left, right)
return left.duration < right.duration; return left.duration < right.duration;
end); end);
end end
end end
return _displayed_buffs;
end
function this.draw()
local cached_config = config.current_config.buff_UI;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
local position_on_screen = screen.calculate_absolute_coordinates(cached_config.position); local position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
-- draw -- draw
for _, buff in ipairs(displayed_buffs) do for _, buff in ipairs(displayed_buffs) do
if not buff.is_active then
goto continue2
end
buffs.draw(buff, buff.buff_UI, position_on_screen, 1); buffs.draw(buff, buff.buff_UI, position_on_screen, 1);
if cached_config.settings.orientation == "Horizontal" then if cached_config.settings.orientation == "Horizontal" then
@@ -106,13 +217,15 @@ function this.draw()
position_on_screen.y = position_on_screen.y + cached_config.spacing.y * global_scale_modifier; position_on_screen.y = position_on_screen.y + cached_config.spacing.y * global_scale_modifier;
end end
::continue2:: ::continue::
end end
end end
function this.init_module() function this.init_dependencies()
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity"); buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
item_buffs = require("MHR_Overlay.Buffs.item_buffs");
melody_effects = require("MHR_Overlay.Buffs.melody_effects");
buffs = require("MHR_Overlay.Buffs.buffs"); buffs = require("MHR_Overlay.Buffs.buffs");
--singletons = require("MHR_Overlay.Game_Handler.singletons"); --singletons = require("MHR_Overlay.Game_Handler.singletons");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -122,6 +235,19 @@ function this.init_module()
--quest_status = require("MHR_Overlay.Game_Handler.quest_status"); --quest_status = require("MHR_Overlay.Game_Handler.quest_status");
screen = require("MHR_Overlay.Game_Handler.screen"); screen = require("MHR_Overlay.Game_Handler.screen");
--drawing = require("MHR_Overlay.UI.drawing"); --drawing = require("MHR_Overlay.UI.drawing");
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
endemic_life_buff = require("MHR_Overlay.Buffs.endemic_life_buffs");
skills = require("MHR_Overlay.Buffs.skills");
dango_skills = require("MHR_Overlay.Buffs.dango_skills");
abnormal_statuses = require("MHR_Overlay.Buffs.abnormal_statuses");
otomo_moves = require("MHR_Overlay.Buffs.otomo_moves");
weapon_skills = require("MHR_Overlay.Buffs.weapon_skills");
misc_buffs = require("MHR_Overlay.Buffs.misc_buffs");
rampage_skills = require("MHR_Overlay.Buffs.rampage_skills");
end
function this.init_module()
end end
return this; return this;

View File

@@ -10,6 +10,7 @@ local screen;
local drawing; local drawing;
local language; local language;
local utils; local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -43,19 +44,163 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
local top_damage = 0;
local top_dps = 0;
this.displayed_players = {};
this.last_displayed_players = {}; this.last_displayed_players = {};
this.freeze_displayed_players = false; this.freeze_displayed_players = false;
local lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager"); function this.update()
local quest_hunter_info_field = lobby_manager_type_def:get_field("_questHunterInfo"); local is_on_quest = quest_status.flow_state ~= quest_status.flow_states.IN_LOBBY and quest_status.flow_state ~= quest_status.flow_states.IN_TRAINING_AREA;
local hunter_info_field = lobby_manager_type_def:get_field("_hunterInfo"); local cached_config = config.current_config.damage_meter_UI;
local quest_hunter_info_type_def = quest_hunter_info_field:get_type(); if this.freeze_displayed_players and not utils.table.is_empty(this.last_displayed_players) then
local get_count_method = quest_hunter_info_type_def:get_method("get_Count"); this.displayed_players = this.last_displayed_players;
local get_item_method = quest_hunter_info_type_def:get_method("get_Item"); return;
end;
local hunter_info_type_def = sdk.find_type_definition("snow.LobbyManager.HunterInfo"); if players.total.display.total_damage == 0 and cached_config.settings.hide_module_if_total_damage_is_zero then
local member_index_field = hunter_info_type_def:get_field("_memberIndex"); return;
end
this.displayed_players = {};
for id, player in pairs(players.list) do
if player ~= players.myself or cached_config.settings.my_damage_bar_location == "Normal" then
this.add_to_displayed_players_list(player, cached_config);
end
end
if not cached_config.settings.hide_servants then
for id, servant in pairs(non_players.servant_list) do
this.add_to_displayed_players_list(servant, cached_config);
end
end
for id, otomo in pairs(non_players.otomo_list) do
if id == players.myself.id or id == non_players.my_second_otomo_id then
if cached_config.settings.show_my_otomos_separately then
this.add_to_displayed_players_list(otomo, cached_config);
end
elseif id >= 4 then
if cached_config.settings.show_servant_otomos_separately then
this.add_to_displayed_players_list(otomo, cached_config);
end
else
if cached_config.settings.show_other_player_otomos_separately then
this.add_to_displayed_players_list(otomo, cached_config);
end
end
end
this.sort();
this.last_displayed_players = this.displayed_players;
end
function this.calculate_top_damage_and_dps()
top_damage = 0;
top_dps = 0;
for _, player in ipairs(this.displayed_players) do
if player.display.total_damage > top_damage then
top_damage = player.display.total_damage;
end
if player.dps > top_dps then
top_dps = player.dps;
end
end
end
function this.add_to_displayed_players_list(player, cached_config, position)
cached_config = cached_config.settings;
position = position or #(this.displayed_players) + 1;
if player.display.total_damage == 0 and cached_config.hide_player_if_player_damage_is_zero then
return;
end
if player.type == players.types.myself then
if cached_config.hide_myself then
return;
end
elseif player.type == players.types.servant then
if cached_config.hide_servants then
return;
end
elseif player.type == players.types.other_player then
if cached_config.hide_other_players then
return;
end
elseif player.type == players.types.my_otomo then
if not cached_config.show_my_otomos_separately then
return;
end
elseif player.type == players.types.other_player_otomo then
if not cached_config.show_other_player_otomos_separately then
return;
end
elseif player.type == players.types.servant_otomo then
if not cached_config.show_servant_otomos_separately then
return;
end
end
--if position == nil then
-- table.insert(this.displayed_players, player);
--else
table.insert(this.displayed_players, position, player);
--end
end
function this.sort()
local cached_config = config.current_config.damage_meter_UI;
if cached_config.settings.my_damage_bar_location == "Normal" then
table.insert(this.displayed_players, this.myself);
end
-- sort here
if cached_config.sorting.type == "Normal" then
if cached_config.sorting.reversed_order then
table.sort(this.displayed_players, function(left, right)
return left.id > right.id;
end);
else
table.sort(this.displayed_players, function(left, right)
return left.id < right.id;
end);
end
elseif cached_config.sorting.type == "DPS" then
if cached_config.sorting.reversed_order then
table.sort(this.displayed_players, function(left, right)
return left.dps < right.dps;
end);
else
table.sort(this.displayed_players, function(left, right)
return left.dps > right.dps;
end);
end
else
if cached_config.sorting.reversed_order then
table.sort(this.displayed_players, function(left, right)
return left.display.total_damage < right.display.total_damage;
end);
else
table.sort(this.displayed_players, function(left, right)
return left.display.total_damage > right.display.total_damage;
end);
end
end
if cached_config.settings.my_damage_bar_location == "First" then
this.add_to_displayed_players_list(players.myself, cached_config, 1);
elseif cached_config.settings.my_damage_bar_location == "Last" then
this.add_to_displayed_players_list(players.myself, cached_config);
end
end
function this.draw() function this.draw()
local cached_config = config.current_config.damage_meter_UI; local cached_config = config.current_config.damage_meter_UI;
@@ -65,46 +210,21 @@ function this.draw()
return; return;
end end
local quest_players = {}; this.calculate_top_damage_and_dps();
if this.freeze_displayed_players and not utils.table.is_empty(this.last_displayed_players) then
quest_players = this.last_displayed_players;
else
quest_players = players.display_list;
end
this.last_displayed_players = quest_players;
local top_damage = 0;
local top_dps = 0;
for _, player in ipairs(quest_players) do
if player.display.total_damage > top_damage then
top_damage = player.display.total_damage;
end
if player.dps > top_dps then
top_dps = player.dps;
end
end
local position_on_screen = screen.calculate_absolute_coordinates(cached_config.position); local position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
-- draw total damage -- draw total damage
if cached_config.settings.total_damage_location == "First" then if cached_config.settings.total_damage_location == "First"
if cached_config.settings.hide_total_damage then and not cached_config.settings.hide_total_damage then
return; if not (cached_config.settings.hide_total_if_total_damage_is_zero and players.total.display.total_damage == 0) then
end players.draw(players.total, position_on_screen, 1);
if cached_config.settings.hide_total_if_total_damage_is_zero and players.total.display.total_damage == 0 then if cached_config.settings.orientation == "Horizontal" then
return; position_on_screen.x = position_on_screen.x + cached_config.spacing.x * global_scale_modifier;
end else
position_on_screen.y = position_on_screen.y + cached_config.spacing.y * global_scale_modifier;
players.draw(players.total, position_on_screen, 1, top_damage, top_dps); end
if cached_config.settings.orientation == "Horizontal" then
position_on_screen.x = position_on_screen.x + cached_config.spacing.x * global_scale_modifier;
else
position_on_screen.y = position_on_screen.y + cached_config.spacing.y * global_scale_modifier;
end end
end end
@@ -113,37 +233,7 @@ function this.draw()
position_on_screen = screen.calculate_absolute_coordinates(cached_config.position); position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
end end
for _, player in ipairs(quest_players) do for _, player in ipairs(this.displayed_players) do
if player.display.total_damage == 0 and cached_config.settings.hide_player_if_player_damage_is_zero then
goto continue
end
if player.type == players.types.myself then
if cached_config.settings.hide_myself then
goto continue
end
elseif player.type == players.types.servant then
if cached_config.settings.hide_servants then
goto continue
end
elseif player.type == players.types.other_player then
if cached_config.settings.hide_other_players then
goto continue
end
elseif player.type == players.types.my_otomo then
if not cached_config.settings.show_my_otomos_separately then
goto continue
end
elseif player.type == players.types.other_player_otomo then
if not cached_config.settings.show_other_player_otomos_separately then
goto continue
end
elseif player.type == players.types.servant_otomo then
if not cached_config.settings.show_servant_otomos_separately then
goto continue
end
end
players.draw(player, position_on_screen, 1, top_damage, top_dps); players.draw(player, position_on_screen, 1, top_damage, top_dps);
@@ -154,28 +244,24 @@ function this.draw()
end end
::continue:: ::continue::
end end
-- draw total damage -- draw total damage
if cached_config.settings.total_damage_location == "Last" then if cached_config.settings.total_damage_location == "Last"
if cached_config.settings.hide_total_damage then and not cached_config.settings.hide_total_damage then
return;
end
if cached_config.settings.hide_total_if_total_damage_is_zero and players.total.display.total_damage == 0 then if not (cached_config.settings.hide_total_if_total_damage_is_zero and players.total.display.total_damage == 0) then
return;
end
if not cached_config.settings.total_damage_offset_is_relative then if not cached_config.settings.total_damage_offset_is_relative then
position_on_screen = screen.calculate_absolute_coordinates(cached_config.position); position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
end end
players.draw(players.total, position_on_screen, 1); players.draw(players.total, position_on_screen, 1);
end
end end
end end
function this.init_module() function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
@@ -186,6 +272,10 @@ function this.init_module()
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -11,6 +11,8 @@ local health_UI_entity;
local stamina_UI_entity; local stamina_UI_entity;
local rage_UI_entity; local rage_UI_entity;
local env_creature; local env_creature;
local error_handler;
local utils;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -44,48 +46,58 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
local enemy_manager_type_def = sdk.find_type_definition("snow.enemy.EnemyManager"); local displayed_creatures = {};
function this.draw() function this.update()
if singletons.enemy_manager == nil then local cached_config = config.current_config.endemic_life_UI;
local _displayed_creatures = {};
if utils.number.is_equal(cached_config.settings.max_distance, 0) then
displayed_creatures = {};
return; return;
end end
for REcreature, creature in pairs(env_creature.list) do
if cached_config.settings.hide_inactive_creatures and creature.is_inactive then
goto continue;
end
creature.distance = (players.myself_position - creature.position):length();
if creature.distance > cached_config.settings.max_distance then
goto continue;
end
table.insert(_displayed_creatures, creature);
::continue::
end
displayed_creatures = _displayed_creatures;
end
function this.draw()
local cached_config = config.current_config.endemic_life_UI; local cached_config = config.current_config.endemic_life_UI;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier; local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
for REcreature, creature in pairs(env_creature.list) do for i, creature in ipairs(displayed_creatures) do
local world_offset = Vector3f.new(
cached_config.world_offset.x,
cached_config.world_offset.y,
cached_config.world_offset.z
);
if cached_config.settings.max_distance == 0 then local position_on_screen = draw.world_to_screen(creature.position + world_offset);
break
end
if cached_config.settings.hide_inactive_creatures and creature.is_inactive then
goto continue
end
local position_on_screen = {};
local world_offset = Vector3f.new(cached_config.world_offset.x, cached_config.world_offset.y,
cached_config.world_offset.z);
position_on_screen = draw.world_to_screen(creature.position + world_offset);
if position_on_screen == nil then if position_on_screen == nil then
goto continue goto continue;
end end
position_on_screen.x = position_on_screen.x + cached_config.viewport_offset.x * global_scale_modifier; position_on_screen.x = position_on_screen.x + cached_config.viewport_offset.x * global_scale_modifier;
position_on_screen.y = position_on_screen.y + cached_config.viewport_offset.y * global_scale_modifier; position_on_screen.y = position_on_screen.y + cached_config.viewport_offset.y * global_scale_modifier;
creature.distance = (players.myself_position - creature.position):length();
local opacity_scale = 1; local opacity_scale = 1;
if creature.distance > cached_config.settings.max_distance then
goto continue
end
if cached_config.settings.opacity_falloff then if cached_config.settings.opacity_falloff then
creature.distance = (players.myself_position - creature.position):length();
opacity_scale = 1 - (creature.distance / cached_config.settings.max_distance); opacity_scale = 1 - (creature.distance / cached_config.settings.max_distance);
end end
@@ -94,7 +106,7 @@ function this.draw()
end end
end end
function this.init_module() function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
@@ -106,6 +118,11 @@ function this.init_module()
stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity"); stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity");
rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity"); rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature"); env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
error_handler = require("MHR_Overlay.Misc.error_handler");
utils = require("MHR_Overlay.Misc.utils");
end
function this.init_module()
end end
return this; return this;

View File

@@ -10,6 +10,8 @@ local drawing;
local health_UI_entity; local health_UI_entity;
local stamina_UI_entity; local stamina_UI_entity;
local rage_UI_entity; local rage_UI_entity;
local error_handler;
local utils;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -53,246 +55,319 @@ local get_tg_camera_method = gui_manager_type_def:get_method("get_refGuiHud_TgCa
local tg_camera_type_def = get_tg_camera_method:get_return_type(); local tg_camera_type_def = get_tg_camera_method:get_return_type();
local get_targeting_enemy_index_field = tg_camera_type_def:get_field("OldTargetingEmIndex"); local get_targeting_enemy_index_field = tg_camera_type_def:get_field("OldTargetingEmIndex");
function this.draw(dynamic_enabled, static_enabled, highlighted_enabled) local large_monster_list = {};
local displayed_dynamic_monsters = {};
local displayed_static_monsters = {};
local highlighted_monster = nil;
function this.update(dynamic_enabled, static_enabled, highlighted_enabled)
local cached_config = config.current_config.large_monster_UI; local cached_config = config.current_config.large_monster_UI;
if singletons.enemy_manager == nil then if singletons.enemy_manager == nil then
error_handler.report("large_monster_UI.update", "Failed to access Data: enemy_manager");
return; return;
end end
local displayed_monsters = {}; large_monster_list = {};
local update_distance =
dynamic_enabled or cached_config.static.sorting.type == "Distance"
or (cached_config.highlighted.auto_highlight.enabled
and (cached_config.highlighted.auto_highlight.mode == "Closest" or cached_config.highlighted.auto_highlight.mode == "Furthest")
);
local highlighted_id = -1;
local monster_id_shift = 0;
local highlighted_monster = nil;
if not cached_config.highlighted.auto_highlight.enabled and singletons.gui_manager ~= nil then
local gui_hud_target_camera = get_tg_camera_method:call(singletons.gui_manager);
if gui_hud_target_camera ~= nil then
highlighted_id = get_targeting_enemy_index_field:get_data(gui_hud_target_camera);
if highlighted_id == nil then
highlighted_id = -1;
end
end
end
local enemy_count = get_boss_enemy_count_method:call(singletons.enemy_manager); local enemy_count = get_boss_enemy_count_method:call(singletons.enemy_manager);
if enemy_count == nil then if enemy_count == nil then
error_handler.report("large_monster_UI.update", "Failed to access Data: enemy_count");
return; return;
end end
for i = 0, enemy_count - 1 do for i = 0, enemy_count - 1 do
local enemy = get_boss_enemy_method:call(singletons.enemy_manager, i); local enemy = get_boss_enemy_method:call(singletons.enemy_manager, i);
if enemy == nil then if enemy == nil then
customization_menu.status = "No enemy"; error_handler.report("large_monster_UI.update", "Failed to access Data: enemy No. " .. tostring(i));
goto continue goto continue;
end end
local monster = large_monster.list[enemy]; local monster = large_monster.get_monster(enemy);
if monster == nil then if monster == nil then
customization_menu.status = "No large monster entry"; error_handler.report("large_monster_UI.update", "Failed to create Large Monster Entry No. " .. tostring(i));
goto continue goto continue;
end end
if update_distance then monster.distance = (players.myself_position - monster.position):length();
monster.distance = (players.myself_position - monster.position):length();
end
if cached_config.highlighted.auto_highlight.enabled then table.insert(large_monster_list, monster);
if highlighted_monster == nil then
highlighted_monster = monster;
elseif cached_config.highlighted.auto_highlight.mode == "Farthest" then
if monster.distance > highlighted_monster.distance then
highlighted_monster = monster;
end
elseif cached_config.highlighted.auto_highlight.mode == "Lowest Health" then
if monster.health < highlighted_monster.health then
highlighted_monster = monster;
end
elseif cached_config.highlighted.auto_highlight.mode == "Highest Health" then
if monster.health > highlighted_monster.health then
highlighted_monster = monster;
end
elseif cached_config.highlighted.auto_highlight.mode == "Lowest Health Percentage" then
if monster.health_percentage < highlighted_monster.health_percentage then
highlighted_monster = monster;
end
elseif cached_config.highlighted.auto_highlight.mode == "Highest Health Percentage" then
if monster.health_percentage > highlighted_monster.health_percentage then
highlighted_monster = monster;
end
else
if monster.distance < highlighted_monster.distance then
highlighted_monster = monster;
end
end
else
if monster.dead_or_captured or not monster.is_disp_icon_mini_map then
monster_id_shift = monster_id_shift + 1;
elseif i == highlighted_id + monster_id_shift then
highlighted_monster = monster;
end
end
table.insert(displayed_monsters, monster);
::continue:: ::continue::
end end
if dynamic_enabled then if dynamic_enabled then
local success = pcall(this.draw_dynamic, displayed_monsters, highlighted_monster, cached_config); this.update_dynamic_monsters(large_monster_list, cached_config);
end
if static_enabled then
this.update_static_monsters(large_monster_list, cached_config);
end
end
function this.update_dynamic_monsters(large_monster_list, cached_config)
if not cached_config.dynamic.enabled then
displayed_dynamic_monsters = {};
return;
end
local dynamic_cached_config = cached_config.dynamic.settings;
local _displayed_dynamic_monsters = {};
if utils.number.is_equal(dynamic_cached_config.max_distance, 0) then
displayed_dynamic_monsters = {};
return;
end
for i, monster in ipairs(large_monster_list) do
if monster.distance > dynamic_cached_config.max_distance then
goto continue;
end
if monster.is_stealth then
goto continue;
end
if monster.dead_or_captured and dynamic_cached_config.hide_dead_or_captured then
goto continue;
end
if monster == highlighted_monster then
if not dynamic_cached_config.render_highlighted_monster then
goto continue;
end
else
if not dynamic_cached_config.render_not_highlighted_monsters then
goto continue;
end
end
table.insert(_displayed_dynamic_monsters, monster);
::continue::
end
displayed_dynamic_monsters = _displayed_dynamic_monsters;
end
function this.update_static_monsters(large_monster_list, cached_config)
if not cached_config.static.enabled then
displayed_static_monsters = {};
return;
end
local static_cached_config = cached_config.static.settings;
local _displayed_static_monsters = {};
for i, monster in ipairs(large_monster_list) do
if monster.is_stealth then
goto continue;
end
if monster.dead_or_captured and static_cached_config.hide_dead_or_captured then
goto continue;
end
if monster == highlighted_monster then
if not static_cached_config.render_highlighted_monster then
goto continue;
end
else
if not static_cached_config.render_not_highlighted_monsters then
goto continue;
end
end
table.insert(_displayed_static_monsters, monster);
::continue::
end
displayed_static_monsters = this.sort_static_monsters(_displayed_static_monsters, cached_config);
end
function this.sort_static_monsters(_displayed_static_monsters, cached_config)
cached_config = cached_config.static.sorting;
-- sort here
if cached_config.type == "Normal" and cached_config.reversed_order then
local reversed_monsters = {};
for i = #_displayed_static_monsters, 1, -1 do
table.insert(reversed_monsters, _displayed_static_monsters[i]);
end
_displayed_static_monsters = reversed_monsters;
elseif cached_config.type == "Health" then
if cached_config.reversed_order then
table.sort(_displayed_static_monsters, function(left, right)
return left.health > right.health;
end);
else
table.sort(_displayed_static_monsters, function(left, right)
return left.health < right.health;
end);
end
elseif cached_config.type == "Health Percentage" then
if cached_config.reversed_order then
table.sort(_displayed_static_monsters, function(left, right)
return left.health_percentage > right.health_percentage;
end);
else
table.sort(_displayed_static_monsters, function(left, right)
return left.health_percentage < right.health_percentage;
end);
end
elseif cached_config.type == "Distance" then
if cached_config.reversed_order then
table.sort(_displayed_static_monsters, function(left, right)
return left.distance > right.distance;
end);
else
table.sort(_displayed_static_monsters, function(left, right)
return left.distance < right.distance;
end);
end
end
return _displayed_static_monsters;
end
function this.update_highlighted_monster(large_monster_list, autohighlight_config)
local monster_id_shift = 0;
local _highlighted_monster = nil;
large_monster.update_highlighted_id();
if large_monster.highlighted_id == -1 then
highlighted_monster = nil;
return;
end
for i, monster in ipairs(large_monster_list) do
if monster.dead_or_captured or not monster.is_disp_icon_mini_map then
monster_id_shift = monster_id_shift + 1;
goto continue;
end
if not autohighlight_config.enabled then
if i - 1 == large_monster.highlighted_id + monster_id_shift then
_highlighted_monster = monster;
goto continue;
end
goto continue;
end
if _highlighted_monster == nil then
_highlighted_monster = monster;
goto continue;
end
if autohighlight_config.mode == "Farthest" and monster.distance > _highlighted_monster.distance then
_highlighted_monster = monster;
goto continue;
end
if autohighlight_config.mode == "Lowest Health" and monster.health < _highlighted_monster.health then
_highlighted_monster = monster;
goto continue;
end
if autohighlight_config.mode == "Highest Health" and monster.health > _highlighted_monster.health then
_highlighted_monster = monster;
goto continue;
end
if autohighlight_config.mode == "Lowest Health Percentage" and monster.health_percentage < _highlighted_monster.health_percentage then
_highlighted_monster = monster;
goto continue;
end
if autohighlight_config.mode == "Highest Health Percentage" and monster.health_percentage > _highlighted_monster.health_percentage then
_highlighted_monster = monster;
goto continue;
end
if monster.distance < _highlighted_monster.distance then
_highlighted_monster = monster;
end
::continue::
end
highlighted_monster = _highlighted_monster;
end
function this.draw(dynamic_enabled, static_enabled, highlighted_enabled)
local cached_config = config.current_config.large_monster_UI;
this.update_highlighted_monster(large_monster_list, cached_config.highlighted.auto_highlight);
if dynamic_enabled then
local success = pcall(this.draw_dynamic, cached_config);
if not success then if not success then
customization_menu.status = string.format("[%s] Dynamic Large Monster drawing function threw an exception"); error_handler.report("large_monster_UI.draw", "Dynamic Large Monster drawing function threw an exception");
end end
end end
if highlighted_enabled then if highlighted_enabled then
local success = pcall(this.draw_highlighted, highlighted_monster, cached_config); local success = pcall(this.draw_highlighted, cached_config);
if not success then if not success then
customization_menu.status = string.format("[%s] Highlighted Large Monster drawing function threw an exception"); error_handler.report("large_monster_UI.draw", "Highlighted Large Monster drawing function threw an exception");
end end
end end
if static_enabled then if static_enabled then
local success = pcall(this.draw_static, displayed_monsters, highlighted_monster, cached_config); local success = pcall(this.draw_static, cached_config);
if not success then if not success then
customization_menu.status = string.format("[%s] Static Large Monster drawing function threw an exception"); error_handler.report("large_monster_UI.draw", "Static Large Monster drawing function threw an exception");
end end
end end
end end
function this.draw_dynamic(displayed_monsters, highlighted_monster, cached_config) function this.draw_dynamic(cached_config)
cached_config = cached_config.dynamic; cached_config = cached_config.dynamic;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier; local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
local i = 0; local i = 0;
for _, monster in ipairs(displayed_monsters) do for _, monster in ipairs(displayed_dynamic_monsters) do
if cached_config.settings.max_distance == 0 then
break
end
if monster.is_stealth then
goto continue
end
if monster.dead_or_captured and cached_config.settings.hide_dead_or_captured then
goto continue
end
if monster == highlighted_monster then
if not cached_config.settings.render_highlighted_monster then
goto continue
end
else
if not cached_config.settings.render_not_highlighted_monsters then
goto continue
end
end
local position_on_screen = {};
local world_offset = Vector3f.new(cached_config.world_offset.x, cached_config.world_offset.y, cached_config.world_offset.z); local world_offset = Vector3f.new(cached_config.world_offset.x, cached_config.world_offset.y, cached_config.world_offset.z);
local position_on_screen = draw.world_to_screen(monster.position + world_offset);
position_on_screen = draw.world_to_screen(monster.position + world_offset);
if position_on_screen == nil then if position_on_screen == nil then
goto continue goto continue;
end end
position_on_screen.x = position_on_screen.x + cached_config.viewport_offset.x * global_scale_modifier; position_on_screen.x = position_on_screen.x + cached_config.viewport_offset.x * global_scale_modifier;
position_on_screen.y = position_on_screen.y + cached_config.viewport_offset.y * global_scale_modifier; position_on_screen.y = position_on_screen.y + cached_config.viewport_offset.y * global_scale_modifier;
local opacity_scale = 1; local opacity_scale = 1;
if monster.distance > cached_config.settings.max_distance then
goto continue
end
if cached_config.settings.opacity_falloff then if cached_config.settings.opacity_falloff then
monster.distance = (players.myself_position - monster.position):length();
opacity_scale = 1 - (monster.distance / cached_config.settings.max_distance); opacity_scale = 1 - (monster.distance / cached_config.settings.max_distance);
end end
large_monster.draw(monster, "dynamic", cached_config, position_on_screen, opacity_scale); large_monster.draw(monster, "dynamic_UI", cached_config, position_on_screen, opacity_scale);
i = i + 1; i = i + 1;
::continue:: ::continue::
end end
end end
function this.draw_static(displayed_monsters, highlighted_monster, cached_config) function this.draw_static(cached_config)
cached_config = cached_config.static; cached_config = cached_config.static;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier; local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
-- sort here
if cached_config.sorting.type == "Normal" and cached_config.sorting.reversed_order then
local reversed_monsters = {};
for i = #displayed_monsters, 1, -1 do
table.insert(reversed_monsters, displayed_monsters[i]);
end
displayed_monsters = reversed_monsters;
elseif cached_config.sorting.type == "Health" then
if cached_config.sorting.reversed_order then
table.sort(displayed_monsters, function(left, right)
return left.health > right.health;
end);
else
table.sort(displayed_monsters, function(left, right)
return left.health < right.health;
end);
end
elseif cached_config.sorting.type == "Health Percentage" then
if cached_config.sorting.reversed_order then
table.sort(displayed_monsters, function(left, right)
return left.health_percentage > right.health_percentage;
end);
else
table.sort(displayed_monsters, function(left, right)
return left.health_percentage < right.health_percentage;
end);
end
elseif cached_config.sorting.type == "Distance" then
if cached_config.sorting.reversed_order then
table.sort(displayed_monsters, function(left, right)
return left.distance > right.distance;
end);
else
table.sort(displayed_monsters, function(left, right)
return left.distance < right.distance;
end);
end
end
local position_on_screen = screen.calculate_absolute_coordinates(cached_config.position); local position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
local i = 0; local i = 0;
for _, monster in ipairs(displayed_monsters) do for _, monster in ipairs(displayed_static_monsters) do
if monster.dead_or_captured and cached_config.settings.hide_dead_or_captured then
goto continue
end
if monster == highlighted_monster then
if not cached_config.settings.render_highlighted_monster then
goto continue
end
else
if not cached_config.settings.render_not_highlighted_monsters then
goto continue
end
end
local monster_position_on_screen = { local monster_position_on_screen = {
x = position_on_screen.x, x = position_on_screen.x,
y = position_on_screen.y y = position_on_screen.y
@@ -304,30 +379,26 @@ function this.draw_static(displayed_monsters, highlighted_monster, cached_config
monster_position_on_screen.y = monster_position_on_screen.y + cached_config.spacing.y * i * global_scale_modifier; monster_position_on_screen.y = monster_position_on_screen.y + cached_config.spacing.y * i * global_scale_modifier;
end end
large_monster.draw(monster, "static", cached_config, monster_position_on_screen, 1); large_monster.draw(monster, "static_UI", cached_config, monster_position_on_screen, 1);
i = i + 1; i = i + 1;
::continue:: ::continue::
end end
end end
function this.draw_highlighted(monster, cached_config) function this.draw_highlighted(cached_config)
cached_config = cached_config.highlighted; if highlighted_monster == nil then
if monster == nil then
return; return;
end end
cached_config = cached_config.highlighted;
local position_on_screen = screen.calculate_absolute_coordinates(cached_config.position); local position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
if monster.dead_or_captured then large_monster.draw(highlighted_monster, "highlighted_UI", cached_config, position_on_screen, 1);
return;
end
large_monster.draw(monster, "highlighted", cached_config, position_on_screen, 1);
end end
function this.init_module() function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
@@ -338,6 +409,11 @@ function this.init_module()
health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_UI_entity"); health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_UI_entity");
stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity"); stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity");
rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity"); rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity");
error_handler = require("MHR_Overlay.Misc.error_handler");
utils = require("MHR_Overlay.Misc.utils");
end
function this.init_module()
end end
return this; return this;

View File

@@ -9,6 +9,8 @@ local players;
local drawing; local drawing;
local health_UI_entity; local health_UI_entity;
local stamina_UI_entity; local stamina_UI_entity;
local error_handler;
local utils;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -46,105 +48,101 @@ local enemy_manager_type_def = sdk.find_type_definition("snow.enemy.EnemyManager
local get_zako_enemy_count_method = enemy_manager_type_def:get_method("getZakoEnemyCount"); local get_zako_enemy_count_method = enemy_manager_type_def:get_method("getZakoEnemyCount");
local get_zako_enemy_method = enemy_manager_type_def:get_method("getZakoEnemy"); local get_zako_enemy_method = enemy_manager_type_def:get_method("getZakoEnemy");
function this.draw() local displayed_monsters = {};
if singletons.enemy_manager == nil then
return;
end
function this.update()
local cached_config = config.current_config.small_monster_UI; local cached_config = config.current_config.small_monster_UI;
local displayed_monsters = {}; if cached_config.dynamic_positioning.enabled and utils.number.is_equal(cached_config.dynamic_positioning.max_distance, 0) then
displayed_monsters = {};
local enemy_count = get_zako_enemy_count_method:call(singletons.enemy_manager);
if enemy_count == nil then
customization_menu.status = "No enemy count";
return; return;
end end
for i = 0, enemy_count - 1 do local _displayed_monsters = {};
local enemy = get_zako_enemy_method:call(singletons.enemy_manager, i);
if enemy == nil then
customization_menu.status = "No enemy";
goto continue
end
local monster = small_monster.list[enemy]; for enemy, monster in pairs(small_monster.list) do
if monster == nil then
customization_menu.status = "No small monster entry";
goto continue
end
if monster.dead_or_captured and cached_config.settings.hide_dead_or_captured then if monster.dead_or_captured and cached_config.settings.hide_dead_or_captured then
goto continue goto continue;
end end;
table.insert(displayed_monsters, monster); monster.distance = (players.myself_position - monster.position):length();
if monster.distance > cached_config.dynamic_positioning.max_distance then
goto continue;
end
table.insert(_displayed_monsters, monster);
::continue:: ::continue::
end end
if cached_config.dynamic_positioning.enabled displayed_monsters = this.sort_monsters(_displayed_monsters, cached_config);
or (not cached_config.dynamic_positioning.enabled and cached_config.static_sorting.type == "Distance") then end
for _, monster in ipairs(displayed_monsters) do
monster.distance = (players.myself_position - monster.position):length();
end
end
function this.sort_monsters(_displayed_monsters, cached_config)
if not cached_config.dynamic_positioning.enabled then if not cached_config.dynamic_positioning.enabled then
-- sort here
if cached_config.static_sorting.type == "Normal" and cached_config.static_sorting.reversed_order then if cached_config.static_sorting.type == "Normal" and cached_config.static_sorting.reversed_order then
local reversed_monsters = {}; local reversed_monsters = {};
for i = #displayed_monsters, 1, -1 do for i = #_displayed_monsters, 1, -1 do
table.insert(reversed_monsters, displayed_monsters[i]); table.insert(reversed_monsters, _displayed_monsters[i]);
end end
displayed_monsters = reversed_monsters; _displayed_monsters = reversed_monsters;
elseif cached_config.static_sorting.type == "Health" then elseif cached_config.static_sorting.type == "Health" then
if cached_config.static_sorting.reversed_order then if cached_config.static_sorting.reversed_order then
table.sort(displayed_monsters, function(left, right) table.sort(_displayed_monsters, function(left, right)
return left.health > right.health; return left.health > right.health;
end); end);
else else
table.sort(displayed_monsters, function(left, right) table.sort(_displayed_monsters, function(left, right)
return left.health < right.health; return left.health < right.health;
end); end);
end end
elseif cached_config.static_sorting.type == "Health Percentage" then elseif cached_config.static_sorting.type == "Health Percentage" then
if cached_config.static_sorting.reversed_order then if cached_config.static_sorting.reversed_order then
table.sort(displayed_monsters, function(left, right) table.sort(_displayed_monsters, function(left, right)
return left.health_percentage > right.health_percentage; return left.health_percentage > right.health_percentage;
end); end);
else else
table.sort(displayed_monsters, function(left, right) table.sort(_displayed_monsters, function(left, right)
return left.health_percentage < right.health_percentage; return left.health_percentage < right.health_percentage;
end); end);
end end
elseif cached_config.static_sorting.type == "Distance" then elseif cached_config.static_sorting.type == "Distance" then
if cached_config.static_sorting.reversed_order then if cached_config.static_sorting.reversed_order then
table.sort(displayed_monsters, function(left, right) table.sort(_displayed_monsters, function(left, right)
return left.distance > right.distance; return left.distance > right.distance;
end); end);
else else
table.sort(displayed_monsters, function(left, right) table.sort(_displayed_monsters, function(left, right)
return left.distance < right.distance; return left.distance < right.distance;
end); end);
end end
end end
end end
return _displayed_monsters;
end
function this.draw()
local cached_config = config.current_config.small_monster_UI;
local is_dynamic_positioning_enabled = cached_config.dynamic_positioning.enabled;
local i = 0; local i = 0;
for _, monster in ipairs(displayed_monsters) do for _, monster in ipairs(displayed_monsters) do
local position_on_screen; local position_on_screen;
if cached_config.dynamic_positioning.enabled then if is_dynamic_positioning_enabled then
local world_offset = Vector3f.new(cached_config.dynamic_positioning.world_offset.x, local world_offset = Vector3f.new(
cached_config.dynamic_positioning.world_offset.x,
cached_config.dynamic_positioning.world_offset.y, cached_config.dynamic_positioning.world_offset.y,
cached_config.dynamic_positioning.world_offset.z); cached_config.dynamic_positioning.world_offset.z
);
position_on_screen = draw.world_to_screen(monster.position + world_offset); position_on_screen = draw.world_to_screen(monster.position + world_offset);
if position_on_screen == nil then if position_on_screen == nil then
goto continue goto continue;
end end
position_on_screen.x = position_on_screen.x + cached_config.dynamic_positioning.viewport_offset.x; position_on_screen.x = position_on_screen.x + cached_config.dynamic_positioning.viewport_offset.x;
@@ -153,32 +151,17 @@ function this.draw()
position_on_screen = screen.calculate_absolute_coordinates(cached_config.static_position); position_on_screen = screen.calculate_absolute_coordinates(cached_config.static_position);
if cached_config.settings.orientation == "Horizontal" then if cached_config.settings.orientation == "Horizontal" then
position_on_screen.x = position_on_screen.x + cached_config.static_spacing.x * i; position_on_screen.x = position_on_screen.x + cached_config.static_spacing.x * i;
else else
position_on_screen.y = position_on_screen.y + cached_config.static_spacing.y * i; position_on_screen.y = position_on_screen.y + cached_config.static_spacing.y * i;
end end
end end
local opacity_scale = 1; local opacity_scale = 1;
if cached_config.dynamic_positioning.enabled then if is_dynamic_positioning_enabled and cached_config.dynamic_positioning.opacity_falloff then
if cached_config.dynamic_positioning.max_distance == 0 then monster.distance = (players.myself_position - monster.position):length();
return; opacity_scale = 1 - (monster.distance / cached_config.dynamic_positioning.max_distance);
end
if monster.distance > cached_config.dynamic_positioning.max_distance then
goto continue
end
if cached_config.dynamic_positioning.opacity_falloff then
opacity_scale = 1 - (monster.distance / cached_config.dynamic_positioning.max_distance);
end
end end
small_monster.draw(monster, cached_config, position_on_screen, opacity_scale); small_monster.draw(monster, cached_config, position_on_screen, opacity_scale);
i = i + 1; i = i + 1;
@@ -186,7 +169,7 @@ function this.draw()
end end
end end
function this.init_module() function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
@@ -196,6 +179,11 @@ function this.init_module()
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_UI_entity"); health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_UI_entity");
stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity"); stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity");
error_handler = require("MHR_Overlay.Misc.error_handler");
utils = require("MHR_Overlay.Misc.utils");
end
function this.init_module()
end end
return this; return this;

View File

@@ -0,0 +1,322 @@
local this = {};
local buff_UI_entity;
local config;
local buffs;
local item_buffs;
local melody_effects;
local endemic_life_buff;
local screen;
local utils;
local error_handler;
local skills;
local dango_skills;
local abnormal_statuses;
local drawing;
local player_info;
local language;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.label_list = {
attack = nil,
defense = nil,
fire_resistance = nil,
water_resistance = nil,
thunder_resistance = nil,
ice_resistance = nil,
dragon_resistance = nil
};
this.affinity_label = nil;
this.health_label = nil;
this.stamina_label = nil;
this.element_label = nil;
this.element_2_label = nil;
function this.draw()
local cached_config = config.current_config.stats_UI;
if not cached_config.enabled then
return;
end
local cached_names = language.current_language.stats;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
local position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
-- draw
for label_key, label in pairs(this.label_list) do
local name_text = "";
if label.include.name then
if label.include.value then
name_text = string.format("%s: ", cached_names[label_key]);
else
name_text = string.format("%s", cached_names[label_key]);
end
end
if label.include.value then
name_text = string.format("%s%s", name_text, tostring(player_info.list[label_key]));
end
drawing.draw_label(label, position_on_screen, 1, name_text);
::continue::
end
-- Health Label
local health_name_text = "";
if this.health_label.include.name then
health_name_text = string.format("%s: ", language.current_language.customization_menu.health);
if this.health_label.include.value or this.health_label.include.max_value then
health_name_text = string.format("%s: ", language.current_language.customization_menu.health);
else
health_name_text = string.format("%s", language.current_language.customization_menu.health);
end
end
if this.health_label.include.value and not this.health_label.include.max_value then
health_name_text = string.format("%s%s", health_name_text, tostring(player_info.list.health));
elseif not this.health_label.include.value and this.health_label.include.max_value then
health_name_text = string.format("%s%s", health_name_text, tostring(player_info.list.max_health));
elseif this.health_label.include.value and this.health_label.include.max_value then
health_name_text = string.format("%s%s/%s", health_name_text, tostring(player_info.list.health), tostring(player_info.list.max_health));
end
drawing.draw_label(this.health_label, position_on_screen, 1, health_name_text);
-- Stamina Label
local stamina_name_text = "";
if this.stamina_label.include.name then
if this.stamina_label.include.value or this.stamina_label.include.max_value then
stamina_name_text = string.format("%s: ", cached_names.stamina);
else
stamina_name_text = string.format("%s", cached_names.stamina);
end
end
if this.stamina_label.include.value and not this.stamina_label.include.max_value then
stamina_name_text = string.format("%s%s", stamina_name_text, tostring(player_info.list.stamina));
elseif not this.stamina_label.include.value and this.stamina_label.include.max_value then
stamina_name_text = string.format("%s%s", stamina_name_text, tostring(player_info.list.max_stamina));
elseif this.stamina_label.include.value and this.stamina_label.include.max_value then
stamina_name_text = string.format("%s%s/%s", stamina_name_text, tostring(player_info.list.stamina), tostring(player_info.list.max_stamina));
end
drawing.draw_label(this.stamina_label, position_on_screen, 1, stamina_name_text);
-- Affinity Label
local affinity_name_text = "";
if this.affinity_label.include.name then
if this.affinity_label.include.value then
affinity_name_text = string.format("%s: ", cached_names.affinity);
else
affinity_name_text = string.format("%s", cached_names.affinity);
end
end
if this.affinity_label.include.value then
affinity_name_text = string.format("%s%s%%", affinity_name_text, tostring(player_info.list.affinity));
end
drawing.draw_label(this.affinity_label, position_on_screen, 1, affinity_name_text);
-- Element Label
if player_info.list.element_type ~= 0 then
local element_name_text = "";
if this.element_label.include.name then
local ailment_names = language.current_language.ailments;
local ailment_name = "";
if player_info.list.element_type == 1 then
ailment_name = cached_names.fire;
elseif player_info.list.element_type == 2 then
ailment_name = cached_names.water;
elseif player_info.list.element_type == 3 then
ailment_name = cached_names.thunder;
elseif player_info.list.element_type == 4 then
ailment_name = cached_names.ice;
elseif player_info.list.element_type == 5 then
ailment_name = cached_names.dragon;
elseif player_info.list.element_type == 6 then
ailment_name = ailment_names.poison;
elseif player_info.list.element_type == 7 then
ailment_name = ailment_names.sleep;
elseif player_info.list.element_type == 8 then
ailment_name = ailment_names.paralysis;
elseif player_info.list.element_type == 9 then
ailment_name = ailment_names.blast;
end
if this.element_label.include.value then
element_name_text = string.format("%s: ", ailment_name);
else
element_name_text = string.format("%s", ailment_name);
end
end
if this.element_label.include.value then
element_name_text = string.format("%s%s", element_name_text, tostring(player_info.list.element_attack));
end
drawing.draw_label(this.element_label, position_on_screen, 1, element_name_text);
end
-- Element 2 Label
if player_info.list.element_type_2 ~= 0 then
local element_2_name_text = "";
if this.element_2_label.include.name then
local ailment_names = language.current_language.ailments;
local ailment_name = "";
if player_info.list.element_type_2 == 1 then
ailment_name = cached_names.fire;
elseif player_info.list.element_type_2 == 2 then
ailment_name = cached_names.water;
elseif player_info.list.element_type_2 == 3 then
ailment_name = cached_names.thunder;
elseif player_info.list.element_type_2 == 4 then
ailment_name = cached_names.ice;
elseif player_info.list.element_type_2 == 5 then
ailment_name = cached_names.dragon;
elseif player_info.list.element_type_2 == 6 then
ailment_name = ailment_names.poison;
elseif player_info.list.element_type_2 == 7 then
ailment_name = ailment_names.sleep;
elseif player_info.list.element_type_2 == 8 then
ailment_name = ailment_names.paralysis;
elseif player_info.list.element_type_2 == 9 then
ailment_name = ailment_names.blast;
end
if this.element_2_label.include.value then
element_2_name_text = string.format("%s: ", ailment_name);
else
element_2_name_text = string.format("%s", ailment_name);
end
end
if this.element_2_label.include.value then
element_2_name_text = string.format("%s%s", element_2_name_text, tostring(player_info.list.element_attack_2));
end
drawing.draw_label(this.element_2_label, position_on_screen, 1, element_2_name_text);
end
end
function this.init_UI()
this.label_list.attack = utils.table.deep_copy(config.current_config.stats_UI.attack_label);
this.label_list.defense = utils.table.deep_copy(config.current_config.stats_UI.defense_label);
this.label_list.fire_resistance = utils.table.deep_copy(config.current_config.stats_UI.fire_resistance_label);
this.label_list.water_resistance = utils.table.deep_copy(config.current_config.stats_UI.water_resistance_label);
this.label_list.thunder_resistance = utils.table.deep_copy(config.current_config.stats_UI.thunder_resistance_label);
this.label_list.ice_resistance = utils.table.deep_copy(config.current_config.stats_UI.ice_resistance_label);
this.label_list.dragon_resistance = utils.table.deep_copy(config.current_config.stats_UI.dragon_resistance_label);
this.affinity_label = utils.table.deep_copy(config.current_config.stats_UI.affinity_label);
this.health_label = utils.table.deep_copy(config.current_config.stats_UI.health_label);
this.stamina_label = utils.table.deep_copy(config.current_config.stats_UI.stamina_label);
this.element_label = utils.table.deep_copy(config.current_config.stats_UI.element_label);
this.element_2_label = utils.table.deep_copy(config.current_config.stats_UI.element_2_label);
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
for label_key, label in pairs(this.label_list) do
label.offset.x = label.offset.x * global_scale_modifier;
label.offset.y = label.offset.y * global_scale_modifier;
end
this.affinity_label.offset.x = this.affinity_label.offset.x * global_scale_modifier;
this.affinity_label.offset.y = this.affinity_label.offset.y * global_scale_modifier;
this.health_label.offset.x = this.health_label.offset.x * global_scale_modifier;
this.health_label.offset.y = this.health_label.offset.y * global_scale_modifier;
this.stamina_label.offset.x = this.stamina_label.offset.x * global_scale_modifier;
this.stamina_label.offset.y = this.stamina_label.offset.y * global_scale_modifier;
this.element_label.offset.x = this.element_label.offset.x * global_scale_modifier;
this.element_label.offset.y = this.element_label.offset.y * global_scale_modifier;
this.element_2_label.offset.x = this.element_2_label.offset.x * global_scale_modifier;
this.element_2_label.offset.y = this.element_2_label.offset.y * global_scale_modifier;
end
function this.init_dependencies()
config = require("MHR_Overlay.Misc.config");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
item_buffs = require("MHR_Overlay.Buffs.item_buffs");
melody_effects = require("MHR_Overlay.Buffs.melody_effects");
buffs = require("MHR_Overlay.Buffs.buffs");
--singletons = require("MHR_Overlay.Game_Handler.singletons");
config = require("MHR_Overlay.Misc.config");
--customization_menu = require("MHR_Overlay.UI.customization_menu");
--players = require("MHR_Overlay.Damage_Meter.players");
--non_players = require("MHR_Overlay.Damage_Meter.non_players");
--quest_status = require("MHR_Overlay.Game_Handler.quest_status");
screen = require("MHR_Overlay.Game_Handler.screen");
--drawing = require("MHR_Overlay.UI.drawing");
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
endemic_life_buff = require("MHR_Overlay.Buffs.endemic_life_buffs");
skills = require("MHR_Overlay.Buffs.skills");
dango_skills = require("MHR_Overlay.Buffs.dango_skills");
abnormal_statuses = require("MHR_Overlay.Buffs.abnormal_statuses");
drawing = require("MHR_Overlay.UI.drawing");
player_info = require("MHR_Overlay.Misc.player_info");
language = require("MHR_Overlay.Misc.language");
end
function this.init_module()
this.init_UI();
end
return this;

View File

@@ -5,6 +5,7 @@ local screen;
local config; local config;
local drawing; local drawing;
local utils; local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -62,13 +63,16 @@ function this.init_UI()
this.label.offset.y = this.label.offset.y * global_scale_modifier; this.label.offset.y = this.label.offset.y * global_scale_modifier;
end end
function this.init_module() function this.init_dependencies()
time = require("MHR_Overlay.Game_Handler.time"); time = require("MHR_Overlay.Game_Handler.time");
screen = require("MHR_Overlay.Game_Handler.screen"); screen = require("MHR_Overlay.Game_Handler.screen");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
this.init_UI() this.init_UI()
end end

View File

@@ -4,6 +4,7 @@ local config;
local utils; local utils;
local drawing; local drawing;
local language; local language;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -118,11 +119,15 @@ function this.draw(ailment, ailment_UI, cached_config, position_on_screen, opaci
end end
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -5,6 +5,7 @@ local drawing;
local config; local config;
local players; local players;
local language; local language;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -117,12 +118,16 @@ function this.draw(player, player_buildup, ailment_buildup_UI, cached_config, po
drawing.draw_label(ailment_buildup_UI.buildup_percentage_label, position_on_screen, opacity_scale, 100 * player_buildup.buildup_share); drawing.draw_label(ailment_buildup_UI.buildup_percentage_label, position_on_screen, opacity_scale, 100 * player_buildup.buildup_share);
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
players = require("MHR_Overlay.Damage_Meter.players"); players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -3,6 +3,7 @@ local this = {};
local config; local config;
local utils; local utils;
local drawing; local drawing;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -36,9 +37,11 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
function this.new(part_visibility, part_name_label, flinch_visibility, flinch_bar, flinch_text_label, function this.new(part_visibility, part_name_label,
flinch_value_label, flinch_percentage_label, break_visibility, break_bar, break_text_label, break_value_label, flinch_visibility, flinch_bar, flinch_text_label, flinch_value_label, flinch_percentage_label,
break_percentage_label, loss_visibility, loss_bar, loss_text_label, loss_value_label, loss_health_percentage_label) break_visibility, break_bar, break_text_label, break_value_label, break_percentage_label,
loss_visibility, loss_bar, loss_text_label, loss_value_label, loss_health_percentage_label,
anomaly_visibility, anomaly_bar, anomaly_text_label, anomaly_value_label, anomaly_health_percentage_label)
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier; local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
@@ -48,6 +51,7 @@ function this.new(part_visibility, part_name_label, flinch_visibility, flinch_ba
entity.flinch_visibility = flinch_visibility; entity.flinch_visibility = flinch_visibility;
entity.break_visibility = break_visibility; entity.break_visibility = break_visibility;
entity.loss_visibility = loss_visibility; entity.loss_visibility = loss_visibility;
entity.anomaly_visibility = anomaly_visibility;
entity.part_name_label = utils.table.deep_copy(part_name_label); entity.part_name_label = utils.table.deep_copy(part_name_label);
@@ -117,6 +121,27 @@ function this.new(part_visibility, part_name_label, flinch_visibility, flinch_ba
entity.loss_health_percentage_label.offset.x = entity.loss_health_percentage_label.offset.x * global_scale_modifier; entity.loss_health_percentage_label.offset.x = entity.loss_health_percentage_label.offset.x * global_scale_modifier;
entity.loss_health_percentage_label.offset.y = entity.loss_health_percentage_label.offset.y * global_scale_modifier; entity.loss_health_percentage_label.offset.y = entity.loss_health_percentage_label.offset.y * global_scale_modifier;
entity.anomaly_bar = utils.table.deep_copy(anomaly_bar);
entity.anomaly_text_label = utils.table.deep_copy(anomaly_text_label);
entity.anomaly_value_label = utils.table.deep_copy(anomaly_value_label);
entity.anomaly_health_percentage_label = utils.table.deep_copy(anomaly_health_percentage_label);
entity.anomaly_bar.offset.x = entity.anomaly_bar.offset.x * global_scale_modifier;
entity.anomaly_bar.offset.y = entity.anomaly_bar.offset.y * global_scale_modifier;
entity.anomaly_bar.size.width = entity.anomaly_bar.size.width * global_scale_modifier;
entity.anomaly_bar.size.height = entity.anomaly_bar.size.height * global_scale_modifier;
entity.anomaly_bar.outline.thickness = entity.anomaly_bar.outline.thickness * global_scale_modifier;
entity.anomaly_bar.outline.offset = entity.anomaly_bar.outline.offset * global_scale_modifier;
entity.anomaly_text_label.offset.x = entity.anomaly_text_label.offset.x * global_scale_modifier;
entity.anomaly_text_label.offset.y = entity.anomaly_text_label.offset.y * global_scale_modifier;
entity.anomaly_value_label.offset.x = entity.anomaly_value_label.offset.x * global_scale_modifier;
entity.anomaly_value_label.offset.y = entity.anomaly_value_label.offset.y * global_scale_modifier;
entity.anomaly_health_percentage_label.offset.x = entity.anomaly_health_percentage_label.offset.x * global_scale_modifier;
entity.anomaly_health_percentage_label.offset.y = entity.anomaly_health_percentage_label.offset.y * global_scale_modifier;
return entity; return entity;
end end
@@ -127,9 +152,10 @@ function this.draw(part, part_UI, cached_config, position_on_screen, opacity_sca
local draw_health = part_UI.flinch_visibility and part.max_health > 0; local draw_health = part_UI.flinch_visibility and part.max_health > 0;
local draw_break = part_UI.break_visibility and part.break_max_health > 0 and part.break_count < part.break_max_count; local draw_break = part_UI.break_visibility and part.break_max_health > 0 and part.break_count < part.break_max_count;
local draw_severe = part_UI.loss_visibility and part.loss_max_health > 0 and not part.is_severed; local draw_sever = part_UI.loss_visibility and part.loss_max_health > 0 and not part.is_severed;
local draw_anomaly = part_UI.anomaly_visibility and part.anomaly_max_health > 0 and (part.anomaly_is_active or cached_config.settings.render_inactive_anomaly_cores);
if not draw_health and not draw_break and not draw_severe then if not draw_health and not draw_break and not draw_sever and not draw_anomaly then
return; return;
end end
@@ -186,7 +212,7 @@ function this.draw(part, part_UI, cached_config, position_on_screen, opacity_sca
-- loss health value string -- loss health value string
local loss_health_string = ""; local loss_health_string = "";
if draw_severe then if draw_sever then
local include_loss_health_current_value = part_UI.loss_value_label.include.current_value; local include_loss_health_current_value = part_UI.loss_value_label.include.current_value;
local include_loss_health_max_value = part_UI.loss_value_label.include.max_value; local include_loss_health_max_value = part_UI.loss_value_label.include.max_value;
@@ -199,22 +225,39 @@ function this.draw(part, part_UI, cached_config, position_on_screen, opacity_sca
end end
end end
-- anomaly health value string
local anomaly_health_string = "";
if draw_anomaly then
local include_anomaly_health_current_value = part_UI.anomaly_value_label.include.current_value;
local include_anomaly_health_max_value = part_UI.anomaly_value_label.include.max_value;
if include_anomaly_health_current_value and include_anomaly_health_max_value then
anomaly_health_string = string.format("%.0f/%.0f", part.anomaly_health, part.anomaly_max_health);
elseif include_anomaly_health_current_value then
anomaly_health_string = string.format("%.0f", part.anomaly_health);
elseif include_anomaly_health_max_value then
anomaly_health_string = string.format("%.0f", part.anomaly_max_health);
end
end
local flinch_position_on_screen = { local flinch_position_on_screen = {
x = position_on_screen.x + cached_config.part_health.offset.x, x = position_on_screen.x + cached_config.part_health.offset.x,
y = position_on_screen.y + cached_config.part_health.offset.y, y = position_on_screen.y + cached_config.part_health.offset.y,
visibility = part_UI.flinch_visibility
}; };
local break_position_on_screen = { local break_position_on_screen = {
x = position_on_screen.x + cached_config.part_break.offset.x, x = position_on_screen.x + cached_config.part_break.offset.x,
y = position_on_screen.y + cached_config.part_break.offset.y, y = position_on_screen.y + cached_config.part_break.offset.y,
visibility = part_UI.flinch_visibility
}; };
local loss_position_on_screen = { local loss_position_on_screen = {
x = position_on_screen.x + cached_config.part_loss.offset.x, x = position_on_screen.x + cached_config.part_loss.offset.x,
y = position_on_screen.y + cached_config.part_loss.offset.y, y = position_on_screen.y + cached_config.part_loss.offset.y,
part_UI = part_UI.loss_visibility };
local anomaly_position_on_screen = {
x = position_on_screen.x + cached_config.part_anomaly.offset.x,
y = position_on_screen.y + cached_config.part_anomaly.offset.y,
}; };
if draw_health then if draw_health then
@@ -225,10 +268,14 @@ function this.draw(part, part_UI, cached_config, position_on_screen, opacity_sca
drawing.draw_bar(part_UI.break_bar, break_position_on_screen, opacity_scale, part.break_health_percentage); drawing.draw_bar(part_UI.break_bar, break_position_on_screen, opacity_scale, part.break_health_percentage);
end end
if draw_severe then if draw_sever then
drawing.draw_bar(part_UI.loss_bar, loss_position_on_screen, opacity_scale, part.loss_health_percentage); drawing.draw_bar(part_UI.loss_bar, loss_position_on_screen, opacity_scale, part.loss_health_percentage);
end end
if draw_anomaly then
drawing.draw_bar(part_UI.anomaly_bar, anomaly_position_on_screen, opacity_scale, part.anomaly_health_percentage);
end
drawing.draw_label(part_UI.part_name_label, position_on_screen, opacity_scale, part_name); drawing.draw_label(part_UI.part_name_label, position_on_screen, opacity_scale, part_name);
if draw_health then if draw_health then
@@ -243,17 +290,27 @@ function this.draw(part, part_UI, cached_config, position_on_screen, opacity_sca
drawing.draw_label(part_UI.break_percentage_label, break_position_on_screen, opacity_scale, 100 * part.break_health_percentage); drawing.draw_label(part_UI.break_percentage_label, break_position_on_screen, opacity_scale, 100 * part.break_health_percentage);
end end
if draw_severe then if draw_sever then
drawing.draw_label(part_UI.loss_text_label, loss_position_on_screen, opacity_scale); drawing.draw_label(part_UI.loss_text_label, loss_position_on_screen, opacity_scale);
drawing.draw_label(part_UI.loss_value_label, loss_position_on_screen, opacity_scale, loss_health_string); drawing.draw_label(part_UI.loss_value_label, loss_position_on_screen, opacity_scale, loss_health_string);
drawing.draw_label(part_UI.loss_health_percentage_label, loss_position_on_screen, opacity_scale, 100 * part.loss_health_percentage); drawing.draw_label(part_UI.loss_health_percentage_label, loss_position_on_screen, opacity_scale, 100 * part.loss_health_percentage);
end end
if draw_anomaly then
drawing.draw_label(part_UI.anomaly_text_label, anomaly_position_on_screen, opacity_scale);
drawing.draw_label(part_UI.anomaly_value_label, anomaly_position_on_screen, opacity_scale, anomaly_health_string);
drawing.draw_label(part_UI.anomaly_health_percentage_label, anomaly_position_on_screen, opacity_scale, 100 * part.anomaly_health_percentage);
end
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -4,6 +4,7 @@ local config;
local utils; local utils;
local drawing; local drawing;
local language; local language;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -72,7 +73,12 @@ function this.draw(buff, buff_UI, position_on_screen, opacity_scale)
drawing.draw_bar(buff_UI.bar, position_on_screen, opacity_scale, 1); drawing.draw_bar(buff_UI.bar, position_on_screen, opacity_scale, 1);
end end
drawing.draw_label(buff_UI.name_label, position_on_screen, opacity_scale, buff.name); local buff_name = buff.name;
if cached_config.name_label.include.skill_level and buff.level > 1 then
buff_name = string.format("%s %s%d", buff_name, language.current_language.UI.lv, buff.level);
end
drawing.draw_label(buff_UI.name_label, position_on_screen, opacity_scale, buff_name);
if not buff.is_infinite then if not buff.is_infinite then
drawing.draw_label(buff_UI.timer_label, position_on_screen, opacity_scale, buff.minutes_left, buff.seconds_left); drawing.draw_label(buff_UI.timer_label, position_on_screen, opacity_scale, buff.minutes_left, buff.seconds_left);
@@ -81,11 +87,15 @@ function this.draw(buff, buff_UI, position_on_screen, opacity_scale)
end end
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -7,6 +7,7 @@ local players;
local language; local language;
local quest_status; local quest_status;
local non_players; local non_players;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -114,6 +115,9 @@ end
function this.draw(player, position_on_screen, opacity_scale, top_damage, top_dps) function this.draw(player, position_on_screen, opacity_scale, top_damage, top_dps)
local cached_config = config.current_config.damage_meter_UI; local cached_config = config.current_config.damage_meter_UI;
top_damage = top_damage or 0;
top_dps = top_dps or 0;
local name_include = nil; local name_include = nil;
if player.damage_UI.name_label ~= nil then if player.damage_UI.name_label ~= nil then
name_include = player.damage_UI.name_label.include; name_include = player.damage_UI.name_label.include;
@@ -197,6 +201,7 @@ function this.draw(player, position_on_screen, opacity_scale, top_damage, top_dp
local bar = player.damage_UI.bar; local bar = player.damage_UI.bar;
local name_label = player.damage_UI.name_label; local name_label = player.damage_UI.name_label;
local hunter_rank_label = player.damage_UI.hunter_rank_label; local hunter_rank_label = player.damage_UI.hunter_rank_label;
local cart_count_label = player.damage_UI.cart_count_label;
local value_label = player.damage_UI.value_label; local value_label = player.damage_UI.value_label;
local percentage_label = player.damage_UI.percentage_label; local percentage_label = player.damage_UI.percentage_label;
local dps_label = player.damage_UI.dps_label; local dps_label = player.damage_UI.dps_label;
@@ -207,6 +212,7 @@ function this.draw(player, position_on_screen, opacity_scale, top_damage, top_dp
bar = players.highlighted_damage_UI.bar; bar = players.highlighted_damage_UI.bar;
name_label = players.highlighted_damage_UI.name_label; name_label = players.highlighted_damage_UI.name_label;
hunter_rank_label = players.highlighted_damage_UI.hunter_rank_label; hunter_rank_label = players.highlighted_damage_UI.hunter_rank_label;
cart_count_label = players.highlighted_damage_UI.cart_count_label;
value_label = players.highlighted_damage_UI.value_label; value_label = players.highlighted_damage_UI.value_label;
percentage_label = players.highlighted_damage_UI.percentage_label; percentage_label = players.highlighted_damage_UI.percentage_label;
dps_label = players.highlighted_damage_UI.dps_label; dps_label = players.highlighted_damage_UI.dps_label;
@@ -227,13 +233,13 @@ function this.draw(player, position_on_screen, opacity_scale, top_damage, top_dp
if player.type == players.types.total then if player.type == players.types.total then
drawing.draw_label(player.damage_UI.cart_count_label, position_on_screen, opacity_scale, quest_status.cart_count, quest_status.max_cart_count); drawing.draw_label(player.damage_UI.cart_count_label, position_on_screen, opacity_scale, quest_status.cart_count, quest_status.max_cart_count);
else else
drawing.draw_label(player.damage_UI.cart_count_label, position_on_screen, opacity_scale, player.cart_count); drawing.draw_label(cart_count_label, position_on_screen, opacity_scale, player.cart_count);
end end
end end
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -241,6 +247,10 @@ function this.init_module()
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
quest_status = require("MHR_Overlay.Game_Handler.quest_status"); quest_status = require("MHR_Overlay.Game_Handler.quest_status");
non_players = require("MHR_Overlay.Damage_Meter.non_players"); non_players = require("MHR_Overlay.Damage_Meter.non_players");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -4,6 +4,7 @@ local utils;
local drawing; local drawing;
local language; local language;
local config; local config;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -91,11 +92,15 @@ function this.draw(monster, health_UI, position_on_screen, opacity_scale)
drawing.draw_label(health_UI.percentage_label, position_on_screen, opacity_scale, 100 * monster.health_percentage); drawing.draw_label(health_UI.percentage_label, position_on_screen, opacity_scale, 100 * monster.health_percentage);
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -4,6 +4,7 @@ local utils;
local drawing; local drawing;
local language; local language;
local config; local config;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -105,11 +106,15 @@ function this.draw(monster, rage_UI, position_on_screen, opacity_scale)
end end
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -4,6 +4,7 @@ local utils;
local drawing; local drawing;
local language; local language;
local config; local config;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -102,11 +103,15 @@ function this.draw(monster, stamina_UI, position_on_screen, opacity_scale)
end end
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -14,6 +14,9 @@ local keyboard;
local non_players; local non_players;
local quest_status; local quest_status;
local buffs; local buffs;
local error_handler;
local time;
local stats_UI;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
@@ -61,10 +64,10 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
this.font = nil;
this.font_range = {0x1, 0xFFFF, 0};
this.is_opened = false; this.is_opened = false;
this.status = "OK";
this.font = nil;
this.full_font_range = {0x1, 0xFFFF, 0};
this.window_position = Vector2f.new(480, 200); this.window_position = Vector2f.new(480, 200);
this.window_pivot = Vector2f.new(0, 0); this.window_pivot = Vector2f.new(0, 0);
@@ -73,51 +76,38 @@ this.window_flags = 0x10120;
this.color_picker_flags = 327680; this.color_picker_flags = 327680;
this.decimal_input_flags = 33; this.decimal_input_flags = 33;
this.displayed_orientation_types = {};
this.displayed_anchor_types = {};
this.displayed_outline_styles = {};
this.displayed_monster_UI_sorting_types = {};
this.displayed_large_monster_UI_parts_sorting_types = {};
this.displayed_large_monster_UI_parts_filter_types = {};
this.displayed_ailments_sorting_types = {};
this.displayed_ailment_buildups_sorting_types = {};
this.displayed_highlighted_buildup_bar_types = {};
this.displayed_buildup_bar_relative_types = {};
this.displayed_buff_UI_sorting_types = {};
this.displayed_damage_meter_UI_highlighted_entity_types = {};
this.displayed_damage_meter_UI_damage_bar_relative_types = {};
this.displayed_damage_meter_UI_my_damage_bar_location_types = {};
this.displayed_damage_meter_UI_total_damage_location_types = {};
this.displayed_damage_meter_UI_sorting_types = {};
this.displayed_damage_meter_UI_dps_modes = {};
this.displayed_auto_highlight_modes = {};
this.orientation_types = {}; this.orientation_types = {};
this.displayed_orientation_types = {};
this.anchor_types = {}; this.anchor_types = {};
this.outline_styles = {}; this.displayed_anchor_types = {};
this.monster_UI_sorting_types = {}; this.monster_UI_sorting_types = {};
this.large_monster_UI_parts_sorting_types = {}; this.displayed_monster_UI_sorting_types = {};
this.large_monster_UI_parts_filter_types = {};
this.ailments_sorting_types = {};
this.ailment_buildups_sorting_types = {};
this.highlighted_buildup_bar_types = {};
this.buildup_bar_relative_types = {};
this.buff_UI_sorting_types = {}; this.buff_UI_sorting_types = {};
this.displayed_buff_UI_sorting_types = {};
this.damage_meter_UI_highlighted_entity_types = {}; this.damage_meter_UI_highlighted_entity_types = {};
this.displayed_damage_meter_UI_highlighted_entity_types = {};
this.damage_meter_UI_damage_bar_relative_types = {}; this.damage_meter_UI_damage_bar_relative_types = {};
this.displayed_damage_meter_UI_damage_bar_relative_types = {};
this.damage_meter_UI_my_damage_bar_location_types = {}; this.damage_meter_UI_my_damage_bar_location_types = {};
this.displayed_damage_meter_UI_my_damage_bar_location_types = {};
this.damage_meter_UI_total_damage_location_types = {}; this.damage_meter_UI_total_damage_location_types = {};
this.displayed_damage_meter_UI_total_damage_location_types = {};
this.damage_meter_UI_sorting_types = {}; this.damage_meter_UI_sorting_types = {};
this.displayed_damage_meter_UI_sorting_types = {};
this.damage_meter_UI_dps_modes = {}; this.damage_meter_UI_dps_modes = {};
this.displayed_damage_meter_UI_dps_modes = {};
this.auto_highlight_modes = {}; this.auto_highlight_modes = {};
this.displayed_auto_highlight_modes = {};
this.fonts = {"Arial", "Arial Black", "Bahnschrift", "Calibri", "Cambria", "Cambria Math", "Candara", this.fonts = {"Arial", "Arial Black", "Bahnschrift", "Calibri", "Cambria", "Cambria Math", "Candara",
"Comic Sans MS", "Consolas", "Constantia", "Corbel", "Courier New", "Ebrima", "Comic Sans MS", "Consolas", "Constantia", "Corbel", "Courier New", "Ebrima",
@@ -146,8 +136,22 @@ this.menu_font_changed = false;
this.config_name_input = ""; this.config_name_input = "";
function this.reload_font(pop_push) function this.reload_font(pop_push)
this.font = imgui.load_font(language.current_language.font_name, local cached_language = language.current_language;
config.current_config.global_settings.menu_font.size, this.font_range);
local font_range = cached_language.unicode_glyph_ranges;
if cached_language.font_name == "" then
font_range = nil;
elseif cached_language.unicode_glyph_ranges == nil
or utils.table.is_empty(cached_language.unicode_glyph_ranges)
or #cached_language.unicode_glyph_ranges == 1
or not utils.number.is_odd(#cached_language.unicode_glyph_ranges) then
font_range = this.full_font_range;
end
this.font = imgui.load_font(cached_language.font_name, config.current_config.global_settings.menu_font.size, font_range);
if pop_push then if pop_push then
imgui.pop_font(); imgui.pop_font();
@@ -156,182 +160,201 @@ function this.reload_font(pop_push)
end end
function this.init() function this.init()
local current = language.current_language.customization_menu;
local default = language.default_language.customization_menu; local default = language.default_language.customization_menu;
local current = language.current_language.customization_menu;
this.displayed_orientation_types = { current.horizontal, bar_customization.init();
current.vertical}; ailments_customization.init();
ailment_buildups_customization.init();
body_parts_customization.init();
this.orientation_types = { default.horizontal, this.orientation_types =
default.vertical}; {
default.horizontal,
default.vertical
};
this.displayed_anchor_types = { current.top_left, this.displayed_orientation_types =
current.top_right, {
current.bottom_left, current.horizontal,
current.bottom_right}; current.vertical
};
this.anchor_types =
{
default.top_left,
default.top_right,
default.bottom_left,
default.bottom_right
};
this.anchor_types = { default.top_left, this.displayed_anchor_types =
default.top_right, {
default.bottom_left, current.top_left,
default.bottom_right}; current.top_right,
current.bottom_left,
current.bottom_right
};
this.displayed_outline_styles = { current.inside, this.monster_UI_sorting_types =
current.center, {
current.outside}; default.normal,
default.health,
default.health_percentage,
default.distance
};
this.outline_styles = { default.inside, this.displayed_monster_UI_sorting_types =
default.center, {
default.outside}; current.normal,
current.health,
current.health_percentage,
current.distance
};
this.displayed_monster_UI_sorting_types = { current.normal, this.buff_UI_sorting_types =
current.health, {
current.health_percentage, default.name,
current.distance}; default.timer,
default.duration
};
this.monster_UI_sorting_types = { default.normal, this.displayed_buff_UI_sorting_types =
default.health, {
default.health_percentage, current.name,
default.distance}; current.timer,
current.duration
};
this.displayed_large_monster_UI_parts_sorting_types = { current.normal, this.damage_meter_UI_highlighted_entity_types =
current.health, {
current.health_percentage, default.top_damage,
current.flinch_count, default.top_dps,
current.break_health, default.none
current.break_health_percentage, };
current.break_count,
current.loss_health,
current.loss_health_percentage};
this.large_monster_UI_parts_sorting_types = { default.normal, this.displayed_damage_meter_UI_highlighted_entity_types =
default.health, {
default.health_percentage, current.top_damage,
default.flinch_count, current.top_dps,
default.break_health, current.none
default.break_health_percentage, };
default.break_count,
default.loss_health,
default.loss_health_percentage};
this.displayed_large_monster_UI_parts_filter_types = { current.current_state, this.damage_meter_UI_damage_bar_relative_types =
current.default_state}; {
default.total_damage,
default.top_damage
};
this.large_monster_UI_parts_filter_types = { default.current_state, this.displayed_damage_meter_UI_damage_bar_relative_types =
default.default_state}; {
current.total_damage,
current.top_damage
};
this.displayed_ailments_sorting_types = { current.normal, this.damage_meter_UI_my_damage_bar_location_types =
current.buildup, {
current.buildup_percentage}; default.normal,
default.first,
default.last
};
this.ailments_sorting_types = { default.normal, this.displayed_damage_meter_UI_my_damage_bar_location_types =
default.buildup, {
default.buildup_percentage}; current.normal,
current.first,
current.last
};
this.displayed_buff_UI_sorting_types = { current.name, this.damage_meter_UI_total_damage_location_types =
current.timer, {
current.duration}; default.first,
default.last
};
this.buff_UI_sorting_types = { default.name, this.displayed_damage_meter_UI_total_damage_location_types =
default.timer, {
default.duration}; current.first,
current.last
};
this.displayed_ailment_buildups_sorting_types = { current.normal, this.damage_meter_UI_sorting_types =
current.buildup, {
current.buildup_percentage}; default.normal,
default.damage,
default.dps
};
this.ailment_buildups_sorting_types = { default.normal, this.displayed_damage_meter_UI_sorting_types =
default.buildup, {
default.buildup_percentage}; current.normal,
current.damage,
current.dps
};
this.displayed_highlighted_buildup_bar_types = { current.me, this.damage_meter_UI_dps_modes =
current.top_buildup, {
current.none}; default.first_hit,
default.quest_time,
default.join_time
};
this.highlighted_buildup_bar_types = { default.me, this.displayed_damage_meter_UI_dps_modes =
default.top_buildup, {
default.none}; current.first_hit,
current.quest_time,
current.join_time
};
this.displayed_buildup_bar_relative_types = { current.total_buildup, this.auto_highlight_modes =
current.top_buildup}; {
default.closest,
default.farthest,
default.lowest_health,
default.highest_health,
default.lowest_health_percentage,
default.highest_health_percentage
};
this.buildup_bar_relative_types = { default.total_buildup, this.displayed_auto_highlight_modes =
default.top_buildup}; {
current.closest,
this.displayed_damage_meter_UI_highlighted_entity_types = { current.top_damage, current.farthest,
current.top_dps, current.lowest_health,
current.none}; current.highest_health,
current.lowest_health_percentage,
this.damage_meter_UI_highlighted_entity_types = { default.top_damage, current.highest_health_percentage
default.top_dps, };
default.none};
this.displayed_damage_meter_UI_damage_bar_relative_types = { current.total_damage,
current.top_damage};
this.damage_meter_UI_damage_bar_relative_types = { default.total_damage,
default.top_damage};
this.displayed_damage_meter_UI_my_damage_bar_location_types = { current.normal,
current.first,
current.last};
this.damage_meter_UI_my_damage_bar_location_types = { default.normal,
default.first,
default.last};
this.displayed_damage_meter_UI_total_damage_location_types = { current.first,
current.last};
this.damage_meter_UI_total_damage_location_types = { default.first,
default.last};
this.displayed_damage_meter_UI_sorting_types = { current.normal,
current.damage,
current.dps};
this.damage_meter_UI_sorting_types = { default.normal,
default.damage,
default.dps};
this.displayed_damage_meter_UI_dps_modes = { current.first_hit,
current.quest_time,
current.join_time};
this.damage_meter_UI_dps_modes = { default.first_hit,
default.quest_time,
default.join_time};
this.displayed_auto_highlight_modes = { current.closest,
current.farthest,
current.lowest_health,
current.highest_health,
current.lowest_health_percentage,
current.highest_health_percentage};
this.auto_highlight_modes = { default.closest,
default.farthest,
default.lowest_health,
default.highest_health,
default.lowest_health_percentage,
default.highest_health_percentage};
end end
function this.draw() function this.draw()
imgui.set_next_window_pos(this.window_position, 1 << 3, this.window_pivot);
imgui.set_next_window_size(this.window_size, 1 << 3);
this.is_opened = imgui.begin_window(
language.current_language.customization_menu.mod_name .. " v" .. config.current_config.version, this.is_opened,
this.window_flags);
if not this.is_opened then if not this.is_opened then
imgui.end_window();
return; return;
end end
local window_position = Vector2f.new(config.current_config.customization_menu.position.x, config.current_config.customization_menu.position.y);
local window_pivot = Vector2f.new(config.current_config.customization_menu.pivot.x, config.current_config.customization_menu.pivot.y);
local window_size = Vector2f.new(config.current_config.customization_menu.size.width, config.current_config.customization_menu.size.height);
imgui.set_next_window_pos(window_position, 1 << 3, window_pivot);
imgui.set_next_window_size(window_size, 1 << 3);
imgui.push_font(this.font); imgui.push_font(this.font);
this.is_opened = imgui.begin_window(
string.format("%s v%s", language.current_language.customization_menu.mod_name, config.current_config.version),
this.is_opened,
this.window_flags);
if not this.is_opened then
imgui.pop_font();
imgui.end_window();
config.save_current();
return;
end
local window_changed = false;
local config_changed = false; local config_changed = false;
local language_changed = false; local language_changed = false;
local modifiers_changed = false; local modifiers_changed = false;
@@ -345,11 +368,28 @@ function this.draw()
local damage_meter_UI_changed = false; local damage_meter_UI_changed = false;
local endemic_life_UI_changed = false; local endemic_life_UI_changed = false;
local buff_UI_changed = false; local buff_UI_changed = false;
local stats_UI_changed = false;
local debug_changed = false;
local apply_font_requested = false; local apply_font_requested = false;
local status_string = tostring(this.status); local new_window_position = imgui.get_window_pos();
if window_position.x ~= new_window_position.x or window_position.y ~= new_window_position.y then
window_changed = window_changed or true;
imgui.text(language.current_language.customization_menu.status .. ": " .. status_string); config.current_config.customization_menu.position.x = new_window_position.x;
config.current_config.customization_menu.position.y = new_window_position.y;
end
local new_window_size = imgui.get_window_size();
if window_size.x ~= new_window_size.x or window_size.y ~= new_window_size.y then
window_changed = window_changed or true;
config.current_config.customization_menu.size.width = new_window_size.x;
config.current_config.customization_menu.size.height = new_window_size.y;
end
local new_window_size = imgui.get_window_size();
window_changed = window_changed or new_window_size.x ~= window_size.x or new_window_size.y ~= window_size.y;
config_changed, apply_font_requested = this.draw_config(); config_changed, apply_font_requested = this.draw_config();
modules_changed = this.draw_modules(); modules_changed = this.draw_modules();
@@ -367,7 +407,11 @@ function this.draw()
time_UI_changed = this.draw_time_UI(); time_UI_changed = this.draw_time_UI();
damage_meter_UI_changed = this.draw_damage_meter_UI(); damage_meter_UI_changed = this.draw_damage_meter_UI();
endemic_life_UI_changed = this.draw_endemic_life_UI() endemic_life_UI_changed = this.draw_endemic_life_UI()
--buff_UI_changed = customization_menu.draw_buff_UI(); buff_UI_changed = this.draw_buff_UI();
stats_UI_changed = this.draw_stats_UI()
imgui.new_line();
debug_changed = this.draw_debug();
imgui.pop_font(); imgui.pop_font();
imgui.end_window(); imgui.end_window();
@@ -426,22 +470,28 @@ function this.draw()
end end
end end
--[[if buff_UI_changed or modifiers_changed or config_changed then if buff_UI_changed or modifiers_changed or config_changed then
for _, buff in pairs(buffs.list) do for _, buff in pairs(buffs.list) do
buffs.init_UI(buff); buffs.init_UI(buff);
end end
end]] end
if stats_UI_changed or modifiers_changed or config_changed then
stats_UI.init_UI();
end
if this.menu_font_changed and (apply_font_requested or config_changed) then if this.menu_font_changed and (apply_font_requested or config_changed) then
this.menu_font_changed = false; this.menu_font_changed = false;
this.reload_font(false); this.reload_font();
end end
if modules_changed or global_settings_changed or small_monster_UI_changed or large_monster_dynamic_UI_changed or if window_changed or modules_changed or global_settings_changed or small_monster_UI_changed or large_monster_dynamic_UI_changed or
large_monster_static_UI_changed or large_monster_highlighted_UI_changed or time_UI_changed or damage_meter_UI_changed or large_monster_static_UI_changed or large_monster_highlighted_UI_changed or time_UI_changed or damage_meter_UI_changed or
endemic_life_UI_changed or buff_UI_changed or modifiers_changed or config_changed then endemic_life_UI_changed or buff_UI_changed or stats_UI_changed or modifiers_changed or config_changed or debug_changed then
config.save_current(); config.save_current();
end end
end end
function this.draw_config() function this.draw_config()
@@ -561,9 +611,9 @@ function this.draw_modules()
language.current_language.customization_menu.endemic_life_UI, config.current_config.endemic_life_UI.enabled); language.current_language.customization_menu.endemic_life_UI, config.current_config.endemic_life_UI.enabled);
config_changed = config_changed or changed; config_changed = config_changed or changed;
--[[changed, config.current_config.buff_UI.enabled = imgui.checkbox( changed, config.current_config.buff_UI.enabled = imgui.checkbox(
language.current_language.customization_menu.buff_UI, config.current_config.buff_UI.enabled); language.current_language.customization_menu.buff_UI, config.current_config.buff_UI.enabled);
config_changed = config_changed or changed;]] config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
@@ -823,6 +873,7 @@ function this.draw_global_settings(apply_font_requested, language_changed)
if changed then if changed then
cached_config.language = language.language_names[index]; cached_config.language = language.language_names[index];
language.update(index); language.update(index);
part_names.init();
this.init(); this.init();
language_changed = true; language_changed = true;
@@ -961,6 +1012,17 @@ function this.draw_global_settings(apply_font_requested, language_changed)
if imgui.tree_node(language.current_language.customization_menu.module_visibility_based_on_game_state) then if imgui.tree_node(language.current_language.customization_menu.module_visibility_based_on_game_state) then
if imgui.tree_node(language.current_language.customization_menu.in_lobby) then
changed, cached_config.module_visibility.in_lobby.stats_UI = imgui.checkbox(
language.current_language.customization_menu.stats_UI,
cached_config.module_visibility.in_lobby.stats_UI);
config_changed = config_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.in_training_area) then if imgui.tree_node(language.current_language.customization_menu.in_training_area) then
changed, cached_config.module_visibility.in_training_area.large_monster_dynamic_UI = imgui.checkbox( changed, cached_config.module_visibility.in_training_area.large_monster_dynamic_UI = imgui.checkbox(
@@ -993,11 +1055,17 @@ function this.draw_global_settings(apply_font_requested, language_changed)
config_changed = config_changed or changed; config_changed = config_changed or changed;
--[[changed, cached_config.module_visibility.in_training_area.buff_UI = imgui.checkbox( changed, cached_config.module_visibility.in_training_area.buff_UI = imgui.checkbox(
language.current_language.customization_menu.buff_UI, language.current_language.customization_menu.buff_UI,
cached_config.module_visibility.in_training_area.buff_UI); cached_config.module_visibility.in_training_area.buff_UI);
config_changed = config_changed or changed;]] config_changed = config_changed or changed;
changed, cached_config.module_visibility.in_training_area.stats_UI = imgui.checkbox(
language.current_language.customization_menu.stats_UI,
cached_config.module_visibility.in_training_area.stats_UI);
config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
@@ -1731,62 +1799,68 @@ function this.draw_damage_meter_UI()
if imgui.tree_node(language.current_language.customization_menu.tracked_damage_types) then if imgui.tree_node(language.current_language.customization_menu.tracked_damage_types) then
changed, cached_config.tracked_damage_types.player_damage = imgui.checkbox( changed, cached_config.tracked_damage_types.players = imgui.checkbox(
language.current_language.customization_menu.player_damage, cached_config.tracked_damage_types.player_damage); language.current_language.customization_menu.players, cached_config.tracked_damage_types.players);
config_changed = config_changed or changed; config_changed = config_changed or changed;
damage_display_changed = damage_display_changed or changed; damage_display_changed = damage_display_changed or changed;
changed, cached_config.tracked_damage_types.bomb_damage = imgui.checkbox( changed, cached_config.tracked_damage_types.bombs = imgui.checkbox(
language.current_language.customization_menu.bomb_damage, cached_config.tracked_damage_types.bomb_damage); language.current_language.customization_menu.bombs, cached_config.tracked_damage_types.bombs);
config_changed = config_changed or changed; config_changed = config_changed or changed;
damage_display_changed = damage_display_changed or changed; damage_display_changed = damage_display_changed or changed;
changed, cached_config.tracked_damage_types.kunai_damage = imgui.checkbox( changed, cached_config.tracked_damage_types.kunai = imgui.checkbox(
language.current_language.customization_menu.kunai_damage, cached_config.tracked_damage_types.kunai_damage); language.current_language.customization_menu.kunai, cached_config.tracked_damage_types.kunai);
config_changed = config_changed or changed; config_changed = config_changed or changed;
damage_display_changed = damage_display_changed or changed; damage_display_changed = damage_display_changed or changed;
changed, cached_config.tracked_damage_types.installation_damage = imgui.checkbox( changed, cached_config.tracked_damage_types.installations = imgui.checkbox(
language.current_language.customization_menu.installation_damage, cached_config.tracked_damage_types.installation_damage); language.current_language.customization_menu.installations, cached_config.tracked_damage_types.installations);
config_changed = config_changed or changed; config_changed = config_changed or changed;
damage_display_changed = damage_display_changed or changed; damage_display_changed = damage_display_changed or changed;
changed, cached_config.tracked_damage_types.otomo_damage = imgui.checkbox( changed, cached_config.tracked_damage_types.otomos = imgui.checkbox(
language.current_language.customization_menu.otomo_damage, cached_config.tracked_damage_types.otomo_damage); language.current_language.customization_menu.otomos, cached_config.tracked_damage_types.otomos);
config_changed = config_changed or changed; config_changed = config_changed or changed;
damage_display_changed = damage_display_changed or changed; damage_display_changed = damage_display_changed or changed;
changed, cached_config.tracked_damage_types.wyvern_riding_damage = imgui.checkbox( changed, cached_config.tracked_damage_types.wyvern_riding = imgui.checkbox(
language.current_language.customization_menu.wyvern_riding_damage, cached_config.tracked_damage_types.wyvern_riding_damage); language.current_language.customization_menu.wyvern_riding, cached_config.tracked_damage_types.wyvern_riding);
config_changed = config_changed or changed; config_changed = config_changed or changed;
damage_display_changed = damage_display_changed or changed; damage_display_changed = damage_display_changed or changed;
changed, cached_config.tracked_damage_types.poison_damage = imgui.checkbox( changed, cached_config.tracked_damage_types.poison = imgui.checkbox(
language.current_language.customization_menu.poison_damage, cached_config.tracked_damage_types.poison_damage); language.current_language.customization_menu.poison, cached_config.tracked_damage_types.poison);
config_changed = config_changed or changed; config_changed = config_changed or changed;
damage_display_changed = damage_display_changed or changed; damage_display_changed = damage_display_changed or changed;
changed, cached_config.tracked_damage_types.blast_damage = imgui.checkbox( changed, cached_config.tracked_damage_types.blast = imgui.checkbox(
language.current_language.customization_menu.blast_damage, cached_config.tracked_damage_types.blast_damage); language.current_language.customization_menu.blast, cached_config.tracked_damage_types.blast);
config_changed = config_changed or changed; config_changed = config_changed or changed;
damage_display_changed = damage_display_changed or changed; damage_display_changed = damage_display_changed or changed;
changed, cached_config.tracked_damage_types.endemic_life_damage = imgui.checkbox( changed, cached_config.tracked_damage_types.endemic_life = imgui.checkbox(
language.current_language.customization_menu.endemic_life_damage, cached_config.tracked_damage_types.endemic_life_damage); language.current_language.customization_menu.endemic_life, cached_config.tracked_damage_types.endemic_life);
config_changed = config_changed or changed; config_changed = config_changed or changed;
damage_display_changed = damage_display_changed or changed; damage_display_changed = damage_display_changed or changed;
changed, cached_config.tracked_damage_types.other_damage = imgui.checkbox( changed, cached_config.tracked_damage_types.anomaly_cores = imgui.checkbox(
language.current_language.customization_menu.other_damage, cached_config.tracked_damage_types.other_damage); language.current_language.customization_menu.anomaly_cores, cached_config.tracked_damage_types.anomaly_cores);
config_changed = config_changed or changed;
damage_display_changed = damage_display_changed or changed;
changed, cached_config.tracked_damage_types.other = imgui.checkbox(
language.current_language.customization_menu.other, cached_config.tracked_damage_types.other);
config_changed = config_changed or changed; config_changed = config_changed or changed;
damage_display_changed = damage_display_changed or changed; damage_display_changed = damage_display_changed or changed;
@@ -2011,6 +2085,9 @@ function this.draw_damage_meter_UI()
changed = label_customization.draw(language.current_language.customization_menu.hunter_rank_label, cached_config.highlighted.hunter_rank_label); changed = label_customization.draw(language.current_language.customization_menu.hunter_rank_label, cached_config.highlighted.hunter_rank_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.cart_count_label, cached_config.highlighted.cart_count_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.dps_label, cached_config.highlighted.dps_label); changed = label_customization.draw(language.current_language.customization_menu.dps_label, cached_config.highlighted.dps_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
@@ -2027,12 +2104,7 @@ function this.draw_damage_meter_UI()
end end
if config_changed then if config_changed then
local is_on_quest = quest_status.flow_state ~= quest_status.flow_states.IN_LOBBY and quest_status.flow_state ~= quest_status.flow_states.IN_TRAINING_AREA; players.update_players();
players.display_list = {};
players.update_player_list(is_on_quest);
non_players.update_servant_list();
non_players.update_otomo_list(is_on_quest, quest_status.is_online);
end end
if damage_display_changed then if damage_display_changed then
@@ -2052,10 +2124,6 @@ function this.draw_damage_meter_UI()
players.update_dps(true); players.update_dps(true);
end end
if config_changed then
players.sort_players();
end
imgui.tree_pop(); imgui.tree_pop();
end end
@@ -2127,7 +2195,7 @@ function this.draw_endemic_life_UI()
end end
changed = label_customization.draw( changed = label_customization.draw(
language.current_language.customization_menu.creature_name_label, cached_config.creature_name_label.visibility); language.current_language.customization_menu.creature_name_label, cached_config.creature_name_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
@@ -2249,7 +2317,143 @@ function this.draw_buff_UI()
return config_changed; return config_changed;
end end
function this.init_module() function this.draw_stats_UI()
local changed = false;
local config_changed = false;
local index = 0;
if imgui.tree_node(language.current_language.customization_menu.stats_UI) then
local cached_config = config.current_config.stats_UI;
changed, cached_config.enabled = imgui.checkbox(
language.current_language.customization_menu.enabled, cached_config.enabled);
config_changed = config_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.position) then
changed, cached_config.position.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.position.x, 0.1, 0, screen.width, "%.1f");
config_changed = config_changed or changed;
changed, cached_config.position.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.position.y, 0.1, 0, screen.height, "%.1f");
config_changed = config_changed or changed;
changed, index = imgui.combo(
language.current_language.customization_menu.anchor,
utils.table.find_index(this.anchor_types, cached_config.position.anchor),
this.displayed_anchor_types);
config_changed = config_changed or changed;
if changed then
cached_config.position.anchor = this.anchor_types[index];
end
imgui.tree_pop();
end
changed = label_customization.draw(language.current_language.customization_menu.health_label, cached_config.health_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.stamina_label, cached_config.stamina_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.attack_label, cached_config.attack_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.affinity_label, cached_config.affinity_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.defense_label, cached_config.defense_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.fire_resistance_label, cached_config.fire_resistance_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.water_resistance_label, cached_config.water_resistance_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.thunder_resistance_label, cached_config.thunder_resistance_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.ice_resistance_label, cached_config.ice_resistance_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.dragon_resistance_label, cached_config.dragon_resistance_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.element_label, cached_config.element_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.element_2_label, cached_config.element_2_label);
config_changed = config_changed or changed;
imgui.tree_pop();
end
return config_changed;
end
function this.draw_debug()
local cached_config = config.current_config.debug;
local changed = false;
local config_changed = false;
if imgui.tree_node(language.current_language.customization_menu.debug) then
imgui.text_colored(string.format("%s:", language.current_language.customization_menu.current_time), 0xFFAAAA66);
imgui.same_line();
imgui.text(string.format("%.3fs", time.total_elapsed_script_seconds));
if error_handler.is_empty then
imgui.text(language.current_language.customization_menu.everything_seems_to_be_ok);
else
for error_key, error in pairs(error_handler.list) do
imgui.button(string.format("%.3fs", error.time));
imgui.same_line();
imgui.text_colored(error_key, 0xFFAA66AA);
imgui.same_line();
imgui.text(error.message);
end
end
if imgui.tree_node(language.current_language.customization_menu.history) then
changed, cached_config.history_size = imgui.drag_int(
language.current_language.customization_menu.history_size, cached_config.history_size, 1, 0, 1024);
config_changed = config_changed or changed;
if changed then
error_handler.history = {};
end
for index, error in pairs(error_handler.history) do
imgui.text_colored(index, 0xFF66AA66);
imgui.same_line();
imgui.button(string.format("%.3fs", error.time));
imgui.same_line();
imgui.text_colored(error.key, 0xFFAA66AA);
imgui.same_line();
imgui.text(error.message);
end
imgui.tree_pop();
end
imgui.tree_pop();
end
return config_changed;
end
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -2264,6 +2468,9 @@ function this.init_module()
non_players = require("MHR_Overlay.Damage_Meter.non_players"); non_players = require("MHR_Overlay.Damage_Meter.non_players");
quest_status = require("MHR_Overlay.Game_Handler.quest_status"); quest_status = require("MHR_Overlay.Game_Handler.quest_status");
buffs = require("MHR_Overlay.Buffs.buffs"); buffs = require("MHR_Overlay.Buffs.buffs");
error_handler = require("MHR_Overlay.Misc.error_handler");
time = require("MHR_Overlay.Game_Handler.time");
stats_UI = require("MHR_Overlay.UI.Modules.stats_UI");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
@@ -2276,9 +2483,11 @@ function this.init_module()
ailments_customization = require("MHR_Overlay.UI.Customizations.ailments_customization"); ailments_customization = require("MHR_Overlay.UI.Customizations.ailments_customization");
ailment_buildups_customization = require("MHR_Overlay.UI.Customizations.ailment_buildups_customization"); ailment_buildups_customization = require("MHR_Overlay.UI.Customizations.ailment_buildups_customization");
module_visibility_customization = require("MHR_Overlay.UI.Customizations.module_visibility_customization"); module_visibility_customization = require("MHR_Overlay.UI.Customizations.module_visibility_customization");
end
function this.init_module()
this.init(); this.init();
this.reload_font(false); this.reload_font();
end end
return this; return this;

View File

@@ -2,6 +2,7 @@ local this = {};
local config; local config;
local utils; local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -82,7 +83,7 @@ function this.limit_text_size(text, size_limit)
limited_text = utils.unicode.sub(limited_text, 1, -5) .. "..."; limited_text = utils.unicode.sub(limited_text, 1, -5) .. "...";
if limited_text == old_limited_text then if limited_text == old_limited_text then
break break;
end end
end end
end end
@@ -126,12 +127,19 @@ function this.draw_label(label, position, opacity_scale, ...)
return; return;
end end
local text = string.format(label.text_format, table.unpack({...})); local text = string.format(label.text_formatting, table.unpack({...}));
if text == "" then if text == "" then
return; return;
end end
local right_alignment_shift = label.settings.right_alignment_shift;
if right_alignment_shift ~= 0 then
local right_aligment_format = string.format("%%%ds", right_alignment_shift);
text = string.format(right_aligment_format, text);
end
local position_x = position.x + label.offset.x; local position_x = position.x + label.offset.x;
local position_y = position.y + label.offset.y; local position_y = position.y + label.offset.y;
@@ -167,7 +175,6 @@ function this.draw_label(label, position, opacity_scale, ...)
end end
function this.draw_bar(bar, position, opacity_scale, percentage) function this.draw_bar(bar, position, opacity_scale, percentage)
if bar == nil or not bar.visibility then if bar == nil or not bar.visibility then
return; return;
end end
@@ -182,6 +189,7 @@ function this.draw_bar(bar, position, opacity_scale, percentage)
local outline_visibility = bar.outline.visibility; local outline_visibility = bar.outline.visibility;
local style = bar.outline.style; -- Inside/Center/Outside local style = bar.outline.style; -- Inside/Center/Outside
local fill_direction = bar.settings.fill_direction; -- Left to Right/Right to Left/Top to Bottom/Bottom to Top
local outline_thickness = bar.outline.thickness; local outline_thickness = bar.outline.thickness;
if not outline_visibility then if not outline_visibility then
@@ -192,7 +200,7 @@ function this.draw_bar(bar, position, opacity_scale, percentage)
local outline_offset = bar.outline.offset; local outline_offset = bar.outline.offset;
if outline_thickness == 0 then if utils.number.is_equal(outline_thickness, 0) then
outline_offset = 0; outline_offset = 0;
end end
local half_outline_offset = outline_offset / 2; local half_outline_offset = outline_offset / 2;
@@ -206,10 +214,21 @@ function this.draw_bar(bar, position, opacity_scale, percentage)
local position_x = 0; local position_x = 0;
local position_y = 0; local position_y = 0;
local foreground_width = 0; local width = 0;
local background_width = 0;
local height = 0; local height = 0;
local foreground_width = 0;
local foreground_height = 0;
local background_width = 0;
local background_height = 0;
local foreground_shift_x = 0;
local foreground_shift_y = 0;
local background_shift_x = 0;
local background_shift_y = 0;
if style == "Inside" then if style == "Inside" then
outline_position_x = position.x + bar.offset.x + half_outline_thickness; outline_position_x = position.x + bar.offset.x + half_outline_thickness;
outline_position_y = position.y + bar.offset.y + half_outline_thickness; outline_position_y = position.y + bar.offset.y + half_outline_thickness;
@@ -220,10 +239,7 @@ function this.draw_bar(bar, position, opacity_scale, percentage)
position_x = outline_position_x + half_outline_thickness + outline_offset; position_x = outline_position_x + half_outline_thickness + outline_offset;
position_y = outline_position_y + half_outline_thickness + outline_offset; position_y = outline_position_y + half_outline_thickness + outline_offset;
local width = outline_width - outline_thickness - outline_offset - outline_offset; width = outline_width - outline_thickness - outline_offset - outline_offset;
foreground_width = width * percentage;
background_width = width - foreground_width;
height = outline_height - outline_thickness - outline_offset - outline_offset; height = outline_height - outline_thickness - outline_offset - outline_offset;
elseif style == "Center" then elseif style == "Center" then
@@ -236,22 +252,16 @@ function this.draw_bar(bar, position, opacity_scale, percentage)
position_x = outline_position_x + half_outline_thickness + outline_offset; position_x = outline_position_x + half_outline_thickness + outline_offset;
position_y = outline_position_y + half_outline_thickness + outline_offset; position_y = outline_position_y + half_outline_thickness + outline_offset;
local width = outline_width - outline_thickness - outline_offset - outline_offset; width = outline_width - outline_thickness - outline_offset - outline_offset;
foreground_width = width * percentage;
background_width = width - foreground_width;
height = outline_height - outline_thickness - outline_offset - outline_offset; height = outline_height - outline_thickness - outline_offset - outline_offset;
else else -- Outside
position_x = position.x + bar.offset.x; position_x = position.x + bar.offset.x;
position_y = position.y + bar.offset.y; position_y = position.y + bar.offset.y;
local width = bar.size.width; width = bar.size.width;
height = bar.size.height; height = bar.size.height;
foreground_width = width * percentage;
background_width = width - foreground_width;
outline_position_x = position_x - half_outline_thickness - outline_offset; outline_position_x = position_x - half_outline_thickness - outline_offset;
outline_position_y = position_y - half_outline_thickness - outline_offset; outline_position_y = position_y - half_outline_thickness - outline_offset;
@@ -259,6 +269,43 @@ function this.draw_bar(bar, position, opacity_scale, percentage)
outline_height = height + outline_thickness + outline_offset + outline_offset; outline_height = height + outline_thickness + outline_offset + outline_offset;
end end
if fill_direction == "Right to Left" then
foreground_width = width * percentage;
foreground_height = height;
background_width = width - foreground_width;
background_height = height;
foreground_shift_x = background_width;
elseif fill_direction == "Top to Bottom" then
foreground_width = width;
foreground_height = height * percentage;
background_width = width;
background_height = height - foreground_height;
background_shift_y = foreground_height;
elseif fill_direction == "Bottom to Top" then
foreground_width = width;
foreground_height = height * percentage;
background_width = width;
background_height = height - foreground_height;
foreground_shift_y = background_height;
else -- Left to Right
foreground_width = width * percentage;
foreground_height = height;
background_width = width - foreground_width;
background_height = height;
background_shift_x = foreground_width;
end
local foreground_color = bar.colors.foreground; local foreground_color = bar.colors.foreground;
local background_color = bar.colors.background; local background_color = bar.colors.background;
local outline_color = bar.colors.outline; local outline_color = bar.colors.outline;
@@ -271,35 +318,33 @@ function this.draw_bar(bar, position, opacity_scale, percentage)
local use_d2d = d2d ~= nil and config.current_config.global_settings.renderer.use_d2d_if_available; local use_d2d = d2d ~= nil and config.current_config.global_settings.renderer.use_d2d_if_available;
-- outline -- background
if outline_thickness ~= 0 then if background_width ~= 0 then
if use_d2d then if use_d2d then
d2d.outline_rect(outline_position_x, outline_position_y, outline_width, outline_height, outline_thickness, d2d.fill_rect(position_x + background_shift_x, position_y + background_shift_y, background_width, background_height, background_color);
outline_color);
else else
outline_color = this.argb_color_to_abgr_color(outline_color); background_color = this.argb_color_to_abgr_color(background_color);
draw.outline_rect(outline_position_x, outline_position_y, outline_width, outline_height, outline_color); draw.filled_rect(position_x + background_shift_x, position_y + background_shift_y, background_width, background_height, background_color)
end end
end end
-- foreground -- foreground
if foreground_width ~= 0 then if foreground_width ~= 0 then
if use_d2d then if use_d2d then
d2d.fill_rect(position_x, position_y, foreground_width, height, foreground_color); d2d.fill_rect(position_x + foreground_shift_x, position_y + foreground_shift_y, foreground_width, foreground_height, foreground_color);
else else
foreground_color = this.argb_color_to_abgr_color(foreground_color); foreground_color = this.argb_color_to_abgr_color(foreground_color);
draw.filled_rect(position_x, position_y, foreground_width, height, foreground_color) draw.filled_rect(position_x + foreground_shift_x, position_y + foreground_shift_y, foreground_width, foreground_height, foreground_color)
end end
end end
-- background -- outline
if background_width ~= 0 then if outline_thickness ~= 0 then
if use_d2d then if use_d2d then
d2d.fill_rect(position_x + foreground_width, position_y, background_width, height, background_color); d2d.outline_rect(outline_position_x, outline_position_y, outline_width, outline_height, outline_thickness, outline_color);
else else
background_color = this.argb_color_to_abgr_color(background_color); outline_color = this.argb_color_to_abgr_color(outline_color);
draw.filled_rect(position_x + foreground_width, position_y, background_width, height, background_color) draw.outline_rect(outline_position_x, outline_position_y, outline_width, outline_height, outline_color);
end end
end end
end end
@@ -332,9 +377,13 @@ function this.draw_capture_line(health_UI, position, opacity_scale, percentage)
end end
end end
function this.init_module() function this.init_dependencies()
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -3,8 +3,10 @@
"HP": "HP:", "HP": "HP:",
"buildup": "Buildup:", "buildup": "Buildup:",
"gold": "Gold", "gold": "Gold",
"lv": "",
"mini": "Mini", "mini": "Mini",
"otomo": "Buddy", "otomo": "Buddy",
"part_anomaly_core": "Anomaly Core",
"part_break": "Break", "part_break": "Break",
"part_sever": "Sever", "part_sever": "Sever",
"player": "Player", "player": "Player",
@@ -17,30 +19,53 @@
}, },
"ailments": { "ailments": {
"blast": "Blast", "blast": "Blast",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "Dung Bomb", "dung_bomb": "Dung Bomb",
"engulfed": "Engulfed",
"exhaust": "Exhaust", "exhaust": "Exhaust",
"fall_otomo_trap": "Fall Buddy Trap", "fall_otomo_trap": "Fall Buddy Trap",
"fall_trap": "Fall Trap", "fall_trap": "Fall Trap",
"falling_asleep": "Falling Asleep",
"fireblight": "Fireblight", "fireblight": "Fireblight",
"flash": "Flash", "flash": "Flash",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "Iceblight", "iceblight": "Iceblight",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "Paralysis", "paralysis": "Paralysis",
"poison": "Poison", "poison": "Poison",
"quick_sand": "Quick Sand", "quick_sand": "Quick Sand",
"resistance_down": "Resistance Down",
"ride": "Wyvern Riding", "ride": "Wyvern Riding",
"roar": "Roar",
"shock_otomo_trap": "Shock Buddy Trap", "shock_otomo_trap": "Shock Buddy Trap",
"shock_trap": "Shock Trap", "shock_trap": "Shock Trap",
"sleep": "Sleep", "sleep": "Sleep",
"steel_fang": "Steel Fang", "steel_fang": "Steel Fang",
"stench": "Stench",
"stun": "Stun", "stun": "Stun",
"thunderblight": "Thunderblight", "thunderblight": "Thunderblight",
"tranq_bomb": "Tranq Bomb", "tranq_bomb": "Tranq Bomb",
"waterblight": "Waterblight" "tremor": "Tremor",
"waterblight": "Waterblight",
"webbed": "Webbed"
}, },
"customization_menu": { "customization_menu": {
"UI_font": "UI Font", "UI_font": "UI Font",
"UI_font_notice": "Any changes to the font require script reload!", "UI_font_notice": "Any changes to the font require script reload!",
"activation_count": "Activation Count", "activation_count": "Activation Count",
"affinity_label": "Affinity Label",
"ailment_buildups": "Ailment Buildups", "ailment_buildups": "Ailment Buildups",
"ailment_name": "Ailment Name", "ailment_name": "Ailment Name",
"ailment_name_label": "Ailment Name Label", "ailment_name_label": "Ailment Name Label",
@@ -48,23 +73,31 @@
"ailments": "Ailments", "ailments": "Ailments",
"all_UI": "All UI", "all_UI": "All UI",
"anchor": "Anchor", "anchor": "Anchor",
"anomaly_cores": "Anomaly Cores",
"anomaly_filter": "Anomaly Core",
"anomaly_health": "Anomaly Core Health",
"anomaly_health_percentage": "Anomaly Core Health Percentage",
"apply": "Apply", "apply": "Apply",
"assign_new_key": "Assign new key", "assign_new_key": "Assign new key",
"attack_label": "Attack Label",
"auto_highlight": "Auto-highlight", "auto_highlight": "Auto-highlight",
"background": "Background", "background": "Background",
"bar": "Bar", "bar": "Bar",
"blast_damage": "Blast Damage", "blast": "Blast",
"body_parts": "Body Parts", "body_parts": "Body Parts",
"bold": "Bold", "bold": "Bold",
"bomb_damage": "Bomb Damage", "bombs": "Bombs",
"bottom_left": "Bottom-Left", "bottom_left": "Bottom-Left",
"bottom_right": "Bottom-Right", "bottom_right": "Bottom-Right",
"bottom_to_top": "Bottom to Top",
"break_anomaly_filter": "Break + Anomaly Core",
"break_count": "Break Count", "break_count": "Break Count",
"break_filter": "Break", "break_filter": "Break",
"break_health": "Break Health", "break_health": "Break Health",
"break_health_percentage": "Break Health Percentage", "break_health_percentage": "Break Health Percentage",
"break_max_count": "Break Max Count", "break_max_count": "Break Max Count",
"break_severe_filter": "Break + Severe", "break_sever_anomaly_filter": "Break + Sever + Anomaly Core",
"break_sever_filter": "Break + Sever",
"buff_UI": "Buff UI", "buff_UI": "Buff UI",
"buildup": "Buildup", "buildup": "Buildup",
"buildup_bar": "Buildup Bar", "buildup_bar": "Buildup Bar",
@@ -84,6 +117,7 @@
"crown": "Crown", "crown": "Crown",
"crown_thresholds": "Crown Thresholds", "crown_thresholds": "Crown Thresholds",
"current_state": "Current State", "current_state": "Current State",
"current_time": "Current Time",
"current_value": "Current Value", "current_value": "Current Value",
"cutscene": "Cutscene", "cutscene": "Cutscene",
"damage": "Damage", "damage": "Damage",
@@ -92,25 +126,33 @@
"damage_meter_UI": "Damage Meter UI", "damage_meter_UI": "Damage Meter UI",
"damage_percentage_label": "Damage Percentage Label", "damage_percentage_label": "Damage Percentage Label",
"damage_value_label": "Damage Value Label", "damage_value_label": "Damage Value Label",
"debug": "Debug",
"default_state": "Default State", "default_state": "Default State",
"defense_label": "Defense Label",
"delete": "Delete", "delete": "Delete",
"distance": "Distance", "distance": "Distance",
"dps": "DPS", "dps": "DPS",
"dps_label": "DPS Label", "dps_label": "DPS Label",
"dps_mode": "DPS Mode", "dps_mode": "DPS Mode",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "Duplicate", "duplicate": "Duplicate",
"duration": "Duration", "duration": "Duration",
"dynamic_positioning": "Dynamic Positioning", "dynamic_positioning": "Dynamic Positioning",
"dynamically_positioned": "Dynamically Positioned", "dynamically_positioned": "Dynamically Positioned",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "Enable for", "enable_for": "Enable for",
"enabled": "Enabled", "enabled": "Enabled",
"endemic_life": "Endemic Life",
"endemic_life_UI": "Endemic Life UI", "endemic_life_UI": "Endemic Life UI",
"endemic_life_damage": "Endemic Life Damage", "everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "Family", "family": "Family",
"farthest": "Farthest", "farthest": "Farthest",
"fight_time": "Fight Time", "fight_time": "Fight Time",
"fill_direction": "Fill Direction",
"filter": "Filter", "filter": "Filter",
"filter_mode": "Filter Mode", "filter_mode": "Filter Mode",
"fire_resistance_label": "Fire Resistance Label",
"first": "First", "first": "First",
"first_hit": "First Hit", "first_hit": "First Hit",
"flinch_count": "Flinch Count", "flinch_count": "Flinch Count",
@@ -120,11 +162,16 @@
"global_scale_modifier": "Global Scale Modifier", "global_scale_modifier": "Global Scale Modifier",
"global_settings": "Global Settings", "global_settings": "Global Settings",
"health": "Health", "health": "Health",
"health_anomaly_filter": "Health + Anomaly Core",
"health_break_anomaly_filter": "Health + Break + Anomaly Core",
"health_break_filter": "Health + Break", "health_break_filter": "Health + Break",
"health_break_severe_filter": "Health + Break + Severe", "health_break_sever_anomaly_filter": "Health + Break + Sever + Anomaly Core",
"health_break_sever_filter": "Health + Break + Sever",
"health_filter": "Health", "health_filter": "Health",
"health_label": "Health Label",
"health_percentage": "Health Percentage", "health_percentage": "Health Percentage",
"health_severe_filter": "Health + Severe", "health_sever_anomaly_filter": "Health + Sever + Anomaly Core",
"health_sever_filter": "Health + Sever",
"height": "Height", "height": "Height",
"hide_ailments_with_zero_buildup": "Hide Ailments when Buildup is 0", "hide_ailments_with_zero_buildup": "Hide Ailments when Buildup is 0",
"hide_all_active_ailments": "Hide All Active Ailments", "hide_all_active_ailments": "Hide All Active Ailments",
@@ -150,20 +197,23 @@
"highlighted_buildup_bar": "Highlighted Buildup Bar", "highlighted_buildup_bar": "Highlighted Buildup Bar",
"highlighted_damage_bar": "Highlighted Damage Bar", "highlighted_damage_bar": "Highlighted Damage Bar",
"highlighted_targeted": "Highlighted (targeted)", "highlighted_targeted": "Highlighted (targeted)",
"history": "History",
"history_size": "History Size",
"horizontal": "Horizontal", "horizontal": "Horizontal",
"hotkeys": "Hotkeys", "hotkeys": "Hotkeys",
"hunter_rank": "Hunter Rank", "hunter_rank": "Hunter Rank",
"hunter_rank_label": "Hunter Rank Label", "hunter_rank_label": "Hunter Rank Label",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID", "id": "ID",
"in_lobby": "In Lobby", "in_lobby": "In Lobby",
"in_training_area": "In Training Area", "in_training_area": "In Training Area",
"include": "Include", "include": "Include",
"inside": "Inside", "inside": "Inside",
"installation_damage": "Installation Damage", "installations": "Installations",
"italic": "Italic", "italic": "Italic",
"join_time": "Join Time", "join_time": "Join Time",
"killcam": "Killcam", "killcam": "Killcam",
"kunai_damage": "Kunai Damage", "kunai": "Kunai",
"language": "Language", "language": "Language",
"large_monster_UI": "Large Monster UI", "large_monster_UI": "Large Monster UI",
"large_monster_dynamic_UI": "Large Monster Dynamic UI", "large_monster_dynamic_UI": "Large Monster Dynamic UI",
@@ -171,6 +221,7 @@
"large_monster_static_UI": "Large Monster Static UI", "large_monster_static_UI": "Large Monster Static UI",
"large_monsters": "Large Monsters", "large_monsters": "Large Monsters",
"last": "Last", "last": "Last",
"left_to_right": "Left to Right",
"level": "Level", "level": "Level",
"level_label": "Level Label", "level_label": "Level Label",
"loading_quest": "Loading Quest", "loading_quest": "Loading Quest",
@@ -191,10 +242,10 @@
"module_visibility_based_on_game_state": "Module Visibility based on Game State", "module_visibility_based_on_game_state": "Module Visibility based on Game State",
"modules": "Modules", "modules": "Modules",
"monster_can_be_captured": "Monster can be captured", "monster_can_be_captured": "Monster can be captured",
"monster_damage": "Monster Damage",
"monster_id": "Monster ID", "monster_id": "Monster ID",
"monster_name": "Monster Name", "monster_name": "Monster Name",
"monster_name_label": "Monster Name Label", "monster_name_label": "Monster Name Label",
"monsters": "Monsters",
"my_damage_bar_location": "My Damage Bar Location", "my_damage_bar_location": "My Damage Bar Location",
"my_otomos": "My Buddies", "my_otomos": "My Buddies",
"myself": "Myself", "myself": "Myself",
@@ -207,10 +258,10 @@
"offset_is_relative_to_parts": "Offset is Relative to Parts", "offset_is_relative_to_parts": "Offset is Relative to Parts",
"opacity_falloff": "Opacity Falloff", "opacity_falloff": "Opacity Falloff",
"orientation": "Orientation", "orientation": "Orientation",
"other_damage": "Other Damage", "other": "Other",
"other_player_otomos": "Other Player Buddies", "other_player_otomos": "Other Player Buddies",
"other_players": "Other Players", "other_players": "Other Players",
"otomo_damage": "Buddy Damage", "otomos": "Buddies",
"outline": "Outline", "outline": "Outline",
"outside": "Outside", "outside": "Outside",
"part_health": "Part Health", "part_health": "Part Health",
@@ -218,12 +269,12 @@
"part_name_label": "Part Name Label", "part_name_label": "Part Name Label",
"percentage_label": "Percentage Label", "percentage_label": "Percentage Label",
"performance": "Performance", "performance": "Performance",
"player_damage": "Player Damage",
"player_name_label": "Player Name Label", "player_name_label": "Player Name Label",
"player_name_size_limit": "Player Name Size Limit", "player_name_size_limit": "Player Name Size Limit",
"player_spacing": "Player Spacing", "player_spacing": "Player Spacing",
"players": "Players",
"playing_quest": "Playing Quest", "playing_quest": "Playing Quest",
"poison_damage": "Poison Damage", "poison": "Poison",
"position": "Position", "position": "Position",
"press_any_key": "Press any key...", "press_any_key": "Press any key...",
"prioritize_large_monsters": "Large Monsters on High Priority", "prioritize_large_monsters": "Large Monsters on High Priority",
@@ -237,15 +288,19 @@
"relative_offset": "Relative Offset", "relative_offset": "Relative Offset",
"rename": "Rename", "rename": "Rename",
"render_highlighted_monster": "Render Highlighted Monster", "render_highlighted_monster": "Render Highlighted Monster",
"render_inactive_anomaly_cores": "Render Inactive Anomaly Cores",
"render_not_highlighted_monsters": "Render Not Highlighted Monsters", "render_not_highlighted_monsters": "Render Not Highlighted Monsters",
"renderer": "Renderer", "renderer": "Renderer",
"reset": "Reset", "reset": "Reset",
"reversed_order": "Reversed Order", "reversed_order": "Reversed Order",
"reward_screen": "Reward Screen", "reward_screen": "Reward Screen",
"right_alignment_shift": "Right Alignment Shift",
"right_to_left": "Right to Left",
"servant_otomos": "Servant Buddies", "servant_otomos": "Servant Buddies",
"servants": "Followers", "servants": "Followers",
"settings": "Settings", "settings": "Settings",
"severe_filter": "Severe", "sever_anomaly_filter": "Sever + Anomaly Core",
"sever_filter": "Sever",
"shadow": "Shadow", "shadow": "Shadow",
"show_my_otomos_separately": "Show My Buddies separately", "show_my_otomos_separately": "Show My Buddies separately",
"show_other_player_otomos_separately": "Show Other Player Buddies separately", "show_other_player_otomos_separately": "Show Other Player Buddies separately",
@@ -256,16 +311,19 @@
"sorting": "Sorting", "sorting": "Sorting",
"spacing": "Spacing", "spacing": "Spacing",
"stamina": "Stamina", "stamina": "Stamina",
"stamina_label": "Stamina Label",
"static_orientation": "Static Orientation", "static_orientation": "Static Orientation",
"static_position": "Static Position", "static_position": "Static Position",
"static_sorting": "Static Sorting", "static_sorting": "Static Sorting",
"static_spacing": "Static Spacing", "static_spacing": "Static Spacing",
"statically_positioned": "Statically Positioned", "statically_positioned": "Statically Positioned",
"stats_UI": "Stats UI",
"status": "Status", "status": "Status",
"style": "Style", "style": "Style",
"summary_screen": "Summary Screen", "summary_screen": "Summary Screen",
"text_label": "Text Label", "text_label": "Text Label",
"thickness": "Thickness", "thickness": "Thickness",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "Time UI", "time_UI": "Time UI",
"time_label": "Time Label", "time_label": "Time Label",
"time_limit": "Time Limit (seconds)", "time_limit": "Time Limit (seconds)",
@@ -276,6 +334,7 @@
"top_dps": "Top DPS", "top_dps": "Top DPS",
"top_left": "Top-Left", "top_left": "Top-Left",
"top_right": "Top-Right", "top_right": "Top-Right",
"top_to_bottom": "Top to Bottom",
"total": "Total", "total": "Total",
"total_buildup": "Total Buildup", "total_buildup": "Total Buildup",
"total_buildup_label": "Total Buildup Label", "total_buildup_label": "Total Buildup Label",
@@ -292,18 +351,29 @@
"tracked_monster_types": "Tracked Monster Types", "tracked_monster_types": "Tracked Monster Types",
"type": "Type", "type": "Type",
"use_d2d_if_available": "Use Direct2D if available", "use_d2d_if_available": "Use Direct2D if available",
"value": "Value",
"value_label": "Value Label", "value_label": "Value Label",
"vertical": "Vertical", "vertical": "Vertical",
"viewport_offset": "Viewport Offset", "viewport_offset": "Viewport Offset",
"visible": "Visible", "visible": "Visible",
"water_resistance_label": "Water Resistance Label",
"width": "Width", "width": "Width",
"world_offset": "World Offset", "world_offset": "World Offset",
"wyvern_riding_damage": "Wyvern Riding Damage", "wyvern_riding": "Wyvern Riding",
"x": "X", "x": "X",
"y": "Y", "y": "Y",
"z": "Z" "z": "Z"
}, },
"font_name": "NotoSansKR-Bold.otf", "dango_skills": {
"dango_insurance_defense_up": "Dango Insurance Defense Up"
},
"font_name": "",
"misc_buffs": {
"attack_up": "Attack Up",
"defense_up": "Defense Up",
"immunity": "Immunity",
"stamina_use_down": "Stamina Use Down"
},
"parts": { "parts": {
"abdomen": "Abdomen", "abdomen": "Abdomen",
"amatsu_unknown": "?", "amatsu_unknown": "?",
@@ -372,5 +442,53 @@
"wingclaw": "Wingclaw", "wingclaw": "Wingclaw",
"wingclaws": "Wingclaws", "wingclaws": "Wingclaws",
"wings": "Wings" "wings": "Wings"
},
"skills": {
"dragon_conversion_elemental_attack_up": "Dragon Conversion Elem. Atk Up",
"dragon_conversion_elemental_res_up": "Dragon Conversion Elem. Res Up",
"powder_mantle_blue": "Powder Mantle (Blue)",
"powder_mantle_red": "Powder Mantle (Red)"
},
"stats": {
"affinity": "Affinity",
"attack": "Attack",
"defense": "Defense",
"dragon": "Dragon",
"dragon_resistance": "Dragon Res",
"fire": "Fire",
"fire_resistance": "Fire Res",
"ice": "Ice",
"ice_resistance": "Ice Res",
"stamina": "Stamina",
"thunder": "Thunder",
"thunder_resistance": "Thunder Res",
"water": "Water",
"water_resistance": "Water Res"
},
"unicode_glyph_ranges": [
0
],
"weapon_skills": {
"all_extracts_mix": "All Extracts Mix",
"amped_state": "Amped State",
"arc_shot_affinity": "Arc Shot: Affinity",
"arc_shot_brace": "Arc Shot: Brace",
"archdemon_mode": "Archdemon Mode",
"axe_heavy_slam": "Axe: Heavy Slam",
"element_boost": "Element Boost",
"herculean_draw": "Herculean Draw",
"ironshine_silk": "Ironshine Silk",
"orange_extract": "Orange Extract",
"overheat": "Overheat",
"power_sheathe": "Power Sheathe",
"red_extract": "Red Extract",
"spirit_gauge": "Spirit Gauge",
"spirit_gauge_autofill": "Spirit Gauge Autofill",
"switch_charger": "Switch Charger",
"sword_boost_mode": "Sword Boost Mode",
"twin_wine": "Twin Wine",
"white_extract": "White Extract",
"wyvernblast_reload": "Wyvernblast Reload",
"wyvernsnipe_reload": "Wyvernsnipe Reload"
} }
} }

View File

@@ -3,8 +3,10 @@
"HP": "HP:", "HP": "HP:",
"buildup": "蓄積値:", "buildup": "蓄積値:",
"gold": "金冠", "gold": "金冠",
"lv": "Lv.",
"mini": "小型", "mini": "小型",
"otomo": "Buddy", "otomo": "Buddy",
"part_anomaly_core": "Anomaly Core",
"part_break": "部位破壊", "part_break": "部位破壊",
"part_sever": "尻尾切断", "part_sever": "尻尾切断",
"player": "Player", "player": "Player",
@@ -17,30 +19,67 @@
}, },
"ailments": { "ailments": {
"blast": "爆破", "blast": "爆破",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"bubbleblight": "Bubbleblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "悪臭", "dung_bomb": "悪臭",
"engulfed": "Engulfed",
"exhaust": "疲労", "exhaust": "疲労",
"fall_otomo_trap": "オトモ落とし穴", "fall_otomo_trap": "オトモ落とし穴",
"fall_trap": "落とし穴", "fall_trap": "落とし穴",
"falling_asleep": "Falling Asleep",
"fireblight": "火属性やられ", "fireblight": "火属性やられ",
"flash": "目くらまし", "flash": "目くらまし",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "氷属性やられ", "iceblight": "氷属性やられ",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "麻痺", "paralysis": "麻痺",
"poison": "毒", "poison": "毒",
"quick_sand": "流砂", "quick_sand": "流砂",
"resistance_down": "Resistance Down",
"ride": "操竜", "ride": "操竜",
"roar": "Roar",
"shock_otomo_trap": "オトモしびれ罠", "shock_otomo_trap": "オトモしびれ罠",
"shock_trap": "しびれ罠", "shock_trap": "しびれ罠",
"sleep": "睡眠", "sleep": "睡眠",
"steel_fang": "ガルク噛み付き", "steel_fang": "ガルク噛み付き",
"stench": "Stench",
"stun": "スタン", "stun": "スタン",
"thunderblight": "雷属性やられ", "thunderblight": "雷属性やられ",
"tranq_bomb": "捕獲用麻酔玉", "tranq_bomb": "捕獲用麻酔玉",
"waterblight": "水属性やられ" "tremor": "Tremor",
"waterblight": "水属性やられ",
"webbed": "Webbed"
},
"consumables": {
"adamant_seed": "Adamant Seed",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_powder": "Demon Powder",
"demondrug": "Demondrug",
"gourmet_fish": "Gourmet Fish",
"hardshell_powder": "Hardshell Powder",
"immunizer": "Immunizer",
"mega_armorskin": "Mega Armorskin",
"mega_demondrug": "Mega Demondrug",
"might_seed": "Might Seed"
}, },
"customization_menu": { "customization_menu": {
"UI_font": "UI フォント", "UI_font": "UI フォント",
"UI_font_notice": "フォントの変更後はスクリプトリセットを行ってください。", "UI_font_notice": "フォントの変更後はスクリプトリセットを行ってください。",
"activation_count": "適用までのカウント", "activation_count": "適用までのカウント",
"affinity_label": "Affinity Label",
"ailment_buildups": "状態異常の蓄積値", "ailment_buildups": "状態異常の蓄積値",
"ailment_name": "状態異常表示", "ailment_name": "状態異常表示",
"ailment_name_label": "状態異常表示ラベル", "ailment_name_label": "状態異常表示ラベル",
@@ -48,23 +87,31 @@
"ailments": "状態異常表示", "ailments": "状態異常表示",
"all_UI": "全てのUI", "all_UI": "全てのUI",
"anchor": "固定", "anchor": "固定",
"anomaly_cores": "Anomaly Cores",
"anomaly_filter": "Anomaly Core",
"anomaly_health": "Anomaly Core Health",
"anomaly_health_percentage": "Anomaly Core Health Percentage",
"apply": "適用", "apply": "適用",
"assign_new_key": "新規に割り当てるキーを入力", "assign_new_key": "新規に割り当てるキーを入力",
"attack_label": "Attack Label",
"auto_highlight": "Auto-highlight", "auto_highlight": "Auto-highlight",
"background": "背景色", "background": "背景色",
"bar": "バー", "bar": "バー",
"blast_damage": "爆破ダメージ", "blast": "爆破",
"body_parts": "部位", "body_parts": "部位",
"bold": "ボールド", "bold": "ボールド",
"bomb_damage": "爆弾ダメージ", "bombs": "Bombs",
"bottom_left": "左下", "bottom_left": "左下",
"bottom_right": "右下", "bottom_right": "右下",
"bottom_to_top": "Bottom to Top",
"break_anomaly_filter": "Break + Anomaly Core",
"break_count": "破壊時間", "break_count": "破壊時間",
"break_filter": "Break", "break_filter": "Break",
"break_health": "部位破壊までのダメージ状況", "break_health": "部位破壊までのダメージ状況",
"break_health_percentage": "部位破壊までのダメージ状況()", "break_health_percentage": "部位破壊までのダメージ状況()",
"break_max_count": "最大破壊数", "break_max_count": "最大破壊数",
"break_severe_filter": "Break + Severe", "break_sever_anomaly_filter": "Break + Sever + Anomaly Core",
"break_sever_filter": "Break + Sever",
"buff_UI": "Buff UI", "buff_UI": "Buff UI",
"buildup": "蓄積値", "buildup": "蓄積値",
"buildup_bar": "蓄積値バー", "buildup_bar": "蓄積値バー",
@@ -84,6 +131,7 @@
"crown": "王冠", "crown": "王冠",
"crown_thresholds": "王冠の閾値", "crown_thresholds": "王冠の閾値",
"current_state": "Current State", "current_state": "Current State",
"current_time": "Current Time",
"current_value": "Current Value", "current_value": "Current Value",
"cutscene": "Cutscene", "cutscene": "Cutscene",
"damage": "ダメージ", "damage": "ダメージ",
@@ -92,25 +140,33 @@
"damage_meter_UI": "ダメージメーターUI", "damage_meter_UI": "ダメージメーターUI",
"damage_percentage_label": "ダメージ割合()ラベル", "damage_percentage_label": "ダメージ割合()ラベル",
"damage_value_label": "ダメージラベル", "damage_value_label": "ダメージラベル",
"debug": "Debug",
"default_state": "Default State", "default_state": "Default State",
"defense_label": "Defense Label",
"delete": "Delete", "delete": "Delete",
"distance": "距離", "distance": "距離",
"dps": "DPS", "dps": "DPS",
"dps_label": "DPSラベル", "dps_label": "DPSラベル",
"dps_mode": "DPS モード", "dps_mode": "DPS モード",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "Duplicate", "duplicate": "Duplicate",
"duration": "Duration", "duration": "Duration",
"dynamic_positioning": "動的な場所", "dynamic_positioning": "動的な場所",
"dynamically_positioned": "モンスターに追随して表示", "dynamically_positioned": "モンスターに追随して表示",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "有効にする", "enable_for": "有効にする",
"enabled": "有効", "enabled": "有効",
"endemic_life": "Endemic Life",
"endemic_life_UI": "環境生物UI", "endemic_life_UI": "環境生物UI",
"endemic_life_damage": "環境生物のダメージ", "everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "Family", "family": "Family",
"farthest": "Farthest", "farthest": "Farthest",
"fight_time": "戦闘時間", "fight_time": "戦闘時間",
"fill_direction": "Fill Direction",
"filter": "フィルター", "filter": "フィルター",
"filter_mode": "Filter Mode", "filter_mode": "Filter Mode",
"fire_resistance_label": "Fire Resistance Label",
"first": "最初", "first": "最初",
"first_hit": "初撃", "first_hit": "初撃",
"flinch_count": "ひるみ回数", "flinch_count": "ひるみ回数",
@@ -120,11 +176,16 @@
"global_scale_modifier": "全体的なスケールの調整", "global_scale_modifier": "全体的なスケールの調整",
"global_settings": "全体設定", "global_settings": "全体設定",
"health": "体力", "health": "体力",
"health_anomaly_filter": "Health + Anomaly Core",
"health_break_anomaly_filter": "Health + Break + Anomaly Core",
"health_break_filter": "Health + Break", "health_break_filter": "Health + Break",
"health_break_severe_filter": "Health + Break + Severe", "health_break_sever_anomaly_filter": "Health + Break + Sever + Anomaly Core",
"health_break_sever_filter": "Health + Break + Sever",
"health_filter": "Health", "health_filter": "Health",
"health_label": "Health Label",
"health_percentage": "ダメージ割合()", "health_percentage": "ダメージ割合()",
"health_severe_filter": "Health + Severe", "health_sever_anomaly_filter": "Health + Sever + Anomaly Core",
"health_sever_filter": "Health + Sever",
"height": "ヘイト", "height": "ヘイト",
"hide_ailments_with_zero_buildup": "蓄積値がゼロの時に状態異常の表示を隠す", "hide_ailments_with_zero_buildup": "蓄積値がゼロの時に状態異常の表示を隠す",
"hide_all_active_ailments": "全ての有効な状態異常を隠す", "hide_all_active_ailments": "全ての有効な状態異常を隠す",
@@ -150,20 +211,23 @@
"highlighted_buildup_bar": "ハイライトされた蓄積値バー", "highlighted_buildup_bar": "ハイライトされた蓄積値バー",
"highlighted_damage_bar": "ハイライトされたダメージバー", "highlighted_damage_bar": "ハイライトされたダメージバー",
"highlighted_targeted": "詳細表示 (ターゲット)", "highlighted_targeted": "詳細表示 (ターゲット)",
"history": "History",
"history_size": "History Size",
"horizontal": "水平", "horizontal": "水平",
"hotkeys": "ホットキー", "hotkeys": "ホットキー",
"hunter_rank": "ハンターランク", "hunter_rank": "ハンターランク",
"hunter_rank_label": "ハンターランクのラベル", "hunter_rank_label": "ハンターランクのラベル",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID", "id": "ID",
"in_lobby": "In Lobby", "in_lobby": "In Lobby",
"in_training_area": "In Training Area", "in_training_area": "In Training Area",
"include": "含める情報", "include": "含める情報",
"inside": "Inside", "inside": "Inside",
"installation_damage": "設備のダメージ", "installations": "Installations",
"italic": "イタリック", "italic": "イタリック",
"join_time": "参加時間", "join_time": "参加時間",
"killcam": "Killcam", "killcam": "Killcam",
"kunai_damage": "クナイダメージ", "kunai": "Kunai",
"language": "表示言語", "language": "表示言語",
"large_monster_UI": "大型モンスターUI", "large_monster_UI": "大型モンスターUI",
"large_monster_dynamic_UI": "大型モンスターのダイナミック表示UI", "large_monster_dynamic_UI": "大型モンスターのダイナミック表示UI",
@@ -171,6 +235,7 @@
"large_monster_static_UI": "大型モンスターのスタティック表示UI", "large_monster_static_UI": "大型モンスターのスタティック表示UI",
"large_monsters": "大型モンスター", "large_monsters": "大型モンスター",
"last": "最後", "last": "最後",
"left_to_right": "Left to Right",
"level": "Level", "level": "Level",
"level_label": "Level Label", "level_label": "Level Label",
"loading_quest": "Loading Quest", "loading_quest": "Loading Quest",
@@ -191,10 +256,10 @@
"module_visibility_based_on_game_state": "Module Visibility based on Game State", "module_visibility_based_on_game_state": "Module Visibility based on Game State",
"modules": "モジュール", "modules": "モジュール",
"monster_can_be_captured": "捕獲可能なモンスター", "monster_can_be_captured": "捕獲可能なモンスター",
"monster_damage": "モンスターダメージ",
"monster_id": "モンスターID", "monster_id": "モンスターID",
"monster_name": "モンスター名", "monster_name": "モンスター名",
"monster_name_label": "モンスター名ラベル", "monster_name_label": "モンスター名ラベル",
"monsters": "Monsters",
"my_damage_bar_location": "自身のダメージバーの場所", "my_damage_bar_location": "自身のダメージバーの場所",
"my_otomos": "My Buddies", "my_otomos": "My Buddies",
"myself": "Myself", "myself": "Myself",
@@ -207,10 +272,10 @@
"offset_is_relative_to_parts": "部位表示に対する相対的な位置", "offset_is_relative_to_parts": "部位表示に対する相対的な位置",
"opacity_falloff": "透明度を上げる", "opacity_falloff": "透明度を上げる",
"orientation": "並べ方", "orientation": "並べ方",
"other_damage": "その他のダメージ", "other": "Other",
"other_player_otomos": "Other Player Buddies", "other_player_otomos": "Other Player Buddies",
"other_players": "他のプレイヤー", "other_players": "他のプレイヤー",
"otomo_damage": "オトモのダメージ", "otomos": "Buddies",
"outline": "Outline", "outline": "Outline",
"outside": "Outside", "outside": "Outside",
"part_health": "部位体力", "part_health": "部位体力",
@@ -218,12 +283,12 @@
"part_name_label": "部位名ラベル", "part_name_label": "部位名ラベル",
"percentage_label": "パーセンテージラベル", "percentage_label": "パーセンテージラベル",
"performance": "パフォーマンス", "performance": "パフォーマンス",
"player_damage": "プレイヤーダメージ",
"player_name_label": "プレイヤー名ラベル", "player_name_label": "プレイヤー名ラベル",
"player_name_size_limit": "プレイヤー名のサイズ上限", "player_name_size_limit": "プレイヤー名のサイズ上限",
"player_spacing": "プレイヤー表示の間隔", "player_spacing": "プレイヤー表示の間隔",
"players": "Players",
"playing_quest": "Playing Quest", "playing_quest": "Playing Quest",
"poison_damage": "毒ダメージ", "poison": "毒",
"position": "位置", "position": "位置",
"press_any_key": "何かボタンを押してください。", "press_any_key": "何かボタンを押してください。",
"prioritize_large_monsters": "大型モンスターを優先する", "prioritize_large_monsters": "大型モンスターを優先する",
@@ -237,15 +302,19 @@
"relative_offset": "相対的な表示位置", "relative_offset": "相対的な表示位置",
"rename": "Rename", "rename": "Rename",
"render_highlighted_monster": "ハイライトされたモンスターをレンダリング(表示)する", "render_highlighted_monster": "ハイライトされたモンスターをレンダリング(表示)する",
"render_inactive_anomaly_cores": "Render Inactive Anomaly Cores",
"render_not_highlighted_monsters": "ハイライトされていないモンスターをレンダリング(表示)する", "render_not_highlighted_monsters": "ハイライトされていないモンスターをレンダリング(表示)する",
"renderer": "Renderer", "renderer": "Renderer",
"reset": "Reset", "reset": "Reset",
"reversed_order": "逆順", "reversed_order": "逆順",
"reward_screen": "Reward Screen", "reward_screen": "Reward Screen",
"right_alignment_shift": "Right Alignment Shift",
"right_to_left": "Right to Left",
"servant_otomos": "Servant Buddies", "servant_otomos": "Servant Buddies",
"servants": "Followers", "servants": "Followers",
"settings": "設定", "settings": "設定",
"severe_filter": "Severe", "sever_anomaly_filter": "Sever + Anomaly Core",
"sever_filter": "Sever",
"shadow": "影", "shadow": "影",
"show_my_otomos_separately": "Show my Buddies separately", "show_my_otomos_separately": "Show my Buddies separately",
"show_other_player_otomos_separately": "Show Other Player Buddies separately", "show_other_player_otomos_separately": "Show Other Player Buddies separately",
@@ -256,16 +325,19 @@
"sorting": "ソート", "sorting": "ソート",
"spacing": "間隔", "spacing": "間隔",
"stamina": "スタミナ", "stamina": "スタミナ",
"stamina_label": "Stamina Label",
"static_orientation": "モンスター情報の配置を修正", "static_orientation": "モンスター情報の配置を修正",
"static_position": "モンスター情報の場所を修正", "static_position": "モンスター情報の場所を修正",
"static_sorting": "モンスター情報の並べ替えを修正", "static_sorting": "モンスター情報の並べ替えを修正",
"static_spacing": "モンスター情報間の距離を修正", "static_spacing": "モンスター情報間の距離を修正",
"statically_positioned": "モンスター情報の一覧表示", "statically_positioned": "モンスター情報の一覧表示",
"stats_UI": "Stats UI",
"status": "ステータス", "status": "ステータス",
"style": "Style", "style": "Style",
"summary_screen": "Summary Screen", "summary_screen": "Summary Screen",
"text_label": "テキストラベル", "text_label": "テキストラベル",
"thickness": "Thickness", "thickness": "Thickness",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "タイムUI", "time_UI": "タイムUI",
"time_label": "タイムラベル", "time_label": "タイムラベル",
"time_limit": "タイムリミット(s.)", "time_limit": "タイムリミット(s.)",
@@ -276,6 +348,7 @@
"top_dps": "最高DPS", "top_dps": "最高DPS",
"top_left": "左上", "top_left": "左上",
"top_right": "右上", "top_right": "右上",
"top_to_bottom": "Top to Bottom",
"total": "Total", "total": "Total",
"total_buildup": "蓄積合計", "total_buildup": "蓄積合計",
"total_buildup_label": "合計蓄積ラベル", "total_buildup_label": "合計蓄積ラベル",
@@ -292,18 +365,111 @@
"tracked_monster_types": "モンスタータイプでの追跡", "tracked_monster_types": "モンスタータイプでの追跡",
"type": "タイプ", "type": "タイプ",
"use_d2d_if_available": "Use Direct2D if available", "use_d2d_if_available": "Use Direct2D if available",
"value": "Value",
"value_label": "バリューラベル", "value_label": "バリューラベル",
"vertical": "縦", "vertical": "縦",
"viewport_offset": "表示領域からの位置", "viewport_offset": "表示領域からの位置",
"visible": "表示する", "visible": "表示する",
"water_resistance_label": "Water Resistance Label",
"width": "幅", "width": "幅",
"world_offset": "表示位置", "world_offset": "表示位置",
"wyvern_riding_damage": "操竜ダメージ", "wyvern_riding": "Wyvern Riding",
"x": "X", "x": "X",
"y": "Y", "y": "Y",
"z": "Z" "z": "Z"
}, },
"dango_skills": {
"dango_insurance_defense_up": "Dango Insurance Defense Up"
},
"dangos": {
"dango_adrenaline": "Dango Adrenaline",
"dango_bombardier": "Dango Bombardier",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_defender_hi": "Dango Defender (Hi)",
"dango_deflector": "Dango Deflector",
"dango_dragon_res": "Dango Dragon Res",
"dango_dragon_res_hi": "Dango Dragon Res (Hi)",
"dango_driver": "Dango Driver",
"dango_feet": "Dango Feet",
"dango_fighter": "Dango Fighter",
"dango_fire_res": "Dango Fire Res",
"dango_fire_res_hi": "Dango Fire Res (Hi)",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_guard": "Dango Guard",
"dango_hunter": "Dango Hunter",
"dango_hurler": "Dango Hurler",
"dango_ice_res": "Dango Ice Res",
"dango_ice_res_hi": "Dango Ice Res (Hi)",
"dango_immunizer": "Dango Immunizer",
"dango_insurance": "Dango Insurance",
"dango_insurance_defense_up": "Dango Insurance Defense Up",
"dango_marksman": "Dango Marksman",
"dango_medic": "Dango Medic",
"dango_medic_hi": "Dango Medic (Hi)",
"dango_moxie": "Dango Moxie",
"dango_polisher": "Dango Polisher",
"dango_pyro": "Dango Pyro",
"dango_reviver": "Dango Reviver",
"dango_rider": "Dango Rider",
"dango_shifter": "Dango Shifter",
"dango_slugger": "Dango Slugger",
"dango_specialist": "Dango Specialist",
"dango_temper": "Dango Temper",
"dango_thunder_res": "Dango Thunder Res ",
"dango_thunder_res_hi": "Dango Thunder Res (Hi)",
"dango_wall_runner": "Dango Wall Runner",
"dango_water_res": "Dango Water Res",
"dango_water_res_hi": "Dango Water Res (Hi)",
"dango_weakener": "Dango Weakener",
"super_recovery_dango": "Super Recovery Dango"
},
"font_name": "NotoSansJP-Bold.otf", "font_name": "NotoSansJP-Bold.otf",
"melody_effects": {
"affinity_up": "Affinity Up",
"attack_and_affinity_up": "Attack and Affinity Up",
"attack_and_defense_up": "Attack and Defense Up",
"attack_up": "Attack Up",
"blight_negated": "Blight Negated",
"defense_up": "Defense Up",
"divine_protection": "Divine Protection",
"earplugs_l": "Earplugs (L)",
"earplugs_s": "Earplugs (S)",
"elemental_attack_boost": "Elemental Attack Boost",
"environment_damage_negated": "Environment Damage Negated",
"health_recovery_l": "Health Recovery (L)",
"health_recovery_s": "Health Recovery (S)",
"health_recovery_s_antidote": "Health Recovery (S) + Antidote",
"health_regeneration": "Health Regeneration",
"infernal_melody": "Infernal Melody",
"knockbacks_negated": "Knockbacks Negated",
"self_improvement": "Self-Improvement",
"sharpness_extension": "Sharpness Extension",
"sharpness_loss_reduced": "Sharpness Loss Reduced",
"sharpness_regeneration": "Sharpness Regeneration",
"sonic_barrier": "Sonic Barrier",
"sonic_wave": "Sonic Wave",
"stamina_recovery_up": "Stamina Recovery Up",
"stamina_use_reduced": "Stamina Use Reduced",
"stun_negated": "Stun Negated",
"tremors_negated": "Tremors Negated",
"wind_pressure_negated": "Wind Pressure Negated"
},
"misc_buffs": {
"attack_up": "Attack Up",
"defense_down": "Defense Down",
"defense_up": "Defense Up",
"immunity": "Immunity",
"stamina_use_down": "Stamina Use Down"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar"
},
"parts": { "parts": {
"abdomen": "腹部", "abdomen": "腹部",
"amatsu_unknown": "?", "amatsu_unknown": "?",
@@ -372,5 +538,113 @@
"wingclaw": "翼爪", "wingclaw": "翼爪",
"wingclaws": "Wingclaws", "wingclaws": "Wingclaws",
"wings": "翼" "wings": "翼"
},
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"bladescale_hone": "Bladescale Hone",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragon_conversion_elemental_attack_up": "Dragon Conversion Elem. Attack Up",
"dragon_conversion_elemental_res_up": "Dragon Conversion Elem. Res. Up",
"dragonheart": "Dragonheart",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"intrepid_heart": "Intrepid Heart",
"kushala_daora_soul": "Kushala Daora Soul",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"peak_performance": "Peak Performance",
"powder_mantle_blue": "Powder Mantle (Blue)",
"powder_mantle_red": "Powder Mantle (Red)",
"protective_polish": "Protective Polish",
"resentment": "Resentment",
"resuscitate": "Resuscitate",
"spiribirds_call": "Spiribird's Call",
"status_trigger": "Status Trigger",
"wall_runner": "Wall Runner",
"wind_mantle": "Wind Mantle"
},
"stats": {
"affinity": "Affinity",
"attack": "Attack",
"defense": "Defense",
"dragon": "Dragon",
"dragon_resistance": "Dragon Res",
"fire": "Fire",
"fire_resistance": "Fire Res",
"ice": "Ice",
"ice_resistance": "Ice Res",
"stamina": "Stamina",
"thunder": "Thunder",
"thunder_resistance": "Thunder Res",
"water": "Water",
"water_resistance": "Water Res"
},
"unicode_glyph_ranges": [
32,
255,
8192,
8303,
12288,
12543,
12784,
12799,
19968,
40879,
65280,
65519,
0
],
"weapon_skills": {
"all_extracts_mix": "All Extracts Mix",
"amped_state": "Amped State",
"anchor_rage": "Anchor Rage",
"arc_shot_affinity": "Arc Shot: Affinity",
"arc_shot_brace": "Arc Shot: Brace",
"archdemon_mode": "Archdemon Mode",
"axe_heavy_slam": "Axe: Heavy Slam",
"bead_of_resonance": "Bead of Resonance",
"bolt_boost": "Bolt Boost",
"counter_charger": "Counter Charger",
"destroyer_oil": "Destroyer Oil",
"element_boost": "Element Boost",
"erupting_cannon": "Erupting Cannon",
"fanning_maneuver": "Fannin Maneuver",
"ground_splitter": "Ground Splitter",
"harvest_moon": "Harvest Moon",
"herculean_draw": "Herculean Draw",
"iai_slash": "Iai Slash",
"impact_burst": "Impact Burst",
"ironshine_silk": "Ironshine Silk",
"orange_extract": "O Extract",
"overheat": "Overheat",
"power_sheathe": "Power Sheathe",
"red_extract": "Red Extract",
"rising_moon": "Rising Moon",
"setting_sun": "Setting Sun",
"shield_charge": "Shield Charge",
"silkbind_shockwave": "Silkbind Shockwave",
"soaring_kick": "Soaring Kick",
"sonic_bloom": "Sonic Bloom",
"spiral_thrust": "Spiral Thrust",
"spirit_gauge": "Spirit Gauge",
"spirit_gauge_autofill": "Spirit Gauge Autofill",
"switch_charger": "Switch Charger",
"sword_boost_mode": "Sword Boost Mode",
"sword_charge": "Sword Charge",
"twin_wine": "Twin Wine",
"white_extract": "White Extract",
"wyvernblast_reload": "Wyvernblast Reload",
"wyvernsnipe_reload": "Wyvernsnipe Reload"
} }
} }

View File

@@ -3,8 +3,10 @@
"HP": "체력:", "HP": "체력:",
"buildup": "누적치:", "buildup": "누적치:",
"gold": "금관", "gold": "금관",
"lv": "Lv.",
"mini": "최소", "mini": "최소",
"otomo": "동반자", "otomo": "동반자",
"part_anomaly_core": "괴이핵",
"part_break": "파괴", "part_break": "파괴",
"part_sever": "절단", "part_sever": "절단",
"player": "헌터", "player": "헌터",
@@ -17,30 +19,67 @@
}, },
"ailments": { "ailments": {
"blast": "폭파", "blast": "폭파",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"bubbleblight": "Bubbleblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "거름탄", "dung_bomb": "거름탄",
"engulfed": "Engulfed",
"exhaust": "탈진", "exhaust": "탈진",
"fall_otomo_trap": "동반자 구멍 함정", "fall_otomo_trap": "동반자 구멍 함정",
"fall_trap": "구멍 함정", "fall_trap": "구멍 함정",
"falling_asleep": "Falling Asleep",
"fireblight": "불바위구리", "fireblight": "불바위구리",
"flash": "섬광", "flash": "섬광",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "진흙구리", "iceblight": "진흙구리",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "마비", "paralysis": "마비",
"poison": "독", "poison": "독",
"quick_sand": "유사(모래함정)", "quick_sand": "유사(모래함정)",
"resistance_down": "Resistance Down",
"ride": "용조종", "ride": "용조종",
"roar": "Roar",
"shock_otomo_trap": "동반자 마비덫", "shock_otomo_trap": "동반자 마비덫",
"shock_trap": "마비덫", "shock_trap": "마비덫",
"sleep": "수면", "sleep": "수면",
"steel_fang": "강철아", "steel_fang": "강철아",
"stench": "Stench",
"stun": "기절", "stun": "기절",
"thunderblight": "번개털구리", "thunderblight": "번개털구리",
"tranq_bomb": "포획용마취옥", "tranq_bomb": "포획용마취옥",
"waterblight": "진흙구리" "tremor": "Tremor",
"waterblight": "진흙구리",
"webbed": "Webbed"
},
"consumables": {
"adamant_seed": "Adamant Seed",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_powder": "Demon Powder",
"demondrug": "Demondrug",
"gourmet_fish": "Gourmet Fish",
"hardshell_powder": "Hardshell Powder",
"immunizer": "Immunizer",
"mega_armorskin": "Mega Armorskin",
"mega_demondrug": "Mega Demondrug",
"might_seed": "Might Seed"
}, },
"customization_menu": { "customization_menu": {
"UI_font": "UI 글꼴", "UI_font": "UI 글꼴",
"UI_font_notice": "글꼴 변경시 스크립트를 리로드 해야합니다!", "UI_font_notice": "글꼴 변경시 스크립트를 리로드 해야합니다!",
"activation_count": "활성 횟수", "activation_count": "활성 횟수",
"affinity_label": "Affinity Label",
"ailment_buildups": "상태이상 누적치", "ailment_buildups": "상태이상 누적치",
"ailment_name": "상태이상 이름", "ailment_name": "상태이상 이름",
"ailment_name_label": "상태이상 이름 정보", "ailment_name_label": "상태이상 이름 정보",
@@ -48,23 +87,31 @@
"ailments": "상태이상", "ailments": "상태이상",
"all_UI": "모든 UI", "all_UI": "모든 UI",
"anchor": "기준", "anchor": "기준",
"anomaly_cores": "괴이핵",
"anomaly_filter": "괴이핵",
"anomaly_health": "괴이핵 체력",
"anomaly_health_percentage": "괴이핵 체력 비율",
"apply": "적용", "apply": "적용",
"assign_new_key": "새 키를 할당", "assign_new_key": "새 키를 할당",
"attack_label": "Attack Label",
"auto_highlight": "자동 타겟 설정", "auto_highlight": "자동 타겟 설정",
"background": "배경색", "background": "배경색",
"bar": "막대", "bar": "막대",
"blast_damage": "폭파 대미지", "blast": "폭파",
"body_parts": "부위", "body_parts": "부위",
"bold": "굵게", "bold": "굵게",
"bomb_damage": "폭탄 대미지", "bombs": "폭탄",
"bottom_left": "좌하단", "bottom_left": "왼쪽 아래",
"bottom_right": "우하단", "bottom_right": "오른쪽 아래",
"bottom_to_top": "아래에서 위로",
"break_anomaly_filter": "파괴 + 괴이핵",
"break_count": "파괴 횟수", "break_count": "파괴 횟수",
"break_filter": "파괴", "break_filter": "파괴",
"break_health": "파괴 수치", "break_health": "파괴 수치",
"break_health_percentage": "파괴 수치 비율", "break_health_percentage": "파괴 수치 비율",
"break_max_count": "최대 파괴 횟수", "break_max_count": "최대 파괴 횟수",
"break_severe_filter": "파괴 + 절단", "break_sever_anomaly_filter": "파괴 + 절단 + 괴이핵",
"break_sever_filter": "파괴 + 절단",
"buff_UI": "버프 UI", "buff_UI": "버프 UI",
"buildup": "누적치", "buildup": "누적치",
"buildup_bar": "누적치 막대", "buildup_bar": "누적치 막대",
@@ -83,8 +130,9 @@
"creature_name_label": "환경생물 이름 정보", "creature_name_label": "환경생물 이름 정보",
"crown": "금관", "crown": "금관",
"crown_thresholds": "금관 판정값", "crown_thresholds": "금관 판정값",
"current_state": "Current State", "current_state": "현재 상태",
"current_value": "Current Value", "current_time": "Current Time",
"current_value": "현재 값",
"cutscene": "컷신", "cutscene": "컷신",
"damage": "대미지", "damage": "대미지",
"damage_bar": "대미지 막대", "damage_bar": "대미지 막대",
@@ -92,25 +140,34 @@
"damage_meter_UI": "대미지 미터 UI", "damage_meter_UI": "대미지 미터 UI",
"damage_percentage_label": "대미지 비율 정보", "damage_percentage_label": "대미지 비율 정보",
"damage_value_label": "대미지 값 정보", "damage_value_label": "대미지 값 정보",
"default_state": "Default State", "debug": "Debug",
"debug_errors": "Debug Errors",
"default_state": "기본 상태",
"defense_label": "Defense Label",
"delete": "삭제하기", "delete": "삭제하기",
"distance": "간격", "distance": "간격",
"dps": "DPS", "dps": "DPS",
"dps_label": "DPS 정보", "dps_label": "DPS 정보",
"dps_mode": "DPS 모드", "dps_mode": "DPS 모드",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "복제하기", "duplicate": "복제하기",
"duration": "지속시간", "duration": "지속시간",
"dynamic_positioning": "유동 위치", "dynamic_positioning": "유동 위치",
"dynamically_positioned": "유동 위치 UI", "dynamically_positioned": "유동 위치 UI",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "표시 대상", "enable_for": "표시 대상",
"enabled": "사용함", "enabled": "사용함",
"endemic_life": "환경생물",
"endemic_life_UI": "환경생물 UI", "endemic_life_UI": "환경생물 UI",
"endemic_life_damage": "환경생물 대미지", "everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "글꼴", "family": "글꼴",
"farthest": "가장 멀리있는", "farthest": "가장 멀리있는",
"fight_time": "전투 시간", "fight_time": "전투 시간",
"fill_direction": "채우는 방향",
"filter": "필터", "filter": "필터",
"filter_mode": "Filter Mode", "filter_mode": "필터 모드",
"fire_resistance_label": "Fire Resistance Label",
"first": "맨 앞", "first": "맨 앞",
"first_hit": "첫 공격", "first_hit": "첫 공격",
"flinch_count": "경직 횟수", "flinch_count": "경직 횟수",
@@ -120,11 +177,16 @@
"global_scale_modifier": "전역 크기 배율", "global_scale_modifier": "전역 크기 배율",
"global_settings": "전역 설정", "global_settings": "전역 설정",
"health": "체력", "health": "체력",
"health_anomaly_filter": "체력 + 괴이핵",
"health_break_anomaly_filter": "체력 + 파괴 + 괴이핵",
"health_break_filter": "체력 + 파괴", "health_break_filter": "체력 + 파괴",
"health_break_severe_filter": "체력 + 파괴 + 절단", "health_break_sever_anomaly_filter": "체력 + 파괴 + 절단 + 괴이핵",
"health_break_sever_filter": "체력 + 파괴 + 절단",
"health_filter": "체력", "health_filter": "체력",
"health_label": "Health Label",
"health_percentage": "체력 비율", "health_percentage": "체력 비율",
"health_severe_filter": "체력 + 절단", "health_sever_anomaly_filter": "체력 + 절단 + 괴이핵",
"health_sever_filter": "체력 + 절단",
"height": "높이", "height": "높이",
"hide_ailments_with_zero_buildup": "누적치가 0이면 상태이상 표시 안 함", "hide_ailments_with_zero_buildup": "누적치가 0이면 상태이상 표시 안 함",
"hide_all_active_ailments": "걸린 상태이상 모두 표시 안 함", "hide_all_active_ailments": "걸린 상태이상 모두 표시 안 함",
@@ -150,20 +212,23 @@
"highlighted_buildup_bar": "주시대상 몬스터 누적치 막대", "highlighted_buildup_bar": "주시대상 몬스터 누적치 막대",
"highlighted_damage_bar": "주시대상 몬스터 대미지 막대", "highlighted_damage_bar": "주시대상 몬스터 대미지 막대",
"highlighted_targeted": "주시대상 몬스터 표시", "highlighted_targeted": "주시대상 몬스터 표시",
"history": "History",
"history_size": "History Size",
"horizontal": "가로", "horizontal": "가로",
"hotkeys": "단축키", "hotkeys": "단축키",
"hunter_rank": "헌터 랭크", "hunter_rank": "헌터 랭크",
"hunter_rank_label": "헌터 랭크 정보", "hunter_rank_label": "헌터 랭크 정보",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID", "id": "ID",
"in_lobby": "로비 내", "in_lobby": "로비 내",
"in_training_area": "훈련구역 내", "in_training_area": "훈련구역 내",
"include": "포함", "include": "포함",
"inside": "내부", "inside": "내부",
"installation_damage": "설비 대미지", "installations": "설",
"italic": "기울임", "italic": "기울임",
"join_time": "참가 시간", "join_time": "참가 시간",
"killcam": "처치 영상", "killcam": "처치 영상",
"kunai_damage": "쿠나이 대미지", "kunai": "쿠나이",
"language": "언어", "language": "언어",
"large_monster_UI": "대형 몬스터 UI", "large_monster_UI": "대형 몬스터 UI",
"large_monster_dynamic_UI": "대형 몬스터 유동 UI", "large_monster_dynamic_UI": "대형 몬스터 유동 UI",
@@ -171,6 +236,7 @@
"large_monster_static_UI": "대형 몬스터 고정 UI", "large_monster_static_UI": "대형 몬스터 고정 UI",
"large_monsters": "대형 몬스터", "large_monsters": "대형 몬스터",
"last": "맨 뒤", "last": "맨 뒤",
"left_to_right": "왼쪽에서 오른쪽",
"level": "레벨", "level": "레벨",
"level_label": "레벨 정보", "level_label": "레벨 정보",
"loading_quest": "퀘스트 로딩 중", "loading_quest": "퀘스트 로딩 중",
@@ -181,7 +247,7 @@
"master_rank": "마스터 랭크", "master_rank": "마스터 랭크",
"max_distance": "최대 거리", "max_distance": "최대 거리",
"max_monster_updates_per_tick": "틱당 최대 몬스터 갱신 횟수", "max_monster_updates_per_tick": "틱당 최대 몬스터 갱신 횟수",
"max_value": "Max Value", "max_value": "최대값",
"me": "나", "me": "나",
"menu_font": "메뉴 글꼴", "menu_font": "메뉴 글꼴",
"menu_font_change_disclaimer": "언어 및 메뉴 글꼴 크기를 여러 번 변경하면 비정상 종료가 될 수 있습니다!", "menu_font_change_disclaimer": "언어 및 메뉴 글꼴 크기를 여러 번 변경하면 비정상 종료가 될 수 있습니다!",
@@ -189,28 +255,28 @@
"mode": "모드", "mode": "모드",
"modifiers": "설정 배율", "modifiers": "설정 배율",
"module_visibility_based_on_game_state": "게임 상태에 따라 모듈 표시", "module_visibility_based_on_game_state": "게임 상태에 따라 모듈 표시",
"modules": "UI", "modules": "모듈",
"monster_can_be_captured": "몬스터 포획 가능", "monster_can_be_captured": "몬스터 포획 가능",
"monster_damage": "몬스터 대미지",
"monster_id": "몬스터 ID", "monster_id": "몬스터 ID",
"monster_name": "몬스터명", "monster_name": "몬스터명",
"monster_name_label": "몬스터명 정보", "monster_name_label": "몬스터명 정보",
"monsters": "몬스터",
"my_damage_bar_location": "내 대미지 막대 위치", "my_damage_bar_location": "내 대미지 막대 위치",
"my_otomos": "내 동반자", "my_otomos": "내 동반자",
"myself": "나", "myself": "나",
"name": "이름", "name": "이름",
"name_label": "이름 정보", "name_label": "이름 정보",
"new": "새", "new": "새로 만들기",
"none": "없음", "none": "없음",
"normal": "기본", "normal": "기본",
"offset": "오프셋", "offset": "오프셋",
"offset_is_relative_to_parts": "오프셋을 부위 기준으로", "offset_is_relative_to_parts": "오프셋을 부위 기준으로",
"opacity_falloff": "투명도 감소", "opacity_falloff": "투명도 감소",
"orientation": "방향", "orientation": "방향",
"other_damage": "기타 대미지", "other": "기타",
"other_player_otomos": "다른 플레이어 동반자", "other_player_otomos": "다른 플레이어 동반자",
"other_players": "다른 헌터", "other_players": "다른 헌터",
"otomo_damage": "동반자 대미지", "otomos": "동반자",
"outline": "외곽선", "outline": "외곽선",
"outside": "외부", "outside": "외부",
"part_health": "부위 수치", "part_health": "부위 수치",
@@ -218,12 +284,12 @@
"part_name_label": "부위 정보", "part_name_label": "부위 정보",
"percentage_label": "비율 정보", "percentage_label": "비율 정보",
"performance": "성능", "performance": "성능",
"player_damage": "헌터 대미지",
"player_name_label": "헌터명 정보", "player_name_label": "헌터명 정보",
"player_name_size_limit": "헌터명 크기 제한", "player_name_size_limit": "헌터명 크기 제한",
"player_spacing": "플레이어 간격", "player_spacing": "플레이어 간격",
"players": "모든 플레이어",
"playing_quest": "퀘스트 중", "playing_quest": "퀘스트 중",
"poison_damage": "독 대미지", "poison": "독",
"position": "위치", "position": "위치",
"press_any_key": "설정할 키를 누르세요...", "press_any_key": "설정할 키를 누르세요...",
"prioritize_large_monsters": "대형 몬스터를 우선적으로", "prioritize_large_monsters": "대형 몬스터를 우선적으로",
@@ -237,15 +303,19 @@
"relative_offset": "상대적 위치 오프셋", "relative_offset": "상대적 위치 오프셋",
"rename": "이름 변경", "rename": "이름 변경",
"render_highlighted_monster": "주시대상 몬스터 표시", "render_highlighted_monster": "주시대상 몬스터 표시",
"render_inactive_anomaly_cores": "비활성화 된 괴이핵 표시",
"render_not_highlighted_monsters": "주시대상이 아닌 아닌 몬스터 표시", "render_not_highlighted_monsters": "주시대상이 아닌 아닌 몬스터 표시",
"renderer": "렌더링", "renderer": "렌더링",
"reset": "리셋", "reset": "리셋",
"reversed_order": "역순", "reversed_order": "역순",
"reward_screen": "보상 화면", "reward_screen": "보상 화면",
"right_alignment_shift": "우측정렬 이동",
"right_to_left": "오른쪽에서 왼쪽",
"servant_otomos": "맹우 동반자", "servant_otomos": "맹우 동반자",
"servants": "맹우", "servants": "맹우",
"settings": "설정", "settings": "설정",
"severe_filter": "절단", "sever_anomaly_filter": "절단 + 괴이핵",
"sever_filter": "절단",
"shadow": "그림자", "shadow": "그림자",
"show_my_otomos_separately": "내 동반자를 따로", "show_my_otomos_separately": "내 동반자를 따로",
"show_other_player_otomos_separately": "다른 플레이어의 동반자를 따로", "show_other_player_otomos_separately": "다른 플레이어의 동반자를 따로",
@@ -256,16 +326,19 @@
"sorting": "정렬방법", "sorting": "정렬방법",
"spacing": "간격", "spacing": "간격",
"stamina": "스태미나", "stamina": "스태미나",
"stamina_label": "Stamina Label",
"static_orientation": "고정 방향", "static_orientation": "고정 방향",
"static_position": "고정 위치", "static_position": "고정 위치",
"static_sorting": "고정 정렬방법", "static_sorting": "고정 정렬방법",
"static_spacing": "고정 간격", "static_spacing": "고정 간격",
"statically_positioned": "고정 위치 UI", "statically_positioned": "고정 위치 UI",
"stats_UI": "Stats UI",
"status": "상태", "status": "상태",
"style": "스타일", "style": "스타일",
"summary_screen": "결과 요약 화면", "summary_screen": "결과 요약 화면",
"text_label": "텍스트 정보", "text_label": "텍스트 정보",
"thickness": "두께", "thickness": "두께",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "시간 UI", "time_UI": "시간 UI",
"time_label": "시간 정보", "time_label": "시간 정보",
"time_limit": "시간 제한 (단위: 초)", "time_limit": "시간 제한 (단위: 초)",
@@ -274,8 +347,9 @@
"top_buildup": "총 누적치", "top_buildup": "총 누적치",
"top_damage": "최고 대미지", "top_damage": "최고 대미지",
"top_dps": "최고 DPS", "top_dps": "최고 DPS",
"top_left": "좌상단", "top_left": "왼쪽 위",
"top_right": "우상단", "top_right": "오른쪽 위",
"top_to_bottom": "위에서 아래",
"total": "전체", "total": "전체",
"total_buildup": "총 누적치", "total_buildup": "총 누적치",
"total_buildup_label": "총 누적치 정보", "total_buildup_label": "총 누적치 정보",
@@ -292,18 +366,111 @@
"tracked_monster_types": "추적할 몬스터 타입", "tracked_monster_types": "추적할 몬스터 타입",
"type": "종류", "type": "종류",
"use_d2d_if_available": "가능한 Direct2D를 사용함", "use_d2d_if_available": "가능한 Direct2D를 사용함",
"value": "Value",
"value_label": "값 정보", "value_label": "값 정보",
"vertical": "세로", "vertical": "세로",
"viewport_offset": "뷰포트 오프셋", "viewport_offset": "뷰포트 오프셋",
"visible": "표시함", "visible": "표시함",
"water_resistance_label": "Water Resistance Label",
"width": "너비", "width": "너비",
"world_offset": "전역 오프셋", "world_offset": "전역 오프셋",
"wyvern_riding_damage": "용조종 대미지", "wyvern_riding": "용조종",
"x": "X", "x": "X",
"y": "Y", "y": "Y",
"z": "Z" "z": "Z"
}, },
"dango_skills": {
"dango_insurance_defense_up": "Dango Insurance Defense Up"
},
"dangos": {
"dango_adrenaline": "Dango Adrenaline",
"dango_bombardier": "Dango Bombardier",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_defender_hi": "Dango Defender (Hi)",
"dango_deflector": "Dango Deflector",
"dango_dragon_res": "Dango Dragon Res",
"dango_dragon_res_hi": "Dango Dragon Res (Hi)",
"dango_driver": "Dango Driver",
"dango_feet": "Dango Feet",
"dango_fighter": "Dango Fighter",
"dango_fire_res": "Dango Fire Res",
"dango_fire_res_hi": "Dango Fire Res (Hi)",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_guard": "Dango Guard",
"dango_hunter": "Dango Hunter",
"dango_hurler": "Dango Hurler",
"dango_ice_res": "Dango Ice Res",
"dango_ice_res_hi": "Dango Ice Res (Hi)",
"dango_immunizer": "Dango Immunizer",
"dango_insurance": "Dango Insurance",
"dango_insurance_defense_up": "Dango Insurance Defense Up",
"dango_marksman": "Dango Marksman",
"dango_medic": "Dango Medic",
"dango_medic_hi": "Dango Medic (Hi)",
"dango_moxie": "Dango Moxie",
"dango_polisher": "Dango Polisher",
"dango_pyro": "Dango Pyro",
"dango_reviver": "Dango Reviver",
"dango_rider": "Dango Rider",
"dango_shifter": "Dango Shifter",
"dango_slugger": "Dango Slugger",
"dango_specialist": "Dango Specialist",
"dango_temper": "Dango Temper",
"dango_thunder_res": "Dango Thunder Res ",
"dango_thunder_res_hi": "Dango Thunder Res (Hi)",
"dango_wall_runner": "Dango Wall Runner",
"dango_water_res": "Dango Water Res",
"dango_water_res_hi": "Dango Water Res (Hi)",
"dango_weakener": "Dango Weakener",
"super_recovery_dango": "Super Recovery Dango"
},
"font_name": "NotoSansKR-Bold.otf", "font_name": "NotoSansKR-Bold.otf",
"melody_effects": {
"affinity_up": "Affinity Up",
"attack_and_affinity_up": "Attack and Affinity Up",
"attack_and_defense_up": "Attack and Defense Up",
"attack_up": "Attack Up",
"blight_negated": "Blight Negated",
"defense_up": "Defense Up",
"divine_protection": "Divine Protection",
"earplugs_l": "Earplugs (L)",
"earplugs_s": "Earplugs (S)",
"elemental_attack_boost": "Elemental Attack Boost",
"environment_damage_negated": "Environment Damage Negated",
"health_recovery_l": "Health Recovery (L)",
"health_recovery_s": "Health Recovery (S)",
"health_recovery_s_antidote": "Health Recovery (S) + Antidote",
"health_regeneration": "Health Regeneration",
"infernal_melody": "Infernal Melody",
"knockbacks_negated": "Knockbacks Negated",
"self_improvement": "Self-Improvement",
"sharpness_extension": "Sharpness Extension",
"sharpness_loss_reduced": "Sharpness Loss Reduced",
"sharpness_regeneration": "Sharpness Regeneration",
"sonic_barrier": "Sonic Barrier",
"sonic_wave": "Sonic Wave",
"stamina_recovery_up": "Stamina Recovery Up",
"stamina_use_reduced": "Stamina Use Reduced",
"stun_negated": "Stun Negated",
"tremors_negated": "Tremors Negated",
"wind_pressure_negated": "Wind Pressure Negated"
},
"misc_buffs": {
"attack_up": "Attack Up",
"defense_down": "Defense Down",
"defense_up": "Defense Up",
"immunity": "Immunity",
"stamina_use_down": "Stamina Use Down"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar"
},
"parts": { "parts": {
"abdomen": "배", "abdomen": "배",
"amatsu_unknown": "?", "amatsu_unknown": "?",
@@ -372,5 +539,113 @@
"wingclaw": "날개발톱", "wingclaw": "날개발톱",
"wingclaws": "날개발톱", "wingclaws": "날개발톱",
"wings": "날개" "wings": "날개"
},
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"bladescale_hone": "Bladescale Hone",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragon_conversion_elemental_attack_up": "Dragon Conversion Elem. Attack Up",
"dragon_conversion_elemental_res_up": "Dragon Conversion Elem. Res. Up",
"dragonheart": "Dragonheart",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"intrepid_heart": "Intrepid Heart",
"kushala_daora_soul": "Kushala Daora Soul",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"peak_performance": "Peak Performance",
"powder_mantle_blue": "Powder Mantle (Blue)",
"powder_mantle_red": "Powder Mantle (Red)",
"protective_polish": "Protective Polish",
"resentment": "Resentment",
"resuscitate": "Resuscitate",
"spiribirds_call": "Spiribird's Call",
"status_trigger": "Status Trigger",
"wall_runner": "Wall Runner",
"wind_mantle": "Wind Mantle"
},
"stats": {
"affinity": "Affinity",
"attack": "Attack",
"defense": "Defense",
"dragon": "Dragon",
"dragon_resistance": "Dragon Res",
"fire": "Fire",
"fire_resistance": "Fire Res",
"ice": "Ice",
"ice_resistance": "Ice Res",
"stamina": "Stamina",
"thunder": "Thunder",
"thunder_resistance": "Thunder Res",
"water": "Water",
"water_resistance": "Water Res"
},
"unicode_glyph_ranges": [
32,
255,
4352,
4607,
8192,
8303,
12592,
12687,
44032,
55215,
65280,
65519,
0
],
"weapon_skills": {
"all_extracts_mix": "All Extracts Mix",
"amped_state": "Amped State",
"anchor_rage": "Anchor Rage",
"arc_shot_affinity": "Arc Shot: Affinity",
"arc_shot_brace": "Arc Shot: Brace",
"archdemon_mode": "Archdemon Mode",
"axe_heavy_slam": "Axe: Heavy Slam",
"bead_of_resonance": "Bead of Resonance",
"bolt_boost": "Bolt Boost",
"counter_charger": "Counter Charger",
"destroyer_oil": "Destroyer Oil",
"element_boost": "Element Boost",
"erupting_cannon": "Erupting Cannon",
"fanning_maneuver": "Fannin Maneuver",
"ground_splitter": "Ground Splitter",
"harvest_moon": "Harvest Moon",
"herculean_draw": "Herculean Draw",
"iai_slash": "Iai Slash",
"impact_burst": "Impact Burst",
"ironshine_silk": "Ironshine Silk",
"orange_extract": "O Extract",
"overheat": "Overheat",
"power_sheathe": "Power Sheathe",
"red_extract": "Red Extract",
"rising_moon": "Rising Moon",
"setting_sun": "Setting Sun",
"shield_charge": "Shield Charge",
"silkbind_shockwave": "Silkbind Shockwave",
"soaring_kick": "Soaring Kick",
"sonic_bloom": "Sonic Bloom",
"spiral_thrust": "Spiral Thrust",
"spirit_gauge": "Spirit Gauge",
"spirit_gauge_autofill": "Spirit Gauge Autofill",
"switch_charger": "Switch Charger",
"sword_boost_mode": "Sword Boost Mode",
"sword_charge": "Sword Charge",
"twin_wine": "Twin Wine",
"white_extract": "White Extract",
"wyvernblast_reload": "Wyvernblast Reload",
"wyvernsnipe_reload": "Wyvernsnipe Reload"
} }
} }

View File

@@ -3,8 +3,10 @@
"HP": "ОЗ:", "HP": "ОЗ:",
"buildup": "Накопление", "buildup": "Накопление",
"gold": "Золото", "gold": "Золото",
"lv": "Lv.",
"mini": "Мини", "mini": "Мини",
"otomo": "Cпутник", "otomo": "Cпутник",
"part_anomaly_core": "Ядро аномалии",
"part_break": "Повреждение", "part_break": "Повреждение",
"part_sever": "Отсечение", "part_sever": "Отсечение",
"player": "Игрок", "player": "Игрок",
@@ -17,30 +19,67 @@
}, },
"ailments": { "ailments": {
"blast": "Взрыв", "blast": "Взрыв",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"bubbleblight": "Bubbleblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "Навозная бомба", "dung_bomb": "Навозная бомба",
"engulfed": "Engulfed",
"exhaust": "Усталость", "exhaust": "Усталость",
"fall_otomo_trap": "Волчья яма спутника", "fall_otomo_trap": "Волчья яма спутника",
"fall_trap": "Волчья яма", "fall_trap": "Волчья яма",
"falling_asleep": "Falling Asleep",
"fireblight": "Огненная порча", "fireblight": "Огненная порча",
"flash": "Оглушение", "flash": "Оглушение",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "Ледяная порча", "iceblight": "Ледяная порча",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "Паралич", "paralysis": "Паралич",
"poison": "Отравление", "poison": "Отравление",
"quick_sand": "Зыбучий песок", "quick_sand": "Зыбучий песок",
"resistance_down": "Resistance Down",
"ride": "Езда на виверне", "ride": "Езда на виверне",
"roar": "Roar",
"shock_otomo_trap": "Шоковая ловушка спутника", "shock_otomo_trap": "Шоковая ловушка спутника",
"shock_trap": "Шоковая ловушка", "shock_trap": "Шоковая ловушка",
"sleep": "Сон", "sleep": "Сон",
"steel_fang": "Стальной клык", "steel_fang": "Стальной клык",
"stench": "Stench",
"stun": "Оглушение", "stun": "Оглушение",
"thunderblight": "Грозовая порча", "thunderblight": "Грозовая порча",
"tranq_bomb": "Снотворная порча", "tranq_bomb": "Снотворная порча",
"waterblight": "Водяная порча" "tremor": "Tremor",
"waterblight": "Водяная порча",
"webbed": "Webbed"
},
"consumables": {
"adamant_seed": "Adamant Seed",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_powder": "Demon Powder",
"demondrug": "Demondrug",
"gourmet_fish": "Gourmet Fish",
"hardshell_powder": "Hardshell Powder",
"immunizer": "Immunizer",
"mega_armorskin": "Mega Armorskin",
"mega_demondrug": "Mega Demondrug",
"might_seed": "Might Seed"
}, },
"customization_menu": { "customization_menu": {
"UI_font": "Шрифт интерфейса", "UI_font": "Шрифт интерфейса",
"UI_font_notice": "Любые изменения шрифта требуют перезагрузку скрипта!", "UI_font_notice": "Любые изменения шрифта требуют перезагрузку скрипта!",
"activation_count": "Кол-во активаций", "activation_count": "Кол-во активаций",
"affinity_label": "Affinity Label",
"ailment_buildups": "Накопление аномального статуса", "ailment_buildups": "Накопление аномального статуса",
"ailment_name": "Название аномального статуса", "ailment_name": "Название аномального статуса",
"ailment_name_label": "Метка названия аномального статуса", "ailment_name_label": "Метка названия аномального статуса",
@@ -48,23 +87,31 @@
"ailments": "Аномальные статусы", "ailments": "Аномальные статусы",
"all_UI": "Весь интерфейс", "all_UI": "Весь интерфейс",
"anchor": "Привязка", "anchor": "Привязка",
"anomaly_cores": "Ядра аномалии",
"anomaly_filter": "Ядро аномалии",
"anomaly_health": "Здоровье ядра аномалии",
"anomaly_health_percentage": "Здоровье ядра аномалии в процентах",
"apply": "Применить", "apply": "Применить",
"assign_new_key": "Привязать клавишу", "assign_new_key": "Привязать клавишу",
"attack_label": "Attack Label",
"auto_highlight": "Автофокус", "auto_highlight": "Автофокус",
"background": "Фон", "background": "Фон",
"bar": "Шкала", "bar": "Шкала",
"blast_damage": "Урон от взрыва", "blast": "Взрыв",
"body_parts": "Части тела", "body_parts": "Части тела",
"bold": "Жирный", "bold": "Жирный",
"bomb_damage": "Урон от бомб", "bombs": "Бомбы",
"bottom_left": "Левый нижний угол", "bottom_left": "Левый нижний угол",
"bottom_right": "Правй нижний угол", "bottom_right": "Правй нижний угол",
"bottom_to_top": "Снизу вверх",
"break_anomaly_filter": "Повреждение + Ядро аномалии",
"break_count": "Счётчик повреждений", "break_count": "Счётчик повреждений",
"break_filter": "Повреждение", "break_filter": "Повреждение",
"break_health": "Повреждение части", "break_health": "Повреждение части",
"break_health_percentage": "Повреждение части в процентах", "break_health_percentage": "Повреждение части в процентах",
"break_max_count": "Максимальное кол-во повреждений", "break_max_count": "Максимальное кол-во повреждений",
"break_severe_filter": "Повреждение + Отсечение", "break_sever_anomaly_filter": "Повреждение + Отсечение + Ядро аномалии",
"break_sever_filter": "Повреждение + Отсечение",
"buff_UI": "Интерфейс баффов", "buff_UI": "Интерфейс баффов",
"buildup": "Накопление", "buildup": "Накопление",
"buildup_bar": "Шкала накопления", "buildup_bar": "Шкала накопления",
@@ -84,6 +131,7 @@
"crown": "Корона", "crown": "Корона",
"crown_thresholds": "Лимиты корон", "crown_thresholds": "Лимиты корон",
"current_state": "Текущее состояние", "current_state": "Текущее состояние",
"current_time": "Current Time",
"current_value": "Текущее значение", "current_value": "Текущее значение",
"cutscene": "Катсцена", "cutscene": "Катсцена",
"damage": "Урон", "damage": "Урон",
@@ -92,25 +140,34 @@
"damage_meter_UI": "Интерфейс модуля урона", "damage_meter_UI": "Интерфейс модуля урона",
"damage_percentage_label": "Метка урона в процентах", "damage_percentage_label": "Метка урона в процентах",
"damage_value_label": "Метка значений урона", "damage_value_label": "Метка значений урона",
"debug": "Debug",
"debug_errors": "Debug Errors",
"default_state": "Состояние по умолчанию", "default_state": "Состояние по умолчанию",
"defense_label": "Defense Label",
"delete": "Удалить", "delete": "Удалить",
"distance": "Расстояние", "distance": "Расстояние",
"dps": "Урон в секунду", "dps": "Урон в секунду",
"dps_label": "Метка урона в секунду", "dps_label": "Метка урона в секунду",
"dps_mode": "Режим урона в секунду", "dps_mode": "Режим урона в секунду",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "Дублировать", "duplicate": "Дублировать",
"duration": "Продолжительность", "duration": "Продолжительность",
"dynamic_positioning": "Динамическое позиционирование", "dynamic_positioning": "Динамическое позиционирование",
"dynamically_positioned": "Рассположенный динамично", "dynamically_positioned": "Рассположенный динамично",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "Показывать для", "enable_for": "Показывать для",
"enabled": "Включить", "enabled": "Включить",
"endemic_life": "Местная живность",
"endemic_life_UI": "Интерфейс местной живности", "endemic_life_UI": "Интерфейс местной живности",
"endemic_life_damage": "Урон от окружения", "everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "Семейство", "family": "Семейство",
"farthest": "Самый дальний", "farthest": "Самый дальний",
"fight_time": "Время в бою", "fight_time": "Время в бою",
"fill_direction": "Направление заполнения",
"filter": "Фильтр", "filter": "Фильтр",
"filter_mode": "Режим Фильтра", "filter_mode": "Режим Фильтра",
"fire_resistance_label": "Fire Resistance Label",
"first": "Первый", "first": "Первый",
"first_hit": "Первый удар", "first_hit": "Первый удар",
"flinch_count": "Кол-во вздрагиваний", "flinch_count": "Кол-во вздрагиваний",
@@ -120,11 +177,16 @@
"global_scale_modifier": "Глобальный модификатор размера", "global_scale_modifier": "Глобальный модификатор размера",
"global_settings": "Общие настройки", "global_settings": "Общие настройки",
"health": "Здоровье", "health": "Здоровье",
"health_anomaly_filter": "Здоровье + Ядро аномалии",
"health_break_anomaly_filter": "Здоровье + Повреждение + Ядро аномалии",
"health_break_filter": "Здоровье + Повреждение", "health_break_filter": "Здоровье + Повреждение",
"health_break_severe_filter": "Здоровье + Повреждение + Отсечение", "health_break_sever_anomaly_filter": "Здоровье + Повреждение + Отсечение + Ядро аномалии",
"health_break_sever_filter": "Здоровье + Повреждение + Отсечение",
"health_filter": "Здоровье", "health_filter": "Здоровье",
"health_label": "Health Label",
"health_percentage": "Здоровье в процентах", "health_percentage": "Здоровье в процентах",
"health_severe_filter": "Здоровье + Отсечение", "health_sever_anomaly_filter": "Здоровье + Отсечение + Ядро аномалии",
"health_sever_filter": "Здоровье + Отсечение",
"height": "Высота", "height": "Высота",
"hide_ailments_with_zero_buildup": "Скрыть аномальный статус, если накопление равно 0", "hide_ailments_with_zero_buildup": "Скрыть аномальный статус, если накопление равно 0",
"hide_all_active_ailments": "Скрыть все активные аномальные статусы", "hide_all_active_ailments": "Скрыть все активные аномальные статусы",
@@ -150,20 +212,23 @@
"highlighted_buildup_bar": "Помеченная шкала накопления", "highlighted_buildup_bar": "Помеченная шкала накопления",
"highlighted_damage_bar": "Помеченная шкала урона", "highlighted_damage_bar": "Помеченная шкала урона",
"highlighted_targeted": "Помеченный", "highlighted_targeted": "Помеченный",
"history": "History",
"history_size": "History Size",
"horizontal": "Горизонтально", "horizontal": "Горизонтально",
"hotkeys": "Горячие клавиши", "hotkeys": "Горячие клавиши",
"hunter_rank": "Ранг охотника", "hunter_rank": "Ранг охотника",
"hunter_rank_label": "Метка ранга охотника", "hunter_rank_label": "Метка ранга охотника",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID", "id": "ID",
"in_lobby": "В лобби", "in_lobby": "В лобби",
"in_training_area": "В тренировочной зоне", "in_training_area": "В тренировочной зоне",
"include": "Элементы", "include": "Элементы",
"inside": "Внутри", "inside": "Внутри",
"installation_damage": "Урон от установок", "installations": "Установки",
"italic": "Курсив", "italic": "Курсив",
"join_time": "Время присоединения", "join_time": "Время присоединения",
"killcam": "Камера смерти", "killcam": "Камера смерти",
"kunai_damage": "Урон от кунаев", "kunai": "Кунаи",
"language": "Язык", "language": "Язык",
"large_monster_UI": "Интерфейс больший монстров", "large_monster_UI": "Интерфейс больший монстров",
"large_monster_dynamic_UI": "Динамический интерфейс больших монстров", "large_monster_dynamic_UI": "Динамический интерфейс больших монстров",
@@ -171,6 +236,7 @@
"large_monster_static_UI": "Статический интерфейс больших монстров", "large_monster_static_UI": "Статический интерфейс больших монстров",
"large_monsters": "Большие монстры", "large_monsters": "Большие монстры",
"last": "Последний", "last": "Последний",
"left_to_right": "Слева направо",
"level": "Уровень", "level": "Уровень",
"level_label": "Метка уровня", "level_label": "Метка уровня",
"loading_quest": "Загрузка квеста", "loading_quest": "Загрузка квеста",
@@ -191,10 +257,10 @@
"module_visibility_based_on_game_state": "Видимость модулей в зависимости от состояния игры", "module_visibility_based_on_game_state": "Видимость модулей в зависимости от состояния игры",
"modules": "Модули", "modules": "Модули",
"monster_can_be_captured": "Монстр может быть схвачен", "monster_can_be_captured": "Монстр может быть схвачен",
"monster_damage": "Урон от монстров",
"monster_id": "ИД монстра", "monster_id": "ИД монстра",
"monster_name": "Имя монстра", "monster_name": "Имя монстра",
"monster_name_label": "Метка имени монстра", "monster_name_label": "Метка имени монстра",
"monsters": "Монстры",
"my_damage_bar_location": "Позиция моей шкалы урона", "my_damage_bar_location": "Позиция моей шкалы урона",
"my_otomos": "Мои спутники", "my_otomos": "Мои спутники",
"myself": "Я", "myself": "Я",
@@ -207,10 +273,10 @@
"offset_is_relative_to_parts": "Сдвиг относителен к частям тела", "offset_is_relative_to_parts": "Сдвиг относителен к частям тела",
"opacity_falloff": "Увеличение прозрачности от расстояния", "opacity_falloff": "Увеличение прозрачности от расстояния",
"orientation": "Ориентация", "orientation": "Ориентация",
"other_damage": "Другой урон", "other": "Другое",
"other_player_otomos": "Спутники других игроков", "other_player_otomos": "Спутники других игроков",
"other_players": "Другие игроки", "other_players": "Другие игроки",
"otomo_damage": "Урон от спутников", "otomos": "Спутники",
"outline": "Обводка", "outline": "Обводка",
"outside": "Снаружи", "outside": "Снаружи",
"part_health": "Здоровье части", "part_health": "Здоровье части",
@@ -218,12 +284,12 @@
"part_name_label": "Метка имени части тела", "part_name_label": "Метка имени части тела",
"percentage_label": "Метка процентов", "percentage_label": "Метка процентов",
"performance": "Производительность", "performance": "Производительность",
"player_damage": "Урон игрока",
"player_name_label": "Метка имени игрока", "player_name_label": "Метка имени игрока",
"player_name_size_limit": "Ограничить ширину имени игрока", "player_name_size_limit": "Ограничить ширину имени игрока",
"player_spacing": "Расстояние между игроками", "player_spacing": "Расстояние между игроками",
"players": "Игроки",
"playing_quest": "Во время квеста", "playing_quest": "Во время квеста",
"poison_damage": "Урон от отравления", "poison": "Отравление",
"position": "Расположение", "position": "Расположение",
"press_any_key": "Нажмите любую клавишу...", "press_any_key": "Нажмите любую клавишу...",
"prioritize_large_monsters": "Большие монстры в приоритете", "prioritize_large_monsters": "Большие монстры в приоритете",
@@ -237,15 +303,19 @@
"relative_offset": "Относительный сдвиг", "relative_offset": "Относительный сдвиг",
"rename": "Переименовать", "rename": "Переименовать",
"render_highlighted_monster": "Показывать помеченного монстра", "render_highlighted_monster": "Показывать помеченного монстра",
"render_inactive_anomaly_cores": "Показывать неактивные ядра аномалии",
"render_not_highlighted_monsters": "Показывать непомеченных монстров", "render_not_highlighted_monsters": "Показывать непомеченных монстров",
"renderer": "Рендерер", "renderer": "Рендерер",
"reset": "Сбросить", "reset": "Сбросить",
"reversed_order": "Обратный порядок", "reversed_order": "Обратный порядок",
"reward_screen": "Экран наград", "reward_screen": "Экран наград",
"right_alignment_shift": "Сдвиг для выравнивания по правому краю",
"right_to_left": "Справа налево",
"servant_otomos": "Спутники последователей", "servant_otomos": "Спутники последователей",
"servants": "Последователи", "servants": "Последователи",
"settings": "Настройки", "settings": "Настройки",
"severe_filter": "Отсечение", "sever_anomaly_filter": "Отсечение + Ядро аномалии",
"sever_filter": "Отсечение",
"shadow": "Тень", "shadow": "Тень",
"show_my_otomos_separately": "Показывать моих спутников отдельно", "show_my_otomos_separately": "Показывать моих спутников отдельно",
"show_other_player_otomos_separately": "Показывать спутников других игроков отдельно", "show_other_player_otomos_separately": "Показывать спутников других игроков отдельно",
@@ -256,16 +326,19 @@
"sorting": "Сортировка", "sorting": "Сортировка",
"spacing": "Расстояние между элементами", "spacing": "Расстояние между элементами",
"stamina": "Выносливость", "stamina": "Выносливость",
"stamina_label": "Stamina Label",
"static_orientation": "Статичная ориентация", "static_orientation": "Статичная ориентация",
"static_position": "Статичное расположение", "static_position": "Статичное расположение",
"static_sorting": "Статичная сортировка", "static_sorting": "Статичная сортировка",
"static_spacing": "Статичное расстояние между элементами", "static_spacing": "Статичное расстояние между элементами",
"statically_positioned": "Рассположенный статично", "statically_positioned": "Рассположенный статично",
"stats_UI": "Stats UI",
"status": "Статус", "status": "Статус",
"style": "Стиль", "style": "Стиль",
"summary_screen": "Экран Результатов", "summary_screen": "Экран Результатов",
"text_label": "Текстовая метка", "text_label": "Текстовая метка",
"thickness": "Толщина", "thickness": "Толщина",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "Интерфейс времени", "time_UI": "Интерфейс времени",
"time_label": "Метка времени", "time_label": "Метка времени",
"time_limit": "Ограничение по времени (cек.)", "time_limit": "Ограничение по времени (cек.)",
@@ -276,6 +349,7 @@
"top_dps": "Наибольший урон в секунду", "top_dps": "Наибольший урон в секунду",
"top_left": "Левый верхний угол", "top_left": "Левый верхний угол",
"top_right": "Правый верхний угол", "top_right": "Правый верхний угол",
"top_to_bottom": "Сверху вниз",
"total": "Всего", "total": "Всего",
"total_buildup": "Общее накопление", "total_buildup": "Общее накопление",
"total_buildup_label": "Метка общего накопления", "total_buildup_label": "Метка общего накопления",
@@ -292,18 +366,111 @@
"tracked_monster_types": "Отслеживаемые типы монстров", "tracked_monster_types": "Отслеживаемые типы монстров",
"type": "Тип", "type": "Тип",
"use_d2d_if_available": "Использовать Direct2D, если доступен", "use_d2d_if_available": "Использовать Direct2D, если доступен",
"value": "Value",
"value_label": "Метка значений", "value_label": "Метка значений",
"vertical": "Вертикально", "vertical": "Вертикально",
"viewport_offset": "Сдвиг в экранном пространстве", "viewport_offset": "Сдвиг в экранном пространстве",
"visible": "Включить", "visible": "Включить",
"water_resistance_label": "Water Resistance Label",
"width": "Ширина", "width": "Ширина",
"world_offset": "Сдвиг в игровом пространстве", "world_offset": "Сдвиг в игровом пространстве",
"wyvern_riding_damage": "Урон от езды на виверне", "wyvern_riding": "Езда на виверне",
"x": "X", "x": "X",
"y": "Y", "y": "Y",
"z": "Z" "z": "Z"
}, },
"dango_skills": {
"dango_insurance_defense_up": "Dango Insurance Defense Up"
},
"dangos": {
"dango_adrenaline": "Dango Adrenaline",
"dango_bombardier": "Dango Bombardier",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_defender_hi": "Dango Defender (Hi)",
"dango_deflector": "Dango Deflector",
"dango_dragon_res": "Dango Dragon Res",
"dango_dragon_res_hi": "Dango Dragon Res (Hi)",
"dango_driver": "Dango Driver",
"dango_feet": "Dango Feet",
"dango_fighter": "Dango Fighter",
"dango_fire_res": "Dango Fire Res",
"dango_fire_res_hi": "Dango Fire Res (Hi)",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_guard": "Dango Guard",
"dango_hunter": "Dango Hunter",
"dango_hurler": "Dango Hurler",
"dango_ice_res": "Dango Ice Res",
"dango_ice_res_hi": "Dango Ice Res (Hi)",
"dango_immunizer": "Dango Immunizer",
"dango_insurance": "Dango Insurance",
"dango_insurance_defense_up": "Dango Insurance Defense Up",
"dango_marksman": "Dango Marksman",
"dango_medic": "Dango Medic",
"dango_medic_hi": "Dango Medic (Hi)",
"dango_moxie": "Dango Moxie",
"dango_polisher": "Dango Polisher",
"dango_pyro": "Dango Pyro",
"dango_reviver": "Dango Reviver",
"dango_rider": "Dango Rider",
"dango_shifter": "Dango Shifter",
"dango_slugger": "Dango Slugger",
"dango_specialist": "Dango Specialist",
"dango_temper": "Dango Temper",
"dango_thunder_res": "Dango Thunder Res ",
"dango_thunder_res_hi": "Dango Thunder Res (Hi)",
"dango_wall_runner": "Dango Wall Runner",
"dango_water_res": "Dango Water Res",
"dango_water_res_hi": "Dango Water Res (Hi)",
"dango_weakener": "Dango Weakener",
"super_recovery_dango": "Super Recovery Dango"
},
"font_name": "NotoSansKR-Bold.otf", "font_name": "NotoSansKR-Bold.otf",
"melody_effects": {
"affinity_up": "Affinity Up",
"attack_and_affinity_up": "Attack and Affinity Up",
"attack_and_defense_up": "Attack and Defense Up",
"attack_up": "Attack Up",
"blight_negated": "Blight Negated",
"defense_up": "Defense Up",
"divine_protection": "Divine Protection",
"earplugs_l": "Earplugs (L)",
"earplugs_s": "Earplugs (S)",
"elemental_attack_boost": "Elemental Attack Boost",
"environment_damage_negated": "Environment Damage Negated",
"health_recovery_l": "Health Recovery (L)",
"health_recovery_s": "Health Recovery (S)",
"health_recovery_s_antidote": "Health Recovery (S) + Antidote",
"health_regeneration": "Health Regeneration",
"infernal_melody": "Infernal Melody",
"knockbacks_negated": "Knockbacks Negated",
"self_improvement": "Self-Improvement",
"sharpness_extension": "Sharpness Extension",
"sharpness_loss_reduced": "Sharpness Loss Reduced",
"sharpness_regeneration": "Sharpness Regeneration",
"sonic_barrier": "Sonic Barrier",
"sonic_wave": "Sonic Wave",
"stamina_recovery_up": "Stamina Recovery Up",
"stamina_use_reduced": "Stamina Use Reduced",
"stun_negated": "Stun Negated",
"tremors_negated": "Tremors Negated",
"wind_pressure_negated": "Wind Pressure Negated"
},
"misc_buffs": {
"attack_up": "Attack Up",
"defense_down": "Defense Down",
"defense_up": "Defense Up",
"immunity": "Immunity",
"stamina_use_down": "Stamina Use Down"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar"
},
"parts": { "parts": {
"abdomen": "Брюхо", "abdomen": "Брюхо",
"amatsu_unknown": "?", "amatsu_unknown": "?",
@@ -372,5 +539,109 @@
"wingclaw": "Крыло-коготь", "wingclaw": "Крыло-коготь",
"wingclaws": "Крыло-коготь", "wingclaws": "Крыло-коготь",
"wings": "Крылья" "wings": "Крылья"
},
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"bladescale_hone": "Bladescale Hone",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragon_conversion_elemental_attack_up": "Dragon Conversion Elem. Attack Up",
"dragon_conversion_elemental_res_up": "Dragon Conversion Elem. Res. Up",
"dragonheart": "Dragonheart",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"intrepid_heart": "Intrepid Heart",
"kushala_daora_soul": "Kushala Daora Soul",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"peak_performance": "Peak Performance",
"powder_mantle_blue": "Powder Mantle (Blue)",
"powder_mantle_red": "Powder Mantle (Red)",
"protective_polish": "Protective Polish",
"resentment": "Resentment",
"resuscitate": "Resuscitate",
"spiribirds_call": "Spiribird's Call",
"status_trigger": "Status Trigger",
"wall_runner": "Wall Runner",
"wind_mantle": "Wind Mantle"
},
"stats": {
"affinity": "Affinity",
"attack": "Attack",
"defense": "Defense",
"dragon": "Dragon",
"dragon_resistance": "Dragon Res",
"fire": "Fire",
"fire_resistance": "Fire Res",
"ice": "Ice",
"ice_resistance": "Ice Res",
"stamina": "Stamina",
"thunder": "Thunder",
"thunder_resistance": "Thunder Res",
"water": "Water",
"water_resistance": "Water Res"
},
"unicode_glyph_ranges": [
32,
255,
1024,
1241,
8192,
8303,
65280,
65519,
0
],
"weapon_skills": {
"all_extracts_mix": "All Extracts Mix",
"amped_state": "Amped State",
"anchor_rage": "Anchor Rage",
"arc_shot_affinity": "Arc Shot: Affinity",
"arc_shot_brace": "Arc Shot: Brace",
"archdemon_mode": "Archdemon Mode",
"axe_heavy_slam": "Axe: Heavy Slam",
"bead_of_resonance": "Bead of Resonance",
"bolt_boost": "Bolt Boost",
"counter_charger": "Counter Charger",
"destroyer_oil": "Destroyer Oil",
"element_boost": "Element Boost",
"erupting_cannon": "Erupting Cannon",
"fanning_maneuver": "Fannin Maneuver",
"ground_splitter": "Ground Splitter",
"harvest_moon": "Harvest Moon",
"herculean_draw": "Herculean Draw",
"iai_slash": "Iai Slash",
"impact_burst": "Impact Burst",
"ironshine_silk": "Ironshine Silk",
"orange_extract": "O Extract",
"overheat": "Overheat",
"power_sheathe": "Power Sheathe",
"red_extract": "Red Extract",
"rising_moon": "Rising Moon",
"setting_sun": "Setting Sun",
"shield_charge": "Shield Charge",
"silkbind_shockwave": "Silkbind Shockwave",
"soaring_kick": "Soaring Kick",
"sonic_bloom": "Sonic Bloom",
"spiral_thrust": "Spiral Thrust",
"spirit_gauge": "Spirit Gauge",
"spirit_gauge_autofill": "Spirit Gauge Autofill",
"switch_charger": "Switch Charger",
"sword_boost_mode": "Sword Boost Mode",
"sword_charge": "Sword Charge",
"twin_wine": "Twin Wine",
"white_extract": "White Extract",
"wyvernblast_reload": "Wyvernblast Reload",
"wyvernsnipe_reload": "Wyvernsnipe Reload"
} }
} }

View File

@@ -3,8 +3,10 @@
"HP": "生命:", "HP": "生命:",
"buildup": "积累值:", "buildup": "积累值:",
"gold": "金冠", "gold": "金冠",
"lv": "Lv.",
"mini": "小型", "mini": "小型",
"otomo": "随从", "otomo": "随从",
"part_anomaly_core": "怪异核",
"part_break": "部位破坏", "part_break": "部位破坏",
"part_sever": "部位切断", "part_sever": "部位切断",
"player": "玩家", "player": "玩家",
@@ -17,30 +19,67 @@
}, },
"ailments": { "ailments": {
"blast": "爆破", "blast": "爆破",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"bubbleblight": "Bubbleblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "异臭球", "dung_bomb": "异臭球",
"engulfed": "Engulfed",
"exhaust": "减气", "exhaust": "减气",
"fall_otomo_trap": "随从落穴陷阱", "fall_otomo_trap": "随从落穴陷阱",
"fall_trap": "落穴陷阱", "fall_trap": "落穴陷阱",
"falling_asleep": "Falling Asleep",
"fireblight": "火异常状态", "fireblight": "火异常状态",
"flash": "闪光", "flash": "闪光",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "冰异常状态", "iceblight": "冰异常状态",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "麻痹", "paralysis": "麻痹",
"poison": "中毒", "poison": "中毒",
"quick_sand": "流沙", "quick_sand": "流沙",
"resistance_down": "Resistance Down",
"ride": "御龙", "ride": "御龙",
"roar": "Roar",
"shock_otomo_trap": "随从麻痹陷阱", "shock_otomo_trap": "随从麻痹陷阱",
"shock_trap": "麻痹陷阱", "shock_trap": "麻痹陷阱",
"sleep": "睡眠", "sleep": "睡眠",
"steel_fang": "双刃锁镰", "steel_fang": "双刃锁镰",
"stench": "Stench",
"stun": "昏厥", "stun": "昏厥",
"thunderblight": "雷异常状态", "thunderblight": "雷异常状态",
"tranq_bomb": "捕获用麻醉球", "tranq_bomb": "捕获用麻醉球",
"waterblight": "水异常状态" "tremor": "Tremor",
"waterblight": "水异常状态",
"webbed": "Webbed"
},
"consumables": {
"adamant_seed": "Adamant Seed",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_powder": "Demon Powder",
"demondrug": "Demondrug",
"gourmet_fish": "Gourmet Fish",
"hardshell_powder": "Hardshell Powder",
"immunizer": "Immunizer",
"mega_armorskin": "Mega Armorskin",
"mega_demondrug": "Mega Demondrug",
"might_seed": "Might Seed"
}, },
"customization_menu": { "customization_menu": {
"UI_font": "UI字体", "UI_font": "UI字体",
"UI_font_notice": "当更改字体时,请重新加载脚本!", "UI_font_notice": "当更改字体时,请重新加载脚本!",
"activation_count": "激活次数", "activation_count": "激活次数",
"affinity_label": "Affinity Label",
"ailment_buildups": "状态异常积累值", "ailment_buildups": "状态异常积累值",
"ailment_name": "状态异常名", "ailment_name": "状态异常名",
"ailment_name_label": "状态异常标签", "ailment_name_label": "状态异常标签",
@@ -48,23 +87,31 @@
"ailments": "状态异常", "ailments": "状态异常",
"all_UI": "所有UI", "all_UI": "所有UI",
"anchor": "锚点", "anchor": "锚点",
"anomaly_cores": "怪异核",
"anomaly_filter": "怪异核",
"anomaly_health": "怪异核破坏值",
"anomaly_health_percentage": "怪异核破坏百分比",
"apply": "应用", "apply": "应用",
"assign_new_key": "指定新按键", "assign_new_key": "指定新按键",
"attack_label": "Attack Label",
"auto_highlight": "自动高亮", "auto_highlight": "自动高亮",
"background": "背景", "background": "背景",
"bar": "状态条", "bar": "状态条",
"blast_damage": "爆破伤害", "blast": "爆破",
"body_parts": "身体部位", "body_parts": "身体部位",
"bold": "粗体", "bold": "粗体",
"bomb_damage": "爆弹桶伤害", "bombs": "爆",
"bottom_left": "左下", "bottom_left": "左下",
"bottom_right": "右下", "bottom_right": "右下",
"bottom_to_top": "从下到上",
"break_anomaly_filter": "破坏+怪异核",
"break_count": "破坏次数", "break_count": "破坏次数",
"break_filter": "破坏", "break_filter": "破坏",
"break_health": "破坏值", "break_health": "破坏值",
"break_health_percentage": "破坏值百分比", "break_health_percentage": "破坏值百分比",
"break_max_count": "最大破坏次数", "break_max_count": "最大破坏次数",
"break_severe_filter": "破坏+切断", "break_sever_anomaly_filter": "破坏+切断+怪异核",
"break_sever_filter": "破坏+切断",
"buff_UI": "Buff UI", "buff_UI": "Buff UI",
"buildup": "积累值", "buildup": "积累值",
"buildup_bar": "积累值条", "buildup_bar": "积累值条",
@@ -84,6 +131,7 @@
"crown": "皇冠", "crown": "皇冠",
"crown_thresholds": "皇冠阈值", "crown_thresholds": "皇冠阈值",
"current_state": "当前阶段", "current_state": "当前阶段",
"current_time": "Current Time",
"current_value": "当前值", "current_value": "当前值",
"cutscene": "过场动画", "cutscene": "过场动画",
"damage": "伤害", "damage": "伤害",
@@ -92,25 +140,34 @@
"damage_meter_UI": "伤害统计UI", "damage_meter_UI": "伤害统计UI",
"damage_percentage_label": "伤害百分比标签", "damage_percentage_label": "伤害百分比标签",
"damage_value_label": "伤害量标签", "damage_value_label": "伤害量标签",
"debug": "Debug",
"debug_errors": "Debug Errors",
"default_state": "默认阶段", "default_state": "默认阶段",
"defense_label": "Defense Label",
"delete": "删除", "delete": "删除",
"distance": "距离", "distance": "距离",
"dps": "DPS", "dps": "DPS",
"dps_label": "DPS标签", "dps_label": "DPS标签",
"dps_mode": "DPS模式", "dps_mode": "DPS模式",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "复制", "duplicate": "复制",
"duration": "持续时间", "duration": "持续时间",
"dynamic_positioning": "动态位置", "dynamic_positioning": "动态位置",
"dynamically_positioned": "动态位置", "dynamically_positioned": "动态位置",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "开启", "enable_for": "开启",
"enabled": "开启", "enabled": "开启",
"endemic_life": "环境生物",
"endemic_life_UI": "环境生物UI", "endemic_life_UI": "环境生物UI",
"endemic_life_damage": "环境生物伤害", "everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "字体", "family": "字体",
"farthest": "最远", "farthest": "最远",
"fight_time": "战斗时间", "fight_time": "战斗时间",
"fill_direction": "填充方向",
"filter": "筛选器", "filter": "筛选器",
"filter_mode": "筛选方式", "filter_mode": "筛选方式",
"fire_resistance_label": "Fire Resistance Label",
"first": "第一", "first": "第一",
"first_hit": "第一击", "first_hit": "第一击",
"flinch_count": "胆怯次数", "flinch_count": "胆怯次数",
@@ -120,11 +177,16 @@
"global_scale_modifier": "全局比例更改", "global_scale_modifier": "全局比例更改",
"global_settings": "全局设定", "global_settings": "全局设定",
"health": "生命", "health": "生命",
"health_anomaly_filter": "生命+怪异核",
"health_break_anomaly_filter": "生命+破坏+怪异核",
"health_break_filter": "生命+破坏", "health_break_filter": "生命+破坏",
"health_break_severe_filter": "生命+破坏+切断", "health_break_sever_anomaly_filter": "生命+破坏+切断+怪异核",
"health_break_sever_filter": "生命+破坏+切断",
"health_filter": "生命", "health_filter": "生命",
"health_label": "Health Label",
"health_percentage": "生命百分比", "health_percentage": "生命百分比",
"health_severe_filter": "生命+切断", "health_sever_anomaly_filter": "生命+切断+怪异核",
"health_sever_filter": "生命+切断",
"height": "高度", "height": "高度",
"hide_ailments_with_zero_buildup": "当积累值为0时隐藏该状态异常", "hide_ailments_with_zero_buildup": "当积累值为0时隐藏该状态异常",
"hide_all_active_ailments": "隐藏所有激活的状态异常", "hide_all_active_ailments": "隐藏所有激活的状态异常",
@@ -150,20 +212,23 @@
"highlighted_buildup_bar": "高亮积累值条", "highlighted_buildup_bar": "高亮积累值条",
"highlighted_damage_bar": "高亮伤害条", "highlighted_damage_bar": "高亮伤害条",
"highlighted_targeted": "高亮目标[锁定目标的UI]", "highlighted_targeted": "高亮目标[锁定目标的UI]",
"history": "History",
"history_size": "History Size",
"horizontal": "水平", "horizontal": "水平",
"hotkeys": "热键", "hotkeys": "热键",
"hunter_rank": "猎人等级", "hunter_rank": "猎人等级",
"hunter_rank_label": "猎人等级标签", "hunter_rank_label": "猎人等级标签",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID", "id": "ID",
"in_lobby": "在大厅", "in_lobby": "在大厅",
"in_training_area": "在修炼场", "in_training_area": "在修炼场",
"include": "包含", "include": "包含",
"inside": "里面", "inside": "里面",
"installation_damage": "设施伤害", "installations": "狩猎设备",
"italic": "斜体", "italic": "斜体",
"join_time": "加入时间", "join_time": "加入时间",
"killcam": "击杀镜头", "killcam": "击杀镜头",
"kunai_damage": "苦无伤害", "kunai": "苦无",
"language": "语言", "language": "语言",
"large_monster_UI": "大型怪物UI", "large_monster_UI": "大型怪物UI",
"large_monster_dynamic_UI": "大型怪物浮动UI", "large_monster_dynamic_UI": "大型怪物浮动UI",
@@ -171,6 +236,7 @@
"large_monster_static_UI": "大型怪物固定UI", "large_monster_static_UI": "大型怪物固定UI",
"large_monsters": "大型怪物群", "large_monsters": "大型怪物群",
"last": "最后", "last": "最后",
"left_to_right": "从左到右",
"level": "等级", "level": "等级",
"level_label": "等级标签", "level_label": "等级标签",
"loading_quest": "任务加载中", "loading_quest": "任务加载中",
@@ -191,10 +257,10 @@
"module_visibility_based_on_game_state": "基于游戏状态的模组可视化设置", "module_visibility_based_on_game_state": "基于游戏状态的模组可视化设置",
"modules": "模块", "modules": "模块",
"monster_can_be_captured": "可捕获的怪物", "monster_can_be_captured": "可捕获的怪物",
"monster_damage": "怪物伤害",
"monster_id": "怪物ID", "monster_id": "怪物ID",
"monster_name": "怪物名", "monster_name": "怪物名",
"monster_name_label": "怪物名标签", "monster_name_label": "怪物名标签",
"monsters": "怪物",
"my_damage_bar_location": "我的伤害条位置", "my_damage_bar_location": "我的伤害条位置",
"my_otomos": "我的随从", "my_otomos": "我的随从",
"myself": "我自己", "myself": "我自己",
@@ -207,10 +273,10 @@
"offset_is_relative_to_parts": "根据部位偏移", "offset_is_relative_to_parts": "根据部位偏移",
"opacity_falloff": "透明度增加", "opacity_falloff": "透明度增加",
"orientation": "方向", "orientation": "方向",
"other_damage": "其他伤害", "other": "其",
"other_player_otomos": "其他玩家的随从", "other_player_otomos": "其他玩家的随从",
"other_players": "其他玩家", "other_players": "其他玩家",
"otomo_damage": "随从伤害", "otomos": "随从",
"outline": "轮廓", "outline": "轮廓",
"outside": "外面", "outside": "外面",
"part_health": "部位生命值", "part_health": "部位生命值",
@@ -218,12 +284,12 @@
"part_name_label": "部位名标签", "part_name_label": "部位名标签",
"percentage_label": "百分比标签", "percentage_label": "百分比标签",
"performance": "性能", "performance": "性能",
"player_damage": "玩家伤害",
"player_name_label": "玩家名标签", "player_name_label": "玩家名标签",
"player_name_size_limit": "玩家名长度限制", "player_name_size_limit": "玩家名长度限制",
"player_spacing": "玩家间距", "player_spacing": "玩家间距",
"players": "玩家",
"playing_quest": "操作界面/正常游玩时", "playing_quest": "操作界面/正常游玩时",
"poison_damage": "中毒伤害", "poison": "中毒",
"position": "位置", "position": "位置",
"press_any_key": "按任意键...", "press_any_key": "按任意键...",
"prioritize_large_monsters": "大型怪物优先", "prioritize_large_monsters": "大型怪物优先",
@@ -237,15 +303,19 @@
"relative_offset": "相对偏移", "relative_offset": "相对偏移",
"rename": "重命名", "rename": "重命名",
"render_highlighted_monster": "渲染高亮怪物", "render_highlighted_monster": "渲染高亮怪物",
"render_inactive_anomaly_cores": "渲染不活跃的怪异核",
"render_not_highlighted_monsters": "渲染非高亮怪物", "render_not_highlighted_monsters": "渲染非高亮怪物",
"renderer": "渲染器", "renderer": "渲染器",
"reset": "重置", "reset": "重置",
"reversed_order": "逆向排序", "reversed_order": "逆向排序",
"reward_screen": "奖励界面", "reward_screen": "奖励界面",
"right_alignment_shift": "右对齐偏移距离",
"right_to_left": "从右到左",
"servant_otomos": "盟友随从", "servant_otomos": "盟友随从",
"servants": "盟友", "servants": "盟友",
"settings": "设定", "settings": "设定",
"severe_filter": "切断", "sever_anomaly_filter": "切断+怪异核",
"sever_filter": "切断",
"shadow": "阴影", "shadow": "阴影",
"show_my_otomos_separately": "分开显示我的随从", "show_my_otomos_separately": "分开显示我的随从",
"show_other_player_otomos_separately": "分开显示其他玩家的随从", "show_other_player_otomos_separately": "分开显示其他玩家的随从",
@@ -256,16 +326,19 @@
"sorting": "排序方式", "sorting": "排序方式",
"spacing": "间距", "spacing": "间距",
"stamina": "耐力", "stamina": "耐力",
"stamina_label": "Stamina Label",
"static_orientation": "固定方向", "static_orientation": "固定方向",
"static_position": "固定位置", "static_position": "固定位置",
"static_sorting": "固定排序", "static_sorting": "固定排序",
"static_spacing": "固定间距", "static_spacing": "固定间距",
"statically_positioned": "固定位置", "statically_positioned": "固定位置",
"stats_UI": "Stats UI",
"status": "状态", "status": "状态",
"style": "样式", "style": "样式",
"summary_screen": "总结界面", "summary_screen": "总结界面",
"text_label": "文字标签", "text_label": "文字标签",
"thickness": "粗细度", "thickness": "粗细度",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "时间UI", "time_UI": "时间UI",
"time_label": "时间标签", "time_label": "时间标签",
"time_limit": "时间限制(秒)", "time_limit": "时间限制(秒)",
@@ -276,6 +349,7 @@
"top_dps": "最高DPS", "top_dps": "最高DPS",
"top_left": "左上", "top_left": "左上",
"top_right": "右上", "top_right": "右上",
"top_to_bottom": "从上到下",
"total": "总计", "total": "总计",
"total_buildup": "总积累值", "total_buildup": "总积累值",
"total_buildup_label": "总积累值标签", "total_buildup_label": "总积累值标签",
@@ -292,18 +366,111 @@
"tracked_monster_types": "跟踪的怪物类型", "tracked_monster_types": "跟踪的怪物类型",
"type": "类型", "type": "类型",
"use_d2d_if_available": "可用时使用Direct2D", "use_d2d_if_available": "可用时使用Direct2D",
"value": "Value",
"value_label": "数字", "value_label": "数字",
"vertical": "垂直", "vertical": "垂直",
"viewport_offset": "窗口偏移", "viewport_offset": "窗口偏移",
"visible": "可见", "visible": "可见",
"water_resistance_label": "Water Resistance Label",
"width": "宽度", "width": "宽度",
"world_offset": "整体偏移", "world_offset": "整体偏移",
"wyvern_riding_damage": "御龙伤害", "wyvern_riding": "御龙",
"x": "X轴", "x": "X轴",
"y": "Y轴", "y": "Y轴",
"z": "Z轴" "z": "Z轴"
}, },
"dango_skills": {
"dango_insurance_defense_up": "Dango Insurance Defense Up"
},
"dangos": {
"dango_adrenaline": "Dango Adrenaline",
"dango_bombardier": "Dango Bombardier",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_defender_hi": "Dango Defender (Hi)",
"dango_deflector": "Dango Deflector",
"dango_dragon_res": "Dango Dragon Res",
"dango_dragon_res_hi": "Dango Dragon Res (Hi)",
"dango_driver": "Dango Driver",
"dango_feet": "Dango Feet",
"dango_fighter": "Dango Fighter",
"dango_fire_res": "Dango Fire Res",
"dango_fire_res_hi": "Dango Fire Res (Hi)",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_guard": "Dango Guard",
"dango_hunter": "Dango Hunter",
"dango_hurler": "Dango Hurler",
"dango_ice_res": "Dango Ice Res",
"dango_ice_res_hi": "Dango Ice Res (Hi)",
"dango_immunizer": "Dango Immunizer",
"dango_insurance": "Dango Insurance",
"dango_insurance_defense_up": "Dango Insurance Defense Up",
"dango_marksman": "Dango Marksman",
"dango_medic": "Dango Medic",
"dango_medic_hi": "Dango Medic (Hi)",
"dango_moxie": "Dango Moxie",
"dango_polisher": "Dango Polisher",
"dango_pyro": "Dango Pyro",
"dango_reviver": "Dango Reviver",
"dango_rider": "Dango Rider",
"dango_shifter": "Dango Shifter",
"dango_slugger": "Dango Slugger",
"dango_specialist": "Dango Specialist",
"dango_temper": "Dango Temper",
"dango_thunder_res": "Dango Thunder Res ",
"dango_thunder_res_hi": "Dango Thunder Res (Hi)",
"dango_wall_runner": "Dango Wall Runner",
"dango_water_res": "Dango Water Res",
"dango_water_res_hi": "Dango Water Res (Hi)",
"dango_weakener": "Dango Weakener",
"super_recovery_dango": "Super Recovery Dango"
},
"font_name": "NotoSansSC-Bold.otf", "font_name": "NotoSansSC-Bold.otf",
"melody_effects": {
"affinity_up": "Affinity Up",
"attack_and_affinity_up": "Attack and Affinity Up",
"attack_and_defense_up": "Attack and Defense Up",
"attack_up": "Attack Up",
"blight_negated": "Blight Negated",
"defense_up": "Defense Up",
"divine_protection": "Divine Protection",
"earplugs_l": "Earplugs (L)",
"earplugs_s": "Earplugs (S)",
"elemental_attack_boost": "Elemental Attack Boost",
"environment_damage_negated": "Environment Damage Negated",
"health_recovery_l": "Health Recovery (L)",
"health_recovery_s": "Health Recovery (S)",
"health_recovery_s_antidote": "Health Recovery (S) + Antidote",
"health_regeneration": "Health Regeneration",
"infernal_melody": "Infernal Melody",
"knockbacks_negated": "Knockbacks Negated",
"self_improvement": "Self-Improvement",
"sharpness_extension": "Sharpness Extension",
"sharpness_loss_reduced": "Sharpness Loss Reduced",
"sharpness_regeneration": "Sharpness Regeneration",
"sonic_barrier": "Sonic Barrier",
"sonic_wave": "Sonic Wave",
"stamina_recovery_up": "Stamina Recovery Up",
"stamina_use_reduced": "Stamina Use Reduced",
"stun_negated": "Stun Negated",
"tremors_negated": "Tremors Negated",
"wind_pressure_negated": "Wind Pressure Negated"
},
"misc_buffs": {
"attack_up": "Attack Up",
"defense_down": "Defense Down",
"defense_up": "Defense Up",
"immunity": "Immunity",
"stamina_use_down": "Stamina Use Down"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar"
},
"parts": { "parts": {
"abdomen": "腹部", "abdomen": "腹部",
"amatsu_unknown": "?", "amatsu_unknown": "?",
@@ -372,5 +539,113 @@
"wingclaw": "翼爪", "wingclaw": "翼爪",
"wingclaws": "翼爪", "wingclaws": "翼爪",
"wings": "翼" "wings": "翼"
},
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"bladescale_hone": "Bladescale Hone",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragon_conversion_elemental_attack_up": "Dragon Conversion Elem. Attack Up",
"dragon_conversion_elemental_res_up": "Dragon Conversion Elem. Res. Up",
"dragonheart": "Dragonheart",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"intrepid_heart": "Intrepid Heart",
"kushala_daora_soul": "Kushala Daora Soul",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"peak_performance": "Peak Performance",
"powder_mantle_blue": "Powder Mantle (Blue)",
"powder_mantle_red": "Powder Mantle (Red)",
"protective_polish": "Protective Polish",
"resentment": "Resentment",
"resuscitate": "Resuscitate",
"spiribirds_call": "Spiribird's Call",
"status_trigger": "Status Trigger",
"wall_runner": "Wall Runner",
"wind_mantle": "Wind Mantle"
},
"stats": {
"affinity": "Affinity",
"attack": "Attack",
"defense": "Defense",
"dragon": "Dragon",
"dragon_resistance": "Dragon Res",
"fire": "Fire",
"fire_resistance": "Fire Res",
"ice": "Ice",
"ice_resistance": "Ice Res",
"stamina": "Stamina",
"thunder": "Thunder",
"thunder_resistance": "Thunder Res",
"water": "Water",
"water_resistance": "Water Res"
},
"unicode_glyph_ranges": [
32,
255,
8192,
8303,
12288,
12543,
12784,
12799,
19968,
40879,
65280,
65519,
0
],
"weapon_skills": {
"all_extracts_mix": "All Extracts Mix",
"amped_state": "Amped State",
"anchor_rage": "Anchor Rage",
"arc_shot_affinity": "Arc Shot: Affinity",
"arc_shot_brace": "Arc Shot: Brace",
"archdemon_mode": "Archdemon Mode",
"axe_heavy_slam": "Axe: Heavy Slam",
"bead_of_resonance": "Bead of Resonance",
"bolt_boost": "Bolt Boost",
"counter_charger": "Counter Charger",
"destroyer_oil": "Destroyer Oil",
"element_boost": "Element Boost",
"erupting_cannon": "Erupting Cannon",
"fanning_maneuver": "Fannin Maneuver",
"ground_splitter": "Ground Splitter",
"harvest_moon": "Harvest Moon",
"herculean_draw": "Herculean Draw",
"iai_slash": "Iai Slash",
"impact_burst": "Impact Burst",
"ironshine_silk": "Ironshine Silk",
"orange_extract": "O Extract",
"overheat": "Overheat",
"power_sheathe": "Power Sheathe",
"red_extract": "Red Extract",
"rising_moon": "Rising Moon",
"setting_sun": "Setting Sun",
"shield_charge": "Shield Charge",
"silkbind_shockwave": "Silkbind Shockwave",
"soaring_kick": "Soaring Kick",
"sonic_bloom": "Sonic Bloom",
"spiral_thrust": "Spiral Thrust",
"spirit_gauge": "Spirit Gauge",
"spirit_gauge_autofill": "Spirit Gauge Autofill",
"switch_charger": "Switch Charger",
"sword_boost_mode": "Sword Boost Mode",
"sword_charge": "Sword Charge",
"twin_wine": "Twin Wine",
"white_extract": "White Extract",
"wyvernblast_reload": "Wyvernblast Reload",
"wyvernsnipe_reload": "Wyvernsnipe Reload"
} }
} }

View File

@@ -3,8 +3,10 @@
"HP": "生命:", "HP": "生命:",
"buildup": "累積值:", "buildup": "累積值:",
"gold": "金冠", "gold": "金冠",
"lv": "Lv.",
"mini": "小型", "mini": "小型",
"otomo": "Buddy", "otomo": "Buddy",
"part_anomaly_core": "Anomaly Core",
"part_break": "Break", "part_break": "Break",
"part_sever": "Sever", "part_sever": "Sever",
"player": "玩家", "player": "玩家",
@@ -17,30 +19,67 @@
}, },
"ailments": { "ailments": {
"blast": "爆破", "blast": "爆破",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"bubbleblight": "Bubbleblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "異臭", "dung_bomb": "異臭",
"engulfed": "Engulfed",
"exhaust": "疲勞", "exhaust": "疲勞",
"fall_otomo_trap": "隨從地洞陷阱", "fall_otomo_trap": "隨從地洞陷阱",
"fall_trap": "地洞陷阱", "fall_trap": "地洞陷阱",
"falling_asleep": "Falling Asleep",
"fireblight": "火屬性異常", "fireblight": "火屬性異常",
"flash": "失明", "flash": "失明",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "冰屬性異常", "iceblight": "冰屬性異常",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "麻痺", "paralysis": "麻痺",
"poison": "毒", "poison": "毒",
"quick_sand": "流沙", "quick_sand": "流沙",
"resistance_down": "Resistance Down",
"ride": "操龍", "ride": "操龍",
"roar": "Roar",
"shock_otomo_trap": "隨從麻痺陷阱", "shock_otomo_trap": "隨從麻痺陷阱",
"shock_trap": "麻痺陷阱", "shock_trap": "麻痺陷阱",
"sleep": "睡眠", "sleep": "睡眠",
"steel_fang": "獵犬鋼牙", "steel_fang": "獵犬鋼牙",
"stench": "Stench",
"stun": "暈眩", "stun": "暈眩",
"thunderblight": "雷屬性異常", "thunderblight": "雷屬性異常",
"tranq_bomb": "麻醉", "tranq_bomb": "麻醉",
"waterblight": "水屬性異常" "tremor": "Tremor",
"waterblight": "水屬性異常",
"webbed": "Webbed"
},
"consumables": {
"adamant_seed": "Adamant Seed",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_powder": "Demon Powder",
"demondrug": "Demondrug",
"gourmet_fish": "Gourmet Fish",
"hardshell_powder": "Hardshell Powder",
"immunizer": "Immunizer",
"mega_armorskin": "Mega Armorskin",
"mega_demondrug": "Mega Demondrug",
"might_seed": "Might Seed"
}, },
"customization_menu": { "customization_menu": {
"UI_font": "UI 字型", "UI_font": "UI 字型",
"UI_font_notice": "當更改文字時,請重新載入", "UI_font_notice": "當更改文字時,請重新載入",
"activation_count": "觸發次數", "activation_count": "觸發次數",
"affinity_label": "Affinity Label",
"ailment_buildups": "異常狀態累積值", "ailment_buildups": "異常狀態累積值",
"ailment_name": "異常狀態", "ailment_name": "異常狀態",
"ailment_name_label": "異常狀態名稱", "ailment_name_label": "異常狀態名稱",
@@ -48,23 +87,31 @@
"ailments": "異常狀態", "ailments": "異常狀態",
"all_UI": "全部UI", "all_UI": "全部UI",
"anchor": "錨點", "anchor": "錨點",
"anomaly_cores": "Anomaly Cores",
"anomaly_filter": "Anomaly Core",
"anomaly_health": "Anomaly Core Health",
"anomaly_health_percentage": "Anomaly Core Health Percentage",
"apply": "套用", "apply": "套用",
"assign_new_key": "指定新按鍵", "assign_new_key": "指定新按鍵",
"attack_label": "Attack Label",
"auto_highlight": "自動高亮", "auto_highlight": "自動高亮",
"background": "圖形化顯示條的背景底色", "background": "圖形化顯示條的背景底色",
"bar": "圖形化顯示條", "bar": "圖形化顯示條",
"blast_damage": "爆破傷害", "blast": "爆破",
"body_parts": "身體部位", "body_parts": "身體部位",
"bold": "粗體", "bold": "粗體",
"bomb_damage": "爆炸傷害", "bombs": "Bombs",
"bottom_left": "左下", "bottom_left": "左下",
"bottom_right": "右下", "bottom_right": "右下",
"bottom_to_top": "Bottom to Top",
"break_anomaly_filter": "Break + Anomaly Core",
"break_count": "破壞次數", "break_count": "破壞次數",
"break_filter": "Break", "break_filter": "Break",
"break_health": "Break Health", "break_health": "Break Health",
"break_health_percentage": "Break Health Percentage", "break_health_percentage": "Break Health Percentage",
"break_max_count": "Break Max Count", "break_max_count": "Break Max Count",
"break_severe_filter": "Break + Severe", "break_sever_anomaly_filter": "Break + Sever + Anomaly Core",
"break_sever_filter": "Break + Sever",
"buff_UI": "Buff UI", "buff_UI": "Buff UI",
"buildup": "累積值", "buildup": "累積值",
"buildup_bar": "累積值條", "buildup_bar": "累積值條",
@@ -84,6 +131,7 @@
"crown": "皇冠", "crown": "皇冠",
"crown_thresholds": "皇冠的大小判定範圍", "crown_thresholds": "皇冠的大小判定範圍",
"current_state": "Current State", "current_state": "Current State",
"current_time": "Current Time",
"current_value": "Current Value", "current_value": "Current Value",
"cutscene": "Cutscene", "cutscene": "Cutscene",
"damage": "傷害", "damage": "傷害",
@@ -92,25 +140,34 @@
"damage_meter_UI": "傷害量計算 UI", "damage_meter_UI": "傷害量計算 UI",
"damage_percentage_label": "傷害量百分比", "damage_percentage_label": "傷害量百分比",
"damage_value_label": "傷害量", "damage_value_label": "傷害量",
"debug": "Debug",
"debug_errors": "Debug Errors",
"default_state": "Default State", "default_state": "Default State",
"defense_label": "Defense Label",
"delete": "Delete", "delete": "Delete",
"distance": "距離", "distance": "距離",
"dps": "DPS", "dps": "DPS",
"dps_label": "DPS文字", "dps_label": "DPS文字",
"dps_mode": "DPS模式", "dps_mode": "DPS模式",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "Duplicate", "duplicate": "Duplicate",
"duration": "Duration", "duration": "Duration",
"dynamic_positioning": "浮動的資訊位置", "dynamic_positioning": "浮動的資訊位置",
"dynamically_positioned": "浮動的魔物資訊", "dynamically_positioned": "浮動的魔物資訊",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "啟用對象", "enable_for": "啟用對象",
"enabled": "啟用", "enabled": "啟用",
"endemic_life": "Endemic Life",
"endemic_life_UI": "環境生物 UI", "endemic_life_UI": "環境生物 UI",
"endemic_life_damage": "環境生物傷害", "everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "字體", "family": "字體",
"farthest": "最遠的", "farthest": "最遠的",
"fight_time": "戰鬥時間", "fight_time": "戰鬥時間",
"fill_direction": "Fill Direction",
"filter": "篩選器", "filter": "篩選器",
"filter_mode": "Filter Mode", "filter_mode": "Filter Mode",
"fire_resistance_label": "Fire Resistance Label",
"first": "第一", "first": "第一",
"first_hit": "第一擊", "first_hit": "第一擊",
"flinch_count": "膽怯次數", "flinch_count": "膽怯次數",
@@ -120,11 +177,16 @@
"global_scale_modifier": "全域比例更改", "global_scale_modifier": "全域比例更改",
"global_settings": "全域設定", "global_settings": "全域設定",
"health": "血量", "health": "血量",
"health_anomaly_filter": "Health + Anomaly Core",
"health_break_anomaly_filter": "Health + Break + Anomaly Core",
"health_break_filter": "Health + Break", "health_break_filter": "Health + Break",
"health_break_severe_filter": "Health + Break + Severe", "health_break_sever_anomaly_filter": "Health + Break + Sever + Anomaly Core",
"health_break_sever_filter": "Health + Break + Sever",
"health_filter": "Health", "health_filter": "Health",
"health_label": "Health Label",
"health_percentage": "血量百分比", "health_percentage": "血量百分比",
"health_severe_filter": "Health + Severe", "health_sever_anomaly_filter": "Health + Sever + Anomaly Core",
"health_sever_filter": "Health + Sever",
"height": "高度", "height": "高度",
"hide_ailments_with_zero_buildup": "當累積值為0時,隱藏該異常狀態", "hide_ailments_with_zero_buildup": "當累積值為0時,隱藏該異常狀態",
"hide_all_active_ailments": "隱藏觸發中的異常狀態", "hide_all_active_ailments": "隱藏觸發中的異常狀態",
@@ -150,20 +212,23 @@
"highlighted_buildup_bar": "重點累積條", "highlighted_buildup_bar": "重點累積條",
"highlighted_damage_bar": "重點傷害條", "highlighted_damage_bar": "重點傷害條",
"highlighted_targeted": "鎖定的魔物資訊(目標)", "highlighted_targeted": "鎖定的魔物資訊(目標)",
"history": "History",
"history_size": "History Size",
"horizontal": "水平", "horizontal": "水平",
"hotkeys": "快捷鍵", "hotkeys": "快捷鍵",
"hunter_rank": "獵人等級", "hunter_rank": "獵人等級",
"hunter_rank_label": "獵人等級", "hunter_rank_label": "獵人等級",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID", "id": "ID",
"in_lobby": "In Lobby", "in_lobby": "In Lobby",
"in_training_area": "In Training Area", "in_training_area": "In Training Area",
"include": "細部資訊調整", "include": "細部資訊調整",
"inside": "內部", "inside": "內部",
"installation_damage": "設備傷害", "installations": "Installations",
"italic": "斜體", "italic": "斜體",
"join_time": "加入時間", "join_time": "加入時間",
"killcam": "Killcam", "killcam": "Killcam",
"kunai_damage": "苦無傷害", "kunai": "Kunai",
"language": "語言", "language": "語言",
"large_monster_UI": "大型魔物 UI", "large_monster_UI": "大型魔物 UI",
"large_monster_dynamic_UI": "大型魔物浮動 UI", "large_monster_dynamic_UI": "大型魔物浮動 UI",
@@ -171,6 +236,7 @@
"large_monster_static_UI": "大型魔物固定 UI", "large_monster_static_UI": "大型魔物固定 UI",
"large_monsters": "大型魔物群", "large_monsters": "大型魔物群",
"last": "最後", "last": "最後",
"left_to_right": "Left to Right",
"level": "Level", "level": "Level",
"level_label": "Level Label", "level_label": "Level Label",
"loading_quest": "Loading Quest", "loading_quest": "Loading Quest",
@@ -191,10 +257,10 @@
"module_visibility_based_on_game_state": "Module Visibility based on Game State", "module_visibility_based_on_game_state": "Module Visibility based on Game State",
"modules": "模組", "modules": "模組",
"monster_can_be_captured": "可捕獲的魔物", "monster_can_be_captured": "可捕獲的魔物",
"monster_damage": "魔物傷害",
"monster_id": "Monster ID", "monster_id": "Monster ID",
"monster_name": "魔物名稱", "monster_name": "魔物名稱",
"monster_name_label": "魔物名稱", "monster_name_label": "魔物名稱",
"monsters": "Monsters",
"my_damage_bar_location": "我的傷害條", "my_damage_bar_location": "我的傷害條",
"my_otomos": "My Buddies", "my_otomos": "My Buddies",
"myself": "Myself", "myself": "Myself",
@@ -207,10 +273,10 @@
"offset_is_relative_to_parts": "與部位顯示相對偏移", "offset_is_relative_to_parts": "與部位顯示相對偏移",
"opacity_falloff": "透明度提高", "opacity_falloff": "透明度提高",
"orientation": "對齊方式", "orientation": "對齊方式",
"other_damage": "其他傷害", "other": "Other",
"other_player_otomos": "Other Player Buddies", "other_player_otomos": "Other Player Buddies",
"other_players": "其他玩家", "other_players": "其他玩家",
"otomo_damage": "隨從傷害", "otomos": "Buddies",
"outline": "描邊", "outline": "描邊",
"outside": "外部", "outside": "外部",
"part_health": "部位血量", "part_health": "部位血量",
@@ -218,12 +284,12 @@
"part_name_label": "部位名稱", "part_name_label": "部位名稱",
"percentage_label": "百分比", "percentage_label": "百分比",
"performance": "效能", "performance": "效能",
"player_damage": "玩家傷害量",
"player_name_label": "玩家名稱", "player_name_label": "玩家名稱",
"player_name_size_limit": "玩家名稱大小限制", "player_name_size_limit": "玩家名稱大小限制",
"player_spacing": "玩家間格", "player_spacing": "玩家間格",
"players": "Players",
"playing_quest": "Playing Quest", "playing_quest": "Playing Quest",
"poison_damage": "毒傷害", "poison": "毒",
"position": "位置", "position": "位置",
"press_any_key": "輸入任意鍵...", "press_any_key": "輸入任意鍵...",
"prioritize_large_monsters": "大型魔物優先", "prioritize_large_monsters": "大型魔物優先",
@@ -237,15 +303,19 @@
"relative_offset": "相對偏移", "relative_offset": "相對偏移",
"rename": "Rename", "rename": "Rename",
"render_highlighted_monster": "渲染目標魔物", "render_highlighted_monster": "渲染目標魔物",
"render_inactive_anomaly_cores": "Render Inactive Anomaly Cores",
"render_not_highlighted_monsters": "渲染非目標魔物", "render_not_highlighted_monsters": "渲染非目標魔物",
"renderer": "Renderer", "renderer": "Renderer",
"reset": "Reset", "reset": "Reset",
"reversed_order": "反向排序", "reversed_order": "反向排序",
"reward_screen": "Reward Screen", "reward_screen": "Reward Screen",
"right_alignment_shift": "Right Alignment Shift",
"right_to_left": "Right to Left",
"servant_otomos": "Servant Buddies", "servant_otomos": "Servant Buddies",
"servants": "Followers", "servants": "Followers",
"settings": "設定", "settings": "設定",
"severe_filter": "Severe", "sever_anomaly_filter": "Sever + Anomaly Core",
"sever_filter": "Sever",
"shadow": "陰影", "shadow": "陰影",
"show_my_otomos_separately": "Show my Buddies separately", "show_my_otomos_separately": "Show my Buddies separately",
"show_other_player_otomos_separately": "Show Other Player Buddies separately", "show_other_player_otomos_separately": "Show Other Player Buddies separately",
@@ -256,16 +326,19 @@
"sorting": "排序方式", "sorting": "排序方式",
"spacing": "間距", "spacing": "間距",
"stamina": "耐力", "stamina": "耐力",
"stamina_label": "Stamina Label",
"static_orientation": "固定魔物資訊的對齊方式", "static_orientation": "固定魔物資訊的對齊方式",
"static_position": "固定魔物資訊的位置", "static_position": "固定魔物資訊的位置",
"static_sorting": "固定魔物資訊的排序", "static_sorting": "固定魔物資訊的排序",
"static_spacing": "固定魔物資訊的間距", "static_spacing": "固定魔物資訊的間距",
"statically_positioned": "固定的魔物資訊", "statically_positioned": "固定的魔物資訊",
"stats_UI": "Stats UI",
"status": "狀態", "status": "狀態",
"style": "樣式", "style": "樣式",
"summary_screen": "Summary Screen", "summary_screen": "Summary Screen",
"text_label": "文字", "text_label": "文字",
"thickness": "粗細", "thickness": "粗細",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "時間 UI", "time_UI": "時間 UI",
"time_label": "時間", "time_label": "時間",
"time_limit": "時限 (秒)", "time_limit": "時限 (秒)",
@@ -276,6 +349,7 @@
"top_dps": "最高 DPS", "top_dps": "最高 DPS",
"top_left": "左上", "top_left": "左上",
"top_right": "右上", "top_right": "右上",
"top_to_bottom": "Top to Bottom",
"total": "Total", "total": "Total",
"total_buildup": "總累積值", "total_buildup": "總累積值",
"total_buildup_label": "總累積值文字", "total_buildup_label": "總累積值文字",
@@ -292,18 +366,111 @@
"tracked_monster_types": "追蹤的魔物類型", "tracked_monster_types": "追蹤的魔物類型",
"type": "類型", "type": "類型",
"use_d2d_if_available": "Use Direct2D if available", "use_d2d_if_available": "Use Direct2D if available",
"value": "Value",
"value_label": "數字", "value_label": "數字",
"vertical": "垂直", "vertical": "垂直",
"viewport_offset": "視窗的位置", "viewport_offset": "視窗的位置",
"visible": "可見", "visible": "可見",
"water_resistance_label": "Water Resistance Label",
"width": "寬度", "width": "寬度",
"world_offset": "地圖中的位置", "world_offset": "地圖中的位置",
"wyvern_riding_damage": "操龍傷害", "wyvern_riding": "Wyvern Riding",
"x": "X軸", "x": "X軸",
"y": "Y軸", "y": "Y軸",
"z": "Z軸" "z": "Z軸"
}, },
"dango_skills": {
"dango_insurance_defense_up": "Dango Insurance Defense Up"
},
"dangos": {
"dango_adrenaline": "Dango Adrenaline",
"dango_bombardier": "Dango Bombardier",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_defender_hi": "Dango Defender (Hi)",
"dango_deflector": "Dango Deflector",
"dango_dragon_res": "Dango Dragon Res",
"dango_dragon_res_hi": "Dango Dragon Res (Hi)",
"dango_driver": "Dango Driver",
"dango_feet": "Dango Feet",
"dango_fighter": "Dango Fighter",
"dango_fire_res": "Dango Fire Res",
"dango_fire_res_hi": "Dango Fire Res (Hi)",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_guard": "Dango Guard",
"dango_hunter": "Dango Hunter",
"dango_hurler": "Dango Hurler",
"dango_ice_res": "Dango Ice Res",
"dango_ice_res_hi": "Dango Ice Res (Hi)",
"dango_immunizer": "Dango Immunizer",
"dango_insurance": "Dango Insurance",
"dango_insurance_defense_up": "Dango Insurance Defense Up",
"dango_marksman": "Dango Marksman",
"dango_medic": "Dango Medic",
"dango_medic_hi": "Dango Medic (Hi)",
"dango_moxie": "Dango Moxie",
"dango_polisher": "Dango Polisher",
"dango_pyro": "Dango Pyro",
"dango_reviver": "Dango Reviver",
"dango_rider": "Dango Rider",
"dango_shifter": "Dango Shifter",
"dango_slugger": "Dango Slugger",
"dango_specialist": "Dango Specialist",
"dango_temper": "Dango Temper",
"dango_thunder_res": "Dango Thunder Res ",
"dango_thunder_res_hi": "Dango Thunder Res (Hi)",
"dango_wall_runner": "Dango Wall Runner",
"dango_water_res": "Dango Water Res",
"dango_water_res_hi": "Dango Water Res (Hi)",
"dango_weakener": "Dango Weakener",
"super_recovery_dango": "Super Recovery Dango"
},
"font_name": "NotoSansTC-Bold.otf", "font_name": "NotoSansTC-Bold.otf",
"melody_effects": {
"affinity_up": "Affinity Up",
"attack_and_affinity_up": "Attack and Affinity Up",
"attack_and_defense_up": "Attack and Defense Up",
"attack_up": "Attack Up",
"blight_negated": "Blight Negated",
"defense_up": "Defense Up",
"divine_protection": "Divine Protection",
"earplugs_l": "Earplugs (L)",
"earplugs_s": "Earplugs (S)",
"elemental_attack_boost": "Elemental Attack Boost",
"environment_damage_negated": "Environment Damage Negated",
"health_recovery_l": "Health Recovery (L)",
"health_recovery_s": "Health Recovery (S)",
"health_recovery_s_antidote": "Health Recovery (S) + Antidote",
"health_regeneration": "Health Regeneration",
"infernal_melody": "Infernal Melody",
"knockbacks_negated": "Knockbacks Negated",
"self_improvement": "Self-Improvement",
"sharpness_extension": "Sharpness Extension",
"sharpness_loss_reduced": "Sharpness Loss Reduced",
"sharpness_regeneration": "Sharpness Regeneration",
"sonic_barrier": "Sonic Barrier",
"sonic_wave": "Sonic Wave",
"stamina_recovery_up": "Stamina Recovery Up",
"stamina_use_reduced": "Stamina Use Reduced",
"stun_negated": "Stun Negated",
"tremors_negated": "Tremors Negated",
"wind_pressure_negated": "Wind Pressure Negated"
},
"misc_buffs": {
"attack_up": "Attack Up",
"defense_down": "Defense Down",
"defense_up": "Defense Up",
"immunity": "Immunity",
"stamina_use_down": "Stamina Use Down"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar"
},
"parts": { "parts": {
"abdomen": "腹部", "abdomen": "腹部",
"amatsu_unknown": "?", "amatsu_unknown": "?",
@@ -372,5 +539,113 @@
"wingclaw": "翼爪", "wingclaw": "翼爪",
"wingclaws": "翼爪", "wingclaws": "翼爪",
"wings": "翅膀" "wings": "翅膀"
},
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"bladescale_hone": "Bladescale Hone",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragon_conversion_elemental_attack_up": "Dragon Conversion Elem. Attack Up",
"dragon_conversion_elemental_res_up": "Dragon Conversion Elem. Res. Up",
"dragonheart": "Dragonheart",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"intrepid_heart": "Intrepid Heart",
"kushala_daora_soul": "Kushala Daora Soul",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"peak_performance": "Peak Performance",
"powder_mantle_blue": "Powder Mantle (Blue)",
"powder_mantle_red": "Powder Mantle (Red)",
"protective_polish": "Protective Polish",
"resentment": "Resentment",
"resuscitate": "Resuscitate",
"spiribirds_call": "Spiribird's Call",
"status_trigger": "Status Trigger",
"wall_runner": "Wall Runner",
"wind_mantle": "Wind Mantle"
},
"stats": {
"affinity": "Affinity",
"attack": "Attack",
"defense": "Defense",
"dragon": "Dragon",
"dragon_resistance": "Dragon Res",
"fire": "Fire",
"fire_resistance": "Fire Res",
"ice": "Ice",
"ice_resistance": "Ice Res",
"stamina": "Stamina",
"thunder": "Thunder",
"thunder_resistance": "Thunder Res",
"water": "Water",
"water_resistance": "Water Res"
},
"unicode_glyph_ranges": [
32,
255,
8192,
8303,
12288,
12543,
12784,
12799,
19968,
40879,
65280,
65519,
0
],
"weapon_skills": {
"all_extracts_mix": "All Extracts Mix",
"amped_state": "Amped State",
"anchor_rage": "Anchor Rage",
"arc_shot_affinity": "Arc Shot: Affinity",
"arc_shot_brace": "Arc Shot: Brace",
"archdemon_mode": "Archdemon Mode",
"axe_heavy_slam": "Axe: Heavy Slam",
"bead_of_resonance": "Bead of Resonance",
"bolt_boost": "Bolt Boost",
"counter_charger": "Counter Charger",
"destroyer_oil": "Destroyer Oil",
"element_boost": "Element Boost",
"erupting_cannon": "Erupting Cannon",
"fanning_maneuver": "Fannin Maneuver",
"ground_splitter": "Ground Splitter",
"harvest_moon": "Harvest Moon",
"herculean_draw": "Herculean Draw",
"iai_slash": "Iai Slash",
"impact_burst": "Impact Burst",
"ironshine_silk": "Ironshine Silk",
"orange_extract": "O Extract",
"overheat": "Overheat",
"power_sheathe": "Power Sheathe",
"red_extract": "Red Extract",
"rising_moon": "Rising Moon",
"setting_sun": "Setting Sun",
"shield_charge": "Shield Charge",
"silkbind_shockwave": "Silkbind Shockwave",
"soaring_kick": "Soaring Kick",
"sonic_bloom": "Sonic Bloom",
"spiral_thrust": "Spiral Thrust",
"spirit_gauge": "Spirit Gauge",
"spirit_gauge_autofill": "Spirit Gauge Autofill",
"switch_charger": "Switch Charger",
"sword_boost_mode": "Sword Boost Mode",
"sword_charge": "Sword Charge",
"twin_wine": "Twin Wine",
"white_extract": "White Extract",
"wyvernblast_reload": "Wyvernblast Reload",
"wyvernsnipe_reload": "Wyvernsnipe Reload"
} }
} }