268 Commits

Author SHA1 Message Date
GreenComfyTea
9bcc1142f6 Update README.md 2024-01-22 20:23:21 +02:00
GreenComfyTea
afec53e5f1 Bump version to 2.6.4 2024-01-22 19:38:42 +02:00
GreenComfyTea
b3cfa61660 Buff UI -> Fix Rampage Skills filters not working 2024-01-22 19:38:11 +02:00
GreenComfyTea
2f10a5d9e5 Buff UI -> Fix Harvest Moon not getting cleared when the buff expires or when skill is switched 2024-01-22 19:37:42 +02:00
GreenComfyTea
0dc74d4cc9 Buff UI -> Clear buff data on error 2024-01-22 19:36:12 +02:00
GreenComfyTea
9b82e27725 Bump version to 2.6.3 2023-10-29 15:36:43 +02:00
GreenComfyTea
2a3c8106d5 Fix: Power Shealthe, Sonic Boom, Bead of Resonance 2023-10-29 15:36:26 +02:00
GreenComfyTea
3b89ce8303 Bump version to v2.6.2 2023-10-24 10:15:42 +03:00
GreenComfyTea
f2e23626cf Fix creating DEFAULT file in /data/ when no config 2023-10-24 10:15:19 +03:00
GreenComfyTea
8a55873e14 Bump version to 2.6.1 2023-10-16 08:56:48 +03:00
GreenComfyTea
b93bdd0338 Add Buff UI and Stats UI to Hotkeys
+ Fix a Bug when Removed Hotkey was not Saved in the Config
+ Allow Changing Selected Hotkey when Any Other Hotkey is Waiting for a Keypress
2023-10-16 08:55:46 +03:00
GreenComfyTea
f01ec08990 Merge branch 'main' of https://github.com/GreenComfyTea/MHR-Overlay 2023-10-10 12:56:26 +03:00
GreenComfyTea
b6ed4f036a Adjust Dragon Conversion Buff Names 2023-10-10 12:56:18 +03:00
GreenComfyTea
fedf5bc7af Update README.md 2023-10-10 12:54:29 +03:00
GreenComfyTea
009eb9ffb0 Add Missing Might Seed Buff Filter 2023-10-10 12:30:19 +03:00
GreenComfyTea
b8a7f109e0 Add Missing Falling Asleep Buff Filter 2023-10-10 12:28:25 +03:00
GreenComfyTea
51b824e385 Update README.md 2023-10-10 11:08:50 +03:00
GreenComfyTea
c8bd65556e Fix Unicode Ranges 2023-10-10 10:57:07 +03:00
GreenComfyTea
0781662344 Update Unicode Ranges 2023-10-10 10:17:36 +03:00
GreenComfyTea
5bdcd1b9cf Update NotoSans-CJK Fonts to v2.004 2023-10-10 09:55:02 +03:00
GreenComfyTea
305a78b654 Add NotoSansArabic-Bold.otf Font 2023-10-10 09:30:38 +03:00
GreenComfyTea
6236c1e088 Add Missing NotoSans-Bold.otf Font 2023-10-10 09:28:41 +03:00
GreenComfyTea
ba571b0426 Update ru-ru.json to v2.6 + Add Buff Include Name 2023-10-09 17:46:29 +03:00
GreenComfyTea
2c7c229ec9 Add ID to Endemic Life Name Label 2023-10-09 15:19:54 +03:00
GreenComfyTea
39dbd23791 Change Default Customization Menu Font Size to 16 2023-10-09 15:00:42 +03:00
GreenComfyTea
96407c07bf Bump version to v2.6 2023-10-09 14:59:21 +03:00
GreenComfyTea
1f3a7d2bf8 Use Buff Filter Name frrom Localization File
+ Sort Names in English + Use NotoSans-Bold as Default Font
2023-10-09 14:58:10 +03:00
GreenComfyTea
423635400c Implement Buff Customization by Type 2023-09-30 11:03:25 +03:00
GreenComfyTea
17b89d3d7f Fix Include -> Skill Level Not Working 2023-09-30 11:02:38 +03:00
GreenComfyTea
c3d78705a3 Add Missing skill_level Translation String 2023-09-30 11:01:21 +03:00
GreenComfyTea
764b72f0ea Add buff types back 2023-09-30 10:06:04 +03:00
GreenComfyTea
df43908a31 Add Option to Set Infinite Buffs Location 2023-09-26 14:02:48 +03:00
GreenComfyTea
0f72fba92d Remove debug data 2023-09-26 13:15:25 +03:00
GreenComfyTea
e586534c4d Add Timer Delays Customization 2023-09-26 13:14:23 +03:00
GreenComfyTea
0951de24e2 Check for null in time.remove_delay_timer() 2023-09-26 11:32:18 +03:00
GreenComfyTea
480bc9c9b7 Add Buff Filters 2023-09-26 11:31:00 +03:00
GreenComfyTea
cbaa537a0b Improve Error Reporting in the Main Loop Functions 2023-09-26 11:29:14 +03:00
GreenComfyTea
c25ceee3d6 Blood Awakening: Remove Duration Pulling 2023-09-19 14:10:10 +03:00
GreenComfyTea
5a29b60fca Clean Up 2023-09-19 14:02:48 +03:00
GreenComfyTea
41f75d19d3 Refactor player_skill_list 2023-09-19 13:50:21 +03:00
GreenComfyTea
43b2946939 Set default Buff.update Timer to 0.5 2023-09-19 13:49:55 +03:00
GreenComfyTea
43fc14e01e Remove Pulling Duration for Some Buffs
Because only a few of the buff durations were found, I would prefer a simpler, more consistent and more performant code.
2023-09-19 13:47:24 +03:00
GreenComfyTea
66b192717c Misc Buffs: Move/Rename Immunizer to Natural Healing Up 2023-09-19 13:37:24 +03:00
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
GreenComfyTea
40820f98a7 Return missing debug.lua 2023-04-21 12:54:35 +03:00
GreenComfyTea
dd8a6bc2d7 Update README.md 2023-04-21 11:37:51 +03:00
GreenComfyTea
5dbfcb89f4 Update README.md 2023-04-21 11:27:21 +03:00
GreenComfyTea
75a7d8fa8c Update ru-ru 2023-04-21 11:06:37 +03:00
GreenComfyTea
d4e97854c3 Mark Amatsu 7th Part as Unknown 2023-04-21 11:04:55 +03:00
GreenComfyTea
81a803cc7c Dont register global xy debug variable if debug is missing or debug.enabled = false 2023-04-21 10:21:27 +03:00
GreenComfyTea
9b1ff5b264 Utilize this keyword everywhere 2023-04-21 10:19:12 +03:00
GreenComfyTea
94e9e5d18b Merge branch 'main' of https://github.com/GreenComfyTea/MHR-Overlay.git; branch 'main' of https://github.com/GreenComfyTea/MHR-Overlay 2023-04-21 10:13:24 +03:00
GreenComfyTea
96afca0ade Map Risen Shagaru Magala and Amatsu part names 2023-04-21 10:13:14 +03:00
GreenComfyTea
f627a0b19b Merge table_helpers and unicode_helpers into utils 2023-04-21 10:08:07 +03:00
GreenComfyTea
ad2097b380 Merge pull request #63 from sukiqwq/patch-1 2023-04-21 08:55:31 +03:00
RqLiu
a08ecff5d7 Update zh-cn.json 2023-04-20 16:10:05 -04:00
GreenComfyTea
3dcb55e086 Update LICENSE 2023-04-20 10:39:50 +03:00
GreenComfyTea
23df95e30e Merge remote-tracking branch 'origin/main' into main 2023-04-19 11:36:13 +03:00
GreenComfyTea
ba3ec120b2 ; 2023-04-19 11:35:08 +03:00
GreenComfyTea
c8cad67d15 Merge pull request #62 from etnAtker/update-zh-cn-translation
Update zh-cn translation
2023-03-25 09:31:15 +02:00
etnAtker
3090e6bb6a Update zh-cn translation 2023-03-25 12:00:20 +08:00
GreenComfyTea
0a9c8488d6 Add wall hit damage (only host/local) 2023-03-07 11:55:30 +02:00
GreenComfyTea
c2531b77a2 Add option to filter parts based on current state 2023-03-06 13:48:55 +02:00
GreenComfyTea
6a4f4a9dfe Add include options for value/max labels 2023-03-06 13:24:01 +02:00
GreenComfyTea
7346b8d96f Update Korean Localization to v2.4.1 2023-03-01 17:41:02 +02:00
GreenComfyTea
7158c0d367 Uncomment Poison and Stun Ailment Buildup UIs 2023-03-01 16:59:24 +02:00
GreenComfyTea
c145c8a37b Move debug xy 2023-03-01 16:46:29 +02:00
GreenComfyTea
c1464dcc12 Fix poison damage not being accounted due to buildup_share being deep-copied 2023-03-01 16:46:11 +02:00
GreenComfyTea
6723091294 Bump version to 2.4.1 2023-02-07 20:01:42 +02:00
GreenComfyTea
650eba5568 Mapped TU4 Monsters: Velkhana and Risen Valstrax 2023-02-07 20:01:27 +02:00
GreenComfyTea
80b6977e0f Localization fixes 2023-02-07 19:41:50 +02:00
GreenComfyTea
ce250961fe Localization fixes 2023-02-07 19:41:38 +02:00
GreenComfyTea
09d82dea54 Add Buff UI (visuals only/commented out) 2023-02-07 19:41:08 +02:00
GreenComfyTea
c74a93a3b2 Fix "highlighted (targeted)" being used in damage meter 2023-02-06 16:53:13 +02:00
GreenComfyTea
ccd64f534c Cache some methods 2023-02-06 16:43:00 +02:00
GreenComfyTea
60bcd5770d Cache all global variables 2023-02-06 16:31:59 +02:00
GreenComfyTea
9252beba11 pcall each large monster UI individually 2023-02-06 15:58:28 +02:00
GreenComfyTea
9958817989 Fix a bug when autotarget was trying to target dead monster causing all large monster UI to not work 2023-02-06 15:55:57 +02:00
GreenComfyTea
fcf35d817f Potential fix to damage meter showing incorrect players sometimes 2023-02-06 15:26:03 +02:00
GreenComfyTea
b1d84ab739 Move default static large mon. UI from screen edge 2023-02-06 15:25:20 +02:00
GreenComfyTea
82033313ba Merge branch 'main' of https://github.com/GreenComfyTea/MHR-Overlay 2023-02-06 12:47:24 +02:00
GreenComfyTea
23213fcab0 Dont highlight if dps/damage is 0 2023-02-06 12:47:01 +02:00
GreenComfyTea
976abee356 Fix Highlighted Damage UI not being initialized 2023-02-06 12:45:23 +02:00
GreenComfyTea
d8f6e2f9bb Update README.md 2023-01-24 19:11:31 +02:00
GreenComfyTea
a0a4df7b91 fix 2023-01-14 15:17:33 +02:00
GreenComfyTea
667be5793e Hide otomos on screen end when option has been toggled 2023-01-14 15:07:45 +02:00
GreenComfyTea
b321896eeb Fix Total Cart Count 2023-01-14 14:16:50 +02:00
GreenComfyTea
3b94c67071 Fix a bug when my buddy was incorrect when disconnecting from online quest 2023-01-14 13:52:24 +02:00
GreenComfyTea
7b9e376db1 Fix typo 2023-01-14 13:51:25 +02:00
GreenComfyTea
fdab487b7e Language fixes 2023-01-14 13:31:00 +02:00
GreenComfyTea
b9d44a9b67 Change table tostring function to a better one 2023-01-14 13:30:35 +02:00
GreenComfyTea
3513d77714 Added Support for multiple configs
1) Implemented ailment damage for buddies;
2) Bugfixes;
2023-01-14 13:30:09 +02:00
GreenComfyTea
9a3cb399e2 Damage Meter UI customization refactoring 2023-01-05 18:15:18 +02:00
GreenComfyTea
a8ec321dae Refactor Damage Meter UI config; 2023-01-02 14:18:32 +02:00
GreenComfyTea
575b46c70d Added Buddies to Damage Meter UI 2023-01-02 11:46:10 +02:00
GreenComfyTea
592defcd99 fix last_displayed_players not clearing 2022-12-04 10:06:21 +02:00
GreenComfyTea
a84c698a4b remove comments 2022-12-02 13:59:06 +02:00
GreenComfyTea
f0eb9673b0 Fix freeze_displayed_players on quest end
...if module visibility is disabled during the quest
2022-12-02 13:49:14 +02:00
GreenComfyTea
add4cca6f1 Bump version to v2.3.2 2022-11-30 10:54:13 +02:00
GreenComfyTea
5b0ed78e27 Fix use_d2d when overlay to not work without d2d 2022-11-30 10:17:57 +02:00
GreenComfyTea
12149d19f5 Fix player name include, bump version 2022-11-28 09:16:17 +02:00
GreenComfyTea
a6762490d0 Update README.md 2022-11-27 19:16:08 +02:00
GreenComfyTea
d4c4267c35 Add Followers to Damage Meter UI 2022-11-26 13:24:12 +02:00
GreenComfyTea
a0e6974ad7 Add use_d2d_if_available option 2022-11-25 12:38:34 +02:00
GreenComfyTea
b36b1080df Fix DPS freezing on quest end + total cart count 2022-11-25 12:04:58 +02:00
GreenComfyTea
5e43efb907 flag_cat_skill_insurance comment 2022-11-24 13:05:30 +02:00
GreenComfyTea
d99879bd75 Change Player Cart Hook 2022-11-24 12:58:59 +02:00
GreenComfyTea
45aab796de Map TU3 monster part names
- Chaotic Gore Magala
- Risen Kushala Daora
- Risen Teostra
2022-11-24 11:41:53 +02:00
GreenComfyTea
673bf28451 Fix Ailment Buildup UI 2022-11-23 13:35:16 +02:00
GreenComfyTea
2dde202501 Hide Large Monster Dynamic UI when in stealth 2022-11-23 12:06:00 +02:00
GreenComfyTea
ed6f59655c Implement proper tracking of monster capturability 2022-11-23 11:29:16 +02:00
84 changed files with 24236 additions and 5603 deletions

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2022 GreenComfyTea
Copyright (c) 2023 GreenComfyTea
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

169
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.605%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.**
![50-1659789731-551420562](https://user-images.githubusercontent.com/30152047/183250401-9f2898dd-feb4-4903-802c-c9d398261f11.png)
<p align="center">
<a>
<img align="center" src="https://user-images.githubusercontent.com/30152047/183250401-9f2898dd-feb4-4903-802c-c9d398261f11.png" />
</a>
</p>
# Links
* **[Nexus Mods](https://www.nexusmods.com/monsterhunterrise/mods/50)**
@@ -15,28 +135,34 @@ Exposes in-game data about monsters, creatures, players and damage. Draws a high
* **[Troubleshooting](https://github.com/GreenComfyTea/MHR-Overlay/wiki/Troubleshooting)**
# Requirements
1. [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26) (v1.3.5 or above);
2. [REFramework Direct2D](https://www.nexusmods.com/monsterhunterrise/mods/134) (v0.4.0 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+) - Needed for Unicode Support.
# How to install:
1. Install [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26);
2. (Windows only) 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.
1. Install **[REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26)**;
2. Install **[REFramework Direct2D](https://www.nexusmods.com/monsterhunterrise/mods/134)**;
>**: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:
* 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!
4. Extract the mod from the archive and place it in MonsterHunterRise folder. Refer to [FAQ](https://github.com/GreenComfyTea/MHR-Overlay/wiki/FAQ) to verify how the file hierarchy should look like if everything is done correctly.
* 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!
4. Extract the mod from the archive and place it in MonsterHunterRise folder. Refer to **[FAQ](https://github.com/GreenComfyTea/MHR-Overlay/wiki/FAQ)** to verify how the file hierarchy should look like if everything is done correctly.
# Credits
**GreenComfyTea** - creator of the mod and it's main contributor.
**cursecat** - creator of [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26), [REFramework Direct2D](https://www.nexusmods.com/monsterhunterrise/mods/134) plugin and [Monster Has HP Bar](https://www.nexusmods.com/monsterhunterrise/mods/43) mod, which provided an example on how to retrieve monster HP data.
**praydog2** - creator of [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26). Contributed huge improvements to the performance of the mod.
**coavins** - creator of [coavins damage meter](https://www.nexusmods.com/monsterhunterrise/mods/68) mod.
**[GreenComfyTea](https://github.com/GreenComfyTea)** - creator of the mod and it's main contributor.
**[cursey](https://github.com/cursey)** - creator of [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26), [REFramework Direct2D](https://www.nexusmods.com/monsterhunterrise/mods/134) plugin and [Monster Has HP Bar](https://www.nexusmods.com/monsterhunterrise/mods/43) mod, which provided an example on how to retrieve monster HP data.
**[praydog](https://github.com/praydog)** - creator of [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26). Contributed huge improvements to the performance of the mod.
**[coavins](https://github.com/coavins)** - creator of [coavins damage meter](https://www.nexusmods.com/monsterhunterrise/mods/68) mod.
**[lingsamuel](https://github.com/lingsamuel)** - creator of [Data Reporter and Buff Notification](https://www.nexusmods.com/monsterhunterrise/mods/1609) mod.
**neatnet** - Korean translation.
**s9000008, mcc1** - Traditional Chinese translation.
**etnAtker** - Simplified Chinese translation.
**AKILAND0214** - Japanese translation.
**[neatnet](https://github.com/neatnet)** - Korean translation.
**[s9000008](https://github.com/s9000008)**, **[mcc1](https://github.com/mcc1)** - Traditional Chinese translation.
**[etnAtker](https://github.com/etnAtker)**, **[sukiqwq](https://github.com/sukiqwq)** - Simplified Chinese translation.
**[AKILAND0214](https://github.com/AKILAND0214)** - Japanese translation.
***
# Support
@@ -48,4 +174,3 @@ You can support me by donating! I would appreciate it! But anyway, thank you for
<a href="https://ko-fi.com/greencomfytea">
<img alt="Qries" src="https://panels.twitch.tv/panel-48897356-image-c2fcf835-87e4-408e-81e8-790789c7acbc">
</a>

View File

@@ -1,20 +1,63 @@
xy = "";
local debug = require("MHR_Overlay.Misc.debug");
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 keyboard = require("MHR_Overlay.Game_Handler.keyboard");
local quest_status = require("MHR_Overlay.Game_Handler.quest_status");
local screen = require("MHR_Overlay.Game_Handler.screen");
local singletons = require("MHR_Overlay.Game_Handler.singletons");
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 language = require("MHR_Overlay.Misc.language");
local table_helpers = require("MHR_Overlay.Misc.table_helpers");
local unicode_helpers = require("MHR_Overlay.Misc.unicode_helpers");
local part_names = require("MHR_Overlay.Misc.part_names");
local utils = require("MHR_Overlay.Misc.utils");
local player = require("MHR_Overlay.Damage_Meter.player");
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 non_players = require("MHR_Overlay.Damage_Meter.non_players");
local damage_hook = require("MHR_Overlay.Damage_Meter.damage_hook");
local env_creature_hook = require("MHR_Overlay.Endemic_Life.env_creature_hook");
@@ -33,6 +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 time_UI = require("MHR_Overlay.UI.Modules.time_UI");
local env_creature_UI = require("MHR_Overlay.UI.Modules.env_creature_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 damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.damage_UI_entity");
@@ -41,6 +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 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 buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
local customization_menu = require("MHR_Overlay.UI.customization_menu");
local label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
@@ -54,24 +100,102 @@ local body_parts_customization = require("MHR_Overlay.UI.Customizations.body_par
local ailments_customization = require("MHR_Overlay.UI.Customizations.ailments_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 large_monster_UI_customization = require("MHR_Overlay.UI.Customizations.large_monster_UI_customization");
local drawing = require("MHR_Overlay.UI.drawing");
------------------------INIT MODULES-------------------------
-- #region
screen.init_module();
singletons.init_module();
table_helpers.init_module();
unicode_helpers.init_module();
time.init_module();
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();
quest_status.init_module();
part_names.init_module();
screen.init_module();
singletons.init_module();
utils.init_module();
time.init_module();
damage_UI_entity.init_module();
health_UI_entity.init_module();
stamina_UI_entity.init_module();
@@ -79,9 +203,26 @@ rage_UI_entity.init_module();
ailment_UI_entity.init_module();
ailment_buildup_UI_entity.init_module();
body_part_UI_entity.init_module();
buff_UI_entity.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();
player.init_module();
players.init_module();
non_players.init_module();
quest_status.init_module();
env_creature_hook.init_module();
env_creature.init_module();
@@ -94,7 +235,6 @@ small_monster.init_module();
ailment_hook.init_module();
ailment_buildup.init_module();
customization_menu.init_module();
label_customization.init_module();
bar_customization.init_module();
line_customization.init_module();
@@ -109,6 +249,7 @@ body_parts_customization.init_module();
ailments_customization.init_module();
ailment_buildups_customization.init_module();
module_visibility_customization.init_module();
customization_menu.init_module();
drawing.init_module();
@@ -117,6 +258,8 @@ large_monster_UI.init_module();
small_monster_UI.init_module();
time_UI.init_module();
env_creature_UI.init_module();
buff_UI.init_module();
stats_UI.init_module();
keyboard.init_module();
@@ -127,72 +270,175 @@ log.info("[MHR Overlay] Loaded.");
----------------------------LOOP-----------------------------
-- #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
local success = pcall(small_monster_UI.draw);
local success, error = pcall(small_monster_UI.update);
if not success then
customization_menu.status = string.format("[%s] Small monster drawing function threw an exception", flow_state_name);
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Small Monster UI: %s", flow_state_name, tostring(error)));
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;
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
local success = pcall(large_monster_UI.draw, dynamic_enabled, static_enabled, highlighted_enabled);
local success, error = pcall(large_monster_UI.update, dynamic_enabled, static_enabled, highlighted_enabled);
if not success then
customization_menu.status = string.format("[%s] Large Monster drawing function threw an exception", flow_state_name);
end
end
if config.current_config.time_UI.enabled and module_visibility_config.time_UI then
local success = pcall(time_UI.draw);
if not success then
customization_menu.status = string.format("[%s] Time Drawing function threw an exception", flow_state_name);
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Large Monster UI: %s", flow_state_name, tostring(error)));
end
end
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, error = pcall(damage_meter_UI.update);
if not success then
customization_menu.status = string.format("[%s] Damage Meter drawing function threw an exception", flow_state_name);
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Damage Meter UI: %s", flow_state_name, tostring(error)));
end
end
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, error = pcall(env_creature_UI.update);
if not success then
customization_menu.status = string.format("[%s] Endemic Life drawing function threw an exception", flow_state_name);
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Endemic Life UI: %s", flow_state_name, tostring(error)));
end
end
if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then
local success, error = pcall(buff_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Buff UI: %s", flow_state_name, tostring(error)));
end
end
end
local function main_loop()
customization_menu.status = "OK";
singletons.init();
screen.update_window_size();
player.update_myself_position();
quest_status.update_is_online();
quest_status.update_is_quest_host();
time.tick();
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, error = pcall(small_monster_UI.draw);
if not success then
error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Small Monster UI: %s", flow_state_name, tostring(error)));
end
end
--xy = xy .. quest_status.get_flow_state(quest_status.flow_state, true);
local large_monster_UI_config = config.current_config.large_monster_UI;
player.update_player_list(quest_status.index >= 2);
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 quest_status.flow_state == quest_status.flow_states.IN_LOBBY then
if dynamic_enabled or static_enabled or highlighted_enabled then
local success, error = pcall(large_monster_UI.draw, dynamic_enabled, static_enabled, highlighted_enabled);
if not success then
error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Large Monster UI: %s", flow_state_name, tostring(error)));
end
end
if config.current_config.endemic_life_UI.enabled and
config.current_config.global_settings.module_visibility.in_lobby.endemic_life_UI then
local success = pcall(env_creature_UI.draw);
if config.current_config.time_UI.enabled and module_visibility_config.time_UI then
local success, error = pcall(time_UI.draw);
if not success then
error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Time UI: %s", flow_state_name, tostring(error)));
end
end
if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then
local success, error = pcall(damage_meter_UI.draw);
if not success then
error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Damage Meter UI: %s", flow_state_name, tostring(error)));
end
end
if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then
local success, error = pcall(env_creature_UI.draw);
if not success then
error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Endemic Life UI: %s", flow_state_name, tostring(error)));
end
end
if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then
local success, error = pcall(buff_UI.draw);
if not success then
error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Buff UI: %s", flow_state_name, tostring(error)));
end
end
if config.current_config.stats_UI.enabled and module_visibility_config.stats_UI then
local success, error = pcall(stats_UI.draw);
if not success then
error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Stats UI: %s", flow_state_name, tostring(error)));
end
end
end
local function update_UI()
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 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
local success, error = pcall(large_monster_UI.update, dynamic_enabled, static_enabled, highlighted_enabled);
if not success then
customization_menu.status = "[In Lobby] Endemic life drawing function threw an exception";
error_handler.report("MHR_Overlay.update_UI", string.format("[In Training Area] Large Monster UI: %s", tostring(error)));
end
end
if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then
local success, error = pcall(damage_meter_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_UI", string.format("[In Training Area] Damage Meter UI: %s", tostring(error)));
end
end
if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then
local success, error = pcall(env_creature_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_UI", string.format("[In Training Area] Endemic Life UI: %s", tostring(error)));
end
end
if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then
local success, error = pcall(buff_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_UI", string.format("[In Training Area] Buff UI: %s", tostring(error)));
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, error = pcall(stats_UI.draw);
if not success then
error_handler.report("MHR_Overlay.main_loop", string.format("[In Training Area] Stats UI: %s", tostring(error)));
end
end
@@ -206,26 +452,41 @@ local function main_loop()
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.draw, dynamic_enabled, static_enabled, highlighted_enabled);
local success, error = pcall(large_monster_UI.draw, dynamic_enabled, static_enabled, highlighted_enabled);
if not success then
customization_menu.status = "[In Training Area] Large monster drawing function threw an exception";
error_handler.report("MHR_Overlay.main_loop", string.format("[In Training Area] Large Monster UI: %s", tostring(error)));
end
end
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, error = pcall(damage_meter_UI.draw);
if not success then
customization_menu.status = "[In Training Area] Damage meter drawing function threw an exception";
error_handler.report("MHR_Overlay.main_loop", string.format("[In Training Area] Damage Meter UI: %s", tostring(error)));
end
end
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, error = pcall(env_creature_UI.draw);
if not success then
customization_menu.status = "[In Training Area] Endemic life drawing function threw an exception";
error_handler.report("MHR_Overlay.main_loop", string.format("[In Training Area] Endemic Life UI: %s", tostring(error)));
end
end
if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then
local success, error = pcall(buff_UI.draw);
if not success then
error_handler.report("MHR_Overlay.main_loop", string.format("[In Training Area] Buff UI: %s", tostring(error)));
end
end
if config.current_config.stats_UI.enabled and module_visibility_config.stats_UI then
local success, error = pcall(stats_UI.draw);
if not success then
error_handler.report("MHR_Overlay.main_loop", string.format("[In Training Area] Stats UI: %s", tostring(error)));
end
end
elseif quest_status.flow_state == quest_status.flow_states.CUTSCENE then
draw_modules(config.current_config.global_settings.module_visibility.cutscene, "Cutscene");
elseif quest_status.flow_state == quest_status.flow_states.LOADING_QUEST then
@@ -246,7 +507,7 @@ local function main_loop()
draw_modules(config.current_config.global_settings.module_visibility.reward_screen, "Reward Screen");
elseif quest_status.flow_state == quest_status.flow_states.SUMMARY_SCREEN then
draw_modules(config.current_config.global_settings.module_visibility.summary_screen, "Summary Screen");
end
end
end
-- #endregion
@@ -261,79 +522,39 @@ re.on_draw_ui(function()
end);
re.on_frame(function()
if not reframework:is_drawing_ui() then
customization_menu.is_opened = false;
end
if customization_menu.is_opened then
if reframework:is_drawing_ui() then
pcall(customization_menu.draw);
end
keyboard.update();
end);
-- #endregion
--------------------------RE_IMGUI---------------------------
----------------------------D2D------------------------------
-----------------------Loop Callbacks------------------------
-- #region
if d2d ~= nil then
d2d.register(function()
drawing.init_font();
end, main_loop);
else
re.on_frame(main_loop);
end, function()
if config.current_config.global_settings.renderer.use_d2d_if_available then
draw_loop();
end
end);
end
-- #endregion
----------------------------D2D------------------------------
if debug.enabled then
if d2d ~= nil then
d2d.register(function()
end, function()
local is_ready_quest = singletons.quest_manager:call("isReadyQuest");
local is_ready_play_quest = singletons.quest_manager:call("isReadyPlayQuest");
local is_play_quest = singletons.quest_manager:call("isPlayQuest");
local is_stay_quest = singletons.quest_manager:call("isStayQuest");
local is_end_wait = singletons.quest_manager:call("isEndWait");
local is_active_quest = singletons.quest_manager:call("isActiveQuest");
local quest_clear = singletons.quest_manager:call("checkQuestClear");
local is_result_demo_play_start = singletons.quest_manager:call("isResultDemoPlayStart");
local isResultGuestDrawOff = singletons.quest_manager:call("isResultGuestDrawOff");
re.on_frame(function()
time.update_timers();
keyboard.update();
local game_manager = sdk.get_managed_singleton("snow.SnowGameManager");
local current_status = game_manager:get_field("_CurrentStatus");
local demo_camera = sdk.get_managed_singleton("snow.camera.DemoCamera");
local is_play_demo = demo_camera:call("IsPlayDemo");
--[[xy = "\nquest_status.index: " .. tostring(quest_status.index);
xy = xy .. "\nis_ready_quest: " .. tostring(is_ready_quest);
xy = xy .. "\nis_ready_play_quest: " .. tostring(is_ready_play_quest);
xy = xy .. "\nis_play_quest: " .. tostring(is_play_quest);
xy = xy .. "\nis_stay_quest: " .. tostring(is_stay_quest);
xy = xy .. "\nis_end_wait: " .. tostring(is_end_wait);
xy = xy .. "\nis_active_quest: " .. tostring(is_active_quest);
xy = xy .. "\nquest_clear: " .. tostring(quest_clear);
xy = xy .. "\nis_result_demo_play_start: " .. tostring(is_result_demo_play_start);
xy = xy .. "\nisResultGuestDrawOff: " .. tostring(isResultGuestDrawOff);
xy = xy .. "\ncurrent_status: " .. tostring(current_status);
xy = xy .. "\nis_play_demo: " .. tostring(is_play_demo);--]]
if xy ~= "" then
d2d.text(drawing.font, "xy:\n" .. tostring(xy), 551, 11, 0xFF000000);
d2d.text(drawing.font, "xy:\n" .. tostring(xy), 550, 10, 0xFFFFFFFF);
end
end);
else
re.on_frame(function()
if xy ~= "" then
draw.text("xy:\n" .. tostring(xy), 550, 10, 0xFFFFFFFF);
draw.text("xy:\n" .. tostring(xy), 551, 11, 0xFF000000);
end
end);
if d2d == nil or not config.current_config.global_settings.renderer.use_d2d_if_available then
draw_loop();
end
end
end);
-- #endregion
-----------------------Loop Callbacks------------------------
time.init_global_timers();
time.new_timer(update_UI, 0.5);
if imgui.begin_table == nil then
re.msg(language.current_language.customization_menu.reframework_outdated);
end
end

View File

@@ -0,0 +1,420 @@
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,
thunderblight = nil,
iceblight = nil,
dragonblight = nil,
blastblight = nil,
minor_bubbleblight = nil,
major_bubbleblight = nil,
hellfireblight = nil,
bloodblight = nil,
poison = nil,
deadly_poison = nil,
stun = nil,
paralysis = nil,
falling_asleep = 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,
engulfed = nil,
frostblight = nil,
muck = nil
};
this.keys = {
"fireblight",
"waterblight",
"thunderblight",
"iceblight",
"dragonblight",
"blastblight",
"minor_bubbleblight",
"major_bubbleblight",
"hellfireblight",
"bloodblight",
"frostblight",
"poison",
"deadly_poison",
"stun",
"paralysis",
"falling_asleep",
"sleep",
"defense_down",
"resistance_down",
"tremor",
"roar",
"webbed",
"stench",
"leeched",
-- "whirlwind",
"bleeding",
"engulfed",
"muck",
"frenzy",
"frenzy_overcome",
"frenzy_infection"
};
this.UI = nil;
local abnormal_statuses_type_name = "abnormal_statuses";
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");
-- Thunderblight
local thunder_duration_timer_field = player_quest_base_type_def:get_field("_ThunderLDurationTimer");
-- Iceblight
local ice_duration_timer_field = player_quest_base_type_def:get_field("_IceLDurationTimer");
-- 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)
-- Missing:
-- whirlwind?
-- Wind Pressure?
this.update_poison(player);
this.update_bubbleblight(player);
this.update_muck(player);
this.update_frenzy_infection(player);
this.update_abnormal_status("fireblight", nil, nil, player, fire_duration_timer_field);
this.update_abnormal_status("waterblight", nil, nil, player, water_duration_timer_field);
this.update_abnormal_status("thunderblight", nil, nil, player, thunder_duration_timer_field);
this.update_abnormal_status("iceblight", nil, nil, player, ice_duration_timer_field);
this.update_abnormal_status("dragonblight", nil, nil, player, dragon_duration_timer_field);
this.update_abnormal_status("blastblight", nil, nil, player, bomb_duration_timer_field);
this.update_abnormal_status("hellfireblight", nil, nil, player, oni_bomb_duration_timer_field);
this.update_abnormal_status("bloodblight", nil, nil, player, mystery_debuff_timer_field);
this.update_abnormal_status("frostblight", player, get_is_frozen_damage_method);
this.update_abnormal_status("stun", nil, nil, player, stun_duration_timer_field);
this.update_abnormal_status("paralysis", nil, nil, player, paralyze_duration_timer_field);
this.update_abnormal_status("falling_asleep", nil, nil, player, get_sleep_movable_timer_method);
this.update_abnormal_status("defense_down", nil, nil, player, defense_down_duration_timer_field);
this.update_abnormal_status("resistance_down", nil, nil, player, resistance_down_duration_timer_field);
this.update_abnormal_status("tremor", nil, nil, player, quake_duration_timer_field);
this.update_abnormal_status("roar", nil, nil, player, ear_duration_timer_field);
this.update_abnormal_status("webbed", nil, nil, player, beto_duration_timer_field);
this.update_abnormal_status("stench", nil, nil, player, stink_duration_timer_field);
this.update_abnormal_status("leeched", nil, nil, player, blooding_enemy_timer_field, true);
this.update_abnormal_status("bleeding", nil, nil, player, bleeding_debuff_timer_field);
this.update_abnormal_status("engulfed", player, get_is_vacuum_damage_method);
this.update_abnormal_status("frenzy", nil, nil, player, virus_onset_timer_field);
this.update_abnormal_status("frenzy_overcome", nil, nil, player_data, virus_overcome_buff_timer_field);
this.update_sleep(player);
end
function this.update_abnormal_status(key, value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints)
return buffs.update_generic_buff(this.list, config.current_config.buff_UI.filter.abnormal_statuses, this.get_abnormal_status_name,
abnormal_statuses_type_name, key, value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints);
end
function this.update_generic(key, level, timer)
return buffs.update_generic(this.list, this.get_abnormal_status_name, abnormal_statuses_type_name, key, level, timer);
end
function this.apply_filter(key)
return buffs.apply_filter(this.list, config.current_config.buff_UI.filter.abnormal_statuses, key);
end
function this.update_poison(player)
local cached_config = config.current_config.buff_UI.filter.abnormal_statuses;
if not cached_config.poison
and not cached_config.deadly_poison then
if this.apply_filter("poison") then
return;
end
if this.apply_filter("deadly_poison") then
return;
end
end
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");
this.list.poison = nil;
this.list.deadly_poison = nil;
return;
end
if poison_level == 0 then
this.list.poison = nil;
this.list.deadly_poison = nil;
return;
end
if poison_level == 1 then
this.update_abnormal_status("poison", nil, nil, player, poison_duration_timer_field);
this.list.deadly_poison = nil;
else
this.update_abnormal_status("deadly_poison", nil, nil, player, poison_duration_timer_field);
this.list.poison = nil;
end
end
function this.update_bubbleblight(player)
local cached_config = config.current_config.buff_UI.filter.abnormal_statuses;
if not cached_config.minor_bubbleblight
and not cached_config.major_bubbleblight then
if this.apply_filter("minor_bubbleblight") then
return;
end
if this.apply_filter("major_bubbleblight") then
return;
end
end
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");
this.list.minor_bubbleblight = nil;
this.list.major_bubbleblight = nil;
return;
end
if bubble_type == 0 then
this.list.minor_bubbleblight = nil;
this.list.major_bubbleblight = nil;
return;
end
if bubble_type == 1 then
this.update_abnormal_status("minor_bubbleblight", nil, nil, player, bubble_damage_timer_field);
this.list.major_bubbleblight = nil;
else
this.update_abnormal_status("major_bubbleblight", nil, nil, player, bubble_damage_timer_field);
this.list.minor_bubbleblight = nil;
end
end
function this.update_muck(player)
if this.apply_filter("muck") then
return;
end
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");
this.list.muck = nil;
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");
this.list.muck = nil;
return;
end
if not is_mud_damage and not is_gold_mud_damage then
this.list.muck = nil;
return;
end
this.update_generic("muck");
end
function this.update_frenzy_infection(player)
if this.apply_filter("frenzy_infection") then
return;
end
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");
this.list.frenzy_infection = nil;
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");
this.list.frenzy_infection = nil;
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);
this.update_generic("frenzy_infection", 1, timer);
end
function this.update_sleep(player)
if this.apply_filter("sleep") then
this.list.sleep = nil;
return;
end
if this.list.falling_asleep ~= nil then
this.list.sleep = nil;
return;
end
this.update_abnormal_status("sleep", nil, nil, player, sleep_duration_timer_field);
end
function this.init_all_UI()
for abnormal_status_key, abnormal_status in pairs(this.list) do
buffs.init_UI(abnormal_status);
end
end
function this.init_names()
for abnormal_status_key, abnormal_status in pairs(this.list) do
abnormal_status.name = this.get_abnormal_status_name(abnormal_status_key);
end
end
function this.get_abnormal_status_name(key)
local abnormal_status_name = language.current_language.ailments[key];
if abnormal_status_name == nil then
return 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

@@ -0,0 +1,398 @@
local this = {};
local buff_UI_entity;
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 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 player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local find_master_player_method = player_manager_type_def:get_method("findMasterPlayer");
local get_ref_item_parameter_method = player_manager_type_def:get_method("get_RefItemParameter");
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;
local buff = {};
buff.type = type;
buff.key = key;
buff.name = name;
buff.level = level;
buff.timer = duration;
buff.duration = duration;
buff.is_visible = true;
buff.timer_percentage = 0;
buff.minutes_left = 0;
buff.seconds_left = 0;
buff.is_infinite = is_infinite;
this.update_timer(buff, buff.timer);
this.init_UI(buff);
return buff;
end
function this.init_buffs()
this.list = {};
end
function this.init_all_UI()
abnormal_statuses.init_all_UI();
item_buffs.init_all_UI();
endemic_life_buffs.init_all_UI();
melody_effects.init_all_UI();
dango_skills.init_all_UI();
rampage_skills.init_all_UI();
skills.init_all_UI();
weapon_skills.init_all_UI();
otomo_moves.init_all_UI();
misc_buffs.init_all_UI();
end
function this.init_UI(buff)
local cached_config = config.current_config.buff_UI[buff.type];
buff.buff_UI = buff_UI_entity.new(cached_config.bar, cached_config.name_label, cached_config.timer_label);
end
function this.init_names()
abnormal_statuses.init_names();
item_buffs.init_names();
endemic_life_buffs.init_names();
melody_effects.init_names();
dango_skills.init_names();
rampage_skills.init_names();
skills.init_names();
weapon_skills.init_names();
otomo_moves.init_names();
misc_buffs.init_names();
end
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("buffs.update", "Failed to access Data: weapon_type");
return;
end
if singletons.player_manager == nil then
error_handler.report("buffs.update", "Failed to access Data: player_manager");
return;
end
local item_parameter = get_ref_item_parameter_method:call(singletons.player_manager);
if item_parameter == nil then
error_handler.report("buffs.update", "Failed to access Data: item_parameter");
return;
end
local is_player_lobby_base = master_player:get_type_definition() == player_lobby_base_type_def;
item_buffs.update(master_player_data, item_parameter);
rampage_skills.update(master_player_data);
otomo_moves.update(master_player_data);
if not is_player_lobby_base then
abnormal_statuses.update(master_player, master_player_data);
endemic_life_buffs.update(master_player, master_player_data);
dango_skills.update(master_player, master_player_data);
skills.update(master_player, master_player_data, weapon_type);
weapon_skills.update(master_player, master_player_data, weapon_type);
misc_buffs.update(master_player, master_player_data, item_parameter);
end
end
function this.update_timer(buff, timer)
buff.is_visible = true;
if timer == nil then
return;
end
if timer < 0 then
timer = 0;
end
if timer > buff.duration or timer > buff.timer then
buff.duration = timer;
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, filter_list, get_name_function,
buff_type, buff_key,
value_owner, value_holder,
timer_owner, timer_holder,
is_infinite, minimal_value, level_breakpoints)
if this.apply_filter(buff_list, filter_list, buff_key) then
return;
end
if timer_owner == nil then timer_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));
buff_list[buff_key] = nil;
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));
buff_list[buff_key] = nil;
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
return this.update_generic(buff_list, get_name_function, buff_type, buff_key, level, timer);
end
function this.update_generic(buff_list, get_name_function, buff_type, buff_key, level, 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, timer);
buff_list[buff_key] = buff;
else
if buff.level ~= level then
buff.duration = timer;
end
buff.level = level;
this.update_timer(buff, timer);
end
return buff;
end
function this.apply_filter(buff_list, filter_list, buff_key)
if filter_list[buff_key] then
return false;
end
local buff = buff_list[buff_key];
if buff == nil then
return true;
end
if not buff.is_visible then
return true;
end
if buff.is_infinite then
buff_list[buff_key] = nil;
return true;
end
time.new_delay_timer(function()
local _buff = buff_list[buff_key];
if _buff ~= nil and not _buff.is_visible then
buff_list[buff_key] = nil;
end
end, buff.timer);
buff.is_visible = false;
return true;
end
function this.draw(buff, buff_UI, position_on_screen, opacity_scale)
buff_UI_entity.draw(buff, buff_UI, position_on_screen, opacity_scale);
end
function this.init_dependencies()
config = require("MHR_Overlay.Misc.config");
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()
end
return this;

View File

@@ -0,0 +1,405 @@
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 = {
dango_adrenaline = nil,
dango_booster = nil,
dango_connector = nil,
dango_defender = nil,
dango_flyer = nil,
dango_glutton = nil,
dango_hunter = nil,
dango_insurance = nil,
dango_insurance_defense_up = nil,
super_recovery_dango = nil
};
this.keys = {
"dango_adrenaline",
"dango_booster",
"dango_connector",
"dango_defender",
"dango_flyer",
"dango_glutton",
"dango_hunter",
"dango_insurance",
"dango_insurance_defense_up",
"super_recovery_dango"
};
local dango_skill_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 has_anyone_kitchen_skill_in_quest_method = player_manager_type_def:get_method("hasAnyoneKitchenSkillInQuest");
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Dango Defender
local is_enable_kitchen_skill_048_reduce_field = 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 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");
function this.update(player, player_data)
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);
this.update_dango_skill("dango_booster", nil, nil, player_data, kitchen_skill_027_timer_field);
this.update_dango_skill("dango_defender", player_data, is_enable_kitchen_skill_048_reduce_field, nil, nil, true);
this.update_dango_skill("dango_glutton", nil, nil, player_data, kitchen_skill_045_timer_field);
this.update_dango_skill("dango_connector", nil, nil, player_data, kitchen_skill_054_timer_field);
end
function this.update_dango_skill(key, value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints)
return buffs.update_generic_buff(this.list, config.current_config.buff_UI.filter.dango_skills, this.get_dango_skill_name,
dango_skills_type_name, key,
value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints);
end
function this.update_generic(key, level, timer)
return buffs.update_generic(this.list, this.get_dango_skill_name, dango_skills_type_name, key, level, timer);
end
function this.apply_filter(key)
return buffs.apply_filter(this.list, config.current_config.buff_UI.filter.dango_skills, key);
end
function this.update_dango_adrenaline()
if this.apply_filter("dango_adrenaline") then
return;
end
if not this.is_dango_adrenaline_active then
this.list.dango_adrenaline = nil;
return;
end
this.update_generic("dango_adrenaline");
end
function this.update_dango_insurance()
if this.apply_filter("dango_insurance") then
return;
end
if singletons.player_manager == nil then
error_handler.report("dango_skills.update_dango_insurance", "Failed to access Data: player_manager");
this.list.dango_insurance = nil;
return;
end
if singletons.quest_manager == nil then
error_handler.report("dango_skills.update_dango_insurance", "Failed to access Data: quest_manager");
this.list.dango_insurance = nil;
return;
end
local has_insurance_skill = has_anyone_kitchen_skill_in_quest_method:call(singletons.player_manager, dango_skill_ids.dango_insurance);
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");
this.list.dango_insurance = nil;
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");
this.list.dango_insurance = nil;
return;
end
if not has_insurance_skill or is_cat_skill_insurance then
this.list.dango_insurance = nil;
return;
end
this.update_generic("dango_insurance");
end
function this.update_dango_insurance_defense_up(player_data)
if this.apply_filter("dango_insurance_defense_up") then
return;
end
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");
this.list.dango_insurance_defense_up = nil;
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");
this.list.dango_insurance_defense_up = nil;
return;
end
if not insurance_def_up_lv4 then
this.list.dango_insurance_defense_up = nil;
return;
end
level = 4;
end
this.update_generic("dango_insurance_defense_up", level);
end
function this.update_dango_flyer(player)
if this.apply_filter("dango_flyer") then
return;
end
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");
this.list.dango_flyer = nil;
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");
this.list.dango_flyer = nil;
return;
end
if not is_kitchen_skill_wire_stop_regene then
this.list.dango_flyer = nil;
return;
end
level = 3;
end
this.update_generic("dango_flyer", level);
end
function this.update_dango_hunter(player_data)
local dango_hunter_buff = this.update_dango_skill("dango_hunter", nil, nil, player_data, kitchen_skill_051_atk_up_timer_field);
if dango_hunter_buff ~= nil then
dango_hunter_buff.level = 4;
end
end
function this.update_super_recovery_dango(player)
if this.apply_filter("super_recovery_dango") then
return;
end
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");
this.list.super_recovery_dango = nil;
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;
this.update_generic("super_recovery_dango");
end
function this.init_all_UI()
for dango_skill_key, dango_skill in pairs(this.list) do
buffs.init_UI(dango_skill);
end
end
function this.init_names()
for dango_skill_key, dango_skill in pairs(this.list) do
dango_skill.name = this.get_dango_skill_name(dango_skill_key);
end
end
function this.get_dango_skill_name(key)
local dango_skill_id = dango_skill_ids[key];
if dango_skill_id == nil then
local dango_skill_name = language.current_language.dango_skills[key];
if dango_skill_name == nil then
return key;
end
return dango_skill_name;
end
local dango_skill_name = get_name_method:call(nil, dango_skill_id);
if dango_skill_name == nil then
error_handler.report("dango_skills.get_dango_name", string.format("Failed to access Data: %s_name", key));
return 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");
time = require("MHR_Overlay.Game_Handler.time");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,229 @@
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 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 = {
cutterfly = nil,
clothfly = nil,
butterflame = nil,
-- peepersects = nil,
stinkmink = nil,
ruby_wirebug = nil,
gold_wirebug = nil,
red_lampsquid = nil,
yellow_lampsquid = nil
};
this.keys = {
"cutterfly",
"clothfly",
"butterflame",
-- "peepersects",
"stinkmink",
"ruby_wirebug",
"gold_wirebug",
"red_lampsquid",
"yellow_lampsquid"
};
this.peepersects_duration = 90;
this.butterflame_attack_up = 25;
local endemic_life_buffs_type_name = "endemic_life_buffs";
local marionette_mode_types = { "ruby_wirebug", "gold_wirebug" };
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);
this.update_endemic_life_buff("cutterfly", nil, nil, player_data, crit_up_ec_second_timer_field);
this.update_endemic_life_buff("clothfly", nil, nil, player_data, def_up_buff_second_rate_timer_field);
this.update_endemic_life_buff("stinkmink", nil, nil, player_data, lead_enemy_timer_field);
this.update_endemic_life_buff("red_lampsquid", nil, nil, player_data, atk_up_ec_second_timer_field);
this.update_endemic_life_buff("yellow_lampsquid", nil, nil, player_data, def_up_ec_second_timer_field);
end
function this.update_endemic_life_buff(key, value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints)
return buffs.update_generic_buff(this.list, config.current_config.buff_UI.filter.endemic_life_buffs, this.get_endemic_life_name,
endemic_life_buffs_type_name, key,
value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints)
end
function this.update_generic(key, level, timer)
return buffs.update_generic(this.list, this.get_endemic_life_name, endemic_life_buffs_type_name, key, level, timer);
end
function this.apply_filter(key)
return buffs.apply_filter(this.list, config.current_config.buff_UI.filter.endemic_life_buffs, key);
end
function this.update_ruby_and_gold_wirebugs(player, player_data)
local cached_config = config.current_config.buff_UI.filter.endemic_life_buffs;
if not cached_config.ruby_wirebug
and not cached_config.gold_wirebug then
if this.apply_filter("ruby_wirebug") then
return;
end
if this.apply_filter("gold_wirebug") then
return;
end
end
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");
this.list.ruby_wirebug = nil;
this.list.gold_wirebug = nil;
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];
this.update_endemic_life_buff(endemic_life_buff_key, nil, nil, player_data, wirebug_powerup_timer_field);
end
function this.update_butterflame(player_data)
if this.apply_filter("butterflame") then
return;
end
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");
this.list.butterflame = nil;
return;
end
if atk_up_buff_second ~= this.butterflame_attack_up then
this.list.butterflame = nil;
return;
end
this.update_endemic_life_buff("butterflame", nil, nil, player_data, atk_up_buff_second_timer_field);
end
function this.init_all_UI()
for endemic_life_key, endemic_life in pairs(this.list) do
buffs.init_UI(endemic_life);
end
end
function this.init_names()
for endemic_life_key, endemic_life in pairs(this.list) do
endemic_life.name = this.get_endemic_life_name(endemic_life_key);
end
end
function this.get_endemic_life_name(key)
if singletons.message_manager == nil then
error_handler.report("endemic_life_buffs.get_endemic_life_name", "Failed to access Data: message_manager");
return key;
end
local endemic_life_name = get_env_creature_name_message_method:call(singletons.message_manager, env_creature.creature_ids[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", key));
return 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");
time = require("MHR_Overlay.Game_Handler.time");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,340 @@
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,
demon_ammo = nil,
armor_ammo = nil
};
this.keys = {
"demondrug",
"mega_demondrug",
"armorskin",
"mega_armorskin",
"might_seed",
-- "adamant_seed",
"demon_powder",
"hardshell_powder",
-- "immunizer",
-- "dash_juice",
"gourmet_fish",
"demon_ammo",
"armor_ammo"
};
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
}
this.might_seed_attack_up = 10;
local item_buffs_type_name = "item_buffs";
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");
-- Might Seed
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");
-- 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");
-- 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 player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
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();
-- Demondrug/Mega Demondrug
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");
-- Armorskin/Mega Armorskin
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");
-- Might Seed
local might_seed_atk_up_field = player_user_data_item_parameter_type_def:get_field("_MightSeedAtkUp");
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, item_parameter)
this.update_demondrug(player_data, item_parameter);
this.update_armorskin(player_data, item_parameter);
this.update_might_seed(player_data, item_parameter);
this.update_item_buff("demon_powder", player_data, atk_up_item_second_field, player_data, atk_up_item_second_timer_field);
this.update_item_buff("hardshell_powder", player_data, def_up_item_second_field, player_data, def_up_item_second_timer_field);
this.update_item_buff("gourmet_fish", nil, nil, player_data, fish_regene_enable_field);
this.update_item_buff("demon_ammo", nil, nil, player_data, kijin_bullet_timer_field);
this.update_item_buff("armor_ammo", nil, nil, player_data, kouka_bullet_timer_field);
end
function this.update_item_buff(key, value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints)
return buffs.update_generic_buff(this.list, config.current_config.buff_UI.filter.item_buffs, this.get_item_buff_name,
item_buffs_type_name, key,
value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints)
end
function this.update_generic(key, level, timer)
return buffs.update_generic(this.list, this.get_item_buff_name, item_buffs_type_name, key, level, timer);
end
function this.apply_filter(key)
return buffs.apply_filter(this.list, config.current_config.buff_UI.filter.item_buffs, key);
end
function this.update_demondrug(player_data, item_parameter)
local cached_config = config.current_config.buff_UI.filter.item_buffs;
if not cached_config.demondrug and not cached_config.mega_demondrug then
this.list.demondrug = nil;
this.list.mega_demondrug = nil;
return;
end
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");
this.list.demondrug = nil;
this.list.mega_demondrug = nil;
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");
this.list.demondrug = nil;
this.list.mega_demondrug = nil;
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");
this.list.demondrug = nil;
this.list.mega_demondrug = nil;
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
if not cached_config[item_key] then
this.list[item_key] = nil;
return;
end
this.update_generic(item_key);
end
function this.update_armorskin(player_data, item_parameter)
local cached_config = config.current_config.buff_UI.filter.item_buffs;
if not cached_config.armorskin and not cached_config.mega_armorskin then
this.list.armorskin = nil;
this.list.mega_armorskin = nil;
return;
end
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");
this.list.armorskin = nil;
this.list.mega_armorskin = nil;
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");
this.list.armorskin = nil;
this.list.mega_armorskin = nil;
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");
this.list.armorskin = nil;
this.list.mega_armorskin = nil;
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
if not cached_config[item_key] then
this.list[item_key] = nil;
return;
end
this.update_generic(item_key);
end
function this.update_might_seed(player_data, item_parameter)
if this.apply_filter("might_seed") then
return;
end
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_might_seed", "Failed to access Data: atk_up_buff_second");
this.list.might_seed = nil;
return;
end
local might_seed_atk_up = might_seed_atk_up_field:get_data(item_parameter);
if might_seed_atk_up == nil then
error_handler.report("item_buffs.update_might_seed", "Failed to access Data: might_seed_atk_up");
this.list.might_seed = nil;
return;
end
if atk_up_buff_second ~= might_seed_atk_up then
this.list.might_seed = nil;
return;
end
this.update_item_buff("might_seed", nil, nil, player_data, atk_up_buff_second_timer_field);
end
function this.init_all_UI()
for item_buff_key, item_buff in pairs(this.list) do
buffs.init_UI(item_buff);
end
end
function this.init_names()
for item_buff_key, item_buff in pairs(this.list) do
item_buff.name = this.get_item_buff_name(item_buff_key);
end
end
function this.get_item_buff_name(key)
local item_buff_name = get_name_method:call(nil, item_ids[key]);
if item_buff_name == nil then
error_handler.report("item_buffs.get_item_buff_name", string.format("Failed to access Data: %s_name", key));
return key;
end
return item_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");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,258 @@
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;
--[[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.keys = {
"self_improvement",
"attack_up",
"defense_up",
"affinity_up",
"elemental_attack_boost",
"attack_and_defense_up",
"attack_and_affinity_up",
"knockbacks_negated",
"earplugs_s",
"earplugs_l",
"tremors_negated",
"wind_pressure_negated",
"stun_negated",
"blight_negated",
"divine_protection",
"health_recovery_s",
"health_recovery_l",
"health_recovery_s_antidote",
"health_regeneration",
"stamina_use_reduced",
"stamina_recovery_up",
"sharpness_loss_reduced",
"environment_damage_negated",
"sonic_wave",
"sonic_barrier",
"infernal_melody",
"sharpness_regeneration",
"sharpness_extension"
};
this.list = {};
local melody_effects_type_name = "melody_effects";
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);
if length == nil then
error_handler.report("melody_effects.update", "Failed to access Data: music_data_array -> length");
return;
end
length = length - 1;
for id = 0, length do
local lua_index = id + 1;
local melody_effect = this.list[lua_index];
local key = this.keys[lua_index];
if this.apply_filter(key, lua_index) then
goto continue;
end
local music_data = get_value_method:call(music_data_array, id);
if music_data == nil then
error_handler.report("melody_effects.update", "Failed to access Data: music_data No." .. tostring(id));
this.list[lua_index] = nil;
goto continue;
end
this.update_melody_effect(lua_index, id, key, melody_effect, music_data);
::continue::
end
end
function this.update_melody_effect(lua_index, id, key, melody_effect, melody_data)
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(id));
this.list[lua_index] = nil;
return;
end
if utils.number.is_equal(melody_timer, 0) then
this.list[lua_index] = nil;
return;
end
if melody_effect == nil then
local melody_effect_name = this.get_melody_effect_name(id);
melody_effect = buffs.new(melody_effects_type_name, key, 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.apply_filter(key, lua_index)
if config.current_config.buff_UI.filter.melody_effects[key] then
return false;
end
local buff = this.list[lua_index];
if buff == nil then
return true;
end
if not buff.is_visible then
return true;
end
if buff.is_infinite then
this.list[lua_index] = nil;
return true;
end
time.new_delay_timer(function()
local _buff = this.list[lua_index];
if _buff ~= nil and not _buff.is_visible then
this.list[lua_index] = nil;
end
end, buff.timer);
buff.is_visible = false;
return true;
end
function this.init_all_UI()
for melody_effect_id, melody_effect in pairs(this.list) do
buffs.init_UI(melody_effect);
end
end
function this.init_names()
for melody_effect_id, melody_effect in pairs(this.list) do
melody_effect.name = this.get_melody_effect_name(melody_effect_id - 1);
end
end
function this.get_melody_effect_name(id)
local melody_effect_name = get_name_method:call(nil, id);
if melody_effect_name == nil then
local name = string.format("Melody Effect No. %d", 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");
time = require("MHR_Overlay.Game_Handler.time");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,190 @@
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,
natural_healing_up = nil,
immunity = nil
};
this.keys = {
"attack_up",
"defense_up",
"stamina_use_down",
"natural_healing_up",
"immunity"
};
-- Attack Up
-- Might Seed +10 3min -- Separated
-- Dango Bulker + 15 30sec
-- Chameleos Soul +15 30sec
-- Butterflame +25 1min -- Separated
-- Defense Up
-- Adamant Seed +20 3min
-- Chameleos Souls +20 30sec
-- Stamina Use Down
-- Dash Juice 3min
-- Peepersects 1.5min
-- Chameleos Soul 30sec
-- Natural Healing Up
-- Immunizer 5min
-- Vase of Vitality 20sec
local misc_buffs_type_name = "misc_buffs";
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");
-- Immunizer
local vitalizer_timer_field = player_data_type_def:get_field("_VitalizerTimer");
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
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();
-- Might Seed
local might_seed_atk_up_field = player_user_data_item_parameter_type_def:get_field("_MightSeedAtkUp");
function this.update(player, player_data, item_parameter)
this.update_attack_up(player_data, item_parameter);
--this.update_misc_buff("attack_up", player_data, atk_up_buff_second_field, player_data, atk_up_buff_second_timer_field);
this.update_misc_buff("defense_up", player_data, def_up_buff_second_field, player_data, def_up_buff_second_timer_field);
this.update_misc_buff("stamina_use_down", nil, nil, player_data, stamina_up_buff_second_timer_field);
this.update_misc_buff("natural_healing_up", nil, nil, player_data, vitalizer_timer_field);
this.update_misc_buff("immunity", nil, nil, player_data, debuff_prevention_timer_field);
end
function this.update_misc_buff(key, value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints)
return buffs.update_generic_buff(this.list, config.current_config.buff_UI.filter.misc_buffs, this.get_misc_buff_name,
misc_buffs_type_name, key,
value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints);
end
function this.apply_filter(key)
return buffs.apply_filter(this.list, config.current_config.buff_UI.filter.misc_buffs, key);
end
function this.update_attack_up(player_data, item_parameter)
if this.apply_filter("attack_up") then
return;
end
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_attack_up", "Failed to access Data: atk_up_buff_second");
this.list.attack_up = nil;
return;
end
local might_seed_atk_up = might_seed_atk_up_field:get_data(item_parameter);
if might_seed_atk_up == nil then
error_handler.report("item_buffs.update_might_seed", "Failed to access Data: might_seed_atk_up");
this.list.attack_up = nil;
return;
end
if atk_up_buff_second == might_seed_atk_up or atk_up_buff_second == endemic_life_buffs.butterflame_attack_up then
this.list.attack_up = nil;
return;
end
this.update_misc_buff("attack_up", nil, nil, player_data, atk_up_buff_second_timer_field);
end
function this.init_all_UI()
for misc_buff_key, misc_buff in pairs(this.list) do
buffs.init_UI(misc_buff);
end
end
function this.init_names()
for misc_buff_key, misc_buff in pairs(this.list) do
misc_buff.name = this.get_misc_buff_name(misc_buff_key);
end
end
function this.get_misc_buff_name(key)
local misc_buff_name = language.current_language.misc_buffs[key];
if misc_buff_name == nil then
return 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,162 @@
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 = {
go_fight_win = nil,
power_drum = nil,
rousing_roar = nil
};
this.keys = {
"go_fight_win",
"power_drum",
"rousing_roar"
};
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_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)
this.update_otomo_move("rousing_roar", nil, nil, player_data, beast_roar_otomo_timer_field);
this.update_otomo_move("go_fight_win", nil, nil, player_data, runhigh_otomo_timer_field);
this.update_otomo_move("power_drum", nil, nil, player_data, kijin_otomo_timer_field);
end
function this.update_otomo_move(key, value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints)
return buffs.update_generic_buff(this.list, config.current_config.buff_UI.filter.otomo_moves, this.get_otomo_move_name,
otomo_moves_type_name, key,
value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints)
end
function this.apply_filter(key)
return buffs.apply_filter(this.list, config.current_config.buff_UI.filter.otomo_moves, key);
end
function this.init_all_UI()
for otomo_move_key, otomo_move in pairs(this.list) do
buffs.init_UI(otomo_move);
end
end
function this.init_names()
for otomo_move_key, otomo_move in pairs(this.list) do
otomo_move.name = this.get_otomo_move_name(otomo_move_key);
end
end
function this.get_otomo_move_name(key)
local otomo_move_name = get_name_method:call(nil, otomo_moves_ids[key]);
if otomo_move_name == nil then
error_handler.report("otomo_moves.get_otomo_move_name", string.format("Failed to access Data: %s_name", key));
return 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,134 @@
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 = {
chameleos_soul = nil,
kushala_daora_soul = nil,
};
this.keys = {
"chameleos_soul",
"kushala_daora_soul",
};
local rampage_skill_ids = {
chameleos_soul = 250,
kushala_daora_soul = 251,
};
local rampage_skills_type_name = "rampage_skills";
local kushara_daora_soul_breakpoint = 5;
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)
this.update_rampage_skill("kushala_daora_soul", player_data, hyakuryu_dragon_power_up_count_field,
player_data, hyakuryu_dragon_power_up_timer_field, false, nil, {kushara_daora_soul_breakpoint});
this.update_rampage_skill("chameleos_soul", nil, nil, player_data, hyakuryu_onazuti_power_up_interval_field);
end
function this.update_rampage_skill(key, value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints)
return buffs.update_generic_buff(this.list, config.current_config.buff_UI.filter.rampage_skills, this.get_rampage_skill_name,
rampage_skills_type_name, key,
value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints)
end
function this.apply_filter(key)
return buffs.apply_filter(this.list, config.current_config.buff_UI.filter.rampage_skills, key);
end
function this.init_all_UI()
for rampage_skill_key, rampage_skill in pairs(this.list) do
buffs.init_UI(rampage_skill);
end
end
function this.init_names()
for rampage_skill_key, rampage_skill in pairs(this.list) do
rampage_skill.name = this.get_rampage_skill_name(rampage_skill_key);
end
end
function this.get_rampage_skill_name(key)
local rampage_skill_name = get_name_method:call(nil, rampage_skill_ids[key]);
if rampage_skill_name == nil then
error_handler.report("rampage_skills.get_rampage_skill_name", string.format("Failed to access Data: %s_name", key));
return 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,902 @@
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 = {
adrenaline_rush = nil,
affinity_sliding = nil,
agitator = nil,
berserk = nil,
bladescale_hone = nil,
blood_awakening = nil,
bloodlust = nil,
burst = nil,
coalescence = nil,
counterstrike = nil,
dereliction = nil,
dragon_conversion_elemental_attack_up = nil,
dragon_conversion_elemental_res_up = nil,
dragonheart = nil,
embolden = nil,
frenzied_bloodlust = nil,
furious = nil,
grinder_s = nil,
heaven_sent = nil,
hellfire_cloak = nil,
heroics = nil,
inspiration = nil,
intrepid_heart = nil,
latent_power = nil,
maximum_might = nil,
offensive_guard = nil,
partbreaker = nil,
peak_performance = nil,
powder_mantle_red = nil,
powder_mantle_blue = nil,
protective_polish = nil,
resentment = nil,
resuscitate = nil,
spiribirds_call = nil,
status_trigger = nil,
strife = nil,
wall_runner = nil,
wind_mantle = nil,
};
this.keys = {
"adrenaline_rush",
"affinity_sliding",
"agitator",
"berserk",
"bladescale_hone",
"blood_awakening",
"bloodlust",
"burst",
"coalescence",
"counterstrike",
"dereliction",
"dragon_conversion_elemental_attack_up",
"dragon_conversion_elemental_res_up",
"dragonheart",
"embolden",
"frenzied_bloodlust",
"furious",
"grinder_s",
"heaven_sent",
"hellfire_cloak",
"heroics",
"inspiration",
"intrepid_heart",
"latent_power",
"maximum_might",
"offensive_guard",
"partbreaker",
"peak_performance",
"powder_mantle_red",
"powder_mantle_blue",
"protective_polish",
"resentment",
"resuscitate",
"spiribirds_call",
"status_trigger",
"strife",
"wall_runner",
"wind_mantle"
};
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 }, -- implemented
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 },
}
this.is_heroics_active = false;
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_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 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 = sdk.find_type_definition("snow.player.PlayerSkillList");
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 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)
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_heroics();
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_skill("dereliction", player_data, symbiosis_skill_lost_vital_field, nil, nil, true, nil, dereliction_breakpoints);
this.update_skill("burst", player_data, rengeki_power_up_count_field, player_data, rengeki_power_up_timer_field, false, nil, burst_breakpoints);
this.update_skill("intrepid_heart", player_data, equip_skill_223_accumulator_field, nil, nil, true, intrepid_heart_minimal_value);
this.update_skill("latent_power", nil, nil, player, power_freedom_timer_field);
this.update_skill("protective_polish", nil, nil, player, sharpness_gauge_boost_timer_field);
this.update_skill("grinder_s", nil, nil, player_data, brand_new_sharpness_adjust_up_timer_field);
this.update_skill("counterstrike", nil, nil, player_data, counterattack_powerup_timer_field);
this.update_skill("affinity_sliding", nil, nil, player_data, sliding_powerup_timer_field);
this.update_skill("coalescence", nil, nil, player_data, disaster_turn_powerup_timer_field);
this.update_skill("adrenaline_rush", nil, nil, player_data, equip_skill_208_atk_up_field);
this.update_skill("wall_runner", nil, nil, player_data, wall_run_powerup_timer_field);
this.update_skill("offensive_guard", nil, nil, player_data, equip_skill_036_timer_field);
this.update_skill("hellfire_cloak", nil, nil, player_data, onibi_powerup_timer_field);
this.update_skill("agitator", nil, nil, player_data, challenge_timer_field, nil, nil, true);
this.update_skill("furious", nil, nil, player_data, furious_skill_stamina_buff_second_timer_field);
this.update_skill("status_trigger", nil, nil, player_data, equip_skill_222_timer_field);
this.update_skill("inspiration", nil, nil, player_data, equip_skill_235_atk_up_second_timer_field);
this.update_skill("heaven_sent", player, is_active_equip_skill_230_method);
this.update_skill("resuscitate", player, is_debuff_state_method);
this.update_skill("embolden", player, get_active_equip_209_method);
this.update_skill("berserk", player, get_is_enable_equip_skill_225_method);
this.update_skill("dragon_conversion_elemental_attack_up", player, equip_skill_229_sum_resist_field);
this.update_skill("dragon_conversion_elemental_res_up", player, equip_skill_229_use_up_flag_field);
this.update_skill("partbreaker", nil, nil, nil, nil, true);
this.update_skill("strife", player, get_affinity_equip_skill_233_method, nil, nil, nil, nil, strife_breakpoints[skill_data_list.strife.level]);
end
function this.update_skill(key, value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints)
local skill_data = skill_data_list[key];
if skill_data ~= nil and skill_data.is_equipped ~= nil and not skill_data.is_equipped then
this.list[key] = nil;
return nil;
end
return buffs.update_generic_buff(this.list, config.current_config.buff_UI.filter.skills, this.get_skill_name,
skills_type_name, key,
value_owner, value_holder, timer_owner, timer_holder, is_infinite, minimal_value, level_breakpoints);
end
function this.update_generic(key, level, timer)
return buffs.update_generic(this.list, this.get_skill_name, skills_type_name, key, level, timer);
end
function this.apply_filter(key)
return buffs.apply_filter(this.list, config.current_config.buff_UI.filter.skills, key);
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("this.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)
if this.apply_filter("wind_mantle") then
return;
end
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");
this.list.wind_mantle = nil;
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");
this.list.wind_mantle = nil;
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");
this.list.wind_mantle = nil;
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
this.update_generic("wind_mantle", level, wind_mantle_duration - (wind_mantle_timer / 60));
end
function this.update_maximum_might(player_data)
if not config.current_config.buff_UI.filter.skills.maximum_might then
this.list.maximum_might = nil;
maximum_might_previous_timer_value = 0;
return;
end
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");
this.list.maximum_might = nil;
return;
end
if player_info.list.max_stamina == -1 then
this.list.maximum_might = nil;
return;
end
local maximum_might = this.list.maximum_might;
if player_info.list.stamina ~= player_info.list.max_stamina then
if whole_body_timer < maximum_might_previous_timer_value then
this.list.maximum_might = nil;
end
elseif maximum_might == 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 utils.number.is_equal(whole_body_timer, 0) 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;
if maximum_might ~= nil then
maximum_might.is_visible = true;
end
end
function this.update_bloodlust()
if not config.current_config.buff_UI.filter.skills.bloodlust then
this.list.bloodlust = nil;
return;
end
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
local bloodlust = this.list.bloodlust;
if bloodlust == nil then
local bloodlust_name = this.get_skill_name("bloodlust");
if bloodlust_name == nil then
error_handler.report("skills.update_bloodlust", "Failed to access Data: bloodlust_name");
this.list.bloodlust = nil;
return;
end
this.list.bloodlust = buffs.new(skills_type_name, "bloodlust", bloodlust_name);
end
this.list.bloodlust.is_visible = true;
end
function this.update_frenzied_bloodlust(player, player_data)
if this.apply_filter("frenzied_bloodlust") then
return;
end
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");
this.list.frenzied_bloodlust = nil;
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");
this.list.frenzied_bloodlust = nil;
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");
this.list.frenzied_bloodlust = nil;
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 = this.update_generic("frenzied_bloodlust", 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 config.current_config.buff_UI.filter.skills.peak_performance then
this.list.peak_performance = nil;
return;
end
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
this.update_generic("peak_performance");
end
function this.update_heroics()
if this.apply_filter("heroics") then
return;
end
if not this.is_heroics_active then
this.list.heroics = nil;
return;
end
this.update_generic("heroics");
end
function this.update_dragonheart()
if not config.current_config.buff_UI.filter.skills.dragonheart then
this.list.dragonheart = nil;
return;
end
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
this.update_generic("dragonheart");
end
function this.update_resentment(player_data)
if not config.current_config.buff_UI.filter.skills.resentment then
this.list.resentment = nil;
return;
end
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");
this.list.resentment = nil;
return;
end
if player_info.list.health >= r_vital then
this.list.resentment = nil;
return;
end
this.update_generic("resentment");
end
function this.update_bladescale_hone(player, weapon_type)
if weapon_type ~= 13 then -- 13 = Bow
this.list.bladescale_hone = nil;
return;
end
if this.apply_filter("bladescale_hone") then
return;
end
this.update_skill("bladescale_hone", nil, nil, player, _equip_skill_216_bottle_up_timer_field);
end
function this.update_spiribirds_call(player_data)
if this.apply_filter("spiribirds_call") then
return;
end
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");
this.list.spiribirds_call = nil;
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);
this.update_generic("spiribirds_call", 1, timer);
end
function this.update_powder_mantle(player_data)
if not this.apply_filter("powder_mantle_blue") then
this.update_skill("powder_mantle_blue", player_data, equip_skill_227_state_field, player_data, equip_skill_227_state_timer_field, nil, 2);
end
if this.list.powder_mantle_blue ~= nil then
this.list.powder_mantle_red = nil;
return;
end
if this.apply_filter("powder_mantle_red") then
return;
end
this.update_skill("powder_mantle_red", player_data, equip_skill_227_state_field, player_data, equip_skill_227_state_timer_field);
end
function this.update_blood_awakening(player, player_data)
this.update_skill("blood_awakening", player, get_equip_skill_232_lv_method, player_data, equip_skill_232_timer_field, nil, nil, blood_awakening_breakpoints);
end
function this.init_all_UI()
for skill_key, skill in pairs(this.list) do
buffs.init_UI(skill);
end
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(key)
local skill_data = skill_data_list[key];
if skill_data == nil then
local skill_name = language.current_language.skills[key];
if skill_name == nil then
return key;
end
return skill_name;
end
local skill_name = get_name_method:call(nil, skill_data_list[key].id);
if skill_name == nil then
error_handler.report("skills.get_skill_name", string.format("Failed to access Data: %s_name", key));
return 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

@@ -1,10 +1,48 @@
local damage_hook = {};
local this = {};
local quest_status;
local player;
local players;
local small_monster;
local large_monster;
local ailments;
local table_helpers;
local singletons;
local non_players;
local utils;
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 wall_hit_damage_queue = {};
local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase");
local enemy_character_base_after_calc_damage_damage_side_method = enemy_character_base_type_def:get_method("afterCalcDamage_DamageSide");
@@ -12,6 +50,9 @@ local enemy_character_base_after_calc_damage_damage_side_method = enemy_characte
local is_boss_enemy_method = enemy_character_base_type_def:get_method("get_isBossEnemy");
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 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 get_attacker_id_method = enemy_calc_damage_info_type_def:get_method("get_AttackerID");
local get_damage_attacker_type_method = enemy_calc_damage_info_type_def:get_method("get_DamageAttackerType");
@@ -21,6 +62,8 @@ local get_total_damage_method = enemy_calc_damage_info_type_def:get_method("get_
local get_physical_damage_method = enemy_calc_damage_info_type_def:get_method("get_PhysicalDamage");
local get_elemental_damage_method = enemy_calc_damage_info_type_def:get_method("get_ElementDamage");
local stun_damage_field = enemy_calc_damage_info_type_def:get_field("<StunDamage>k__BackingField");
local get_condition_damage_method = enemy_calc_damage_info_type_def:get_method("get_ConditionDamage");
local get_condition_type_method = enemy_calc_damage_info_type_def:get_method("get_ConditionDamageType");
local get_condition_damage2_method = enemy_calc_damage_info_type_def:get_method("get_ConditionDamage2");
@@ -28,51 +71,49 @@ 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_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 not_host_cart_method = quest_manager_type_def:get_method("netRecvForfeit");
local host_cart_method = quest_manager_type_def:get_method("netSendForfeit");
local offline_cart_method = quest_manager_type_def:get_method("notifyDeath");
local quest_forfeit_method = quest_manager_type_def:get_method("questForfeit");
local packet_quest_forfeit_type_def = sdk.find_type_definition("snow.QuestManager.PacketQuestForfeit");
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");
function damage_hook.get_damage_source_type(damage_source_type_id, is_marionette_attack)
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)
if is_marionette_attack then
return "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
return "player";
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
return players.damage_types.player;
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
return "kunai";
return players.damage_types.kunai;
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
return "otomo";
return players.damage_types.otomo;
elseif damage_source_type_id >= 25 and damage_source_type_id <= 32 then
return "endemic life";
elseif damage_source_type_id == 34 then
return "other";
return players.damage_types.endemic_life;
end
return tostring(damage_source_type_id);
return players.damage_types.other;
end
-- snow.hit.EnemyCalcDamageInfo.AfterCalcInfo_DamageSide
function damage_hook.update_damage(enemy, enemy_calc_damage_info)
function this.update_damage(enemy, enemy_calc_damage_info)
local is_large_monster = is_boss_enemy_method:call(enemy);
if is_large_monster == nil then
error_handler.report("damage_hook.update_damage", "Failed to access Data: is_large_monster");
return;
end
local dead_or_captured = check_die_method:call(enemy);
if dead_or_captured == nil then
error_handler.report("damage_hook.update_damage", "Failed to access Data: dead_or_captured");
return;
end
@@ -81,20 +122,18 @@ function damage_hook.update_damage(enemy, enemy_calc_damage_info)
end
local attacker_id = get_attacker_id_method:call(enemy_calc_damage_info);
local otomo_id = attacker_id;
local attacker_type = get_damage_attacker_type_method:call(enemy_calc_damage_info);
local is_marionette_attack = is_marionette_attack_method:call(enemy_calc_damage_info)
-- 4 is virtual player in singleplayer that "owns" 2nd otomo
if not quest_status.is_online and attacker_id == 4 then
attacker_id = player.myself.id;
end
local is_otomo_attack = attacker_type >= 21 and attacker_type <= 23;
if is_marionette_attack then
large_monster.update_all_riders();
for enemy, monster in pairs(large_monster.list) do
if monster.unique_id == attacker_id then
attacker_id = monster.rider_id;
break
break;
end
end
end
@@ -150,22 +189,7 @@ function damage_hook.update_damage(enemy, enemy_calc_damage_info)
-- 31 - EcSwampLeech
-- 32 - EcPenetrateFish
--xy = "\nPlayer: " .. tostring(attacker_id) ..
--" Damage: " .. tostring(damage_object.total_damage) ..
--" Type: (" .. tostring(attacker_type) ..
--") " ..
--" Condition Damage: " .. tostring(condition_damage) ..
--" Condition Type: (" .. tostring(attacker_type) ..
--") " .. tostring(condition_type);
--if string.len(xy) > 2300 then
-- xy = "";
--end
local damage_source_type = damage_hook.get_damage_source_type(attacker_type,
is_marionette_attack);
local attacking_player = player.get_player(attacker_id);
local damage_source_type = this.get_damage_source_type(attacker_type, is_marionette_attack);
local monster;
if is_large_monster then
@@ -174,100 +198,201 @@ function damage_hook.update_damage(enemy, enemy_calc_damage_info)
monster = small_monster.get_monster(enemy);
end
local stun_damage = enemy_calc_damage_info:get_field("<StunDamage>k__BackingField");
if stun_damage ~= 0 and stun_damage ~= nil then
ailments.apply_ailment_buildup(monster, attacker_id, ailments.stun_id, stun_damage);
local player = nil;
local otomo = nil;
if not is_otomo_attack then
player = players.get_player(attacker_id);
if player == nil then
player = non_players.get_servant(attacker_id);
end
else
if attacker_id < 4 then
player = players.get_player(attacker_id);
otomo = non_players.get_otomo(attacker_id);
elseif attacker_id == 4 then
player = players.myself;
otomo = non_players.get_otomo(non_players.my_second_otomo_id);
else
player = non_players.get_servant(attacker_id - 1);
otomo = non_players.get_otomo(attacker_id - 1);
end
players.update_damage(otomo, damage_source_type, is_large_monster, damage_object);
end
ailments.apply_ailment_buildup(monster, attacker_id, condition_type, condition_damage);
ailments.apply_ailment_buildup(monster, attacker_id, condition_type2, condition_damage2);
ailments.apply_ailment_buildup(monster, attacker_id, condition_type3, condition_damage3);
local stun_damage = stun_damage_field:get_data(enemy_calc_damage_info);
ailments.apply_ailment_buildup(monster, player, otomo, ailments.stun_id, stun_damage);
player.update_damage(player.total, damage_source_type, is_large_monster, damage_object);
player.update_damage(attacking_player, damage_source_type, is_large_monster, damage_object);
ailments.apply_ailment_buildup(monster, player, otomo, condition_type, condition_damage);
ailments.apply_ailment_buildup(monster, player, otomo, condition_type2, condition_damage2);
ailments.apply_ailment_buildup(monster, player, otomo, condition_type3, condition_damage3);
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);
end
--function damage_hook.on_mystery_core_break(enemy)
function this.cart(dead_player_id, flag_cat_skill_insurance)
-- flag_cat_skill_insurance = 0
-- flag_cat_skill_insurance = 1
--end
quest_status.update_cart_count();
end
-- Coavins code
function damage_hook.cart(type, args)
if not quest_status.is_online then --We reach here with notifyDeath when player is offline
player.myself.cart_count = player.myself.cart_count + 1;
function this.on_stock_direct_marionette_finish_shoot_hit_parts_damage(enemy, damage_rate, is_endure, is_ignore_multi_rate, category, no)
local monster = large_monster.get_monster(enemy);
local damage = utils.math.round(monster.max_health * damage_rate);
large_monster.update_all_riders();
local attacker_id = monster.rider_id;
table.insert(wall_hit_damage_queue,
{
damage = damage,
is_large = monster.is_large
}
);
if attacker_id == -1 then
return;
end
if player.myself.id == 0 then -- If player is host, netSendForfeit is always correct
if type == "host" then
local player_id = sdk.to_int64(args[3]);
player.list[player_id].cart_count = player.list[player_id].cart_count + 1;
end
else
if type == "not host" then
local packet_quest_forfeit = sdk.to_managed_object(args[3]);
local player_id = dead_player_id_field:get_data(packet_quest_forfeit);
local is_from_host = is_from_host_field:get_data(packet_quest_forfeit)
local player = players.get_player(attacker_id);
if player == nil then
player = non_players.get_servant(attacker_id);
end
if is_from_host then -- Data is sent twice, 1 from host and 1 from dead player. Check if from host to only add 1
player.list[player_id].cart_count = player.list[player_id].cart_count + 1;
if player == nil then
error_handler.report("damage_hook.on_stock_direct_marionette_finish_shoot_hit_parts_damage", "Failed to create Player Entry");
return;
end
local damage_source_type = this.get_damage_source_type(0, true);
local is_large_monster = monster.is_large;
local large_monster_damage_object = {};
large_monster_damage_object.total_damage = 0;
large_monster_damage_object.physical_damage = 0;
large_monster_damage_object.elemental_damage = 0;
large_monster_damage_object.ailment_damage = 0;
local small_monster_damage_object = {};
small_monster_damage_object.total_damage = 0;
small_monster_damage_object.physical_damage = 0;
small_monster_damage_object.elemental_damage = 0;
small_monster_damage_object.ailment_damage = 0;
for _, damage_info in ipairs(wall_hit_damage_queue) do
if damage_info.is_large then
large_monster_damage_object.total_damage = large_monster_damage_object.total_damage + damage_info.damage;
large_monster_damage_object.physical_damage = large_monster_damage_object.physical_damage + damage_info.damage;
else
small_monster_damage_object.total_damage = small_monster_damage_object.total_damage + damage_info.damage;
small_monster_damage_object.physical_damage = small_monster_damage_object.physical_damage + damage_info.damage;
end
end
wall_hit_damage_queue = {};
players.update_damage(players.total, damage_source_type, false, small_monster_damage_object);
players.update_damage(player, damage_source_type, false, small_monster_damage_object);
players.update_damage(players.total, damage_source_type, true, large_monster_damage_object);
players.update_damage(player, damage_source_type, true, large_monster_damage_object);
end
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 damage_hook.on_get_finish_shoot_wall_hit_damage_rate(enemy, rate, is_part_damage)
--xy = string.format("enemy: %s\nrate: %s\nis_part_damage: %s", tostring(enemy), tostring(rate), tostring(is_part_damage));
--end
local get_finish_shoot_wall_hit_damage_rate_method = enemy_character_base_type_def:get_method("stockFinishShootHitDamage");
function damage_hook.init_module()
function this.init_dependencies()
quest_status = require("MHR_Overlay.Game_Handler.quest_status");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
ailments = require("MHR_Overlay.Monsters.ailments");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
--sdk.hook(get_finish_shoot_wall_hit_damage_rate_method, function(args)
-- pcall(damage_hook.on_get_finish_shoot_wall_hit_damage_rate, sdk.to_managed_object(args[2]), sdk.to_float(args[3]), sdk.to_int64(args--[4]));
--end, function(retval)
-- return retval;
--end);
sdk.hook(enemy_character_base_after_calc_damage_damage_side_method, function(args)
pcall(damage_hook.update_damage, sdk.to_managed_object(args[2]), sdk.to_managed_object(args[3]));
end, function(retval)
return retval;
end);
sdk.hook(not_host_cart_method, function(args)
pcall(damage_hook.cart, "not host", args);
end, function(retval)
return retval;
end);
sdk.hook(host_cart_method, function(args)
pcall(damage_hook.cart, "host", args);
end, function(retval)
return retval;
end);
sdk.hook(offline_cart_method, function(args)
pcall(damage_hook.cart, "offline", args);
end, function(retval)
return retval;
end);
--sdk.hook(stock_mystery_core_break_damage_type_def, function(args)
-- pcall(damage_hook.on_mystery_core_break, sdk.to_managed_object(args[2]));
--end, function(retval)
-- return retval;
--end);
singletons = require("MHR_Overlay.Game_Handler.singletons");
non_players = require("MHR_Overlay.Damage_Meter.non_players");
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return damage_hook;
function this.init_module()
sdk.hook(stock_direct_marionette_finish_shoot_hit_parts_damage_method, function(args)
local enemy = sdk.to_managed_object(args[2]);
local damage_rate = sdk.to_float(args[3]);
local is_endure = (sdk.to_int64(args[4]) & 1) == 1;
local is_ignore_multi_rate = (sdk.to_int64(args[5]) & 1) == 1;
local category = sdk.to_int64(args[6]); --snow.enemy.EnemyDef.VitalCategory
local no = sdk.to_int64(args[7]);
this.on_stock_direct_marionette_finish_shoot_hit_parts_damage(enemy, damage_rate, is_endure, is_ignore_multi_rate, category, no);
end, function(retval)
return retval;
end);
sdk.hook(enemy_character_base_after_calc_damage_damage_side_method, function(args)
pcall(this.update_damage, sdk.to_managed_object(args[2]), sdk.to_managed_object(args[3]));
end, function(retval)
return retval;
end);
sdk.hook(quest_forfeit_method, function(args)
pcall(this.cart, sdk.to_int64(args[3]), (sdk.to_int64(args[4]) & 0xFFFFFFFF));
end, function(retval)
return retval;
end);
sdk.hook(on_break_method, function(args)
-- break core group is same as hit group?
-- break core group is part id which exploded
local anomaly_core_part = sdk.to_managed_object(args[2]);
this.on_anomaly_core_break(anomaly_core_part);
end, function(retval)
return retval;
end);
end
return this;

View File

@@ -0,0 +1,404 @@
local this = {};
local config;
local singletons;
local customization_menu;
local damage_UI_entity;
local time;
local quest_status;
local drawing;
local language;
local players;
local error_handler;
local utils;
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.servant_list = {};
this.otomo_list = {};
this.my_second_otomo_id = -1;
function this.new(id, name, level, type)
local non_player = {};
non_player.id = id;
non_player.name = name;
non_player.level = level;
non_player.type = type;
non_player.join_time = utils.constants.uninitialized_int;
non_player.first_hit_time = utils.constants.uninitialized_int;
non_player.dps = 0;
non_player.small_monsters = players.init_damage_sources()
non_player.large_monsters = players.init_damage_sources();
non_player.display = {};
non_player.display.total_damage = 0;
non_player.display.physical_damage = 0;
non_player.display.elemental_damage = 0;
non_player.display.ailment_damage = 0;
this.init_UI(non_player);
return non_player;
end
function this.get_servant(servant_id)
return this.servant_list[servant_id];
end
function this.get_otomo(otomo_id)
return this.otomo_list[otomo_id];
end
function this.init()
this.servant_list = {};
this.otomo_list = {};
end
local servant_manager_type_def = sdk.find_type_definition("snow.ai.ServantManager");
local get_quest_servant_id_list_method = servant_manager_type_def:get_method("getQuestServantIdList");
local get_ai_control_by_servant_id_method = servant_manager_type_def:get_method("getAIControlByServantID");
local servant_list_type_def = get_quest_servant_id_list_method:get_return_type();
local servant_get_count_method = servant_list_type_def:get_method("get_Count");
local servant_get_item_method = servant_list_type_def:get_method("get_Item");
local ai_control_type_def = get_ai_control_by_servant_id_method:get_return_type();
local get_servant_info_method = ai_control_type_def:get_method("get_ServantInfo");
local servant_info_type_def = get_servant_info_method:get_return_type();
local get_servant_name_method = servant_info_type_def:get_method("get_ServantName");
local get_servant_player_index_method = servant_info_type_def:get_method("get_ServantPlayerIndex");
local lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager");
local quest_otomo_info_field = lobby_manager_type_def:get_field("_questOtomoInfo");
local otomo_info_field = lobby_manager_type_def:get_field("_OtomoInfo");
local otomo_manager_type_def = sdk.find_type_definition("snow.otomo.OtomoManager");
local get_master_otomo_info_method = otomo_manager_type_def:get_method("getMasterOtomoInfo");
local otomo_create_data_type_def = get_master_otomo_info_method:get_return_type();
local otomo_create_data_name_field = otomo_create_data_type_def:get_field("Name");
local otomo_create_data_level_field = otomo_create_data_type_def:get_field("Level");
local get_servant_otomo_list_method = otomo_manager_type_def:get_method("getServantOtomoList");
local otomo_list_type_def = get_servant_otomo_list_method:get_return_type();
local otomo_get_count_method = otomo_list_type_def:get_method("get_Count");
local otomo_get_item_method = otomo_list_type_def:get_method("get_Item");
local otomo_info_list_type_def = quest_otomo_info_field:get_type();
local otomo_info_get_count_method = otomo_info_list_type_def:get_method("get_Count");
local otomo_info_get_item_method = otomo_info_list_type_def:get_method("get_Item");
local otomo_info_type_def = otomo_info_get_item_method:get_return_type();
local otomo_info_name_field = otomo_info_type_def:get_field("_Name");
local otomo_info_level_field = otomo_info_type_def:get_field("_Level");
local otomo_info_order_field = otomo_info_type_def:get_field("_Order");
function this.update_servant_list()
local cached_config = config.current_config.damage_meter_UI;
if singletons.servant_manager == nil then
error_handler.report("non_players.update_servant_list", "Failed to access Data: servant_manager");
return;
end
local quest_servant_id_list = get_quest_servant_id_list_method:call(singletons.servant_manager);
if quest_servant_id_list == nil then
error_handler.report("non_players.update_servant_list", "Failed to access Data: quest_servant_id_list");
return;
end
local servant_count = servant_get_count_method:call(quest_servant_id_list);
if servant_count == nil then
error_handler.report("non_players.update_servant_list", "Failed to access Data: servant_count");
return;
end
for i = 0, servant_count - 1 do
local servant_id = servant_get_item_method:call(quest_servant_id_list, i);
if servant_id == nil then
error_handler.report("non_players.update_servant_list", "Failed to access Data: servant_id No." .. tostring(i));
goto continue;
end
local ai_control = get_ai_control_by_servant_id_method:call(singletons.servant_manager, servant_id);
if ai_control == nil then
error_handler.report("non_players.update_servant_list", "Failed to access Data: ai_control No." .. tostring(i));
goto continue;
end
local servant_info = get_servant_info_method:call(ai_control);
if servant_info == nil then
error_handler.report("non_players.update_servant_list", "Failed to access Data: servant_info No." .. tostring(i));
goto continue;
end
local name = get_servant_name_method:call(servant_info);
if name == nil then
goto continue;
end
local id = get_servant_player_index_method:call(servant_info);
if id == nil then
goto continue;
end
if this.servant_list[id] == nil then
this.servant_list[id] = this.new(id, name, 0, players.types.servant);
end
::continue::
end
end
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_on_quest then
--non_players.update_my_otomos();
this.update_otomos(quest_otomo_info_field);
else
this.update_otomos(otomo_info_field);
end
else
if is_on_quest then
this.update_my_otomos();
this.update_servant_otomos();
else
this.update_my_otomos();
end
end
end
function this.update_my_otomos()
local cached_config = config.current_config.damage_meter_UI;
local first_otomo = get_master_otomo_info_method:call(singletons.otomo_manager, 0);
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);
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
local level = otomo_create_data_level_field:get_data(first_otomo) or 0;
local myself_id = players.myself.id;
local otomo = this.otomo_list[myself_id];
if otomo == nil or name ~= otomo.name then
otomo = this.new(0, name, level, players.types.my_otomo);
this.otomo_list[myself_id] = otomo;
end
end
end
local second_otomo = get_master_otomo_info_method:call(singletons.otomo_manager, 1);
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);
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;
-- the secondary otomo is actually the 4th one!
local otomo = this.otomo_list[this.my_second_otomo_id];
if otomo == nil or name ~= otomo.name then
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
function this.update_servant_otomos()
local cached_config = config.current_config.damage_meter_UI;
local servant_otomo_list = get_servant_otomo_list_method:call(singletons.otomo_manager);
if servant_otomo_list == nil then
error_handler.report("non_players.update_servant_otomos", "Failed to access Data: servant_otomo_list");
return;
end
local count = otomo_get_count_method:call(servant_otomo_list);
if count == nil then
error_handler.report("non_players.update_servant_otomos", "Failed to access Data: servant_otomo_list -> count");
return;
end
for i = 0, count - 1 do
local servant_otomo = otomo_get_item_method:call(servant_otomo_list, i);
if servant_otomo == nil then
error_handler.report("non_players.update_servant_otomos", "Failed to access Data: servant_otomo No. " .. tostring(i));
goto continue;
end
local otomo_create_data = servant_otomo:call("get_OtCreateData");
if otomo_create_data ~= nil then
local name = otomo_create_data_name_field:get_data(otomo_create_data);
local level = otomo_create_data_level_field:get_data(otomo_create_data) or 0;
local member_id = otomo_create_data:get_field("MemberID");
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;
end
local otomo = this.otomo_list[member_id];
if otomo == nil then
otomo = this.new(member_id, name, level, players.types.servant_otomo);
this.otomo_list[member_id] = otomo;
end
end
::continue::
end
end
function this.update_otomos(otomo_info_field_)
local cached_config = config.current_config.damage_meter_UI;
if singletons.lobby_manager == nil then
error_handler.report("non_players.update_otomos", "Failed to access Data: lobby_manager");
return;
end
-- other players
local otomo_info_list = otomo_info_field_:get_data(singletons.lobby_manager);
if otomo_info_list == nil then
error_handler.report("non_players.update_otomos", "Failed to access Data: otomo_info_list");
return;
end
local count = otomo_info_get_count_method:call(otomo_info_list);
if count == nil then
error_handler.report("non_players.update_otomos", "Failed to access Data: otomo_info_list -> count");
return;
end
for id = 0, count - 1 do
local otomo_info = otomo_info_get_item_method:call(otomo_info_list, id);
if otomo_info == nil then
error_handler.report("non_players.update_otomos", "Failed to access Data: otomo_info No. " .. tostring(id));
goto continue;
end
local name = otomo_info_name_field:get_data(otomo_info);
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;
end
local level = otomo_info_level_field:get_data(otomo_info) or 0;
local otomo = this.otomo_list[id];
if otomo == nil or (otomo.name ~= name and level ~= otomo.level) or
(otomo.type == players.types.my_otomo and otomo.id ~= players.myself.id) or
(otomo.type ~= players.types.my_otomo and otomo.id == players.myself.id) then
if id == players.myself.id then
otomo = this.new(id, name, level, players.types.my_otomo);
this.otomo_list[id] = otomo;
elseif id >= 4 then
otomo = this.new(id, name, level, players.types.servant_otomo);
this.otomo_list[id] = otomo;
else
otomo = this.new(id, name, level, players.types.other_player_otomo);
this.otomo_list[id] = otomo;
end
end
::continue::
end
end
function this.init_UI(non_player)
local cached_config = config.current_config.damage_meter_UI;
if non_player.type == players.types.servant then
non_player.damage_UI = damage_UI_entity.new(cached_config.servants, non_player.type);
elseif non_player.type == players.types.my_otomo then
non_player.damage_UI = damage_UI_entity.new(cached_config.my_otomos, non_player.type);
elseif non_player.type == players.types.other_player_otomo then
non_player.damage_UI = damage_UI_entity.new(cached_config.other_player_otomos, non_player.type);
elseif non_player.type == players.types.servant_otomo then
non_player.damage_UI = damage_UI_entity.new(cached_config.servant_otomos, non_player.type);
end
end
function this.init_dependencies()
config = require("MHR_Overlay.Misc.config");
singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu");
damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.damage_UI_entity");
time = require("MHR_Overlay.Game_Handler.time");
quest_status = require("MHR_Overlay.Game_Handler.quest_status");
drawing = require("MHR_Overlay.UI.drawing");
language = require("MHR_Overlay.Misc.language");
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();
end
return this;

View File

@@ -1,555 +0,0 @@
local player = {};
local config;
local table_helpers;
local singletons;
local customization_menu;
local damage_UI_entity;
local time;
local quest_status;
local drawing;
local language;
player.list = {};
player.myself = nil;
player.myself_position = Vector3f.new(0, 0, 0);
player.total = nil;
function player.new(id, guid, name, master_rank, hunter_rank)
local new_player = {};
new_player.id = id;
new_player.guid = guid;
new_player.name = name; -- 齁ODO
new_player.hunter_rank = hunter_rank;
new_player.master_rank = master_rank;
new_player.cart_count = 0;
new_player.join_time = -1;
new_player.first_hit_time = -1;
new_player.dps = 0;
new_player.small_monsters = {};
new_player.small_monsters.total_damage = 0;
new_player.small_monsters.physical_damage = 0;
new_player.small_monsters.elemental_damage = 0;
new_player.small_monsters.ailment_damage = 0;
new_player.small_monsters.bombs = {};
new_player.small_monsters.bombs.total_damage = 0;
new_player.small_monsters.bombs.physical_damage = 0;
new_player.small_monsters.bombs.elemental_damage = 0;
new_player.small_monsters.bombs.ailment_damage = 0;
new_player.small_monsters.kunai = {};
new_player.small_monsters.kunai.total_damage = 0;
new_player.small_monsters.kunai.physical_damage = 0;
new_player.small_monsters.kunai.elemental_damage = 0;
new_player.small_monsters.kunai.ailment_damage = 0;
new_player.small_monsters.installations = {};
new_player.small_monsters.installations.total_damage = 0;
new_player.small_monsters.installations.physical_damage = 0;
new_player.small_monsters.installations.elemental_damage = 0;
new_player.small_monsters.installations.ailment_damage = 0;
new_player.small_monsters.otomo = {};
new_player.small_monsters.otomo.total_damage = 0;
new_player.small_monsters.otomo.physical_damage = 0;
new_player.small_monsters.otomo.elemental_damage = 0;
new_player.small_monsters.otomo.ailment_damage = 0;
new_player.small_monsters.wyvern_riding = {};
new_player.small_monsters.wyvern_riding.total_damage = 0;
new_player.small_monsters.wyvern_riding.physical_damage = 0;
new_player.small_monsters.wyvern_riding.elemental_damage = 0;
new_player.small_monsters.wyvern_riding.ailment_damage = 0;
new_player.small_monsters.poison = {};
new_player.small_monsters.poison.total_damage = 0;
new_player.small_monsters.poison.physical_damage = 0;
new_player.small_monsters.poison.elemental_damage = 0;
new_player.small_monsters.poison.ailment_damage = 0;
new_player.small_monsters.blast = {};
new_player.small_monsters.blast.total_damage = 0;
new_player.small_monsters.blast.physical_damage = 0;
new_player.small_monsters.blast.elemental_damage = 0;
new_player.small_monsters.blast.ailment_damage = 0;
new_player.small_monsters.endemic_life = {};
new_player.small_monsters.endemic_life.total_damage = 0;
new_player.small_monsters.endemic_life.physical_damage = 0;
new_player.small_monsters.endemic_life.elemental_damage = 0;
new_player.small_monsters.endemic_life.ailment_damage = 0;
new_player.small_monsters.other = {};
new_player.small_monsters.other.total_damage = 0;
new_player.small_monsters.other.physical_damage = 0;
new_player.small_monsters.other.elemental_damage = 0;
new_player.small_monsters.other.ailment_damage = 0;
new_player.large_monsters = {};
new_player.large_monsters.total_damage = 0;
new_player.large_monsters.physical_damage = 0;
new_player.large_monsters.elemental_damage = 0;
new_player.large_monsters.ailment_damage = 0;
new_player.large_monsters.bombs = {};
new_player.large_monsters.bombs.total_damage = 0;
new_player.large_monsters.bombs.physical_damage = 0;
new_player.large_monsters.bombs.elemental_damage = 0;
new_player.large_monsters.bombs.ailment_damage = 0;
new_player.large_monsters.kunai = {};
new_player.large_monsters.kunai.total_damage = 0;
new_player.large_monsters.kunai.physical_damage = 0;
new_player.large_monsters.kunai.elemental_damage = 0;
new_player.large_monsters.kunai.ailment_damage = 0;
new_player.large_monsters.installations = {};
new_player.large_monsters.installations.total_damage = 0;
new_player.large_monsters.installations.physical_damage = 0;
new_player.large_monsters.installations.elemental_damage = 0;
new_player.large_monsters.installations.ailment_damage = 0;
new_player.large_monsters.otomo = {};
new_player.large_monsters.otomo.total_damage = 0;
new_player.large_monsters.otomo.physical_damage = 0;
new_player.large_monsters.otomo.elemental_damage = 0;
new_player.large_monsters.otomo.ailment_damage = 0;
new_player.large_monsters.wyvern_riding = {};
new_player.large_monsters.wyvern_riding.total_damage = 0;
new_player.large_monsters.wyvern_riding.physical_damage = 0;
new_player.large_monsters.wyvern_riding.elemental_damage = 0;
new_player.large_monsters.wyvern_riding.ailment_damage = 0;
new_player.large_monsters.poison = {};
new_player.large_monsters.poison.total_damage = 0;
new_player.large_monsters.poison.physical_damage = 0;
new_player.large_monsters.poison.elemental_damage = 0;
new_player.large_monsters.poison.ailment_damage = 0;
new_player.large_monsters.blast = {};
new_player.large_monsters.blast.total_damage = 0;
new_player.large_monsters.blast.physical_damage = 0;
new_player.large_monsters.blast.elemental_damage = 0;
new_player.large_monsters.blast.ailment_damage = 0;
new_player.large_monsters.endemic_life = {};
new_player.large_monsters.endemic_life.total_damage = 0;
new_player.large_monsters.endemic_life.physical_damage = 0;
new_player.large_monsters.endemic_life.elemental_damage = 0;
new_player.large_monsters.endemic_life.ailment_damage = 0;
new_player.large_monsters.other = {};
new_player.large_monsters.other.total_damage = 0;
new_player.large_monsters.other.physical_damage = 0;
new_player.large_monsters.other.elemental_damage = 0;
new_player.large_monsters.other.ailment_damage = 0;
new_player.display = {};
new_player.display.total_damage = 0;
new_player.display.physical_damage = 0;
new_player.display.elemental_damage = 0;
new_player.display.ailment_damage = 0;
if name == "Total" then
player.init_total_UI(new_player);
else
player.init_UI(new_player);
end
return new_player;
end
function player.get_player(player_id)
return player.list[player_id];
end
function player.update_damage(_player, damage_source_type, is_large_monster, damage_object)
if _player == nil then
return;
end
if _player.first_hit_time == -1 then
_player.first_hit_time = time.total_elapsed_script_seconds;
end
local player_monster_type = _player.small_monsters;
if is_large_monster then
player_monster_type = _player.large_monsters;
end
if damage_source_type == "player" then
player.merge_damage(player_monster_type, damage_object);
elseif damage_source_type == "bomb" then
player.merge_damage(player_monster_type.bombs, damage_object);
elseif damage_source_type == "kunai" then
player.merge_damage(player_monster_type.kunai, damage_object);
elseif damage_source_type == "installation" then
player.merge_damage(player_monster_type.installations, damage_object);
elseif damage_source_type == "otomo" then
player.merge_damage(player_monster_type.otomo, damage_object);
elseif damage_source_type == "wyvern riding" then
player.merge_damage(player_monster_type.wyvern_riding, damage_object);
elseif damage_source_type == "poison" then
player.merge_damage(player_monster_type.poison, damage_object);
elseif damage_source_type == "blast" then
player.merge_damage(player_monster_type.blast, damage_object);
elseif damage_source_type == "endemic life" then
player.merge_damage(player_monster_type.endemic_life, damage_object);
elseif damage_source_type == "other" then
player.merge_damage(player_monster_type.other, damage_object);
else
player.merge_damage(player_monster_type, damage_object);
end
player.update_display(_player);
end
function player.update_display(_player)
if _player == nil then
return;
end
_player.display.total_damage = 0;
_player.display.physical_damage = 0;
_player.display.elemental_damage = 0;
_player.display.ailment_damage = 0;
local cached_config = config.current_config.damage_meter_UI;
if cached_config.tracked_monster_types.small_monsters then
if cached_config.tracked_damage_types.player_damage then
player.merge_damage(_player.display, _player.small_monsters);
end
if cached_config.tracked_damage_types.bomb_damage then
player.merge_damage(_player.display, _player.small_monsters.bombs);
end
if cached_config.tracked_damage_types.kunai_damage then
player.merge_damage(_player.display, _player.small_monsters.kunai);
end
if cached_config.tracked_damage_types.installation_damage then
player.merge_damage(_player.display, _player.small_monsters.installations);
end
if cached_config.tracked_damage_types.otomo_damage then
player.merge_damage(_player.display, _player.small_monsters.otomo);
end
if cached_config.tracked_damage_types.wyvern_riding_damage then
player.merge_damage(_player.display, _player.small_monsters.wyvern_riding);
end
if cached_config.tracked_damage_types.poison_damage then
player.merge_damage(_player.display, _player.small_monsters.poison);
end
if cached_config.tracked_damage_types.blast_damage then
player.merge_damage(_player.display, _player.small_monsters.blast);
end
if cached_config.tracked_damage_types.endemic_life_damage then
player.merge_damage(_player.display, _player.small_monsters.endemic_life);
end
if cached_config.tracked_damage_types.other_damage then
player.merge_damage(_player.display, _player.small_monsters.other);
end
end
if cached_config.tracked_monster_types.large_monsters then
if cached_config.tracked_damage_types.player_damage then
player.merge_damage(_player.display, _player.large_monsters);
end
if cached_config.tracked_damage_types.bomb_damage then
player.merge_damage(_player.display, _player.large_monsters.bombs);
end
if cached_config.tracked_damage_types.kunai_damage then
player.merge_damage(_player.display, _player.large_monsters.kunai);
end
if cached_config.tracked_damage_types.installation_damage then
player.merge_damage(_player.display, _player.large_monsters.installations);
end
if cached_config.tracked_damage_types.otomo_damage then
player.merge_damage(_player.display, _player.large_monsters.otomo);
end
if cached_config.tracked_damage_types.wyvern_riding_damage then
player.merge_damage(_player.display, _player.large_monsters.wyvern_riding);
end
if cached_config.tracked_damage_types.poison_damage then
player.merge_damage(_player.display, _player.large_monsters.poison);
end
if cached_config.tracked_damage_types.blast_damage then
player.merge_damage(_player.display, _player.large_monsters.blast);
end
if cached_config.tracked_damage_types.endemic_life_damage then
player.merge_damage(_player.display, _player.large_monsters.endemic_life);
end
if cached_config.tracked_damage_types.other_damage then
player.merge_damage(_player.display, _player.large_monsters.other);
end
end
end
function player.merge_damage(first, second)
first.total_damage = first.total_damage + second.total_damage;
first.physical_damage = first.physical_damage + second.physical_damage;
first.elemental_damage = first.elemental_damage + second.elemental_damage;
first.ailment_damage = first.ailment_damage + second.ailment_damage;
return first;
end
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 = sdk.find_type_definition("snow.player.PlayerBase");
local get_pos_field = player_base_type_def:get_method("get_Pos");
function player.update_myself_position()
if singletons.player_manager == nil then
customization_menu.status = "No player manager";
return;
end
local master_player = find_master_player_method:call(singletons.player_manager);
if master_player == nil then
customization_menu.status = "No master player";
return;
end
local position = get_pos_field:call(master_player);
if position ~= nil then
player.myself_position = position;
end
end
function player.init()
player.list = {};
player.total = player.new(0, -2, "Total", 0, 0);
player.myself = player.new(-1, -1, "Dummy", -1, -1);
end
local lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager");
local my_hunter_info_field = lobby_manager_type_def:get_field("_myHunterInfo");
local myself_quest_index_field = lobby_manager_type_def:get_field("_myselfQuestIndex");
local quest_hunter_info_field = lobby_manager_type_def:get_field("_questHunterInfo");
local hunter_info_field = lobby_manager_type_def:get_field("_hunterInfo");
local my_hunter_info_type_def = my_hunter_info_field:get_type();
local name_field = my_hunter_info_type_def:get_field("_name");
local hunter_unique_id_field = my_hunter_info_type_def:get_field("_HunterUniqueId");
local member_index_field = my_hunter_info_type_def:get_field("_memberIndex");
local hunter_rank_field = my_hunter_info_type_def:get_field("_hunterRank");
local master_rank_field = my_hunter_info_type_def:get_field("_masterRank");
local hunter_info_type_def = hunter_info_field:get_type();
local get_count_method = hunter_info_type_def:get_method("get_Count");
local get_item_method = hunter_info_type_def:get_method("get_Item");
local guid_type = hunter_unique_id_field:get_type();
local guid_equals_method = guid_type:get_method("Equals(System.Guid)");
local progress_manager_type_def = sdk.find_type_definition("snow.progress.ProgressManager");
local get_hunter_rank_method = progress_manager_type_def:get_method("get_HunterRank");
local get_master_rank_method = progress_manager_type_def:get_method("get_MasterRank");
local get_master_player_id_method = player_manager_type_def:get_method("getMasterPlayerID");
function player.update_player_list(is_on_quest)
if is_on_quest then
player.update_player_list_(quest_hunter_info_field);
else
player.update_player_list_(hunter_info_field);
end
end
function player.update_player_list_(hunter_info_field_)
if singletons.lobby_manager == nil then
return;
end
if singletons.progress_manager == nil then
return;
end
-- myself player
local myself_player_info = my_hunter_info_field:get_data(singletons.lobby_manager);
if myself_player_info == nil then
customization_menu.status = "No myself player info list";
return;
end
local myself_player_name = name_field:get_data(myself_player_info);
if myself_player_name == nil then
customization_menu.status = "No myself player name";
return;
end
local myself_hunter_rank = get_hunter_rank_method:call(singletons.progress_manager) or 0;
local myself_master_rank = get_master_rank_method:call(singletons.progress_manager) or 0;
local myself_id = get_master_player_id_method:call(singletons.player_manager) or -1;
-- if quest_status.is_online then
-- myself_id = get_master_player_id_method:call(singletons.player_manager) or -1;
-- else
-- myself_id = myself_quest_index_field:call(singletons.lobby_manager) or -1;
-- end
if myself_id == nil then
customization_menu.status = "No myself player id";
return;
end
local myself_guid = hunter_unique_id_field:get_data(myself_player_info);
if myself_guid == nil then
customization_menu.status = "No myself guid";
return;
end
-- local myself_guid_string = guid_tostring_method:call(myself_guid);
-- if myself_guid_string == nil then
-- customization_menu.status = "No myself guid string";
-- return;
-- end
if myself_id ~= player.myself.id then
player.list[player.myself.id] = nil;
player.myself = player.new(myself_id, myself_guid, myself_player_name, myself_master_rank, myself_hunter_rank);
player.list[myself_id] = player.myself;
end
-- other players
local player_info_list = hunter_info_field_:get_data(singletons.lobby_manager);
if player_info_list == nil then
customization_menu.status = "No player info list";
return;
end
local count = get_count_method:call(player_info_list);
if count == nil then
customization_menu.status = "No player info list count";
return;
end
for i = 0, count - 1 do
local player_info = get_item_method:call(player_info_list, i);
if player_info == nil then
goto continue
end
local player_id = member_index_field:get_data(player_info);
if player_id == nil then
goto continue
end
local player_guid = hunter_unique_id_field:get_data(player_info);
if player_guid == nil then
customization_menu.status = "No player guid";
return;
end
-- local player_guid_string = guid_tostring_method:call(player_guid);
-- if player_guid_string == nil then
-- customization_menu.status = "No player guid string";
-- return;
-- end
local player_hunter_rank = hunter_rank_field:get_data(player_info) or 0;
local player_master_rank = master_rank_field:get_data(player_info) or 0;
local player_name = name_field:get_data(player_info);
if player_name == nil then
goto continue
end
if player.list[player_id] == nil or not guid_equals_method:call(player.list[player_id].guid, player_guid) -- player.list[player_id].guid ~= player_guid
then
local _player = player.new(player_id, player_guid, player_name, player_master_rank, player_hunter_rank);
player.list[player_id] = _player;
if player_name == player.myself.name and player_hunter_rank == player.myself.hunter_rank and player_master_rank ==
player.myself.master_rank then
player.myself = _player;
end
end
::continue::
end
end
function player.init_UI(_player)
local cached_config = config.current_config.damage_meter_UI;
_player.damage_UI = damage_UI_entity.new(cached_config.damage_bar, cached_config.highlighted_damage_bar,
cached_config.player_name_label, cached_config.dps_label, cached_config.master_hunter_rank_label,
cached_config.damage_value_label, cached_config.damage_percentage_label, cached_config.cart_count_label);
end
function player.init_total_UI(_player)
local cached_config = config.current_config.damage_meter_UI;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
_player.damage_UI = {
total_damage_label = table_helpers.deep_copy(cached_config.total_damage_label),
total_damage_value_label = table_helpers.deep_copy(cached_config.total_damage_value_label),
total_dps_label = table_helpers.deep_copy(cached_config.total_dps_label)
};
_player.damage_UI.total_damage_label.offset.x = _player.damage_UI.total_damage_label.offset.x * global_scale_modifier;
_player.damage_UI.total_damage_label.offset.y = _player.damage_UI.total_damage_label.offset.y * global_scale_modifier;
_player.damage_UI.total_damage_value_label.offset.x = _player.damage_UI.total_damage_value_label.offset.x *
global_scale_modifier;
_player.damage_UI.total_damage_value_label.offset.y = _player.damage_UI.total_damage_value_label.offset.y *
global_scale_modifier;
_player.damage_UI.total_dps_label.offset.x = _player.damage_UI.total_dps_label.offset.x * global_scale_modifier;
_player.damage_UI.total_dps_label.offset.y = _player.damage_UI.total_dps_label.offset.y * global_scale_modifier;
end
function player.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
function player.draw_total(position_on_screen, opacity_scale)
drawing.draw_label(player.total.damage_UI.total_damage_label, position_on_screen, opacity_scale,
language.current_language.UI.total_damage);
drawing.draw_label(player.total.damage_UI.total_damage_value_label, position_on_screen, opacity_scale,
player.total.display.total_damage);
drawing.draw_label(player.total.damage_UI.total_dps_label, position_on_screen, opacity_scale, player.total.dps);
end
function player.init_module()
config = require("MHR_Overlay.Misc.config");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu");
damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.damage_UI_entity");
time = require("MHR_Overlay.Game_Handler.time");
quest_status = require("MHR_Overlay.Game_Handler.quest_status");
drawing = require("MHR_Overlay.UI.drawing");
language = require("MHR_Overlay.Misc.language");
player.init();
end
return player;

View File

@@ -0,0 +1,611 @@
local this = {};
local config;
local singletons;
local customization_menu;
local damage_UI_entity;
local time;
local quest_status;
local drawing;
local language;
local non_players;
local utils;
local error_handler;
local large_monster;
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.myself = nil;
this.myself_position = Vector3f.new(0, 0, 0);
this.total = 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 = {
["myself"] = 0,
["other_player"] = 1,
["servant"] = 2,
["my_otomo"] = 4,
["other_player_otomo"] = 8,
["servant_otomo"] = 16,
["total"] = 32,
["highlight"] = 64
};
function this.new(id, name, master_rank, hunter_rank, type)
local player = {};
player.id = id;
player.name = name;
player.hunter_rank = hunter_rank;
player.master_rank = master_rank;
player.type = type;
player.cart_count = 0;
player.join_time = utils.constants.uninitialized_int;
player.first_hit_time = utils.constants.uninitialized_int;
player.dps = 0;
player.small_monsters = this.init_damage_sources();
player.large_monsters = this.init_damage_sources();
player.display = {};
player.display.total_damage = 0;
player.display.physical_damage = 0;
player.display.elemental_damage = 0;
player.display.ailment_damage = 0;
this.init_UI(player);
if this.highlighted_damage_UI == nil then
this.init_highlighted_UI();
end
return player;
end
function this.init_damage_sources()
local monster_type = {};
for damage_type_name, _ in pairs(this.damage_types) do
monster_type[damage_type_name] = {
total_damage = 0,
physical_damage = 0,
elemental_damage = 0,
ailment_damage = 0
};
end
return monster_type;
end
function this.get_player(player_id)
if player_id == non_players.my_second_otomo_id then
return this.myself;
end
return this.list[player_id];
end
function this.update_damage(player, damage_source_type, is_large_monster, damage_object)
if player == nil then
return;
end
if player.first_hit_time == utils.constants.uninitialized_int then
player.first_hit_time = time.total_elapsed_script_seconds;
end
if is_large_monster then
this.merge_damage(player.large_monsters[damage_source_type], damage_object);
else
this.merge_damage(player.small_monsters[damage_source_type], damage_object);
end
this.update_display(player);
end
function this.update_display(player)
if player == nil then
error_handler.report("players.update_display", "Missing Parameter: player");
return;
end
local cached_config = config.current_config.damage_meter_UI;
player.display.total_damage = 0;
player.display.physical_damage = 0;
player.display.elemental_damage = 0;
player.display.ailment_damage = 0;
local monster_types = {};
if cached_config.tracked_monster_types.small_monsters then
table.insert(monster_types, player.small_monsters);
end
if cached_config.tracked_monster_types.large_monsters then
table.insert(monster_types, player.large_monsters);
end
for _, monster_type in ipairs(monster_types) do
if cached_config.tracked_damage_types.players then
this.merge_damage(player.display, monster_type.player);
end
if cached_config.tracked_damage_types.bombs then
this.merge_damage(player.display, monster_type.bombs);
end
if cached_config.tracked_damage_types.kunai then
this.merge_damage(player.display, monster_type.kunai);
end
if cached_config.tracked_damage_types.installations then
this.merge_damage(player.display, monster_type.installations);
end
if cached_config.tracked_damage_types.otomos then
if player.type == this.types.myself then
if not cached_config.settings.show_my_otomos_separately then
this.merge_damage(player.display, monster_type.otomo);
end
elseif player.type == this.types.other_player then
if not cached_config.settings.show_other_player_otomos_separately then
this.merge_damage(player.display, monster_type.otomo);
end
elseif player.type == this.types.servant then
if not cached_config.settings.show_servant_otomos_separately then
this.merge_damage(player.display, monster_type.otomo);
end
elseif player.type == this.types.my_otomo then
if cached_config.settings.show_my_otomos_separately then
this.merge_damage(player.display, monster_type.otomo);
end
elseif player.type == this.types.other_player_otomo then
if cached_config.settings.show_other_player_otomos_separately then
this.merge_damage(player.display, monster_type.otomo);
end
elseif player.type == this.types.servant_otomo then
if cached_config.settings.show_servant_otomos_separately then
this.merge_damage(player.display, monster_type.otomo);
end
elseif player.type == this.types.total then
this.merge_damage(player.display, monster_type.otomo);
end
end
if cached_config.tracked_damage_types.wyvern_riding then
this.merge_damage(player.display, monster_type.wyvern_riding);
end
if cached_config.tracked_damage_types.poison then
this.merge_damage(player.display, monster_type.poison);
if player.type == this.types.myself then
if not cached_config.settings.show_my_otomos_separately then
this.merge_damage(player.display, monster_type.otomo_poison);
end
elseif player.type == this.types.other_player then
if not cached_config.settings.show_other_player_otomos_separately then
this.merge_damage(player.display, monster_type.otomo_poison);
end
elseif player.type == this.types.servant then
if not cached_config.settings.show_servant_otomos_separately then
this.merge_damage(player.display, monster_type.otomo_poison);
end
elseif player.type == this.types.my_otomo then
if cached_config.settings.show_my_otomos_separately then
this.merge_damage(player.display, monster_type.otomo_poison);
end
elseif player.type == this.types.other_player_otomo then
if cached_config.settings.show_other_player_otomos_separately then
this.merge_damage(player.display, monster_type.otomo_poison);
end
elseif player.type == this.types.servant_otomo then
if cached_config.settings.show_servant_otomos_separately then
this.merge_damage(player.display, monster_type.otomo_poison);
end
elseif player.type == this.types.total then
this.merge_damage(player.display, monster_type.otomo_poison);
end
end
if cached_config.tracked_damage_types.blast then
this.merge_damage(player.display, monster_type.blast);
if player.type == this.types.myself then
if not cached_config.settings.show_my_otomos_separately then
this.merge_damage(player.display, monster_type.otomo_blast);
end
elseif player.type == this.types.other_player then
if not cached_config.settings.show_other_player_otomos_separately then
this.merge_damage(player.display, monster_type.otomo_blast);
end
elseif player.type == this.types.servant then
if not cached_config.settings.show_servant_otomos_separately then
this.merge_damage(player.display, monster_type.otomo_blast);
end
elseif player.type == this.types.my_otomo then
if cached_config.settings.show_my_otomos_separately then
this.merge_damage(player.display, monster_type.otomo_blast);
end
elseif player.type == this.types.other_player_otomo then
if cached_config.settings.show_other_player_otomos_separately then
this.merge_damage(player.display, monster_type.otomo_blast);
end
elseif player.type == this.types.servant_otomo then
if cached_config.settings.show_servant_otomos_separately then
this.merge_damage(player.display, monster_type.otomo_blast);
end
elseif player.type == this.types.total then
this.merge_damage(player.display, monster_type.otomo_blast);
end
end
if cached_config.tracked_damage_types.endemic_life then
this.merge_damage(player.display, monster_type.endemic_life);
end
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);
end
end
end
function this.merge_damage(first, second)
first.total_damage = first.total_damage + second.total_damage;
first.physical_damage = first.physical_damage + second.physical_damage;
first.elemental_damage = first.elemental_damage + second.elemental_damage;
first.ailment_damage = first.ailment_damage + second.ailment_damage;
return first;
end
function this.update_dps(bypass_freeze)
local cached_config = config.current_config.damage_meter_UI.settings;
if cached_config.freeze_dps_on_quest_end and quest_status.flow_state >= quest_status.flow_states.KILLCAM and not bypass_freeze then
return;
end
this.total.dps = 0;
for _, player in pairs(this.list) do
this.update_player_dps(player);
end
for _, servant in pairs(non_players.servant_list) do
this.update_player_dps(servant);
end
for _, otomo in pairs(non_players.otomo_list) do
this.update_player_dps(otomo);
end
end
function this.update_player_dps(player)
local cached_config = config.current_config.damage_meter_UI.settings;
if player.join_time == utils.constants.uninitialized_int then
player.join_time = time.total_elapsed_script_seconds;
end
if cached_config.dps_mode == "Quest Time" then
if time.total_elapsed_seconds > 0 then
player.dps = player.display.total_damage / time.total_elapsed_seconds;
end
elseif cached_config.dps_mode == "Join Time" then
if time.total_elapsed_script_seconds - player.join_time > 0 then
player.dps = player.display.total_damage / (time.total_elapsed_script_seconds - player.join_time);
end
elseif cached_config.dps_mode == "First Hit" then
if time.total_elapsed_script_seconds - player.first_hit_time > 0 then
player.dps = player.display.total_damage / (time.total_elapsed_script_seconds - player.first_hit_time);
end
end
this.total.dps = this.total.dps + player.dps;
end
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 = sdk.find_type_definition("snow.player.PlayerBase");
local get_pos_field = player_base_type_def:get_method("get_Pos");
function this.update_myself_position()
if singletons.player_manager == nil then
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;
end
local master_player = find_master_player_method:call(singletons.player_manager);
if master_player == nil then
error_handler.report("players.update_myself_position", "Failed to access Data: master_player");
return;
end
local position = get_pos_field:call(master_player);
if position == nil then
error_handler.report("players.update_myself_position", "Failed to access Data: position");
end
this.myself_position = position;
end
function this.init()
this.list = {};
this.total = this.new(0, "Total", 0, 0, this.types.total);
this.myself = this.new(-1, "MHROverlayDummy", -1, -1, this.types.myself);
end
local lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager");
local my_hunter_info_field = lobby_manager_type_def:get_field("_myHunterInfo");
local myself_quest_index_field = lobby_manager_type_def:get_field("_myselfQuestIndex");
local quest_hunter_info_field = lobby_manager_type_def:get_field("_questHunterInfo");
local hunter_info_field = lobby_manager_type_def:get_field("_hunterInfo");
local my_hunter_info_type_def = my_hunter_info_field:get_type();
local name_field = my_hunter_info_type_def:get_field("_name");
local hunter_unique_id_field = my_hunter_info_type_def:get_field("_HunterUniqueId");
local member_index_field = my_hunter_info_type_def:get_field("_memberIndex");
local hunter_rank_field = my_hunter_info_type_def:get_field("_hunterRank");
local master_rank_field = my_hunter_info_type_def:get_field("_masterRank");
local hunter_info_type_def = hunter_info_field:get_type();
local get_count_method = hunter_info_type_def:get_method("get_Count");
local get_item_method = hunter_info_type_def:get_method("get_Item");
local guid_type = hunter_unique_id_field:get_type();
local guid_equals_method = guid_type:get_method("Equals(System.Guid)");
local progress_manager_type_def = sdk.find_type_definition("snow.progress.ProgressManager");
local get_hunter_rank_method = progress_manager_type_def:get_method("get_HunterRank");
local get_master_rank_method = progress_manager_type_def:get_method("get_MasterRank");
local get_master_player_id_method = player_manager_type_def:get_method("getMasterPlayerID");
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
this.update_player_list(quest_hunter_info_field);
else
this.update_player_list(hunter_info_field);
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
function this.update_player_list(hunter_info_field_)
local cached_config = config.current_config.damage_meter_UI;
if singletons.lobby_manager == nil then
error_handler.report("players.update_player_list", "Failed to access Data: lobby_manager");
return;
end
if singletons.progress_manager == nil then
error_handler.report("players.update_player_list", "Failed to access Data: progress_manager");
return;
end
-- myself player
local myself_player_info = my_hunter_info_field:get_data(singletons.lobby_manager);
if myself_player_info == nil then
error_handler.report("players.update_player_list", "Failed to access Data: myself_player_info");
return;
end
local myself_player_name = name_field:get_data(myself_player_info);
if myself_player_name == nil then
error_handler.report("players.update_player_list", "Failed to access Data: myself_player_name");
return;
end
local myself_hunter_rank = get_hunter_rank_method:call(singletons.progress_manager) or 0;
local myself_master_rank = get_master_rank_method:call(singletons.progress_manager) or 0;
local myself_id = get_master_player_id_method:call(singletons.player_manager);
if myself_id == nil then
error_handler.report("players.update_player_list", "Failed to access Data: myself_id");
return;
end
if this.myself == nil or myself_id ~= this.myself.id then
this.list[this.myself.id] = nil;
this.myself = this.new(myself_id, myself_player_name, myself_master_rank, myself_hunter_rank, this.types.myself);
this.list[myself_id] = this.myself;
end
-- other players
local player_info_array = hunter_info_field_:get_data(singletons.lobby_manager);
if player_info_array == nil then
error_handler.report("players.update_player_list", "Failed to access Data: player_info_array");
return;
end
local count = get_count_method:call(player_info_array);
if count == nil then
error_handler.report("players.update_player_list", "Failed to access Data: player_info_array -> count");
return;
end
for i = 0, count - 1 do
local player_info = get_item_method:call(player_info_array, i);
if player_info == nil then
error_handler.report("players.update_player_list", "Failed to access Data: player_info No. " .. tostring(i));
goto continue;
end
local id = member_index_field:get_data(player_info);
if id == nil then
error_handler.report("players.update_player_list", string.format("Failed to access Data: player_info No. %d -> id", i));
goto continue;
end
local hunter_rank = hunter_rank_field:get_data(player_info) or 0;
local master_rank = master_rank_field:get_data(player_info) or 0;
local name = name_field:get_data(player_info);
if name == nil then
error_handler.report("players.update_player_list", string.format("Failed to access Data: player_info No. %d -> name", i));
goto continue;
end
local player = this.list[id];
if player == nil then
if name == this.myself.name then
player = this.new(id, name, master_rank, hunter_rank, this.types.myself);
this.myself = player;
this.list[id] = player;
else
player = this.new(id, name, master_rank, hunter_rank, this.types.other_player);
this.list[id] = player;
end
elseif player.name ~= name or player.hunter_rank ~= hunter_rank or player.master_rank ~= master_rank then
if name == this.myself.name then
player = this.new(id, name, master_rank, hunter_rank, this.types.myself);
this.myself = player;
this.list[id] = player;
else
player = this.new(id, name, master_rank, hunter_rank, this.types.other_player);
this.list[id] = player;
end
end
::continue::
end
end
function this.init_UI(player)
local cached_config = config.current_config.damage_meter_UI;
if player.type == this.types.myself then
player.damage_UI = damage_UI_entity.new(cached_config.myself, player.type);
elseif player.type == this.types.other_player then
player.damage_UI = damage_UI_entity.new(cached_config.other_players, player.type);
elseif player.type == this.types.total then
player.damage_UI = damage_UI_entity.new(cached_config.total, player.type);
end
end
function this.init_highlighted_UI()
local cached_config = config.current_config.damage_meter_UI;
this.highlighted_damage_UI = damage_UI_entity.new(cached_config.highlighted, this.types.highlight);
end
function this.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
function this.init_dependencies()
config = require("MHR_Overlay.Misc.config");
singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu");
damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.damage_UI_entity");
time = require("MHR_Overlay.Game_Handler.time");
quest_status = require("MHR_Overlay.Game_Handler.quest_status");
drawing = require("MHR_Overlay.UI.drawing");
language = require("MHR_Overlay.Misc.language");
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();
end
return this;

View File

@@ -1,13 +1,59 @@
local env_creature = {};
local this = {};
local drawing;
local customization_menu;
local singletons;
local config;
local table_helpers;
local utils;
local error_handler;
env_creature.list = {};
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;
function env_creature.new(REcreature)
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)
local creature = {};
creature.life = 0;
@@ -17,22 +63,22 @@ function env_creature.new(REcreature)
creature.position = Vector3f.new(0, 0, 0);
creature.distance = 0;
env_creature.init(creature, REcreature);
env_creature.init_UI(creature);
this.init(creature, REcreature);
this.init_UI(creature);
if env_creature.list[REcreature] == nil then
env_creature.list[REcreature] = creature;
if this.list[REcreature] == nil then
this.list[REcreature] = creature;
end
return creature;
end
function env_creature.get_creature(REcreature)
if env_creature.list[REcreature] == nil then
env_creature.list[REcreature] = env_creature.new(REcreature);
function this.get_creature(REcreature)
if this.list[REcreature] == nil then
this.list[REcreature] = this.new(REcreature);
end
return env_creature.list[REcreature];
return this.list[REcreature];
end
local environment_creature_base_type_def = sdk.find_type_definition("snow.envCreature.EnvironmentCreatureBase");
@@ -44,22 +90,25 @@ local get_env_creature_name_message_method = message_manager_type_def:get_method
local get_pos_method = environment_creature_base_type_def:get_method("get_Pos");
function env_creature.init(creature, REcreature)
function this.init(creature, REcreature)
local creature_type = creature_type_field:get_data(REcreature);
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;
end
local creature_name = get_env_creature_name_message_method:call(singletons.message_manager,
creature_type);
if creature_name ~= nil then
creature.name = creature_name;
local creature_name = get_env_creature_name_message_method:call(singletons.message_manager, creature_type);
if creature_name == nil then
error_handler.report("env_creature.init", "Failed to access Data: creature_name");
return;
end
creature.name = creature_name;
creature.id = creature_type;
end
function env_creature.init_UI(creature)
creature.name_label = table_helpers.deep_copy(config.current_config.endemic_life_UI.creature_name_label);
function this.init_UI(creature)
creature.name_label = utils.table.deep_copy(config.current_config.endemic_life_UI.creature_name_label);
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
@@ -67,60 +116,79 @@ function env_creature.init_UI(creature)
creature.name_label.offset.y = creature.name_label.offset.y * global_scale_modifier;
end
function env_creature.update_position(REcreature, creature)
function this.update_position(REcreature, creature)
if not config.current_config.endemic_life_UI.enabled then
return;
end
if creature == nil then
creature = env_creature.get_creature(REcreature);
creature = this.get_creature(REcreature);
end
local position = get_pos_method:call(REcreature);
if position ~= nil then
creature.position = position;
if position == nil then
error_handler.report("env_creature.update_position", "Failed to access Data: position");
end
creature.position = position;
end
function env_creature.update(REcreature, creature)
function this.update(REcreature, creature)
if not config.current_config.endemic_life_UI.enabled then
return;
end
if creature == nil then
creature = env_creature.get_creature(REcreature);
creature = this.get_creature(REcreature);
end
local is_inactive = creature_is_inactive_field:get_data(REcreature);
if is_inactive ~= nil then
creature.is_inactive = is_inactive;
if is_inactive == nil then
error_handler.report("env_creature.update", "Failed to access Data: is_inactive");
end
creature.is_inactive = is_inactive;
end
function env_creature.draw(creature, position_on_screen, opacity_scale)
if d2d ~= nil then
function this.draw(creature, position_on_screen, opacity_scale)
if d2d ~= nil and config.current_config.global_settings.renderer.use_d2d_if_available then
local text_width, text_height = drawing.font:measure(creature.name);
position_on_screen.x = position_on_screen.x - text_width / 2;
end
drawing.draw_label(creature.name_label, position_on_screen, opacity_scale, creature.name);
local cached_config = config.current_config.endemic_life_UI.creature_name_label.include;
local name_text = "";
if cached_config.name then
name_text = string.format("%s ", creature.name);
end
if cached_config.id then
name_text = string.format("%s%s ", name_text, tostring(creature.id));
end
drawing.draw_label(creature.name_label, position_on_screen, opacity_scale, name_text);
end
function env_creature.init_list()
env_creature.list = {};
function this.init_list()
this.list = {};
end
function env_creature.init_module()
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");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
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");
end
return env_creature;
function this.init_module()
end
return this;

View File

@@ -1,27 +1,64 @@
local env_creature_hook = {};
local this = {};
local env_creature;
local config;
local time;
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 environment_creature_base_type_def = sdk.find_type_definition("snow.envCreature.EnvironmentCreatureBase");
local update_method = environment_creature_base_type_def:get_method("update");
function env_creature_hook.update(REcreature)
function this.update(REcreature)
local creature = env_creature.get_creature(REcreature);
env_creature.update(REcreature, creature);
env_creature.update_position(REcreature, creature);
end
function env_creature_hook.init_module()
function this.init_dependencies()
config = require("MHR_Overlay.Misc.config");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
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)
pcall(env_creature_hook.update, sdk.to_managed_object(args[2]));
pcall(this.update, sdk.to_managed_object(args[2]));
end, function(retval)
return retval;
end);
end
return env_creature_hook;
return this;

View File

@@ -1,12 +1,46 @@
local config = require "MHR_Overlay.Misc.config"
local keyboard = {};
local this = {};
local config;
local singletons;
local customization_menu;
local player;
local players;
local small_monster;
local large_monster;
local damage_meter_UI;
local time;
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 game_keyboard_type_def = sdk.find_type_definition("snow.GameKeyboard");
local hard_keyboard_field = game_keyboard_type_def:get_field("hardKeyboard");
@@ -16,13 +50,13 @@ local get_down_method = hard_keyboard_field_type_def:get_method("getDown");
local get_trigger_method = hard_keyboard_field_type_def:get_method("getTrg");
local get_release_method = hard_keyboard_field_type_def:get_method("getRelease");
keyboard.hotkey_modifiers_down = {
this.hotkey_modifiers_down = {
ctrl = false,
shift = false,
alt = false
};
keyboard.keys = {
this.keys = {
[0] = "None",
[1] = "Left Mouse Button",
[2] = "Right Mouse Button",
@@ -300,174 +334,201 @@ keyboard.keys = {
--[254] = "Clear"
};
function keyboard.update()
function this.update()
if singletons.game_keyboard == nil then
customization_menu.status = "No game keyboard";
error_handler.report("keyboard.update", "Failed to access Data: game_keyboard");
return;
end
local hard_keyboard = hard_keyboard_field:get_data(singletons.game_keyboard);
if hard_keyboard == nil then
customization_menu.status = "No hard keyboard";
error_handler.report("keyboard.update", "Failed to access Data: hard_keyboard");
return;
end
keyboard.check_modifiers(hard_keyboard);
local new_hotkey_registered = keyboard.register_hotkey(hard_keyboard);
this.check_modifiers(hard_keyboard);
local new_hotkey_registered = this.register_hotkey(hard_keyboard);
if new_hotkey_registered then
config.save();
config.save_current();
else
keyboard.check_hotkeys(hard_keyboard);
this.check_hotkeys(hard_keyboard);
end
keyboard.hotkey_modifiers_down.ctrl = false;
keyboard.hotkey_modifiers_down.shift = false;
keyboard.hotkey_modifiers_down.alt = false
this.hotkey_modifiers_down.ctrl = false;
this.hotkey_modifiers_down.shift = false;
this.hotkey_modifiers_down.alt = false
end
function keyboard.check_modifiers(hard_keyboard)
function this.check_modifiers(hard_keyboard)
local is_ctrl_down = get_down_method:call(hard_keyboard, 17);
if is_ctrl_down ~= nil then
keyboard.hotkey_modifiers_down.ctrl = is_ctrl_down;
this.hotkey_modifiers_down.ctrl = is_ctrl_down;
end
local is_shift_down = get_down_method:call(hard_keyboard, 16);
if is_shift_down ~= nil then
keyboard.hotkey_modifiers_down.shift = is_shift_down;
this.hotkey_modifiers_down.shift = is_shift_down;
end
local is_alt_down = get_down_method:call(hard_keyboard, 18);
if is_alt_down ~= nil then
keyboard.hotkey_modifiers_down.alt = is_alt_down;
this.hotkey_modifiers_down.alt = is_alt_down;
end
end
function keyboard.register_hotkey(hard_keyboard)
function this.register_hotkey(hard_keyboard)
local cached_config = config.current_config.global_settings.hotkeys_with_modifiers;
if customization_menu.all_UI_waiting_for_key then
for key, key_name in pairs(keyboard.keys) do
for key, key_name in pairs(this.keys) do
if get_release_method:call(hard_keyboard, key) then
cached_config.all_UI.ctrl = keyboard.hotkey_modifiers_down.ctrl;
cached_config.all_UI.shift = keyboard.hotkey_modifiers_down.shift;
cached_config.all_UI.alt = keyboard.hotkey_modifiers_down.alt;
cached_config.all_UI.ctrl = this.hotkey_modifiers_down.ctrl;
cached_config.all_UI.shift = this.hotkey_modifiers_down.shift;
cached_config.all_UI.alt = this.hotkey_modifiers_down.alt;
cached_config.all_UI.key = key;
customization_menu.all_UI_waiting_for_key = false;
return true;
end
end
elseif customization_menu.small_monster_UI_waiting_for_key then
for key, key_name in pairs(keyboard.keys) do
for key, key_name in pairs(this.keys) do
if get_release_method:call(hard_keyboard, key) then
cached_config.small_monster_UI.ctrl = keyboard.hotkey_modifiers_down.ctrl;
cached_config.small_monster_UI.shift = keyboard.hotkey_modifiers_down.shift;
cached_config.small_monster_UI.alt = keyboard.hotkey_modifiers_down.alt;
cached_config.small_monster_UI.ctrl = this.hotkey_modifiers_down.ctrl;
cached_config.small_monster_UI.shift = this.hotkey_modifiers_down.shift;
cached_config.small_monster_UI.alt = this.hotkey_modifiers_down.alt;
cached_config.small_monster_UI.key = key;
customization_menu.small_monster_UI_waiting_for_key = false;
return true;
end
end
elseif customization_menu.large_monster_UI_waiting_for_key then
for key, key_name in pairs(keyboard.keys) do
for key, key_name in pairs(this.keys) do
if get_release_method:call(hard_keyboard, key) then
cached_config.large_monster_UI.ctrl = keyboard.hotkey_modifiers_down.ctrl;
cached_config.large_monster_UI.shift = keyboard.hotkey_modifiers_down.shift;
cached_config.large_monster_UI.alt = keyboard.hotkey_modifiers_down.alt;
cached_config.large_monster_UI.ctrl = this.hotkey_modifiers_down.ctrl;
cached_config.large_monster_UI.shift = this.hotkey_modifiers_down.shift;
cached_config.large_monster_UI.alt = this.hotkey_modifiers_down.alt;
cached_config.large_monster_UI.key = key;
customization_menu.large_monster_UI_waiting_for_key = false;
return true;
end
end
elseif customization_menu.large_monster_dynamic_UI_waiting_for_key then
for key, key_name in pairs(keyboard.keys) do
for key, key_name in pairs(this.keys) do
if get_release_method:call(hard_keyboard, key) then
cached_config.large_monster_dynamic_UI.ctrl = keyboard.hotkey_modifiers_down.ctrl;
cached_config.large_monster_dynamic_UI.shift = keyboard.hotkey_modifiers_down.shift;
cached_config.large_monster_dynamic_UI.alt = keyboard.hotkey_modifiers_down.alt;
cached_config.large_monster_dynamic_UI.ctrl = this.hotkey_modifiers_down.ctrl;
cached_config.large_monster_dynamic_UI.shift = this.hotkey_modifiers_down.shift;
cached_config.large_monster_dynamic_UI.alt = this.hotkey_modifiers_down.alt;
cached_config.large_monster_dynamic_UI.key = key;
customization_menu.large_monster_dynamic_UI_waiting_for_key = false;
return true;
end
end
elseif customization_menu.large_monster_static_UI_waiting_for_key then
for key, key_name in pairs(keyboard.keys) do
for key, key_name in pairs(this.keys) do
if get_release_method:call(hard_keyboard, key) then
cached_config.large_monster_static_UI.ctrl = keyboard.hotkey_modifiers_down.ctrl;
cached_config.large_monster_static_UI.shift = keyboard.hotkey_modifiers_down.shift;
cached_config.large_monster_static_UI.alt = keyboard.hotkey_modifiers_down.alt;
cached_config.large_monster_static_UI.ctrl = this.hotkey_modifiers_down.ctrl;
cached_config.large_monster_static_UI.shift = this.hotkey_modifiers_down.shift;
cached_config.large_monster_static_UI.alt = this.hotkey_modifiers_down.alt;
cached_config.large_monster_static_UI.key = key;
customization_menu.large_monster_static_UI_waiting_for_key = false;
return true;
end
end
elseif customization_menu.large_monster_highlighted_UI_waiting_for_key then
for key, key_name in pairs(keyboard.keys) do
for key, key_name in pairs(this.keys) do
if get_release_method:call(hard_keyboard, key) then
cached_config.large_monster_highlighted_UI.ctrl = keyboard.hotkey_modifiers_down.ctrl;
cached_config.large_monster_highlighted_UI.shift = keyboard.hotkey_modifiers_down.shift;
cached_config.large_monster_highlighted_UI.alt = keyboard.hotkey_modifiers_down.alt;
cached_config.large_monster_highlighted_UI.ctrl = this.hotkey_modifiers_down.ctrl;
cached_config.large_monster_highlighted_UI.shift = this.hotkey_modifiers_down.shift;
cached_config.large_monster_highlighted_UI.alt = this.hotkey_modifiers_down.alt;
cached_config.large_monster_highlighted_UI.key = key;
customization_menu.large_monster_highlighted_UI_waiting_for_key = false;
return true;
end
end
elseif customization_menu.time_UI_waiting_for_key then
for key, key_name in pairs(keyboard.keys) do
for key, key_name in pairs(this.keys) do
if get_release_method:call(hard_keyboard, key) then
cached_config.time_UI.ctrl = keyboard.hotkey_modifiers_down.ctrl;
cached_config.time_UI.shift = keyboard.hotkey_modifiers_down.shift;
cached_config.time_UI.alt = keyboard.hotkey_modifiers_down.alt;
cached_config.time_UI.ctrl = this.hotkey_modifiers_down.ctrl;
cached_config.time_UI.shift = this.hotkey_modifiers_down.shift;
cached_config.time_UI.alt = this.hotkey_modifiers_down.alt;
cached_config.time_UI.key = key;
customization_menu.time_UI_waiting_for_key = false;
return true;
end
end
elseif customization_menu.damage_meter_UI_waiting_for_key then
for key, key_name in pairs(keyboard.keys) do
for key, key_name in pairs(this.keys) do
if get_release_method:call(hard_keyboard, key) then
cached_config.damage_meter_UI.ctrl = keyboard.hotkey_modifiers_down.ctrl;
cached_config.damage_meter_UI.shift = keyboard.hotkey_modifiers_down.shift;
cached_config.damage_meter_UI.alt = keyboard.hotkey_modifiers_down.alt;
cached_config.damage_meter_UI.ctrl = this.hotkey_modifiers_down.ctrl;
cached_config.damage_meter_UI.shift = this.hotkey_modifiers_down.shift;
cached_config.damage_meter_UI.alt = this.hotkey_modifiers_down.alt;
cached_config.damage_meter_UI.key = key;
customization_menu.damage_meter_UI_waiting_for_key = false;
return true;
end
end
elseif customization_menu.endemic_life_UI_waiting_for_key then
for key, key_name in pairs(keyboard.keys) do
for key, key_name in pairs(this.keys) do
if get_release_method:call(hard_keyboard, key) then
cached_config.endemic_life_UI.ctrl = keyboard.hotkey_modifiers_down.ctrl;
cached_config.endemic_life_UI.shift = keyboard.hotkey_modifiers_down.shift;
cached_config.endemic_life_UI.alt = keyboard.hotkey_modifiers_down.alt;
cached_config.endemic_life_UI.ctrl = this.hotkey_modifiers_down.ctrl;
cached_config.endemic_life_UI.shift = this.hotkey_modifiers_down.shift;
cached_config.endemic_life_UI.alt = this.hotkey_modifiers_down.alt;
cached_config.endemic_life_UI.key = key;
customization_menu.endemic_life_UI_waiting_for_key = false;
return true;
end
end
elseif customization_menu.buff_UI_waiting_for_key then
for key, key_name in pairs(this.keys) do
if get_release_method:call(hard_keyboard, key) then
cached_config.buff_UI.ctrl = this.hotkey_modifiers_down.ctrl;
cached_config.buff_UI.shift = this.hotkey_modifiers_down.shift;
cached_config.buff_UI.alt = this.hotkey_modifiers_down.alt;
cached_config.buff_UI.key = key;
customization_menu.buff_UI_waiting_for_key = false;
return true;
end
end
elseif customization_menu.stats_UI_waiting_for_key then
for key, key_name in pairs(this.keys) do
if get_release_method:call(hard_keyboard, key) then
cached_config.stats_UI.ctrl = this.hotkey_modifiers_down.ctrl;
cached_config.stats_UI.shift = this.hotkey_modifiers_down.shift;
cached_config.stats_UI.alt = this.hotkey_modifiers_down.alt;
cached_config.stats_UI.key = key;
customization_menu.stats_UI_waiting_for_key = false;
return true;
end
end
end
return false;
end
function keyboard.check_hotkeys(hard_keyboard)
function this.check_hotkeys(hard_keyboard)
local cached_config = config.current_config.global_settings.hotkeys_with_modifiers;
if not (cached_config.all_UI.ctrl and not keyboard.hotkey_modifiers_down.ctrl)
and not (cached_config.all_UI.shift and not keyboard.hotkey_modifiers_down.shift)
and not (cached_config.all_UI.alt and not keyboard.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard, math.tointeger(cached_config.all_UI.key)) then
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.alt and not this.hotkey_modifiers_down.alt) 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
or config.current_config.small_monster_UI.enabled
or config.current_config.large_monster_UI.dynamic.enabled
or config.current_config.large_monster_UI.static.enabled
or config.current_config.large_monster_UI.highlighted.enabled
or config.current_config.damage_meter_UI.enabled;
or config.current_config.damage_meter_UI.enabled
or config.current_config.endemic_life_UI.enabled
or config.current_config.buff_UI.enabled
or config.current_config.stats_UI.enabled;
config.current_config.time_UI.enabled = not is_any_enabled;
config.current_config.small_monster_UI.enabled = not is_any_enabled;
@@ -475,21 +536,36 @@ function keyboard.check_hotkeys(hard_keyboard)
config.current_config.large_monster_UI.static.enabled = not is_any_enabled;
config.current_config.large_monster_UI.highlighted.enabled = not is_any_enabled;
config.current_config.damage_meter_UI.enabled = not is_any_enabled;
config.current_config.endemic_life_UI.enabled = not is_any_enabled;
config.current_config.buff_UI.enabled = not is_any_enabled;
config.current_config.stats_UI.enabled = not is_any_enabled;
end
end
if not (cached_config.small_monster_UI.ctrl and not keyboard.hotkey_modifiers_down.ctrl)
and not (cached_config.small_monster_UI.shift and not keyboard.hotkey_modifiers_down.shift)
and not (cached_config.small_monster_UI.alt and not keyboard.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard, math.tointeger(cached_config.small_monster_UI.key)) then
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.alt and not this.hotkey_modifiers_down.alt) 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;
end
end
if not (cached_config.large_monster_UI.ctrl and not keyboard.hotkey_modifiers_down.ctrl)
and not (cached_config.large_monster_UI.shift and not keyboard.hotkey_modifiers_down.shift)
and not (cached_config.large_monster_UI.alt and not keyboard.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard, math.tointeger(cached_config.large_monster_UI.key)) then
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.alt and not this.hotkey_modifiers_down.alt) 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
or config.current_config.large_monster_UI.static.enabled
or config.current_config.large_monster_UI.highlighted.enabled;
@@ -500,60 +576,120 @@ function keyboard.check_hotkeys(hard_keyboard)
end
end
if not (cached_config.large_monster_dynamic_UI.ctrl and not keyboard.hotkey_modifiers_down.ctrl)
and not (cached_config.large_monster_dynamic_UI.shift and not keyboard.hotkey_modifiers_down.shift)
and not (cached_config.large_monster_dynamic_UI.alt and not keyboard.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard,
math.tointeger(cached_config.large_monster_dynamic_UI.key)) then
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.alt and not this.hotkey_modifiers_down.alt) 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;
end
end
if not (cached_config.large_monster_static_UI.ctrl and not keyboard.hotkey_modifiers_down.ctrl)
and not (cached_config.large_monster_static_UI.shift and not keyboard.hotkey_modifiers_down.shift)
and not (cached_config.large_monster_static_UI.alt and not keyboard.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard,
math.tointeger(cached_config.large_monster_static_UI.key)) then
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.alt and not this.hotkey_modifiers_down.alt) 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;
end
end
if not (cached_config.large_monster_highlighted_UI.ctrl and not keyboard.hotkey_modifiers_down.ctrl)
and not (cached_config.large_monster_highlighted_UI.shift and not keyboard.hotkey_modifiers_down.shift)
and not (cached_config.large_monster_highlighted_UI.alt and not keyboard.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard,
math.tointeger(cached_config.large_monster_highlighted_UI.key)) then
config.current_config.large_monster_UI.highlighted.enabled = not
config.current_config.large_monster_UI.highlighted.enabled;
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.alt and not this.hotkey_modifiers_down.alt) then
local large_monster_highlighted_UI_key_release = get_release_method:call(hard_keyboard, math.tointeger(cached_config.large_monster_highlighted_UI.key));
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
if not (cached_config.time_UI.ctrl and not keyboard.hotkey_modifiers_down.ctrl)
and not (cached_config.time_UI.shift and not keyboard.hotkey_modifiers_down.shift)
and not (cached_config.time_UI.alt and not keyboard.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard, math.tointeger(cached_config.time_UI.key)) then
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.alt and not this.hotkey_modifiers_down.alt) 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;
end
end
if not (cached_config.damage_meter_UI.ctrl and not keyboard.hotkey_modifiers_down.ctrl)
and not (cached_config.damage_meter_UI.shift and not keyboard.hotkey_modifiers_down.shift)
and not (cached_config.damage_meter_UI.alt and not keyboard.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard, math.tointeger(cached_config.damage_meter_UI.key)) then
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.alt and not this.hotkey_modifiers_down.alt) 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;
end
end
if not (cached_config.endemic_life_UI.ctrl and not keyboard.hotkey_modifiers_down.ctrl)
and not (cached_config.endemic_life_UI.shift and not keyboard.hotkey_modifiers_down.shift)
and not (cached_config.endemic_life_UI.alt and not keyboard.hotkey_modifiers_down.alt) then
if get_release_method:call(hard_keyboard, math.tointeger(cached_config.endemic_life_UI.key)) then
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.alt and not this.hotkey_modifiers_down.alt) 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;
end
end
if not (cached_config.buff_UI.ctrl and not this.hotkey_modifiers_down.ctrl)
and not (cached_config.buff_UI.shift and not this.hotkey_modifiers_down.shift)
and not (cached_config.buff_UI.alt and not this.hotkey_modifiers_down.alt) then
local buff_UI_key_release = get_release_method:call(hard_keyboard, math.tointeger(cached_config.buff_UI.key));
if buff_UI_key_release == nil then
error_handler.report("keyboard.check_hotkeys", "Failed to access Data: buff_UI_key_release");
elseif buff_UI_key_release then
config.current_config.buff_UI.enabled = not config.current_config.buff_UI.enabled;
end
end
if not (cached_config.stats_UI.ctrl and not this.hotkey_modifiers_down.ctrl)
and not (cached_config.stats_UI.shift and not this.hotkey_modifiers_down.shift)
and not (cached_config.stats_UI.alt and not this.hotkey_modifiers_down.alt) then
local stats_UI_key_release = get_release_method:call(hard_keyboard, math.tointeger(cached_config.stats_UI.key));
if stats_UI_key_release == nil then
error_handler.report("keyboard.check_hotkeys", "Failed to access Data: stats_UI_key_release");
elseif stats_UI_key_release then
config.current_config.stats_UI.enabled = not config.current_config.stats_UI.enabled;
end
end
end
function keyboard.get_hotkey_name(hotkey)
function this.get_hotkey_name(hotkey)
local hotkey_name = "";
if hotkey.ctrl then
@@ -568,17 +704,22 @@ function keyboard.get_hotkey_name(hotkey)
hotkey_name = hotkey_name .. "Alt + ";
end
return hotkey_name .. tostring(keyboard.keys[hotkey.key]);
return hotkey_name .. tostring(this.keys[hotkey.key]);
end
function keyboard.init_module()
function this.init_dependencies()
config = require "MHR_Overlay.Misc.config"
singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
damage_meter_UI = require("MHR_Overlay.UI.Modules.damage_meter_UI");
time = require("MHR_Overlay.Game_Handler.time");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return keyboard;
function this.init_module()
end
return this;

View File

@@ -1,15 +1,49 @@
local quest_status = {};
local this = {};
local singletons;
local customization_menu;
local player;
local players;
local small_monster;
local large_monster;
local damage_meter_UI;
local time;
local env_creature;
local non_players;
local error_handler;
quest_status.flow_states = {
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.flow_states = {
NONE = 0,
IN_LOBBY = 1,
IN_TRAINING_AREA = 2,
@@ -31,12 +65,15 @@ quest_status.flow_states = {
SUMMARY_SCREEN = 32768,
};
quest_status.previous_flow_state = quest_status.flow_states.NONE;
quest_status.flow_state = quest_status.flow_states.NONE;
this.previous_flow_state = this.flow_states.NONE;
this.flow_state = this.flow_states.NONE;
quest_status.index = 0;
quest_status.is_online = false;
quest_status.is_quest_host = false;
this.index = 0;
this.is_online = false;
--quest_status.is_quest_host = false;
this.cart_count = 0;
this.max_cart_count = 3;
local quest_manager_type_def = sdk.find_type_definition("snow.QuestManager");
local on_changed_game_status_method = quest_manager_type_def:get_method("onChangedGameStatus");
@@ -46,6 +83,9 @@ local set_quest_clear_sub_method = quest_manager_type_def:get_method("setQuestCl
local set_quest_clear_sub_hyakurui_method = quest_manager_type_def:get_method("setQuestClearSubHyakuryu");
local set_quest_fail_method = quest_manager_type_def:get_method("setQuestFail");
local get_death_num_method = quest_manager_type_def:get_method("getDeathNum");
local get_quest_life_method = quest_manager_type_def:get_method("getQuestLife");
local game_manager_type_def = sdk.find_type_definition("snow.SnowGameManager");
local get_status_method = game_manager_type_def:get_method("getStatus");
@@ -77,8 +117,18 @@ 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 event_manager_dispose_method = unique_event_manager_type_def:get_method("dispose");
function quest_status.get_flow_state(flow_state, new_line)
for key, value in pairs(quest_status.flow_states) do
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)
for key, value in pairs(this.flow_states) do
if value == flow_state then
if new_line then
return "\n" .. tostring(key);
@@ -89,316 +139,398 @@ function quest_status.get_flow_state(flow_state, new_line)
end
end
--type 2 = quest start
--type 3 = monster killcam
--type 5 = end screen
function quest_status.on_demo_request_activation(request_data_base)
if request_data_base == nil then
function this.set_flow_state(new_flow_state)
this.previous_flow_state = this.flow_state;
this.flow_state = new_flow_state;
if this.flow_state >= this.flow_states.KILLCAM then
damage_meter_UI.freeze_displayed_players = true;
else
damage_meter_UI.freeze_displayed_players = false;
end
if this.flow_state == this.flow_states.IN_LOBBY or this.flow_state == this.flow_states.IN_TRAINING_AREA then
players.init();
non_players.init();
small_monster.init_list();
large_monster.init_list();
env_creature.init_list();
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
this.get_max_cart_count();
end
players.update_players();
end
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
if quest_status.index ~= 2 then
local death_num = get_death_num_method:call(singletons.quest_manager);
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;
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
function this.get_max_cart_count()
if singletons.quest_manager == nil then
error_handler.report("quest_status.get_max_cart_count", "Failed to access Data: quest_manager");
return;
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
--type 2 = quest start
--type 3 = monster killcam
--type 5 = end screen
function this.on_demo_request_activation(request_data_base)
if request_data_base == nil then
error_handler.report("quest_status.on_demo_request_activation", "Missing Parameter: request_data_base");
return;
end
if this.index ~= 2 then
return;
end
local request_data_type = request_data_base:call("get_Type");
if request_data_type == nil then
error_handler.report("quest_status.on_demo_request_activation", "Failed to access Data: request_data_type");
return;
end
-- QUEST_START_ANIMATION
if request_data_type == 2 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.QUEST_START_ANIMATION;
this.set_flow_state(this.flow_states.QUEST_START_ANIMATION);
-- KILLCAM
elseif request_data_type == 3 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.KILLCAM;
this.set_flow_state(this.flow_states.KILLCAM);
-- QUEST_END_ANIMATION
elseif request_data_type == 5 or request_data_type == 6 or request_data_type == 7 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.QUEST_END_ANIMATION;
this.set_flow_state(this.flow_states.QUEST_END_ANIMATION);
-- PLAYER_DEATH_ANIMATION
elseif request_data_type == 8 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.PLAYER_DEATH_ANIMATION;
this.set_flow_state(this.flow_states.PLAYER_DEATH_ANIMATION);
-- PLAYER_CART_ANIMATION
elseif request_data_type == 9 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.PLAYER_CART_ANIMATION;
this.set_flow_state(this.flow_states.PLAYER_CART_ANIMATION);
-- FAST_TRAVEL_ANIMATION
elseif request_data_type == 10 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.FAST_TRAVEL_ANIMATION;
this.set_flow_state(this.flow_states.FAST_TRAVEL_ANIMATION);
-- WYVERN_RIDING_START_ANIMATION
elseif request_data_type == 11 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.WYVERN_RIDING_START_ANIMATION;
this.set_flow_state(this.flow_states.WYVERN_RIDING_START_ANIMATION);
end
end
function quest_status.on_demo_end()
if quest_status.index == 2 then
if quest_status.flow_state == quest_status.flow_states.PLAYER_DEATH_ANIMATION
or quest_status.flow_state == quest_status.flow_states.PLAYER_CART_ANIMATION
or quest_status.flow_state == quest_status.flow_states.FAST_TRAVEL_ANIMATION
or quest_status.flow_state == quest_status.flow_states.WYVERN_RIDING_START_ANIMATION then
function this.on_demo_end()
if this.index == 2 then
if this.flow_state == this.flow_states.PLAYER_DEATH_ANIMATION
or this.flow_state == this.flow_states.PLAYER_CART_ANIMATION
or this.flow_state == this.flow_states.FAST_TRAVEL_ANIMATION
or this.flow_state == this.flow_states.WYVERN_RIDING_START_ANIMATION then
local next_flow_state = quest_status.previous_flow_state;
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = next_flow_state;
this.set_flow_state(this.previous_flow_state);
elseif quest_status.flow_state == quest_status.flow_states.QUEST_START_ANIMATION then
elseif this.flow_state == this.flow_states.QUEST_START_ANIMATION then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.PLAYING_QUEST;
this.set_flow_state(this.flow_states.PLAYING_QUEST);
elseif quest_status.flow_state == quest_status.flow_states.KILLCAM then
elseif this.flow_state == this.flow_states.KILLCAM then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.QUEST_END_TIMER;
this.set_flow_state(this.flow_states.QUEST_END_TIMER);
end
end
end
function quest_status.on_set_quest_clear()
if quest_status.index == 2 and quest_status.flow_state ~= quest_status.flow_states.KILLCAM then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.QUEST_END_TIMER;
function this.on_set_quest_clear()
if this.index == 2 and this.flow_state ~= this.flow_states.KILLCAM then
this.set_flow_state(this.flow_states.QUEST_END_TIMER);
end
end
function quest_status.on_quest_end_set_state()
if quest_status.index == 2 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.QUEST_END_SCREEN;
function this.on_quest_end_set_state()
if this.index == 2 then
this.set_flow_state(this.flow_states.QUEST_END_SCREEN);
end
end
function quest_status.on_gui_result_reward_do_open()
if quest_status.index == 3 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.REWARD_SCREEN;
function this.on_gui_result_reward_do_open()
if this.index == 3 then
this.set_flow_state(this.flow_states.REWARD_SCREEN);
end
end
function quest_status.on_gui_result_pay_off_do_open()
if quest_status.index == 3 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.SUMMARY_SCREEN;
function this.on_gui_result_pay_off_do_open()
if this.index == 3 then
this.set_flow_state(this.flow_states.SUMMARY_SCREEN);
end
end
function quest_status.on_play_event_common()
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.CUTSCENE;
function this.on_play_event_common()
this.set_flow_state(this.flow_states.CUTSCENE);
end
function quest_status.on_event_manager_dispose()
if quest_status.flow_state == quest_status.flow_states.CUTSCENE then
function this.on_event_manager_dispose()
if this.flow_state == this.flow_states.CUTSCENE then
this.set_flow_state(this.previous_flow_state);
end
end
function this.on_set_quest_fail()
if this.flow_state == this.flow_states.PLAYER_DEATH_ANIMATION or
this.flow_state == this.flow_states.PLAYER_CART_ANIMATION or
this.flow_state == this.flow_states.FAST_TRAVEL_ANIMATION or
this.flow_state == this.flow_states.WYVERN_RIDING_START_ANIMATION then
local next_flow_state = quest_status.previous_flow_state;
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = next_flow_state;
this.set_flow_state(this.flow_states.QUEST_END_ANIMATION);
end
end
function quest_status.on_set_quest_fail()
if quest_status.flow_state == quest_status.flow_states.PLAYER_DEATH_ANIMATION or
quest_status.flow_state == quest_status.flow_states.PLAYER_CART_ANIMATION or
quest_status.flow_state == quest_status.flow_states.FAST_TRAVEL_ANIMATION or
quest_status.flow_state == quest_status.flow_states.WYVERN_RIDING_START_ANIMATION then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.QUEST_END_ANIMATION;
end
end
function quest_status.on_village_fast_travel(area)
function this.on_village_fast_travel(area)
if area == nil then
error_handler.report("quest_status.on_village_fast_travel", "Missing Parameter: area");
return;
end
quest_status.previous_flow_state = quest_status.flow_state;
if area == 7 then
quest_status.flow_state = quest_status.flow_states.IN_TRAINING_AREA;
this.set_flow_state(this.flow_states.IN_TRAINING_AREA);
else
quest_status.flow_state = quest_status.flow_states.IN_LOBBY;
this.set_flow_state(this.flow_states.IN_LOBBY);
end
end
function quest_status.on_changed_game_status(new_quest_status)
quest_status.index = new_quest_status;
if quest_status.index < 3 then
player.init();
small_monster.init_list();
large_monster.init_list();
env_creature.init_list();
quest_status.is_quest_clear = false;
damage_meter_UI.freeze_displayed_players = false;
damage_meter_UI.last_displayed_players = {};
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
if quest_status.index == 0 then
quest_status.flow_state = quest_status.flow_states.NONE;
elseif quest_status.index == 1 then
quest_status.flow_state = quest_status.flow_states.IN_LOBBY;
elseif quest_status.index == 2 then
quest_status.flow_state = quest_status.flow_states.LOADING_QUEST;
elseif quest_status.index == 3 then
quest_status.flow_state = quest_status.flow_states.SUMMARY_SCREEN;
this.index = new_quest_status;
if this.index == 0 then
this.set_flow_state(this.flow_states.NONE);
elseif this.index == 1 then
this.set_flow_state(this.flow_states.IN_LOBBY);
elseif this.index == 2 then
this.set_flow_state(this.flow_states.LOADING_QUEST);
elseif this.index == 3 then
this.set_flow_state(this.flow_states.SUMMARY_SCREEN);
end
end
function quest_status.init()
function this.init()
if singletons.quest_manager == nil then
error_handler.report("quest_status.init", "Failed to access Data: quest_manager");
return;
end
local new_quest_status = get_status_method:call(singletons.game_manager);
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;
end
quest_status.index = new_quest_status;
this.index = new_quest_status;
if quest_status.index == 0 then
quest_status.flow_state = quest_status.flow_states.NONE;
elseif quest_status.index == 1 then
quest_status.flow_state = quest_status.flow_states.IN_LOBBY;
elseif quest_status.index == 2 then
quest_status.flow_state = quest_status.flow_states.PLAYING_QUEST;
elseif quest_status.index == 3 then
quest_status.flow_state = quest_status.flow_states.SUMMARY_SCREEN;
if this.index == 0 then
this.set_flow_state(this.flow_states.NONE);
elseif this.index == 1 then
this.set_flow_state(this.flow_states.IN_LOBBY);
elseif this.index == 2 then
this.set_flow_state(this.flow_states.PLAYING_QUEST);
elseif this.index == 3 then
this.set_flow_state(this.flow_states.SUMMARY_SCREEN);
end
quest_status.update_is_online();
quest_status.update_is_training_area();
this.update_is_training_area();
end
function quest_status.update_is_online()
function this.update_is_online()
if singletons.lobby_manager == nil then
error_handler.report("quest_status.update_is_online", "Failed to access Data: lobby_manager");
return;
end
local is_quest_online = is_quest_online_method:call(singletons.lobby_manager);
if is_quest_online == nil then
error_handler.report("quest_status.update_is_online", "Failed to access Data: is_quest_online");
return;
end
if quest_status.is_online and not is_quest_online then
damage_meter_UI.freeze_displayed_players = true;
end
quest_status.is_online = is_quest_online;
this.is_online = is_quest_online;
end
function quest_status.update_is_quest_host()
--[[function quest_status.update_is_quest_host()
if singletons.lobby_manager == nil then
error_handler.report("quest_status.update_is_quest_host", "Failed to access Data: lobby_manager");
return;
end
local is_quest_host = is_quest_host_method:call(singletons.lobby_manager, true);
if is_quest_host == nil then
error_handler.report("quest_status.update_is_quest_host", "Failed to access Data: is_quest_host");
return;
end
quest_status.is_quest_host = is_quest_host;
end
end--]]
function quest_status.update_is_training_area()
function this.update_is_training_area()
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;
end
local _is_training_area = check_current_area_training_area_method:call(singletons.village_area_manager);
if _is_training_area == nil then
local is_training_area = check_current_area_training_area_method:call(singletons.village_area_manager);
if is_training_area == nil then
error_handler.report("quest_status.update_is_training_area", "Failed to access Data: is_training_area");
return;
end
if _is_training_area then
quest_status.flow_state = quest_status.flow_states.IN_TRAINING_AREA;
if is_training_area then
this.set_flow_state(this.flow_states.IN_TRAINING_AREA);
end
end
function quest_status.init_module()
function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
damage_meter_UI = require("MHR_Overlay.UI.Modules.damage_meter_UI");
time = require("MHR_Overlay.Game_Handler.time");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
non_players = require("MHR_Overlay.Damage_Meter.non_players");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
quest_status.init();
function this.init_module()
this.init();
sdk.hook(on_changed_game_status_method, function(args)
quest_status.on_changed_game_status(sdk.to_int64(args[3]));
this.on_changed_game_status(sdk.to_int64(args[3]));
end, function(retval) return retval; end);
sdk.hook(set_quest_clear_method, function(args)
quest_status.on_set_quest_clear();
this.on_set_quest_clear();
end, function(retval) return retval; end);
sdk.hook(set_quest_clear_sub_method, function(args)
quest_status.on_set_quest_clear();
this.on_set_quest_clear();
end, function(retval) return retval; end);
sdk.hook(set_quest_clear_sub_hyakurui_method, function(args)
quest_status.on_set_quest_clear();
this.on_set_quest_clear();
end, function(retval) return retval; end);
sdk.hook(demo_request_activation_method, function(args)
quest_status.on_demo_request_activation(sdk.to_managed_object(args[3]));
this.on_demo_request_activation(sdk.to_managed_object(args[3]));
end, function(retval) return retval; end);
sdk.hook(demo_end_method, function(args)
quest_status.on_demo_end();
this.on_demo_end();
end, function(retval) return retval; end);
sdk.hook(set_quest_clear_method, function(args)
quest_status.on_set_quest_clear();
this.on_set_quest_clear();
end, function(retval) return retval; end);
sdk.hook(quest_end_set_state_method, function(args)
quest_status.on_quest_end_set_state();
this.on_quest_end_set_state();
end, function(retval) return retval; end);
sdk.hook(gui_result_reward_do_open_method, function(args)
quest_status.on_gui_result_reward_do_open();
this.on_gui_result_reward_do_open();
end, function(retval) return retval; end);
sdk.hook(gui_result_pay_off_do_open_method, function(args)
quest_status.on_gui_result_pay_off_do_open();
this.on_gui_result_pay_off_do_open();
end, function(retval) return retval; end);
sdk.hook(play_event_common_method, function(args)
quest_status.on_play_event_common();
this.on_play_event_common();
end, function(retval) return retval; end);
sdk.hook(event_manager_dispose_method, function(args)
quest_status.on_event_manager_dispose();
this.on_event_manager_dispose();
end, function(retval) return retval; end);
sdk.hook(set_quest_fail_method, function(args)
quest_status.on_set_quest_fail();
this.on_set_quest_fail();
end, function(retval) return retval; end);
sdk.hook(fast_travel_method, function(args)
quest_status.on_village_fast_travel(sdk.to_int64(args[3]));
this.on_village_fast_travel(sdk.to_int64(args[3]));
end, function(retval) return retval; end);
end
return quest_status;
return this;

View File

@@ -1,27 +1,64 @@
local screen = {};
local this = {};
local config;
local singletons;
local utils;
local time;
local error_handler;
screen.width = 1920;
screen.height = 1080;
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;
function screen.update_window_size()
this.width = 1920;
this.height = 1080;
function this.update_window_size()
local width;
local height;
if d2d ~= nil then
width, height = d2d.surface_size();
else
width, height = screen.get_game_window_size();
end
-- if d2d ~= nil and config.current_config.global_settings.renderer.use_d2d_if_available then
-- width, height = d2d.surface_size();
-- else
-- width, height = this.get_game_window_size();
-- end
width, height = this.get_game_window_size();
if width ~= nil then
screen.width = width;
this.width = width;
end
if height ~= nil then
screen.height = height;
this.height = height;
end
end
@@ -33,40 +70,38 @@ local size_type = get_size_method:get_return_type();
local width_field = size_type:get_field("w");
local height_field = size_type:get_field("h");
function screen.get_game_window_size()
function this.get_game_window_size()
if scene_view == nil then
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
--log.error("[MHR_Overlay.lua] No scene view");
error_handler.report("screen.get_game_window_size", "Failed to access Data: scene_view");
return;
end
end
local size = get_size_method:call(scene_view);
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;
end
local screen_width = width_field:get_data(size);
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;
end
local screen_height = height_field:get_data(size);
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;
end
return screen_width, screen_height;
end
function screen.calculate_absolute_coordinates(position)
function this.calculate_absolute_coordinates(position)
local global_position_modifier = config.current_config.global_settings.modifiers.global_position_modifier;
local _position = {
@@ -81,29 +116,35 @@ function screen.calculate_absolute_coordinates(position)
-- top right
if position.anchor == "Top-Right" then
local screen_x = screen.width - _position.x;
local screen_x = this.width - _position.x;
return { x = screen_x, y = _position.y };
end
-- bottom left
if position.anchor == "Bottom-Left" then
local screen_y = screen.height - _position.y;
local screen_y = this.height - _position.y;
return { x = _position.x, y = screen_y };
end
-- bottom right
if position.anchor == "Bottom-Right" then
local screen_x = screen.width - _position.x;
local screen_y = screen.height - _position.y;
local screen_x = this.width - _position.x;
local screen_y = this.height - _position.y;
return { x = screen_x, y = screen_y };
end
return { x = _position.x, y = _position.y };
end
function screen.init_module()
function this.init_dependencies()
config = require("MHR_Overlay.Misc.config");
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
return screen;
function this.init_module()
end
return this;

View File

@@ -1,178 +1,227 @@
local singletons = {};
local this = {};
singletons.message_manager = nil;
singletons.enemy_manager = nil;
singletons.lobby_manager = nil;
singletons.progress_manager = nil;
singletons.quest_manager = nil;
singletons.player_manager = nil;
singletons.village_area_manager = nil;
singletons.gui_manager = nil;
singletons.game_keyboard = nil;
singletons.scene_manager = nil;
singletons.game_manager = nil;
local time;
local utils;
local error_handler;
function singletons.init()
singletons.init_message_manager();
singletons.init_enemy_manager();
singletons.init_lobby_manager()
singletons.init_progress_manager();
singletons.init_quest_manager();
singletons.init_player_manager();
singletons.init_village_area_manager();
singletons.init_gui_manager();
singletons.init_game_keyboard();
singletons.init_scene_manager();
singletons.init_game_manager();
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.message_manager = nil;
this.enemy_manager = nil;
this.lobby_manager = nil;
this.progress_manager = nil;
this.quest_manager = nil;
this.player_manager = nil;
this.village_area_manager = nil;
this.gui_manager = nil;
this.game_keyboard = nil;
this.scene_manager = nil;
this.game_manager = nil;
function this.update()
this.update_message_manager();
this.update_enemy_manager();
this.update_lobby_manager()
this.update_progress_manager();
this.update_quest_manager();
this.update_player_manager();
this.update_village_area_manager();
this.update_gui_manager();
this.update_game_keyboard();
this.update_scene_manager();
this.update_game_manager();
this.update_servant_manager();
this.update_otomo_manager();
this.update_long_sword_shell_manager();
this.update_light_bowgun_shell_manager();
this.update_horn_shell_manager();
end
function singletons.init_message_manager()
if singletons.message_manager ~= nil then
return;
function this.update_message_manager()
this.message_manager = sdk.get_managed_singleton("snow.gui.MessageManager");
if this.message_manager == nil then
error_handler.report("singletons.update_message_manager", "Failed to access Data: message_manager");
end
singletons.message_manager = sdk.get_managed_singleton("snow.gui.MessageManager");
if singletons.message_manager == nil then
--log.error("[MHR Overlay] No message manager");
end
return singletons.message_manager;
return this.message_manager;
end
function singletons.init_enemy_manager()
if singletons.enemy_manager ~= nil then
return;
function this.update_enemy_manager()
this.enemy_manager = sdk.get_managed_singleton("snow.enemy.EnemyManager");
if this.enemy_manager == nil then
error_handler.report("singletons.update_enemy_manager", "Failed to access Data: enemy_manager");
end
singletons.enemy_manager = sdk.get_managed_singleton("snow.enemy.EnemyManager");
if singletons.enemy_manager == nil then
--log.error("[MHR Overlay] No enemy manager");
end
return singletons.enemy_manager;
return this.enemy_manager;
end
function singletons.init_lobby_manager()
if singletons.lobby_manager ~= nil then
return;
end
singletons.lobby_manager = sdk.get_managed_singleton("snow.LobbyManager");
if singletons.lobby_manager == nil then
--log.error("[MHR Overlay] No lobby manager");
function this.update_lobby_manager()
this.lobby_manager = sdk.get_managed_singleton("snow.LobbyManager");
if this.lobby_manager == nil then
error_handler.report("singletons.update_lobby_manager", "Failed to access Data: lobby_manager");
return false;
end
return singletons.lobby_manager;
return this.lobby_manager;
end
function singletons.init_progress_manager()
if singletons.progress_manager ~= nil then
return;
end
singletons.progress_manager = sdk.get_managed_singleton("snow.progress.ProgressManager");
if singletons.progress_manager == nil then
--log.error("[MHR Overlay] No progress manager");
function this.update_progress_manager()
this.progress_manager = sdk.get_managed_singleton("snow.progress.ProgressManager");
if this.progress_manager == nil then
error_handler.report("singletons.update_progress_manager", "Failed to access Data: progress_manager");
return false;
end
return singletons.progress_manager;
return this.progress_manager;
end
function singletons.init_quest_manager()
if singletons.quest_manager ~= nil then
return;
function this.update_quest_manager()
this.quest_manager = sdk.get_managed_singleton("snow.QuestManager");
if this.quest_manager == nil then
error_handler.report("singletons.update_quest_manager", "Failed to access Data: quest_manager");
end
singletons.quest_manager = sdk.get_managed_singleton("snow.QuestManager");
if singletons.quest_manager == nil then
--log.error("[MHR Overlay] No quest manager");
end
return singletons.quest_manager;
return this.quest_manager;
end
function singletons.init_player_manager()
if singletons.player_manager ~= nil then
return;
function this.update_player_manager()
this.player_manager = sdk.get_managed_singleton("snow.player.PlayerManager");
if this.player_manager == nil then
error_handler.report("singletons.update_player_manager", "Failed to access Data: player_manager");
end
singletons.player_manager = sdk.get_managed_singleton("snow.player.PlayerManager");
if singletons.player_manager == nil then
--log.error("[MHR Overlay] No player manager");
end
return singletons.player_manager;
return this.player_manager;
end
function singletons.init_village_area_manager()
if singletons.village_area_manager ~= nil then
return;
function this.update_village_area_manager()
this.village_area_manager = sdk.get_managed_singleton("snow.VillageAreaManager");
if this.village_area_manager == nil then
error_handler.report("singletons.update_village_area_manager", "Failed to access Data: village_area_manager");
end
singletons.village_area_manager = sdk.get_managed_singleton("snow.VillageAreaManager");
if singletons.village_area_manager == nil then
--log.error("[MHR Overlay] No village area manager");
end
return singletons.village_area_manager;
return this.village_area_manager;
end
function singletons.init_gui_manager()
if singletons.gui_manager ~= nil then
return;
function this.update_gui_manager()
this.gui_manager = sdk.get_managed_singleton("snow.gui.GuiManager");
if this.gui_manager == nil then
error_handler.report("singletons.update_gui_manager", "Failed to access Data: gui_manager");
end
singletons.gui_manager = sdk.get_managed_singleton("snow.gui.GuiManager");
if singletons.gui_manager == nil then
--log.error("[MHR Overlay] No gui manager");
end
return singletons.gui_manager;
return this.gui_manager;
end
function singletons.init_game_keyboard()
if singletons.game_keyboard ~= nil then
return;
function this.update_game_keyboard()
this.game_keyboard = sdk.get_managed_singleton("snow.GameKeyboard");
if this.game_keyboard == nil then
error_handler.report("singletons.update_game_keyboard", "Failed to access Data: game_keyboard");
end
singletons.game_keyboard = sdk.get_managed_singleton("snow.GameKeyboard");
if singletons.game_keyboard == nil then
--log.error("[MHR Overlay] No game keyboard");
end
return singletons.game_keyboard;
return this.game_keyboard;
end
function singletons.init_scene_manager()
if singletons.scene_manager ~= nil then
return;
function this.update_scene_manager()
this.scene_manager = sdk.get_native_singleton("via.SceneManager");
if this.scene_manager == nil then
error_handler.report("singletons.update_scene_manager", "Failed to access Data: scene_manager");
end
singletons.scene_manager = sdk.get_native_singleton("via.SceneManager");
if singletons.scene_manager == nil then
--log.error("[MHR Overlay] No enemy manager");
end
return singletons.scene_manager;
return this.scene_manager;
end
function singletons.init_game_manager()
if singletons.game_manager ~= nil then
return;
function this.update_game_manager()
this.game_manager = sdk.get_managed_singleton("snow.SnowGameManager");
if this.game_manager == nil then
error_handler.report("singletons.update_game_manager", "Failed to access Data: game_manager");
end
singletons.game_manager = sdk.get_managed_singleton("snow.SnowGameManager");
if singletons.game_manager == nil then
--log.error("[MHR Overlay] No enemy manager");
return this.game_manager;
end
function this.update_servant_manager()
this.servant_manager = sdk.get_managed_singleton("snow.ai.ServantManager");
if this.servant_manager == nil then
error_handler.report("singletons.update_servant_manager", "Failed to access Data: servant_manager");
end
return singletons.game_manager;
return this.servant_manager;
end
function singletons.init_module()
singletons.init();
function this.update_otomo_manager()
this.otomo_manager = sdk.get_managed_singleton("snow.otomo.OtomoManager");
if this.otomo_manager == nil then
error_handler.report("singletons.update_otomo_manager", "Failed to access Data: otomo_manager");
end
return this.otomo_manager;
end
return singletons;
function this.update_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.update_long_sword_shell_manager", "Failed to access Data: long_sword_shell_manager");
end
return this.long_sword_shell_manager;
end
function this.update_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.update_light_bowgun_shell_manager", "Failed to access Data: light_bowgun_shell_manager");
end
return this.light_bowgun_shell_manager;
end
function this.update_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.update_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()
this.update();
end
return this;

View File

@@ -1,96 +1,189 @@
local time = {};
local this = {};
local singletons;
local customization_menu;
local quest_status;
local player;
local players;
local non_players;
local config;
local small_monster;
local utils;
local error_handler;
local screen;
local buffs;
local player_info;
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 quest_manager_type_def = sdk.find_type_definition("snow.QuestManager");
local get_quest_elapsed_time_min_method = quest_manager_type_def:get_method("getQuestElapsedTimeMin");
local get_quest_elapsed_time_sec_method = quest_manager_type_def:get_method("getQuestElapsedTimeSec");
time.total_elapsed_seconds = 0;
time.elapsed_minutes = 0;
time.elapsed_seconds = 0;
this.total_elapsed_seconds = 0;
this.elapsed_minutes = 0;
this.elapsed_seconds = 0;
time.total_elapsed_script_seconds = 0;
time.last_elapsed_script_seconds = 0;
this.total_elapsed_script_seconds = 0;
function time.update_script_time()
time.total_elapsed_script_seconds = os.clock();
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 time.tick()
time.update_script_time();
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)
if delay_timer == nil then
return;
end
this.delay_timer_list[delay_timer.callback] = nil;
end
function this.init_global_timers()
local cached_config = config.current_config.global_settings.performance.timer_delays;
this.timer_list = {};
this.new_timer(singletons.update, cached_config.update_singletons_delay);
this.new_timer(screen.update_window_size, cached_config.update_window_size_delay);
this.new_timer(quest_status.update_is_online, cached_config.update_is_online_delay);
this.new_timer(this.update_quest_time, cached_config.update_quest_time_delay);
this.new_timer(players.update_players, cached_config.update_players_delay);
this.new_timer(players.update_myself_position, cached_config.update_myself_position_delay);
this.new_timer(buffs.update, cached_config.update_buffs_delay);
this.new_timer(player_info.update, cached_config.update_player_info_delay);
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()
this.total_elapsed_script_seconds = os.clock();
end
function this.update_quest_time()
if singletons.quest_manager == nil then
return;
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);
if quest_time_elapsed_minutes == nil then
customization_menu.status = "No quest time elapsed minutes";
return;
error_handler.report("time.update_quest_time", "Failed to access Data: quest_time_elapsed_minutes");
else
this.elapsed_minutes = quest_time_elapsed_minutes;
end
time.elapsed_minutes = quest_time_elapsed_minutes;
local quest_time_total_elapsed_seconds = get_quest_elapsed_time_sec_method:call(singletons.quest_manager);
if quest_time_total_elapsed_seconds == nil then
customization_menu.status = "No quest time total elapsed seconds";
return;
error_handler.report("time.update_quest_time", "Failed to access Data: quest_time_total_elapsed_seconds");
else
this.total_elapsed_seconds = quest_time_total_elapsed_seconds;
end
time.total_elapsed_seconds = quest_time_total_elapsed_seconds;
time.elapsed_seconds = quest_time_total_elapsed_seconds - quest_time_elapsed_minutes * 60;
if time.total_elapsed_script_seconds - time.last_elapsed_script_seconds > 1 then
time.last_elapsed_script_seconds = time.total_elapsed_script_seconds;
time.update_players_dps();
end
this.elapsed_seconds = quest_time_total_elapsed_seconds - quest_time_elapsed_minutes * 60;
end
function time.update_players_dps()
local cached_config = config.current_config.damage_meter_UI.settings;
if cached_config.freeze_dps_on_quest_clear and quest_status.is_quest_clear then
return;
end
local new_total_dps = 0;
for _, _player in pairs(player.list) do
if _player.join_time == -1 then
_player.join_time = time.total_elapsed_script_seconds;
end
if cached_config.dps_mode == "Quest Time" then
if time.total_elapsed_seconds > 0 then
_player.dps = _player.display.total_damage / time.total_elapsed_seconds;
end
elseif cached_config.dps_mode == "Join Time" then
if time.total_elapsed_script_seconds - _player.join_time > 0 then
_player.dps = _player.display.total_damage / (time.total_elapsed_script_seconds - _player.join_time);
end
elseif cached_config.dps_mode == "First Hit" then
if time.total_elapsed_script_seconds - _player.first_hit_time > 0 then
_player.dps = _player.display.total_damage / (time.total_elapsed_script_seconds - _player.first_hit_time);
end
end
new_total_dps = new_total_dps + _player.dps;
end
player.total.dps = new_total_dps;
end
function time.init_module()
player = require("MHR_Overlay.Damage_Meter.player");
function this.init_dependencies()
players = require("MHR_Overlay.Damage_Meter.players");
singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu");
config = require("MHR_Overlay.Misc.config");
small_monster = require("MHR_Overlay.Monsters.small_monster");
quest_status = require("MHR_Overlay.Game_Handler.quest_status");
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
return time;
function this.init_module()
end
return this;

File diff suppressed because it is too large Load Diff

View File

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

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,10 +1,89 @@
local language = {};
local table_helpers;
local this = {};
language.language_folder = "MHR Overlay\\languages\\";
local utils;
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.language_folder = "MHR Overlay\\languages\\";
-- this.chinese_ranges = {
-- 0x0020, 0x00FF, -- Basic Latin + Latin Supplement
-- 0x2000, 0x206F, -- General Punctuations
-- 0x2E80, 0x2EFF, -- CJK Radicals Supplement
-- 0x3000, 0x303F, -- CJK Symbols and Punctuations
-- 0x3200, 0x4DBF, -- Enclosed CJK Letters and Months, CJK Compatibility, CJK Unified Ideographs Extension A
-- 0x4E00, 0x9FFF, -- CJK Unified Ideograms
-- 0xF900, 0xFAFF, -- CJK Compatibility Ideographs
-- 0xFE30, 0xFE4F, -- CJK Compatibility Forms
-- 0xFF00, 0xFFEF, -- Half-width characters
-- 0
-- };
-- this.japanese_glyph_ranges = {
-- 0x0020, 0x00FF, -- Basic Latin + Latin Supplement
-- 0x2000, 0x206F, -- General Punctuation
-- 0x2E80, 0x2EFF, -- CJK Radicals Supplement
-- 0x3000, 0x30FF, -- CJK Symbols and Punctuations, Hiragana, Katakana
-- 0x31F0, 0x4DBF, -- Katakana Phonetic Extensions, Enclosed CJK Letters and Months, CJK Compatibility, CJK Unified Ideographs Extension A
-- 0x4E00, 0x9FFF, -- CJK Unified Ideograms
-- 0xF900, 0xFAFF, -- CJK Compatibility Ideographs
-- 0xFE30, 0xFE4F, -- CJK Compatibility Forms
-- 0xFF00, 0xFFEF, -- Half-width characters
-- 0
-- };
-- this.korean_glyph_ranges = {
-- 0x0020, 0x00FF, -- Basic Latin + Latin Supplement
-- 0x1100, 0x11FF, -- Hangul Jamo
-- 0x2000, 0x206F, -- General Punctuation
-- 0x2E80, 0x2EFF, -- CJK Radicals Supplement
-- 0x3000, 0x303F, -- CJK Symbols and Punctuations
-- 0x3130, 0x318F, -- Hangul Compatibility Jamo
-- 0x3200, 0x4DBF, -- Enclosed CJK Letters and Months, CJK Compatibility, CJK Unified Ideographs Extension A
-- 0x4E00, 0x9FFF, -- CJK Unified Ideograms
-- 0xAC00, 0xD7AF, -- Hangul Syllables
-- 0xF900, 0xFAFF, -- CJK Compatibility Ideographs
-- 0xFE30, 0xFE4F, -- CJK Compatibility Forms
-- 0xFF00, 0xFFEF, -- Half-width characters
-- 0
-- }
this.current_language = {};
this.default_language = {
font_name = nil,
unicode_glyph_ranges = nil,
language.default_language = {
font_name = "NotoSansKR-Bold.otf",
parts = {
head = "Head",
neck = "Neck",
@@ -88,7 +167,9 @@ language.default_language = {
chest = "Chest",
shell = "Shell",
thundersacs = "Thundersacs"
thundersacs = "Thundersacs",
amatsu_unknown = "?"
},
ailments = {
@@ -96,14 +177,17 @@ language.default_language = {
sleep = "Sleep",
stun = "Stun",
flash = "Flash",
poison = "Poison",
blast = "Blast",
exhaust = "Exhaust",
ride = "Wyvern Riding",
waterblight = "Waterblight",
poison = "Poison",
deadly_poison = "Deadly Poison",
fireblight = "Fireblight",
iceblight = "Iceblight",
waterblight = "Waterblight",
thunderblight = "Thunderblight",
iceblight = "Iceblight",
fall_trap = "Fall Trap",
shock_trap = "Shock Trap",
@@ -112,7 +196,266 @@ language.default_language = {
steel_fang = "Steel Fang",
quick_sand = "Quick Sand",
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"
},
item_buffs = {
demondrug = "Demondrug",
mega_demondrug = "Mega Demondrug",
armorskin = "Armorskin",
mega_armorskin = "Mega Armorskin",
might_seed = "Might Seed",
adamant_seed = "Adamant Seed",
demon_powder = "Demon Powder",
hardshell_powder = "Hardshell Powder",
immunizer = "Immunizer",
dash_juice = "Dash Juice",
gourmet_fish = "Gourmet Fish",
demon_ammo = "Demon Ammo",
armor_ammo = "Armor Ammo",
},
endemic_life = {
cutterfly = "Cutterfly",
clothfly = "Clothfly",
butterflame = "Butterflame",
peepersects = "Peepersects",
stinkmink = "Stinkmink",
ruby_wirebug = "Ruby Wirebug",
gold_wirebug = "Gold Wirebug",
red_lampsquid = "Red Lampsquid",
yellow_lampsquid = "Yellow Lampsquid"
},
melody_effects = {
self_improvement = "Self-Improvement",
attack_up = "Attack Up",
defense_up ="Defense Up",
affinity_up = "Affinity Up",
elemental_attack_boost = "Elemental Attack Boost",
attack_and_defense_up = "Attack and Defense Up",
attack_and_affinity_up = "Attack and Affinity Up",
knockbacks_negated = "Knockbacks Negated",
earplugs_s = "Earplugs (S)",
earplugs_l = "Earplugs (L)",
tremors_negated = "Tremors Negated",
wind_pressure_negated = "Wind Pressure Negated",
stun_negated = "Stun Negated",
blight_negated = "Blight Negated",
divine_protection = "Divine Protection",
health_recovery_s = "Health Recovery (S)",
health_recovery_l = "Health Recovery (L)",
health_recovery_s_antidote = "Health Recovery (S) + Antidote",
health_regeneration = "Health Regeneration",
stamina_use_reduced = "Stamina Use Reduced",
stamina_recovery_up = "Stamina Recovery Up",
sharpness_loss_reduced = "Sharpness Loss Reduced",
environment_damage_negated = "Environment Damage Negated",
sonic_wave = "Sonic Wave",
sonic_barrier = "Sonic Barrier",
infernal_melody = "Infernal Melody",
sharpness_regeneration = "Sharpness Regeneration",
sharpness_extension = "Sharpness Extension",
},
dango_skills = {
dango_adrenaline = "Dango Adrenaline",
dango_booster = "Dango Booster",
dango_bulker = "Dango Bulker",
dango_connector = "Dango Connector",
dango_defender = "Dango Defender",
dango_flyer = "Dango Flyer",
dango_glutton = "Dango Glutton",
dango_hunter = "Dango Hunter",
dango_insurance = "Dango Insurance",
dango_insurance_defense_up = "Dango Insurance Defense Up",
super_recovery_dango = "Super Recovery Dango"
},
rampage_skills = {
chameleos_soul = "Chameleos Soul",
kushala_daora_soul = "Kushala Daora Soul"
},
skills = {
adrenaline_rush = "Adrenaline Rush",
affinity_sliding = "Affinity Sliding",
agitator = "Agitator",
berserk = "Berserk",
bladescale_hone = "Bladescale Hone",
blood_awakening = "Blood Awakening",
bloodlust = "Bloodlust",
burst = "Burst",
coalescence = "Coalescence",
counterstrike = "Counterstrike",
dereliction = "Dereliction",
dragon_conversion_elemental_attack_up = "Dragon Conversion: Elem. Atk Up",
dragon_conversion_elemental_res_up = "Dragon Conversion: Elem. Res Up",
dragonheart = "Dragonheart",
embolden = "Embolden",
frenzied_bloodlust = "Frenzied Bloodlust",
furious = "Furious",
grinder_s = "Grinder (S)",
heaven_sent = "Heaven-Sent",
hellfire_cloak = "Hellfire Cloak",
heroics = "Heroics",
inspiration = "Inspiration",
intrepid_heart = "Intrepid Heart",
latent_power = "Latent Power",
maximum_might = "Maximum Might",
offensive_guard = "Offensive Guard",
partbreaker = "Partbreaker",
peak_performance = "Peak Performance",
powder_mantle_red = "Powder Mantle (Red)",
powder_mantle_blue = "Powder Mantle (Blue)",
protective_polish = "Protective Polish",
resentment = "Resentment",
resuscitate = "Resuscitate",
spiribirds_call = "Spiribird's Call",
status_trigger = "Status Trigger",
strife = "Strife",
wall_runner = "Wall Runner",
wind_mantle = "Wind Mantle"
},
weapons = {
great_sword = "Great Sword",
long_sword = "Long Sword",
sword_and_shield = "Sword & Shield",
dual_blades = "Dual Blades",
lance = "Lance",
gunlance = "Gunlance",
hammer = "Hammer",
hunting_horn = "Hunting Horn",
switch_axe = "Switch Axe",
charge_blade = "Charge Blade",
insect_glaive = "Insect Glaive",
light_bowgun = "Light Bowgun",
heavy_bowgun = "Heavy Bowgun",
bow = "Bow"
},
weapon_skills = {
-- Great Sword
great_sword = {
power_sheathe = "Power Sheathe"
},
-- Long Sword
long_sword = {
harvest_moon = "Harvest Moon",
iai_slash = "Iai Slash",
soaring_kick = "Soaring Kick",
spirit_gauge = "Spirit Gauge",
spirit_gauge_autofill = "Spirit Gauge Autofill", -- Soaring Kick, Iai Slash
},
-- Sword & Shield
sword_and_shield = {
destroyer_oil = "Destroyer Oil"
},
-- Dual Blades
dual_blades = {
archdemon_mode = "Archdemon Mode",
ironshine_silk = "Ironshine Silk"
},
-- Lance
lance = {
anchor_rage = "Anchor Rage",
spiral_thrust = "Spiral Thrust",
twin_wine = "Twin Wine"
},
-- Gunlance
gunlance = {
erupting_cannon = "Erupting Cannon",
ground_splitter = "Ground Splitter"
},
-- Hammer
hammer = {
impact_burst = "Impact Burst"
},
-- Hunting Horn
hunting_horn = {
bead_of_resonance = "Bead of Resonance",
silkbind_shockwave = "Silkbind Shockwave",
sonic_bloom = "Sonic Bloom"
},
-- Switch Axe
switch_axe = {
amped_state = "Amped State",
axe_heavy_slam = "Axe: Heavy Slam",
switch_charger = "Switch Charger"
},
-- Charge Blade
charge_blade = {
element_boost = "Element Boost",
sword_boost_mode = "Sword Boost Mode"
},
-- Insect Glaive
insect_glaive = {
red_extract = "Red Extract",
white_extract = "White Extract",
orange_extract = "Orange Extract",
all_extracts_mix = "All Extracts Mix"
},
-- Light Bowgun
light_bowgun = {
fanning_maneuver = "Fanning Maneuver",
wyvernblast_reload = "Wyvernblast Reload"
},
-- Heavy Bowgun
heavy_bowgun = {
counter_charger = "Counter Charger",
overheat = "Overheat",
rising_moon = "Rising Moon",
setting_sun = "Setting Sun",
wyvernsnipe_reload = "Wyvernsnipe Reload"
},
-- Bow
bow = {
arc_shot_affinity = "Arc Shot: Affinity",
arc_shot_brace = "Arc Shot: Brace",
bolt_boost = "Bolt Boost",
herculean_draw = "Herculean Draw"
}
},
otomo_moves = {
go_fight_win = "Go, Fight, Win",
power_drum = "Power Drum",
rousing_roar = "Rousing Roar",
vase_of_vitality = "Vase of Vitality",
},
misc_buffs = {
attack_up = "Attack Up",
defense_up = "Defense Up",
stamina_use_down = "Stamina Use Down",
immunity = "Immunity",
natural_healing_up = "Natural Healing Up"
},
UI = {
@@ -127,7 +470,33 @@ language.default_language = {
buildup = "Buildup:",
total_buildup = "Total Buildup",
part_break = "Break",
part_sever = "Sever"
part_sever = "Sever",
part_anomaly_core = "Anomaly Core",
otomo = "Buddy",
servant = "Follower",
lv = ""
},
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",
},
customization_menu = {
@@ -172,6 +541,9 @@ language.default_language = {
bold = "Bold",
italic = "Italic",
renderer = "Renderer",
use_d2d_if_available = "Use Direct2D if available",
enabled = "Enabled",
settings = "Settings",
dynamic_positioning = "Dynamic Positioning",
@@ -229,7 +601,7 @@ language.default_language = {
dynamically_positioned = "Dynamically Positioned",
statically_positioned = "Statically Positioned",
highlighted = "Highlighted (targeted)",
highlighted_targeted = "Highlighted (targeted)",
include = "Include",
monster_name = "Monster Name",
@@ -239,6 +611,7 @@ language.default_language = {
rage = "Rage",
body_parts = "Body Parts",
hide_undamaged_parts = "Hide Undamaged Parts",
render_inactive_anomaly_cores = "Render Inactive Anomaly Cores",
part_name = "Part Name",
flinch_count = "Flinch Count",
break_count = "Break Count",
@@ -288,28 +661,36 @@ language.default_language = {
total_damage = "Total Damage",
my_damage_bar_location = "My Damage Bar Location",
total_damage_location = "Total Damage Bar Location",
first = "First",
last = "Last",
small_monsters = "Small Monsters",
large_monsters = "Large Monsters",
player_damage = "Player Damage",
bomb_damage = "Bomb Damage",
kunai_damage = "Kunai Damage",
installation_damage = "Installation Damage",
otomo_damage = "Buddy Damage",
monster_damage = "Monster Damage",
poison_damage = "Poison Damage",
blast_damage = "Blast Damage",
players = "Players",
bombs = "Bombs",
kunai = "Kunai",
installations = "Installations",
otomos = "Buddies",
monsters = "Monsters",
wyvern_riding = "Wyvern Riding",
poison = "Poison",
blast = "Blast",
endemic_life = "Endemic Life",
anomaly_cores = "Anomaly Cores",
other = "Other",
damage = "Damage",
other_players = "Other Players",
hunter_rank = "Hunter Rank",
word_player = "Word \"Player\"";
player_id = "Player ID",
player_name = "Player Name",
id = "ID",
name = "Name",
show_my_otomos_separately = "Show My Buddies separately",
show_other_player_otomos_separately = "Show Other Player Buddies separately",
show_servant_otomos_separately = "Show Follower Buddies separately",
dps_mode = "DPS Mode",
dps = "DPS",
@@ -369,6 +750,8 @@ language.default_language = {
break_health_percentage = "Break Health Percentage",
loss_health = "Sever Health",
loss_health_percentage = "Sever Health Percentage",
anomaly_health = "Anomaly Core Health",
anomaly_health_percentage = "Anomaly Core Health Percentage",
monster_id = "Monster ID",
@@ -378,32 +761,40 @@ language.default_language = {
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_other_players = "Hide Other Players",
hide_servants = "Hide Followers",
hide_total_damage = "Hide Total Damage",
player_name_size_limit = "Player Name Size Limit",
cart_count = "Cart Count",
cart_count_label = "Cart Count Label",
total_cart_count_label = "Total Cart Count Label",
prioritize_large_monsters = "Large Monsters on High Priority",
max_monster_updates_per_tick = "Max Monster Updates per Tick",
freeze_dps_on_quest_clear = "Freeze DPS when Quest is cleared",
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_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",
break_severe_filter = "Break + Severe",
break_filter = "Break",
severe_filter = "Severe",
sever_filter = "Sever",
anomaly_filter = "Anomaly Core",
outline = "Outline",
thickness = "Thickness",
@@ -421,16 +812,103 @@ language.default_language = {
lowest_health_percentage = "Lowest Health Percentage",
highest_health_percentage = "Highest Health Percentage",
reframework_outdated = "Installed REFramework version is outdated. Please, update. Otherwise, MHR Overlay won't work correctly."
}
reframework_outdated = "Installed REFramework version is outdated. Please, update. Otherwise, MHR Overlay won't work correctly.",
servants = "Followers",
my_otomos = "My Buddies",
other_player_otomos = "Other Player Buddies",
servant_otomos = "Servant Buddies",
level = "Level",
name_label = "Name Label",
myself = "Myself",
total = "Total",
level_label = "Level Label",
config = "Config",
rename = "Rename",
duplicate = "Duplicate",
delete = "Delete",
new = "New",
reset = "Reset",
highlighted = "Highlighted",
buff_UI = "Buff UI",
timer = "Timer",
duration = "Duration",
hide_bar_for_infinite_buffs = "Hide Bar for infinite Buffs",
hide_timer_for_infinite_buffs = "Hide Timer for infinite Buffs",
current_value = "Current Value",
max_value = "Max Value",
filter_mode = "Filter Mode",
current_state = "Current 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",
abnormal_statuses = "Abnormal Statuses",
item_buffs = "Item Buffs",
endemic_life_buffs = "Endemic Life Buffs",
melody_effects = "Melody Effects",
dango_skills = "Dango Skills",
rampage_skills = "Rampage Skills",
skills = "Skills",
weapon_skills = "Weapon Skills",
otomo_moves = "Buddy Moves",
misc_buffs = "Misc Buffs",
timer_delays = "Timer Delays",
update_singletons_delay = "Update Singletons (seconds)",
update_window_size_delay = "Update Window Size (seconds)",
update_quest_time_delay = "Update Quest Time (seconds)",
update_is_online_delay = "Update Is Online (seconds)",
update_players_delay = "Update Players (seconds)",
update_myself_position_delay = "Update Myself Position (seconds)",
update_player_info_delay = "Update Player Info (seconds)",
update_buffs_delay = "Update Buffs (seconds)",
infinite_buffs_location = "Infinite Buffs Location",
effect_level = "Effect Level",
},
};
language.current_language = {};
this.language_names = { "default" };
this.languages = { this.default_language };
language.language_names = { "default" };
language.languages = { language.default_language };
function language.load()
function this.load()
local language_files = fs.glob([[MHR Overlay\\languages\\.*json]]);
if language_files == nil then
@@ -438,48 +916,64 @@ function language.load()
end
for i, language_file_name in ipairs(language_files) do
local language_name = language_file_name:gsub(language.language_folder, ""):gsub(".json"
,
"");
local language_name = language_file_name:gsub(this.language_folder, ""):gsub(".json","");
local loaded_language = json.load_file(language_file_name);
if loaded_language ~= nil then
log.info("[MHR Overlay] " .. language_name .. ".json loaded successfully");
table.insert(language.language_names, language_name);
log.info(string.format("[MHR Overlay] %s.json Loaded Successfully", language_file_name));
local merged_language = table_helpers.merge(language.default_language, loaded_language);
table.insert(language.languages, merged_language);
table.insert(this.language_names, language_name);
language.save(language_file_name, merged_language);
local merged_language = utils.table.merge(this.default_language, loaded_language);
table.insert(this.languages, merged_language);
this.save(language_file_name, merged_language);
else
log.error("[MHR Overlay] Failed to load " .. language_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
function language.save(file_name, language_table)
function this.save(file_name, language_table)
local success = json.dump_file(file_name, language_table);
if success then
log.info("[MHR Overlay] en-us.json saved successfully");
log.info(string.format("[MHR Overlay] %s Saved Successfully", file_name));
else
log.error("[MHR Overlay] Failed to save en-us.json");
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
function language.save_default()
language.save(language.language_folder .. "en-us.json", language.default_language)
function this.save_default()
this.save(this.language_folder .. "en-us.json", this.default_language);
end
function language.update(index)
language.current_language = table_helpers.deep_copy(language.languages[index]);
function this.update(index)
this.current_language = this.languages[index];
end
function language.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
language.save_default();
language.load();
language.current_language = table_helpers.deep_copy(language.default_language);
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return language;
function this.init_module()
this.load();
this.current_language = this.default_language;
this.default_language.font_name = "NotoSans-Bold.otf";
this.default_language.unicode_glyph_ranges = {
0x0020, 0x00FF, -- Basic Latin + Latin Supplement
0x0100, 0x024F, -- Latin Extended-A, Latin Extended-B,
0x0400, 0x052F, -- Cyrillic, Cyrillic Supplementary
0x1E00, 0x1EFF, -- Latin Extended Additional
0x2000, 0x206F, -- General Punctuation
0xFF00, 0xFFEF, -- Halfwidth and Fullwidth Forms
0
};
this.save_default();
end
return this;

View File

@@ -1,11 +1,44 @@
local part_names = {};
local this = {};
local language;
local table_helpers;
local error_handler;
part_names.list = {};
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;
function part_names.init()
part_names.list = {
this.list = {};
function this.init()
this.list = {
[98] = -- Great Izuchi 98
{
language.current_language.parts.head,
@@ -511,7 +544,7 @@ function part_names.init()
language.current_language.parts.right_foreleg,
language.current_language.parts.hind_legs,
language.current_language.parts.wings,
language.current_language.parts.tail,
language.current_language.parts.tail
},
[19] = -- Daimyo Hermitaur 19
{
@@ -777,12 +810,143 @@ function part_names.init()
language.current_language.parts.right_hind_leg,
language.current_language.parts.tail,
language.current_language.parts.wings
},
--SUNBREAK TITLE UPDATE 3
[1351] = -- Chaotic Gore Magala 1351
{
language.current_language.parts.head,
language.current_language.parts.torso,
language.current_language.parts.wings,
language.current_language.parts.right_wingclaw,
language.current_language.parts.forelegs,
language.current_language.parts.hind_legs,
language.current_language.parts.tail,
language.current_language.parts.antenna,
language.current_language.parts.left_wingclaw
},
[2072] = -- Risen Kushala Daora 2072
{
language.current_language.parts.head,
language.current_language.parts.back,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.wings,
language.current_language.parts.tail
},
[2075] = -- Risen Teostra 2075
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.forelegs,
language.current_language.parts.hind_legs,
language.current_language.parts.wings,
language.current_language.parts.tail
},
--SUNBREAK TITLE UPDATE 4
[124] = -- Velkhana 124
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.forelegs,
language.current_language.parts.hind_legs,
language.current_language.parts.wings,
language.current_language.parts.tail
},
[2134] = -- Risen Crimson Glow Valstrax 2134
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.left_foreleg,
language.current_language.parts.right_foreleg,
language.current_language.parts.tail,
language.current_language.parts.hind_legs,
language.current_language.parts.chest
},
--SUNBREAK TITLE UPDATE 5
[2120] = -- Risen Shagaru Magala 2120
{
language.current_language.parts.head,
language.current_language.parts.torso,
language.current_language.parts.wings,
language.current_language.parts.wingclaws,
language.current_language.parts.forelegs,
language.current_language.parts.hind_legs,
language.current_language.parts.tail
},
[58] = -- Amatsu 58
{
language.current_language.parts.head,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm,
language.current_language.parts.abdomen,
language.current_language.parts.tail,
language.current_language.parts.back,
language.current_language.parts.amatsu_unknown,
language.current_language.parts.left_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
function part_names.get_part_name(monster_id, part_id)
local monster_parts = part_names.list[monster_id];
function this.get_part_name(monster_id, part_id)
local monster_parts = this.list[monster_id];
if monster_parts == nil then
return "?";
end
@@ -791,11 +955,13 @@ function part_names.get_part_name(monster_id, part_id)
return part_name;
end
function part_names.init_module()
function this.init_dependencies()
language = require("MHR_Overlay.Misc.language");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
part_names.init();
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return part_names;
function this.init_module()
this.init();
end
return this;

View File

@@ -0,0 +1,350 @@
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 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");
-- Heroics
local is_predicament_power_up_method = player_base_type_def:get_method("isPredicamentPowerUp");
-- 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_heroics(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_heroics(quest_player_base)
if not config.current_config.buff_UI.filter.skills.heroics then
return;
end
local is_predicament_power_up = is_predicament_power_up_method:call(master_player_ref);
if is_predicament_power_up == nil then
error_handler.report("player_info.update_heroics", "Failed to access Data: is_predicament_power_up");
return;
end
skills.is_heroics_active = is_predicament_power_up;
end
function this.update_dango_adrenaline(quest_player_base)
if not config.current_config.buff_UI.filter.dango_skills.dango_adrenaline then
return;
end
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");
skills = require("MHR_Overlay.Buffs.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,86 +0,0 @@
local table_helpers = {};
function table_helpers.deep_copy(original, copies)
copies = copies or {};
local original_type = type(original);
local copy;
if original_type == "table" then
if copies[original] then
copy = copies[original];
else
copy = {};
copies[original] = copy;
for original_key, original_value in next, original, nil do
copy[table_helpers.deep_copy(original_key, copies)] = table_helpers.deep_copy(original_value
,
copies);
end
setmetatable(copy,
table_helpers.deep_copy(getmetatable(original)
, copies));
end
else -- number, string, boolean, etc
copy = original;
end
return copy;
end
function table_helpers.find_index(table, value, nullable)
for i = 1, #table do
if table[i] == value then
return i;
end
end
if not nullable then
return 1;
end
return nil;
end
function table_helpers.merge(...)
local tables_to_merge = { ... };
assert(#tables_to_merge > 1, "There should be at least two tables to merge them");
for key, table in ipairs(tables_to_merge) do
assert(type(table) == "table", string.format("Expected a table as function parameter %d", key));
end
local result = table_helpers.deep_copy(tables_to_merge[1]);
for i = 2, #tables_to_merge do
local from = tables_to_merge[i];
for key, value in pairs(from) do
if type(value) == "table" then
result[key] = result[key] or {};
assert(type(result[key]) == "table", string.format("Expected a table: '%s'", key));
result[key] = table_helpers.merge(result[key], value);
else
result[key] = value;
end
end
end
return result;
end
function table_helpers.tostring(table)
if type(table) == "table" then
local s = "{ \n";
for k, v in pairs(table) do
if type(k) ~= "number" then
k = "\"" .. k .. "\"";
end
s = s .. "\t[" .. k .. "] = " .. table_helpers.tostring(v) .. ",\n";
end
return s .. "} \n";
else
return tostring(table);
end
end
function table_helpers.init_module()
end
return table_helpers;

View File

@@ -1,115 +0,0 @@
local unicode_helpers = {};
-- https://github.com/blitmap/lua-utf8-simple/blob/master/utf8_simple.lua
-- ABNF from RFC 3629
--
-- UTF8-octets = *( UTF8-char )
-- UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
-- UTF8-1 = %x00-7F
-- UTF8-2 = %xC2-DF UTF8-tail
-- UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
-- %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
-- UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
-- %xF4 %x80-8F 2( UTF8-tail )
-- UTF8-tail = %x80-BF
-- 0xxxxxxx | 007F (127)
-- 110xxxxx 10xxxxxx | 07FF (2047)
-- 1110xxxx 10xxxxxx 10xxxxxx | FFFF (65535)
-- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 10FFFF (1114111)
local pattern = "[%z\1-\127\194-\244][\128-\191]*";
-- helper function
function unicode_helpers.relative_position(position, length)
if position < 0 then
position = length + position + 1;
end
return position;
end
-- THE MEAT
-- maps f over s's utf8 characters f can accept args: (visual_index, utf8_character, byte_index)
function unicode_helpers.map(s, f, no_subs)
local i = 0;
if no_subs then
for b, e in s:gmatch("()" .. pattern .. "()") do
i = i + 1;
local c = e - b;
f(i, c, b)
end
else
for b, c in s:gmatch("()(" .. pattern .. ")") do
i = i + 1;
f(i, c, b);
end
end
end
-- THE REST
-- generator for the above -- to iterate over all utf8 chars
function unicode_helpers.chars(s, no_subs)
return coroutine.wrap(function()
return unicode_helpers.map(s, coroutine.yield, no_subs);
end);
end
-- like string.sub() but i, j are utf8 strings
-- a utf8-safe string.sub()
function unicode_helpers.sub(str, i, j)
if coroutine == nil then
return str;
end
local l = utf8.len(str);
i = unicode_helpers.relative_position(i, l);
j = j and unicode_helpers.relative_position(j, l) or l;
if i < 1 then
i = 1;
end
if j > l then
j = l;
end
if i > j then
return "";
end
local diff = j - i;
local iterator = unicode_helpers.chars(str, true);
-- advance up to i
for _ = 1, i - 1 do
iterator();
end
local c, b = select(2, iterator());
-- i and j are the same, single-charaacter sub
if diff == 0 then
return string.sub(str, b, b + c - 1);
end
i = b;
-- advance up to j
for _ = 1, diff - 1 do
iterator();
end
c, b = select(2, iterator());
return string.sub(str, i, b + c - 1);
end
function unicode_helpers.init_module()
end
return unicode_helpers;

View File

@@ -0,0 +1,495 @@
local this = {};
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 table_tostring;
local deep_copy;
local merge;
local is_empty;
local unicode_map;
local unicode_relative_position;
local unicode_chars;
local epsilon = 0.000001;
this.table = {};
this.type = {};
this.number = {};
this.string = {};
this.vec2 = {};
this.vec3 = {};
this.vec4 = {};
this.math = {};
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_)
if type(table_) == "number" or type(table_) == "boolean" or type(table_) == "string" then
return tostring(table_);
end
if is_empty(table_) then
return "{}";
end
local cache = {};
local stack = {};
local output = {};
local depth = 1;
local output_str = "{\n";
while true do
local size = 0;
for k,v in pairs(table_) do
size = size + 1;
end
local cur_index = 1;
for k,v in pairs(table_) do
if cache[table_] == nil or cur_index >= cache[table_] then
if string.find(output_str, "}", output_str:len()) then
output_str = output_str .. ",\n";
elseif not string.find(output_str, "\n", output_str:len()) then
output_str = output_str .. "\n";
end
-- This is necessary for working with HUGE tables otherwise we run out of memory using concat on huge strings
table.insert(output,output_str);
output_str = "";
local key;
if type(k) == "number" or type(k) == "boolean" then
key = "[" .. tostring(k) .. "]";
else
key = "['" .. tostring(k) .. "']";
end
if type(v) == "number" or type(v) == "boolean" then
output_str = output_str .. string.rep('\t', depth) .. key .. " = "..tostring(v);
elseif type(v) == "table" then
output_str = output_str .. string.rep('\t', depth) .. key .. " = {\n";
table.insert(stack, table_);
table.insert(stack, v);
cache[table_] = cur_index + 1;
break;
else
output_str = output_str .. string.rep('\t', depth) .. key .. " = '" .. tostring(v) .. "'";
end
if cur_index == size then
output_str = output_str .. "\n" .. string.rep('\t', depth - 1) .. "}";
else
output_str = output_str .. ",";
end
else
-- close the table
if cur_index == size then
output_str = output_str .. "\n" .. string.rep('\t', depth - 1) .. "}";
end
end
cur_index = cur_index + 1;
end
if size == 0 then
output_str = output_str .. "\n" .. string.rep('\t', depth - 1) .. "}";
end
if #stack > 0 then
table_ = stack[#stack];
stack[#stack] = nil;
depth = cache[table_] == nil and depth + 1 or depth - 1;
else
break;
end
end
-- This is necessary for working with HUGE tables otherwise we run out of memory using concat on huge strings
table.insert(output, output_str);
output_str = table.concat(output);
return output_str;
end
function this.table.tostringln(table_)
return "\n" .. table_tostring(table_);
end
function this.table.is_empty(table_)
return next(table_) == nil;
end
function this.table.deep_copy(original, copies)
copies = copies or {};
local original_type = type(original);
local copy;
if original_type == "table" then
if copies[original] then
copy = copies[original];
else
copy = {};
copies[original] = copy;
for original_key, original_value in next, original, nil do
copy[deep_copy(original_key, copies)] = deep_copy(original_value,copies);
end
setmetatable(copy, deep_copy(getmetatable(original), copies));
end
else -- number, string, boolean, etc
copy = original;
end
return copy;
end
function this.table.find_index(table_, value, nullable)
for i = 1, #table_ do
if table_[i] == value then
return i;
end
end
if not nullable then
return 1;
end
return nil;
end
function this.table.merge(...)
local tables_to_merge = { ... };
assert(#tables_to_merge > 1, "There should be at least two tables to merge them");
for key, table_ in ipairs(tables_to_merge) do
assert(type(table_) == "table", string.format("Expected a table as function parameter %d", key));
end
local result = deep_copy(tables_to_merge[1]);
for i = 2, #tables_to_merge do
local from = tables_to_merge[i];
for key, value in pairs(from) do
if type(value) == "table" then
result[key] = result[key] or {};
assert(type(result[key]) == "table", string.format("Expected a table: '%s'", key));
result[key] = merge(result[key], value);
else
result[key] = value;
end
end
end
return result;
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)
return tostring(value) == tostring(0/0);
end
function this.number.round(value)
return math.floor(value + 0.5);
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)
return str:match("^%s*(.-)%s*$");
end
function this.string.starts_with(str, pattern)
return str:find("^" .. pattern) ~= nil;
end
function this.vec2.tostring(vector2f)
return string.format("<%f, %f>", vector2f.x, vector2f.y);
end
function this.vec2.random(distance)
distance = distance or 1;
local radians = math.random() * math.pi * 2;
return Vector2f.new(
distance * math.cos(radians),
distance * math.sin(radians)
);
end
function this.vec3.tostring(vector3f)
return string.format("<%f, %f, %f>", vector3f.x, vector3f.y, vector3f.z);
end
function this.vec4.tostring(vector4f)
return string.format("<%f, %f, %f, %f>", vector4f.x, vector4f.y, vector4f.z, vector4f.w);
end
--- When called without arguments, returns a pseudo-random float with uniform distribution in the range [0,1). When called with two floats min and max, math.random returns a pseudo-random float with uniform distribution in the range [min, max). The call .random(max) is equivalent to .random(1, max)
---@param min number
---@param max number
---@return number
function this.math.random(min, max)
if min == nil and max == nil then
return math.random();
end
if max == nil then
return max * math.random();
end
return min + (max - min) * math.random();
end
function this.math.sign(value)
return (value >= 0 and 1) or -1;
end
function this.math.round(value, bracket)
bracket = bracket or 1;
return math.floor(value / bracket + this.math.sign(value) * 0.5) * bracket;
end
-- https://github.com/blitmap/lua-utf8-simple/blob/master/utf8_simple.lua
-- ABNF from RFC 3629
--
-- UTF8-octets = *( UTF8-char )
-- UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
-- UTF8-1 = %x00-7F
-- UTF8-2 = %xC2-DF UTF8-tail
-- UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
-- %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
-- UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
-- %xF4 %x80-8F 2( UTF8-tail )
-- UTF8-tail = %x80-BF
-- 0xxxxxxx | 007F (127)
-- 110xxxxx 10xxxxxx | 07FF (2047)
-- 1110xxxx 10xxxxxx 10xxxxxx | FFFF (65535)
-- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 10FFFF (1114111)
local pattern = "[%z\1-\127\194-\244][\128-\191]*";
-- helper function
function this.unicode.relative_position(position, length)
if position < 0 then
position = length + position + 1;
end
return position;
end
-- THE MEAT
-- maps f over s's utf8 characters f can accept args: (visual_index, utf8_character, byte_index)
function this.unicode.map(s, f, no_subs)
local i = 0;
if no_subs then
for b, e in s:gmatch("()" .. pattern .. "()") do
i = i + 1;
local c = e - b;
f(i, c, b);
end
else
for b, c in s:gmatch("()(" .. pattern .. ")") do
i = i + 1;
f(i, c, b);
end
end
end
-- THE REST
-- returns the number of characters in a UTF-8 string
function this.unicode.len(s)
-- count the number of non-continuing bytes
return select(2, s:gsub('[^\128-\193]', ''));
end
-- replace all utf8 chars with mapping
function this.unicode.replace(s, map)
return s:gsub(pattern, map);
end
-- reverse a utf8 string
function this.unicode.reverse(s)
-- reverse the individual greater-than-single-byte characters
s = s:gsub(pattern, function (c)
return #c > 1 and c:reverse()
end);
return s:reverse();
end
-- strip non-ascii characters from a utf8 string
function this.unicode.strip(s)
return s:gsub(pattern, function(c)
return #c > 1 and '';
end);
end
-- generator for the above -- to iterate over all utf8 chars
function this.unicode.chars(s, no_subs)
return coroutine.wrap(function()
return unicode_map(s, coroutine.yield, no_subs);
end);
end
-- like string.sub() but i, j are utf8 strings
-- a utf8-safe string.sub()
function this.unicode.sub(str, i, j)
if coroutine == nil then
return str;
end
local l = utf8.len(str);
i = unicode_relative_position(i, l);
j = j and unicode_relative_position(j, l) or l;
if i < 1 then
i = 1;
end
if j > l then
j = l;
end
if i > j then
return "";
end
local diff = j - i;
local iterator = unicode_chars(str, true);
-- advance up to i
for _ = 1, i - 1 do
iterator();
end
local c, b = select(2, iterator());
-- i and j are the same, single-charaacter sub
if diff == 0 then
return string.sub(str, b, b + c - 1);
end
i = b;
-- advance up to j
for _ = 1, diff - 1 do
iterator();
end
c, b = select(2, iterator());
return string.sub(str, i, b + c - 1);
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()
end
table_tostring = this.table.tostring;
deep_copy = this.table.deep_copy;
merge = this.table.merge;
is_empty = this.table.is_empty;
unicode_map = this.unicode.map;
unicode_relative_position = this.unicode.relative_position;
unicode_chars = this.unicode.chars;
return this;

View File

@@ -1,5 +1,6 @@
local ailment_buildup = {};
local player;
local this = {};
local players;
local language;
local config;
local ailments;
@@ -7,12 +8,45 @@ local ailment_buildup_UI_entity;
local time;
local small_monster;
local large_monster;
local table_helpers;
local drawing;
local error_handler;
function ailment_buildup.draw(monster, ailment_buildup_UI, cached_config, ailment_buildups_position_on_screen, opacity_scale)
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;
function this.draw(monster, ailment_buildup_UI, cached_config, ailment_buildups_position_on_screen, opacity_scale)
local cached_config = cached_config.ailment_buildups;
local cached_damage_meter_UI_config = config.current_config.damage_meter_UI;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
if not cached_config.visibility then
@@ -22,48 +56,105 @@ function ailment_buildup.draw(monster, ailment_buildup_UI, cached_config, ailmen
for id, ailment in pairs(monster.ailments) do
if id == ailments.stun_id then
if not cached_config.filter.stun then
goto continue
goto continue;
end
elseif id == ailments.poison_id then
if not cached_config.filter.poison then
goto continue
goto continue;
end
elseif id == ailments.blast_id then
if not cached_config.filter.blast then
goto continue
goto continue;
end
else
goto continue
goto continue;
end
if cached_config.settings.time_limit ~= 0 and
time.total_elapsed_script_seconds - ailment.last_change_time > cached_config.settings.time_limit then
goto continue
goto continue;
end
local total_buildup = 0;
local top_buildup = 0;
local displayed_players = {};
for player_id, player_buildup in pairs(ailment.buildup) do
for player, player_buildup in pairs(ailment.buildup) do
total_buildup = total_buildup + player_buildup;
if player_buildup > top_buildup then
top_buildup = player_buildup;
end
table.insert(displayed_players,
{
["buildup"] = player_buildup,
["buildup_share"] = ailment.buildup_share[player_id],
["id"] = player_id
}
);
displayed_players[player] = {
["buildup"] = player_buildup,
["buildup_share"] = ailment.buildup_share[player],
["id"] = player.id
};
end
for otomo, otomo_buildup in pairs(ailment.otomo_buildup) do
total_buildup = total_buildup + otomo_buildup;
if otomo_buildup > top_buildup then
top_buildup = otomo_buildup;
end
local player = players.get_player(otomo.id);
local displayed_player = displayed_players[player];
if otomo.type == players.types.my_otomo then
if cached_damage_meter_UI_config.settings.show_my_otomos_separately then
displayed_players[otomo] = {
["buildup"] = otomo_buildup,
["buildup_share"] = ailment.otomo_buildup_share[otomo],
["id"] = otomo.id
};
elseif player ~= nil then
displayed_players[player].buildup = displayed_players[player].buildup + otomo_buildup;
displayed_players[player].buildup_share = displayed_players[player].buildup_share + ailment.otomo_buildup_share[otomo];
end
elseif otomo.type == players.types.other_player_otomo then
if cached_damage_meter_UI_config.settings.show_other_player_otomos_separately then
displayed_players[otomo] = {
["buildup"] = otomo_buildup,
["buildup_share"] = ailment.otomo_buildup_share[otomo],
["id"] = otomo.id
};
elseif player ~= nil then
displayed_players[player].buildup = displayed_players[player].buildup + otomo_buildup;
displayed_players[player].buildup_share = displayed_players[player].buildup_share + ailment.otomo_buildup_share[otomo];
end
elseif otomo.type == players.types.servant_otomo then
if cached_damage_meter_UI_config.settings.show_servant_otomos_separately then
displayed_players[otomo] = {
["buildup"] = otomo_buildup,
["buildup_share"] = ailment.otomo_buildup_share[otomo],
["id"] = otomo.id
};
elseif player ~= nil then
displayed_players[player].buildup = displayed_players[player].buildup + otomo_buildup;
displayed_players[player].buildup_share = displayed_players[player].buildup_share + ailment.otomo_buildup_share[otomo];
end
end
end
if total_buildup == 0 then
goto continue
goto continue;
end
if cached_config.sorting.type == "Normal" then
@@ -98,6 +189,7 @@ function ailment_buildup.draw(monster, ailment_buildup_UI, cached_config, ailmen
end
end
local ailment_name = "";
if cached_config.ailment_name_label.include.ailment_name then
ailment_name = ailment.name .. " ";
@@ -108,21 +200,20 @@ function ailment_buildup.draw(monster, ailment_buildup_UI, cached_config, ailmen
drawing.draw_label(ailment_buildup_UI.ailment_name_label, ailment_buildups_position_on_screen, opacity_scale, ailment_name);
local last_j = 0;
for j, _player in ipairs(displayed_players) do
local j = 0;
for player, displayed_player in pairs(displayed_players) do
local ailment_buildup_position_on_screen = {
x = ailment_buildups_position_on_screen.x + cached_config.player_spacing.x * (j - 1) * global_scale_modifier,
y = ailment_buildups_position_on_screen.y + cached_config.player_spacing.y * (j - 1) * global_scale_modifier;
x = ailment_buildups_position_on_screen.x + cached_config.player_spacing.x * j * global_scale_modifier,
y = ailment_buildups_position_on_screen.y + cached_config.player_spacing.y * j * global_scale_modifier;
};
ailment_buildup_UI_entity.draw(_player, ailment_buildup_UI, cached_config, ailment_buildup_position_on_screen, opacity_scale, top_buildup);
last_j = j;
ailment_buildup_UI_entity.draw(player, displayed_player, ailment_buildup_UI, cached_config, ailment_buildup_position_on_screen, opacity_scale, top_buildup);
j = j + 1;
end
local total_buildup_position_on_screen = {
x = ailment_buildups_position_on_screen.x + cached_config.player_spacing.x * last_j * global_scale_modifier,
y = ailment_buildups_position_on_screen.y + cached_config.player_spacing.y * last_j * global_scale_modifier;
x = ailment_buildups_position_on_screen.x + cached_config.player_spacing.x * j * global_scale_modifier,
y = ailment_buildups_position_on_screen.y + cached_config.player_spacing.y * j * global_scale_modifier;
};
drawing.draw_label(ailment_buildup_UI.total_buildup_label, total_buildup_position_on_screen, opacity_scale, language.current_language.UI.total_buildup);
@@ -133,14 +224,13 @@ function ailment_buildup.draw(monster, ailment_buildup_UI, cached_config, ailmen
y = total_buildup_position_on_screen.y + 17 + cached_config.ailment_spacing.y * global_scale_modifier
};
::continue::
end
end
function ailment_buildup.init_module()
player = require("MHR_Overlay.Damage_Meter.player");
function this.init_dependencies()
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
ailments = require("MHR_Overlay.Monsters.ailments");
@@ -148,8 +238,11 @@ function ailment_buildup.init_module()
time = require("MHR_Overlay.Game_Handler.time");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
drawing = require("MHR_Overlay.UI.drawing");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return ailment_buildup;
function this.init_module()
end
return this;

View File

@@ -1,9 +1,42 @@
local ailment_hook = {};
local this = {};
local small_monster;
local large_monster;
local config;
local ailments;
local table_helpers;
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 enemy_poison_damage_param_type_def = sdk.find_type_definition("snow.enemy.EnemyPoisonDamageParam");
local on_poison_activate_proc_method = enemy_poison_damage_param_type_def:get_method("onActivateProc");
@@ -15,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 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 enemy_damage_param_type_def = sdk.find_type_definition("snow.enemy.EnemyDamageParam");
@@ -28,18 +61,21 @@ local blast_param_type = blast_param_field:get_type();
local blast_damage_method = blast_param_type:get_method("get_BlastDamage");
local blast_adjust_rate_method = blast_param_type:get_method("get_BlastDamageAdjustRateByEnemyLv");
function ailment_hook.poison_proc(poison_param)
function this.poison_proc(poison_param)
if poison_param == nil then
error_handler.report("ailment_hook.poison_proc", "Missing Parameter: poison_param");
return;
end
local enemy = get_enemy_method:call(poison_param);
if enemy == nil then
error_handler.report("ailment_hook.poison_proc", "Failed to access Data: enemy");
return;
end
local is_large = is_boss_enemy_method:call(enemy);
if is_large == nil then
error_handler.report("ailment_hook.poison_proc", "Failed to access Data: is_large");
return;
end
@@ -50,23 +86,27 @@ function ailment_hook.poison_proc(poison_param)
monster = small_monster.get_monster(enemy);
end
monster.ailments[ailments.poison_id].cached_buildup_share = table_helpers.deep_copy(monster.ailments[ailments
.poison_id].buildup_share);
monster.ailments[ailments.poison_id].cached_buildup_share = monster.ailments[ailments.poison_id].buildup_share;
monster.ailments[ailments.poison_id].cached_otomo_buildup_share = monster.ailments[ailments.poison_id].otomo_buildup_share;
ailments.clear_ailment_contribution(monster, ailments.poison_id);
end
function ailment_hook.blast_proc(blast_param)
function this.blast_proc(blast_param)
if blast_param == nil then
error_handler.report("ailment_hook.blast_proc", "Missing Parameter: blast_param");
return;
end
local enemy = get_enemy_method:call(blast_param);
if enemy == nil then
error_handler.report("ailment_hook.blast_proc", "Failed to access Data: enemy");
return;
end
local is_large = is_boss_enemy_method:call(enemy);
if is_large == nil then
error_handler.report("ailment_hook.blast_proc", "Failed to access Data: is_large");
return;
end
@@ -80,61 +120,72 @@ function ailment_hook.blast_proc(blast_param)
local blast_damage = blast_damage_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.clear_ailment_contribution(monster, ailments.blast_id);
end
function ailment_hook.stock_damage()
function this.stock_damage()
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
goto continue
error_handler.report("ailment_hook.stock_damage", "Failed to access Data: large_monster -> damage_param");
goto continue;
end
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);
::continue::
end
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
goto continue
error_handler.report("ailment_hook.stock_damage", "Failed to access Data: small_monster -> damage_param");
goto continue;
end
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);
::continue::
end
end
function ailment_hook.init_module()
function this.init_dependencies()
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
config = require("MHR_Overlay.Misc.config");
ailments = require("MHR_Overlay.Monsters.ailments");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
sdk.hook(stock_damage_method, function(args)
pcall(ailment_hook.stock_damage, sdk.to_managed_object(args[2]));
pcall(this.stock_damage, sdk.to_managed_object(args[2]));
end, function(retval)
return retval;
end);
sdk.hook(on_poison_activate_proc_method, function(args)
pcall(ailment_hook.poison_proc, sdk.to_managed_object(args[2]));
pcall(this.poison_proc, sdk.to_managed_object(args[2]));
end, function(retval)
return retval;
end);
sdk.hook(on_blast_activate_proc_method, function(args)
pcall(ailment_hook.blast_proc, sdk.to_managed_object(args[2]));
pcall(this.blast_proc, sdk.to_managed_object(args[2]));
end, function(retval)
return retval;
end);
end
return ailment_hook;
return this;

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,8 @@
local body_part = {};
local this = {};
local singletons;
local customization_menu;
local config;
local table_helpers;
local health_UI_entity;
local stamina_UI_entity;
local rage_UI_entity;
@@ -11,38 +11,84 @@ local screen;
local drawing;
local part_names;
local time;
local utils;
local error_handler;
body_part.list = {};
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;
function body_part.new(id, name)
this.list = {};
function this.new(id, name)
local part = {};
part.id = id;
part.name = name;
part.health = 9999;
part.max_health = 99999;
part.health = -9;
part.max_health = -10;
part.health_percentage = 0;
part.break_health = 9999;
part.break_max_health = 99999;
part.break_health = -9;
part.break_max_health = -10;
part.break_health_percentage = 0;
part.lost_health = 9999;
part.loss_max_health = 99999;
part.lost_health = -9;
part.loss_max_health = -10;
part.loss_health_percentage = 0;
part.name = name;
part.flinch_count = 0;
part.break_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;
return part;
end
function body_part.update_flinch(part, part_current, part_max)
if part_current > part.health then
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)
if part_current > part.health and part.max_health > 0 then
part.flinch_count = part.flinch_count + 1;
end
@@ -62,7 +108,7 @@ function body_part.update_flinch(part, part_current, part_max)
end
end
function body_part.update_break(part, part_break_current, part_break_max, part_break_count, part_break_max_count)
function this.update_break(part, part_break_current, part_break_max, part_break_count, part_break_max_count)
if part.break_health ~= part_break_current then
part.last_change_time = time.total_elapsed_script_seconds;
@@ -91,7 +137,7 @@ function body_part.update_break(part, part_break_current, part_break_max, part_b
end
end
function body_part.update_loss(part, part_loss_current, part_loss_max, is_severed)
function this.update_loss(part, part_loss_current, part_loss_max, is_severed)
if part.loss_health ~= part_loss_current then
part.last_change_time = time.total_elapsed_script_seconds;
end
@@ -115,7 +161,126 @@ function body_part.update_loss(part, part_loss_current, part_loss_max, is_severe
end
function body_part.draw(monster, part_UI, cached_config, parts_position_on_screen, opacity_scale)
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)
local cached_config = cached_config.body_parts;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
@@ -123,68 +288,47 @@ function body_part.draw(monster, part_UI, cached_config, parts_position_on_scree
for REpart, part in pairs(monster.parts) do
local health_supported = part.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 health_supported then
if break_supported then
if severe_supported then
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
if cached_config.settings.filter_mode == "Current State" then
if break_supported and part.break_count >= part.break_max_count then
break_supported = false;
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
if sever_supported and part.is_severed then
sever_supported = false;
end
if anomaly_supported and not part.anomaly_is_active then
anomaly_supported = false;
end
end
local is_filtered_out = this.is_filtered_out(cached_config, health_supported, break_supported, sever_supported, anomaly_supported);
if is_filtered_out then
goto continue;
end
if cached_config.settings.hide_undamaged_parts
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.loss_health == part.loss_max_health and not part.is_severed) or not severe_supported) then
goto continue
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.loss_health == part.loss_max_health and not part.is_severed) or not sever_supported)
and ((part.anomaly_health == part.anomaly_max_health) or not anomaly_supported) then
goto continue;
end
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.loss_visibility or not severe_supported or part.is_severed) then
goto continue
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 sever_supported or part.is_severed)
and (not part_UI.anomaly_visibility or not anomaly_supported) then
goto continue;
end
if cached_config.settings.time_limit ~= 0 and
time.total_elapsed_script_seconds - part.last_change_time > cached_config.settings.time_limit then
goto continue
goto continue;
end
table.insert(displayed_parts, part);
@@ -281,6 +425,26 @@ function body_part.draw(monster, part_UI, cached_config, parts_position_on_scree
return left.loss_health_percentage < right.loss_health_percentage;
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
local last_part_position_on_screen;
@@ -298,11 +462,10 @@ function body_part.draw(monster, part_UI, cached_config, parts_position_on_scree
return last_part_position_on_screen;
end
function body_part.init_module()
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");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_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");
@@ -311,6 +474,11 @@ function body_part.init_module()
drawing = require("MHR_Overlay.UI.drawing");
part_names = require("MHR_Overlay.Misc.part_names");
time = require("MHR_Overlay.Game_Handler.time");
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return body_part;
function this.init_module()
end
return this;

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,44 @@
local monster_hook = {};
local this = {};
local small_monster;
local large_monster;
local config;
local ailments;
local player;
local players;
local quest_status;
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 enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase");
local enemy_character_base_update_method = enemy_character_base_type_def:get_method("update");
@@ -13,12 +47,14 @@ local is_boss_enemy_method = enemy_character_base_type_def:get_method("get_isBos
local enemy_damage_check_type_def = sdk.find_type_definition("snow.enemy.EnemyDamageCheck");
local damage_check_update_param_update_method = enemy_damage_check_type_def:get_method("updateParam");
local get_ref_enemy = enemy_damage_check_type_def:get_method("get_RefEnemy");
local anger_param_type_def = sdk.find_type_definition("snow.enemy.EnemyAngerParam");
local anger_add_method = anger_param_type_def:get_method("add");
local stamina_param_type_def = sdk.find_type_definition("snow.enemy.EnemyStaminaParam");
local stamina_sub_method = stamina_param_type_def:get_method("sub");
local get_enemy_method = stamina_param_type_def:get_method("get_Em");
local tick_count = 0;
local last_update_tick = 0;
@@ -52,7 +88,7 @@ re.on_pre_application_entry("UpdateBehavior", function()
end
end)
function monster_hook.update_monster(enemy)
function this.update_monster(enemy)
if enemy == nil then
return;
end
@@ -73,18 +109,18 @@ function monster_hook.update_monster(enemy)
end
if is_large then
monster_hook.update_large_monster(enemy);
this.update_large_monster(enemy);
else
monster_hook.update_small_monster(enemy);
this.update_small_monster(enemy);
end
end
function monster_hook.update_large_monster(enemy)
function this.update_large_monster(enemy)
local cached_config = config.current_config.large_monster_UI;
if not cached_config.dynamic.enabled and
not cached_config.static.enabled and
not cached_config.highlighted.enabled then
not cached_config.static.enabled and
not cached_config.highlighted.enabled then
return;
end
@@ -118,15 +154,17 @@ function monster_hook.update_large_monster(enemy)
large_monster.update_stamina_timer(enemy, monster, nil);
large_monster.update_rage_timer(enemy, monster, nil);
if quest_status.is_online and player.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);
pcall(large_monster.update_parts, enemy, monster, physical_param);
pcall(large_monster.update_anomaly_parts, enemy, monster, nil);
end
large_monster.update(enemy, monster);
end
function monster_hook.update_small_monster(enemy)
function this.update_small_monster(enemy)
if not config.current_config.small_monster_UI.enabled then
return;
end
@@ -158,19 +196,22 @@ function monster_hook.update_small_monster(enemy)
small_monster.update(enemy, monster);
if quest_status.is_online and player.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);
end
end
function monster_hook.update_health(enemy_damage_stock_param)
local enemy = enemy_damage_stock_param:call("get_RefEnemy");
function this.update_health(enemy_damage_check)
local enemy = get_ref_enemy:call(enemy_damage_check);
if enemy == nil then
error_handler.report("monster_hook.update_health", "Failed to access Data: enemy");
return;
end
local is_large = is_boss_enemy_method:call(enemy);
if is_large == nil then
error_handler.report("monster_hook.update_health", "Failed to access Data: is_large");
return;
end
@@ -179,19 +220,21 @@ function monster_hook.update_health(enemy_damage_stock_param)
local physical_param = large_monster.update_health(enemy, monster);
pcall(large_monster.update_parts, enemy, monster, physical_param);
pcall(large_monster.update_anomaly_parts, enemy, monster, nil);
else
local monster = small_monster.get_monster(enemy);
small_monster.update_health(enemy, monster);
end
end
function monster_hook.update_stamina(stamina_param, stamina_sub)
function this.update_stamina(stamina_param, stamina_sub)
if stamina_sub <= 0 then
return;
end
local enemy = stamina_param:call("get_Em");
local enemy = get_enemy_method:call(stamina_param);
if enemy == nil then
error_handler.report("monster_hook.update_stamina", "Failed to access Data: enemy");
return;
end
@@ -199,12 +242,12 @@ function monster_hook.update_stamina(stamina_param, stamina_sub)
large_monster.update_stamina(enemy, monster, stamina_param);
end
function monster_hook.update_stamina_timer(stamina_param, enemy)
function this.update_stamina_timer(stamina_param, enemy)
local monster = large_monster.get_monster(enemy);
large_monster.update_stamina_timer(enemy, monster, stamina_param);
end
function monster_hook.update_rage(anger_param, anger_add, enemy)
function this.update_rage(anger_param, anger_add, enemy)
if anger_add <= 0 then
return;
end
@@ -213,43 +256,46 @@ function monster_hook.update_rage(anger_param, anger_add, enemy)
large_monster.update_rage(enemy, monster, anger_param);
end
function monster_hook.update_rage_timer(anger_param, enemy)
function this.update_rage_timer(anger_param, enemy)
local monster = large_monster.get_monster(enemy);
large_monster.update_rage_timer(enemy, monster, anger_param);
end
function monster_hook.init_module()
function this.init_dependencies()
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
config = require("MHR_Overlay.Misc.config");
ailments = require("MHR_Overlay.Monsters.ailments");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
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)
pcall(monster_hook.update_monster, sdk.to_managed_object(args[2]));
pcall(this.update_monster, sdk.to_managed_object(args[2]));
end, function(retval)
return retval;
end);
sdk.hook(damage_check_update_param_update_method, function(args)
pcall(monster_hook.update_health, sdk.to_managed_object(args[2]));
pcall(this.update_health, sdk.to_managed_object(args[2]));
end, function(retval)
return retval;
end);
sdk.hook(stamina_sub_method, function(args)
pcall(monster_hook.update_stamina, sdk.to_managed_object(args[2]), sdk.to_float(args[3]));
pcall(this.update_stamina, sdk.to_managed_object(args[2]), sdk.to_float(args[3]));
end, function(retval)
return retval;
end);
sdk.hook(anger_add_method, function(args)
pcall(monster_hook.update_rage, sdk.to_managed_object(args[2]), sdk.to_float(args[3]),
pcall(this.update_rage, sdk.to_managed_object(args[2]), sdk.to_float(args[3]),
sdk.to_managed_object(args[4]));
end, function(retval)
return retval;
end);
end
return monster_hook;
return this;

View File

@@ -1,8 +1,9 @@
local small_monster = {};
local this = {};
local singletons;
local customization_menu;
local config;
local table_helpers;
local utils;
local health_UI_entity;
local stamina_UI_entity;
local screen;
@@ -11,15 +12,48 @@ local ailments;
local ailment_UI_entity;
local ailment_buildup;
local ailment_buildup_UI_entity;
local error_handler;
small_monster.list = {};
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;
function small_monster.new(enemy)
this.list = {};
function this.new(enemy)
local monster = {};
monster.is_large = false;
monster.health = 0;
monster.max_health = 999999;
monster.max_health = 0;
monster.health_percentage = 0;
monster.missing_health = 0;
monster.capture_health = 0;
@@ -33,24 +67,23 @@ function small_monster.new(enemy)
monster.UI = {};
small_monster.init(monster, enemy);
small_monster.init_UI(monster);
this.init(monster, enemy);
this.init_UI(monster);
small_monster.update_position(enemy, monster);
small_monster.update_health(enemy, monster);
small_monster.update(enemy, monster);
this.update_position(enemy, monster);
this.update(enemy, monster);
if small_monster.list[enemy] == nil then
small_monster.list[enemy] = monster;
if this.list[enemy] == nil then
this.list[enemy] = monster;
end
return monster;
end
function small_monster.get_monster(enemy)
local monster = small_monster.list[enemy];
function this.get_monster(enemy)
local monster = this.list[enemy];
if monster == nil then
monster = small_monster.new(enemy);
monster = this.new(enemy);
end
return monster;
@@ -62,28 +95,30 @@ local enemy_type_field = enemy_character_base_type_def:get_field("<EnemyType>k__
local message_manager_type_def = sdk.find_type_definition("snow.gui.MessageManager");
local get_enemy_name_message_method = message_manager_type_def:get_method("getEnemyNameMessage");
function small_monster.init(monster, enemy)
function this.init(monster, enemy)
local enemy_type = enemy_type_field:get_data(enemy);
if enemy_type == nil then
customization_menu.status = "No enemy type";
error_handler.report("small_monster.init", "Failed to access Data: enemy_type");
return;
end
monster.id = enemy_type;
local enemy_name = get_enemy_name_message_method:call(singletons.message_manager, enemy_type);
if enemy_name ~= nil then
monster.name = enemy_name;
if enemy_name == nil then
error_handler.report("small_monster.init", "Failed to access Data: enemy_name");
end
monster.name = enemy_name;
end
function small_monster.init_UI(monster)
function this.init_UI(monster)
local cached_config = config.current_config.small_monster_UI;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
local monster_UI = monster.UI;
monster_UI.name_label = table_helpers.deep_copy(cached_config.monster_name_label);
monster_UI.name_label = utils.table.deep_copy(cached_config.monster_name_label);
monster_UI.name_label.offset.x = monster_UI.name_label.offset.x * global_scale_modifier;
monster_UI.name_label.offset.y = monster_UI.name_label.offset.y * global_scale_modifier;
@@ -118,19 +153,19 @@ function small_monster.init_UI(monster)
);
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 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 vital_param_type = get_vital_method:get_return_type();
local get_current_method = vital_param_type:get_method("get_Current");
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 small_monster.update_position(enemy, monster)
function this.update_position(enemy, monster)
local cached_config = config.current_config.small_monster_UI;
if not cached_config.enabled then
@@ -141,13 +176,16 @@ function small_monster.update_position(enemy, monster)
return;
end
local position = get_pos_field:call(enemy);
if position ~= nil then
monster.position = position;
local position = get_pos_method:call(enemy);
if position == nil then
error_handler.report("small_monster.update_position", "Failed to access Data: position");
end
monster.position = position;
end
function small_monster.update(enemy, monster)
function this.update(enemy, monster)
if not config.current_config.small_monster_UI.enabled then
return;
end
@@ -155,39 +193,55 @@ function small_monster.update(enemy, monster)
local dead_or_captured = check_die_method:call(enemy);
if dead_or_captured ~= nil then
monster.dead_or_captured = dead_or_captured;
else
error_handler.report("small_monster.update", "Failed to access Data: dead_or_captured");
end
pcall(ailments.update_ailments, enemy, monster);
end
function small_monster.update_health(enemy, monster)
function this.update_health(enemy, monster)
if not config.current_config.small_monster_UI.enabled or not config.current_config.small_monster_UI.health.visibility then
return;
end
local physical_param = physical_param_field:get_data(enemy)
local physical_param = get_physical_param_method:call(enemy);
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;
end
local vital_param = get_vital_method:call(physical_param, 0, 0);
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;
end
monster.health = get_current_method:call(vital_param) or monster.health;
monster.max_health = get_max_method:call(vital_param) or monster.max_health;
monster.missing_health = monster.max_health - monster.health;
if monster.max_health ~= 0 then
monster.health_percentage = monster.health / monster.max_health;
monster.capture_percentage = monster.capture_health / monster.max_health;
local health = get_current_method:call(vital_param);
if health ~= nil then
monster.health = health;
else
error_handler.report("small_monster.update_health", "Failed to access Data: health");
return;
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
function small_monster.draw(monster, cached_config, position_on_screen, opacity_scale)
function this.draw(monster, cached_config, position_on_screen, opacity_scale)
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
drawing.draw_label(monster.UI.name_label, position_on_screen, opacity_scale, monster.name);
@@ -212,15 +266,15 @@ function small_monster.draw(monster, cached_config, position_on_screen, opacity_
ailment_buildup.draw(monster, monster.UI.ailment_buildup_UI, cached_config, ailment_buildups_position_on_screen, opacity_scale);
end
function small_monster.init_list()
small_monster.list = {};
function this.init_list()
this.list = {};
end
function small_monster.init_module()
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");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
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");
@@ -229,6 +283,10 @@ function small_monster.init_module()
ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity");
ailment_buildup = require("MHR_Overlay.Monsters.ailment_buildup");
ailment_buildup_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_buildup_UI_entity");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return small_monster;
function this.init_module()
end
return this;

View File

@@ -1,9 +1,9 @@
local ailment_buildups_customization = {};
local this = {};
local table_helpers;
local utils;
local config;
local screen;
local player;
local players;
local large_monster;
local small_monster;
local env_creature;
@@ -14,10 +14,99 @@ local keyboard;
local customization_menu;
local label_customization;
local bar_customization;
local error_handler;
function ailment_buildups_customization.draw(cached_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.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)
local changed = false;
local config_changed = false;
local index = 1;
if imgui.tree_node(language.current_language.customization_menu.ailment_buildups) then
changed, cached_config.visibility = imgui.checkbox(
@@ -70,24 +159,24 @@ function ailment_buildups_customization.draw(cached_config)
if imgui.tree_node(language.current_language.customization_menu.settings) then
changed, index = imgui.combo(
language.current_language.customization_menu.highlighted_bar,
table_helpers.find_index(customization_menu.highlighted_buildup_bar_types, cached_config.settings.highlighted_bar),
customization_menu.displayed_highlighted_buildup_bar_types);
utils.table.find_index(this.highlighted_buildup_bar_types, cached_config.settings.highlighted_bar),
this.displayed_highlighted_buildup_bar_types);
config_changed = config_changed or changed;
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
changed, index = imgui.combo(
language.current_language.customization_menu.buildup_bars_are_relative_to,
table_helpers.find_index(customization_menu.displayed_buildup_bar_relative_types, cached_config.settings.buildup_bar_relative_to),
customization_menu.displayed_buildup_bar_relative_types);
utils.table.find_index(this.displayed_buildup_bar_relative_types, cached_config.settings.buildup_bar_relative_to),
this.displayed_buildup_bar_relative_types);
config_changed = config_changed or changed;
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
changed, cached_config.settings.time_limit = imgui.drag_float(
@@ -101,13 +190,13 @@ function ailment_buildups_customization.draw(cached_config)
if imgui.tree_node(language.current_language.customization_menu.sorting) then
changed, index = imgui.combo(
language.current_language.customization_menu.type,
table_helpers.find_index(customization_menu.ailment_buildups_sorting_types, cached_config.sorting.type),
customization_menu.displayed_ailment_buildups_sorting_types);
utils.table.find_index(this.ailment_buildups_sorting_types, cached_config.sorting.type),
this.displayed_ailment_buildups_sorting_types);
config_changed = config_changed or changed;
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
changed, cached_config.sorting.reversed_order = imgui.checkbox(
@@ -137,90 +226,8 @@ function ailment_buildups_customization.draw(cached_config)
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.ailment_name_label) then
changed, cached_config.ailment_name_label.visibility =
imgui.checkbox(language.current_language.customization_menu.visible,
cached_config.ailment_name_label.visibility);
config_changed = config_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.include) then
changed, cached_config.ailment_name_label.include.ailment_name = imgui.checkbox(
language.current_language.customization_menu.ailment_name,
cached_config.ailment_name_label.include.ailment_name);
config_changed = config_changed or changed;
changed, cached_config.ailment_name_label.include.activation_count = imgui.checkbox(
language.current_language.customization_menu.activation_count,
cached_config.ailment_name_label.include.activation_count);
config_changed = config_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.offset) then
changed, cached_config.ailment_name_label.offset.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.ailment_name_label.offset.x,
0.1, -screen.width, screen.width, "%.1f");
config_changed = config_changed or changed;
changed, cached_config.ailment_name_label.offset.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.ailment_name_label.offset.y,
0.1, -screen.height, screen.height, "%.1f");
config_changed = config_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.color) then
changed, cached_config.ailment_name_label.color = imgui.color_picker_argb(
"", cached_config.ailment_name_label.color, customization_menu.color_picker_flags);
config_changed = config_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.shadow) then
changed, cached_config.ailment_name_label.shadow.visibility = imgui.checkbox(
language.current_language.customization_menu.visible, cached_config.ailment_name_label.shadow.visibility);
config_changed = config_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.offset) then
changed, cached_config.ailment_name_label.shadow.offset.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.ailment_name_label.shadow.offset.x,
0.1, -screen.width, screen.width, "%.1f");
config_changed = config_changed or changed;
changed, cached_config.ailment_name_label.shadow.offset.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.ailment_name_label.shadow.offset.y,
0.1, -screen.height, screen.height, "%.1f");
config_changed = config_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.color) then
changed, cached_config.ailment_name_label.shadow.color = imgui.color_picker_argb(
"", cached_config.ailment_name_label.shadow.color, customization_menu.color_picker_flags);
config_changed = config_changed or changed;
imgui.tree_pop();
end
imgui.tree_pop();
end
imgui.tree_pop();
end
changed = label_customization.draw(language.current_language.customization_menu.ailment_name_label, cached_config.ailment_name_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.player_name_label, cached_config.player_name_label);
config_changed = config_changed or changed;
@@ -249,12 +256,12 @@ function ailment_buildups_customization.draw(cached_config)
return config_changed;
end
function ailment_buildups_customization.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
@@ -265,6 +272,10 @@ function ailment_buildups_customization.init_module()
label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return ailment_buildups_customization;
function this.init_module()
end
return this;

View File

@@ -1,9 +1,9 @@
local ailments_customization = {};
local this = {};
local table_helpers;
local utils;
local config;
local screen;
local player;
local players;
local large_monster;
local small_monster;
local env_creature;
@@ -14,10 +14,65 @@ local keyboard;
local customization_menu;
local label_customization;
local bar_customization;
local error_handler;
function ailments_customization.draw(cached_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.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)
local changed = false;
local config_changed = false;
local index = 0;
if imgui.tree_node(language.current_language.customization_menu.ailments) then
changed, cached_config.visibility = imgui.checkbox(
@@ -110,13 +165,13 @@ function ailments_customization.draw(cached_config)
if imgui.tree_node(language.current_language.customization_menu.sorting) then
changed, index = imgui.combo(
language.current_language.customization_menu.type,
table_helpers.find_index(customization_menu.ailments_sorting_types, cached_config.sorting.type),
customization_menu.displayed_ailments_sorting_types);
utils.table.find_index(this.ailments_sorting_types, cached_config.sorting.type),
this.displayed_ailments_sorting_types);
config_changed = config_changed or changed;
if changed then
cached_config.sorting.type = customization_menu.ailments_sorting_types[index];
cached_config.sorting.type = this.ailments_sorting_types[index];
end
changed, cached_config.sorting.reversed_order = imgui.checkbox(
@@ -332,12 +387,12 @@ function ailments_customization.draw(cached_config)
return config_changed;
end
function ailments_customization.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
@@ -347,6 +402,10 @@ function ailments_customization.init_module()
customization_menu = require("MHR_Overlay.UI.customization_menu");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return ailments_customization;
function this.init_module()
end
return this;

View File

@@ -1,9 +1,9 @@
local bar_customization = {};
local this = {};
local table_helpers;
local utils;
local config;
local screen;
local player;
local players;
local large_monster;
local small_monster;
local env_creature;
@@ -13,73 +13,156 @@ local time_UI;
local keyboard;
local customization_menu;
local line_customization;
local error_handler;
function bar_customization.draw(bar_name, bar)
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 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)
if bar == nil then
return false;
end
local cached_language = language.current_language.customization_menu;
local bar_changed = false;
local changed = false;
local index = 1;
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_changed = bar_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.offset) then
changed, bar.offset.x = imgui.drag_float(language.current_language.customization_menu.x,
if imgui.tree_node(cached_language.settings) then
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_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_changed = bar_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.size) then
changed, bar.size.width = imgui.drag_float(language.current_language.customization_menu.width,
if imgui.tree_node(cached_language.size) then
changed, bar.size.width = imgui.drag_float(cached_language.width,
bar.size.width, 0.1, 0, screen.width, "%.1f");
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_changed = bar_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.outline) then
changed, bar.outline.visibility = imgui.checkbox(language.current_language.customization_menu.visible
if imgui.tree_node(cached_language.outline) then
changed, bar.outline.visibility = imgui.checkbox(cached_language.visible
, bar.outline.visibility);
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_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_changed = bar_changed or changed;
changed, index = imgui.combo(language.current_language.customization_menu.style,
table_helpers.find_index(customization_menu.outline_styles,
bar.outline.style),
customization_menu.displayed_outline_styles);
changed, index = imgui.combo(cached_language.style,
utils.table.find_index(outline_styles, bar.outline.style),
displayed_outline_styles);
bar_changed = bar_changed or changed;
if changed then
bar.outline.style = customization_menu.outline_styles[index];
bar.outline.style = outline_styles[index];
end
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.colors) then
if imgui.tree_node(cached_language.colors) then
local colors = nil;
if bar.colors ~= nil then
colors = bar.colors;
@@ -87,7 +170,7 @@ function bar_customization.draw(bar_name, bar)
colors = bar.normal_colors;
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,
customization_menu.color_picker_flags);
bar_changed = bar_changed or changed;
@@ -95,7 +178,7 @@ function bar_customization.draw(bar_name, bar)
imgui.tree_pop();
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,
customization_menu.color_picker_flags);
bar_changed = bar_changed or changed;
@@ -103,7 +186,7 @@ function bar_customization.draw(bar_name, bar)
imgui.tree_pop();
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,
customization_menu.color_picker_flags);
bar_changed = bar_changed or changed;
@@ -112,8 +195,8 @@ function bar_customization.draw(bar_name, bar)
end
if bar.capture_colors ~= nil then
if imgui.tree_node(language.current_language.customization_menu.monster_can_be_captured) then
if imgui.tree_node(language.current_language.customization_menu.foreground) then
if imgui.tree_node(cached_language.monster_can_be_captured) then
if imgui.tree_node(cached_language.foreground) then
changed, bar.capture_colors.foreground = imgui.color_picker_argb("",
bar.capture_colors.foreground
,
@@ -123,7 +206,7 @@ function bar_customization.draw(bar_name, bar)
imgui.tree_pop();
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("",
bar.capture_colors.background
,
@@ -133,7 +216,7 @@ function bar_customization.draw(bar_name, bar)
imgui.tree_pop();
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("",
bar.capture_colors.outline
,
@@ -150,7 +233,7 @@ function bar_customization.draw(bar_name, bar)
imgui.tree_pop();
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;
imgui.tree_pop();
@@ -159,12 +242,12 @@ function bar_customization.draw(bar_name, bar)
return bar_changed;
end
function bar_customization.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
@@ -173,6 +256,10 @@ function bar_customization.init_module()
keyboard = require("MHR_Overlay.Game_Handler.keyboard");
customization_menu = require("MHR_Overlay.UI.customization_menu");
line_customization = require("MHR_Overlay.UI.Customizations.line_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return bar_customization;
function this.init_module()
end
return this;

View File

@@ -1,9 +1,9 @@
local body_parts_customization = {};
local this = {};
local table_helpers;
local utils;
local config;
local screen;
local player;
local players;
local large_monster;
local small_monster;
local env_creature;
@@ -14,161 +14,313 @@ local keyboard;
local customization_menu;
local label_customization;
local bar_customization;
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.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)
local cached_language = language.current_language.customization_menu;
function body_parts_customization.draw(cached_config)
local changed = false;
local config_changed = false;
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(
language.current_language.customization_menu.visible, cached_config.visibility);
cached_language.visible, cached_config.visibility);
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(
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;
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;
imgui.tree_pop();
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(
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;
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;
imgui.tree_pop();
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(
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;
changed, cached_config.settings.render_inactive_anomaly_cores = imgui.checkbox(
cached_language.render_inactive_anomaly_cores, cached_config.settings.render_inactive_anomaly_cores);
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;
if changed then
cached_config.settings.filter_mode = this.large_monster_UI_parts_filter_types[index];
end
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;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.sorting) then
if imgui.tree_node(cached_language.sorting) then
changed, index = imgui.combo(
language.current_language.customization_menu.type,
table_helpers.find_index(customization_menu.large_monster_UI_parts_sorting_types, cached_config.sorting.type),
customization_menu.displayed_monster_UI_parts_sorting_types);
cached_language.type,
utils.table.find_index(this.large_monster_UI_parts_sorting_types, cached_config.sorting.type),
this.displayed_large_monster_UI_parts_sorting_types);
config_changed = config_changed or changed;
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
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;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.filter) then
changed, cached_config.filter.health_break_severe = imgui.checkbox(
language.current_language.customization_menu.health_break_severe_filter, cached_config.filter.health_break_severe);
if imgui.tree_node(cached_language.filter) then
changed, cached_config.filter.health_break_sever_anomaly = imgui.checkbox(
cached_language.health_break_sever_anomaly_filter, cached_config.filter.health_break_sever_anomaly);
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(
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;
changed, cached_config.filter.health_severe = imgui.checkbox(
language.current_language.customization_menu.health_severe_filter, cached_config.filter.health_severe);
changed, cached_config.filter.health_sever = imgui.checkbox(
cached_language.health_sever_filter, cached_config.filter.health_sever);
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(
language.current_language.customization_menu.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);
cached_language.health_filter, cached_config.filter.health);
config_changed = config_changed or changed;
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;
changed, cached_config.filter.severe = imgui.checkbox(
language.current_language.customization_menu.severe_filter, cached_config.filter.severe);
changed, cached_config.filter.sever = imgui.checkbox(
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;
imgui.tree_pop();
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(
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;
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(
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;
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;
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;
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;
imgui.tree_pop();
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(
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;
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;
imgui.tree_pop();
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(
"", cached_config.part_name_label.color, customization_menu.color_picker_flags);
@@ -177,21 +329,21 @@ function body_parts_customization.draw(cached_config)
imgui.tree_pop();
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(
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;
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(
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");
config_changed = config_changed or changed;
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");
config_changed = config_changed or changed;
@@ -199,7 +351,7 @@ function body_parts_customization.draw(cached_config)
imgui.tree_pop();
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(
"",cached_config.part_name_label.shadow.color, customization_menu.color_picker_flags);
@@ -214,106 +366,141 @@ function body_parts_customization.draw(cached_config)
imgui.tree_pop();
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(
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;
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(
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;
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;
imgui.tree_pop();
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;
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;
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;
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;
imgui.tree_pop();
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(
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;
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(
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;
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;
imgui.tree_pop();
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;
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;
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;
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;
imgui.tree_pop();
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(
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;
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(
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;
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;
imgui.tree_pop();
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;
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;
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;
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;
imgui.tree_pop();
@@ -325,12 +512,12 @@ function body_parts_customization.draw(cached_config)
return config_changed;
end
function body_parts_customization.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
@@ -340,6 +527,10 @@ function body_parts_customization.init_module()
customization_menu = require("MHR_Overlay.UI.customization_menu");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return body_parts_customization;
function this.init_module()
end
return this;

View File

@@ -1,9 +1,8 @@
local large_monster_UI_customization = {};
local this = {};
local table_helpers;
local config;
local screen;
local player;
local players;
local large_monster;
local small_monster;
local env_creature;
@@ -14,8 +13,41 @@ local keyboard;
local customization_menu;
local label_customization;
local bar_customization;
local error_handler;
function large_monster_UI_customization.draw(cached_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;
function this.draw(cached_config)
local changed = false;
local config_changed = false;
@@ -57,12 +89,11 @@ function large_monster_UI_customization.draw(cached_config)
return config_changed;
end
function large_monster_UI_customization.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
@@ -72,6 +103,10 @@ function large_monster_UI_customization.init_module()
customization_menu = require("MHR_Overlay.UI.customization_menu");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return large_monster_UI_customization;
function this.init_module()
end
return this;

View File

@@ -1,9 +1,8 @@
local label_customization = {};
local this = {};
local table_helpers;
local config;
local screen;
local player;
local players;
local large_monster;
local small_monster;
local env_creature;
@@ -12,57 +11,102 @@ local part_names;
local time_UI;
local keyboard;
local customization_menu;
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;
function this.draw(label_name, label)
local cached_language = language.current_language.customization_menu;
function label_customization.draw(label_name, label)
local label_changed = false;
local changed = false;
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;
-- add text format
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;
changed, label.offset.y = imgui.drag_float(language.current_language.customization_menu.y,
label.offset.y, 0.1, -screen.height, screen.height, "%.1f");
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 imgui.tree_node(language.current_language.customization_menu.color) then
changed, label.color = imgui.color_picker_argb("", label.color,
customization_menu.color_picker_flags);
if label.include ~= nil then
if imgui.tree_node(cached_language.include) then
for include_name, include in pairs(label.include) do
changed, label.include[include_name] = imgui.checkbox(cached_language[include_name], label.include[include_name]);
label_changed = label_changed or changed;
end
imgui.tree_pop();
end
end
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");
label_changed = label_changed or changed;
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;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.shadow) then
changed, label.shadow.visibility = imgui.checkbox(language.current_language.customization_menu.visible
, label.shadow.visibility);
if imgui.tree_node(cached_language.color) then
changed, label.color = imgui.color_picker_argb("", label.color, customization_menu.color_picker_flags);
label_changed = label_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.offset) then
changed, label.shadow.offset.x = imgui.drag_float(language.current_language.customization_menu.x,
imgui.tree_pop();
end
if imgui.tree_node(cached_language.shadow) then
changed, label.shadow.visibility = imgui.checkbox(cached_language.visible, label.shadow.visibility);
label_changed = label_changed or changed;
if imgui.tree_node(cached_language.offset) then
changed, label.shadow.offset.x = imgui.drag_float(cached_language.x,
label.shadow.offset.x, 0.1, -screen.width, screen.width, "%.1f");
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_changed = label_changed or changed;
imgui.tree_pop();
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,
customization_menu.color_picker_flags);
label_changed = label_changed or changed;
@@ -79,12 +123,11 @@ function label_customization.draw(label_name, label)
return label_changed;
end
function label_customization.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
@@ -92,6 +135,10 @@ function label_customization.init_module()
time_UI = require("MHR_Overlay.UI.Modules.time_UI");
keyboard = require("MHR_Overlay.Game_Handler.keyboard");
customization_menu = require("MHR_Overlay.UI.customization_menu");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return label_customization;
function this.init_module()
end
return this;

View File

@@ -1,9 +1,8 @@
local large_monster_UI_customization = {};
local this = {};
local table_helpers;
local config;
local screen;
local player;
local players;
local large_monster;
local small_monster;
local env_creature;
@@ -12,6 +11,7 @@ local part_names;
local time_UI;
local keyboard;
local customization_menu;
local error_handler;
local label_customization;
local bar_customization;
@@ -22,104 +22,44 @@ local body_parts_customization;
local ailments_customization;
local ailment_buildups_customization;
function large_monster_UI_customization.draw(cached_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;
function this.draw(cached_config)
local changed = false;
local config_changed = false;
if imgui.tree_node(language.current_language.customization_menu.monster_name_label) then
changed, cached_config.monster_name_label.visibility = imgui.checkbox(
language.current_language.customization_menu.visible, cached_config.monster_name_label.visibility);
config_changed = config_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.include) then
changed, cached_config.monster_name_label.include.monster_name = imgui.checkbox(
language.current_language.customization_menu.monster_name, cached_config.monster_name_label.include.monster_name);
config_changed = config_changed or changed;
changed, cached_config.monster_name_label.include.monster_id = imgui.checkbox(
language.current_language.customization_menu.monster_id, cached_config.monster_name_label.include.monster_id);
config_changed = config_changed or changed;
changed, cached_config.monster_name_label.include.crown = imgui.checkbox(
language.current_language.customization_menu.crown, cached_config.monster_name_label.include.crown);
config_changed = config_changed or changed;
changed, cached_config.monster_name_label.include.size = imgui.checkbox(
language.current_language.customization_menu.size, cached_config.monster_name_label.include.size);
config_changed = config_changed or changed;
changed, cached_config.monster_name_label.include.scrown_thresholds = imgui.checkbox(
language.current_language.customization_menu.crown_thresholds, cached_config.monster_name_label.include.scrown_thresholds);
config_changed = config_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.offset) then
changed, cached_config.monster_name_label.offset.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.monster_name_label.offset.x, 0.1, -screen.width, screen.width, "%.1f");
config_changed = config_changed or changed;
changed, cached_config.monster_name_label.offset.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.monster_name_label.offset.y, 0.1, -screen.height, screen.height, "%.1f");
config_changed = config_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.color) then
changed, cached_config.monster_name_label.color = imgui.color_picker_argb(
"", cached_config.monster_name_label.color, customization_menu.color_picker_flags);
config_changed = config_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.shadow) then
changed, cached_config.monster_name_label.shadow.visibility = imgui.checkbox(
language.current_language.customization_menu.visible, cached_config.monster_name_label.shadow.visibility);
config_changed = config_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.offset) then
changed, cached_config.monster_name_label.shadow.offset.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.monster_name_label.shadow.offset.x,
0.1, -screen.width, screen.width, "%.1f");
config_changed = config_changed or changed;
changed, cached_config.monster_name_label.shadow.offset.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.monster_name_label.shadow.offset.y,
0.1, -screen.height, screen.height, "%.1f");
config_changed = config_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.color) then
changed, cached_config.monster_name_label.shadow.color = imgui.color_picker_argb(
"", cached_config.monster_name_label.shadow.color, customization_menu.color_picker_flags);
config_changed = config_changed or changed;
imgui.tree_pop();
end
imgui.tree_pop();
end
imgui.tree_pop();
end
changed = label_customization.draw(language.current_language.customization_menu.monster_name_label, cached_config.monster_name_label);
config_changed = config_changed or changed;
changed = health_customization.draw(cached_config.health);
config_changed = config_changed or changed;
@@ -142,12 +82,11 @@ function large_monster_UI_customization.draw(cached_config)
return config_changed;
end
function large_monster_UI_customization.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
@@ -155,9 +94,10 @@ function large_monster_UI_customization.init_module()
time_UI = require("MHR_Overlay.UI.Modules.time_UI");
keyboard = require("MHR_Overlay.Game_Handler.keyboard");
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");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
health_customization = require("MHR_Overlay.UI.Customizations.health_customization");
stamina_customization = require("MHR_Overlay.UI.Customizations.stamina_customization");
rage_customization = require("MHR_Overlay.UI.Customizations.rage_customization");
@@ -166,4 +106,7 @@ function large_monster_UI_customization.init_module()
ailment_buildups_customization = require("MHR_Overlay.UI.Customizations.ailment_buildups_customization");
end
return large_monster_UI_customization;
function this.init_module()
end
return this;

View File

@@ -1,9 +1,8 @@
local line_customization = {};
local this = {};
local table_helpers;
local config;
local screen;
local player;
local players;
local large_monster;
local small_monster;
local env_creature;
@@ -12,8 +11,41 @@ local part_names;
local time_UI;
local keyboard;
local customization_menu;
local error_handler;
function line_customization.draw(line_name, line)
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;
function this.draw(line_name, line)
if line == nil then
return;
end
@@ -64,12 +96,11 @@ function line_customization.draw(line_name, line)
return line_changed;
end
function line_customization.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
@@ -77,6 +108,10 @@ function line_customization.init_module()
time_UI = require("MHR_Overlay.UI.Modules.time_UI");
keyboard = require("MHR_Overlay.Game_Handler.keyboard");
customization_menu = require("MHR_Overlay.UI.customization_menu");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return line_customization;
function this.init_module()
end
return this;

View File

@@ -1,9 +1,8 @@
local module_visibility_customization = {};
local this = {};
local table_helpers;
local config;
local screen;
local player;
local players;
local large_monster;
local small_monster;
local env_creature;
@@ -14,8 +13,41 @@ local keyboard;
local customization_menu;
local label_customization;
local bar_customization;
local error_handler;
function module_visibility_customization.draw(cached_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;
function this.draw(cached_config)
local changed = false;
local config_changed = false;
@@ -61,15 +93,24 @@ function module_visibility_customization.draw(cached_config)
config_changed = config_changed or changed;
changed, cached_config.buff_UI = imgui.checkbox(
language.current_language.customization_menu.buff_UI,
cached_config.buff_UI);
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;
end
function module_visibility_customization.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
@@ -77,6 +118,10 @@ function module_visibility_customization.init_module()
time_UI = require("MHR_Overlay.UI.Modules.time_UI");
keyboard = require("MHR_Overlay.Game_Handler.keyboard");
customization_menu = require("MHR_Overlay.UI.customization_menu");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return module_visibility_customization;
function this.init_module()
end
return this;

View File

@@ -1,9 +1,8 @@
local rage_customization = {};
local this = {};
local table_helpers;
local config;
local screen;
local player;
local players;
local large_monster;
local small_monster;
local env_creature;
@@ -14,8 +13,41 @@ local keyboard;
local customization_menu;
local label_customization;
local bar_customization;
local error_handler;
function rage_customization.draw(cached_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;
function this.draw(cached_config)
local changed = false;
local config_changed = false;
@@ -60,12 +92,11 @@ function rage_customization.draw(cached_config)
return config_changed;
end
function rage_customization.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
@@ -75,6 +106,10 @@ function rage_customization.init_module()
customization_menu = require("MHR_Overlay.UI.customization_menu");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return rage_customization;
function this.init_module()
end
return this;

View File

@@ -1,9 +1,8 @@
local stamina_customization = {};
local this = {};
local table_helpers;
local config;
local screen;
local player;
local players;
local large_monster;
local small_monster;
local env_creature;
@@ -14,8 +13,41 @@ local keyboard;
local customization_menu;
local label_customization;
local bar_customization;
local error_handler;
function stamina_customization.draw(cached_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;
function this.draw(cached_config)
local changed = false;
local config_changed = false;
@@ -60,12 +92,11 @@ function stamina_customization.draw(cached_config)
return config_changed;
end
function stamina_customization.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
@@ -75,6 +106,10 @@ function stamina_customization.init_module()
customization_menu = require("MHR_Overlay.UI.customization_menu");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return stamina_customization;
function this.init_module()
end
return this;

View File

@@ -0,0 +1,384 @@
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 otomo_moves;
local weapon_skills;
local misc_buffs;
local rampage_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;
local displayed_buffs = {};
function this.update()
local cached_config = config.current_config.buff_UI;
local _displayed_buffs = {};
for key, abnormal_status in pairs(abnormal_statuses.list) do
if abnormal_status.is_visible then
table.insert(_displayed_buffs, abnormal_status);
end
end
for key, item_buff in pairs(item_buffs.list) do
if item_buff.is_visible then
table.insert(_displayed_buffs, item_buff);
end
end
for key, endemic_life_buff in pairs(endemic_life_buff.list) do
if endemic_life_buff.is_visible then
table.insert(_displayed_buffs, endemic_life_buff);
end
end
for _, melody_effect in pairs(melody_effects.list) do
if melody_effect.is_visible then
table.insert(_displayed_buffs, melody_effect);
end
end
for key, dango_skill in pairs(dango_skills.list) do
if dango_skill.is_visible then
table.insert(_displayed_buffs, dango_skill);
end
end
for key, rampage_skill in pairs(rampage_skills.list) do
if rampage_skill.is_visible then
table.insert(_displayed_buffs, rampage_skill);
end
end
for key, skill in pairs(skills.list) do
if skill.is_visible then
table.insert(_displayed_buffs, skill);
end
end
for key, weapon_skill in pairs(weapon_skills.list) do
if weapon_skill.is_visible then
table.insert(_displayed_buffs, weapon_skill);
end
end
for key, otomo_move in pairs(otomo_moves.list) do
if otomo_move.is_visible then
table.insert(_displayed_buffs, otomo_move);
end
end
for key, misc_buffs in pairs(misc_buffs.list) do
if misc_buffs.is_visible then
table.insert(_displayed_buffs, misc_buffs);
end
end
displayed_buffs = this.sort_buffs(_displayed_buffs, cached_config);
end
function this.sort_buffs(_displayed_buffs, cached_config)
local infinite_buffs_location = cached_config.settings.infinite_buffs_location;
cached_config = cached_config.sorting;
if cached_config.type == "Name" then
if cached_config.reversed_order then
table.sort(_displayed_buffs, function(left, right)
if infinite_buffs_location == "First" then
if left.is_infinite and right.is_infinite then
return left.name < right.name;
elseif left.is_infinite then
return true;
elseif right.is_infinite then
return false;
else
return left.name < right.name;
end
elseif infinite_buffs_location == "Last" then
if left.is_infinite and right.is_infinite then
return left.name < right.name;
elseif left.is_infinite then
return false;
elseif right.is_infinite then
return true;
else
return left.name < right.name;
end
else
return left.name < right.name;
end
end);
else
table.sort(_displayed_buffs, function(left, right)
if infinite_buffs_location == "First" then
if left.is_infinite and right.is_infinite then
return left.name > right.name;
elseif left.is_infinite then
return false;
elseif right.is_infinite then
return true;
else
return left.name > right.name;
end
elseif infinite_buffs_location == "Last" then
if left.is_infinite and right.is_infinite then
return left.name > right.name;
elseif left.is_infinite then
return true;
elseif right.is_infinite then
return false;
else
return left.name > right.name;
end
else
return left.name > right.name;
end
end);
end
elseif cached_config.type == "Timer" then
if cached_config.reversed_order then
table.sort(_displayed_buffs, function(left, right)
if infinite_buffs_location == "First" then
if left.is_infinite and right.is_infinite then
return left.timer < right.timer;
elseif left.is_infinite then
return true;
elseif right.is_infinite then
return false;
else
return left.timer < right.timer;
end
elseif infinite_buffs_location == "Last" then
if left.is_infinite and right.is_infinite then
return left.timer < right.timer;
elseif left.is_infinite then
return false;
elseif right.is_infinite then
return true;
else
return left.timer < right.timer;
end
else
return left.timer < right.timer;
end
end);
else
table.sort(_displayed_buffs, function(left, right)
if infinite_buffs_location == "First" then
if left.is_infinite and right.is_infinite then
return left.timer > right.timer;
elseif left.is_infinite then
return false;
elseif right.is_infinite then
return true;
else
return left.timer > right.timer;
end
elseif infinite_buffs_location == "Last" then
if left.is_infinite and right.is_infinite then
return left.timer > right.timer;
elseif left.is_infinite then
return true;
elseif right.is_infinite then
return false;
else
return left.timer > right.timer;
end
else
return left.timer > right.timer;
end
end);
end
else -- Duration
if cached_config.reversed_order then
table.sort(_displayed_buffs, function(left, right)
if infinite_buffs_location == "First" then
if left.is_infinite and right.is_infinite then
return left.duration < right.duration;
elseif left.is_infinite then
return true;
elseif right.is_infinite then
return false;
else
return left.duration < right.duration;
end
elseif infinite_buffs_location == "Last" then
if left.is_infinite and right.is_infinite then
return left.duration < right.duration;
elseif left.is_infinite then
return false;
elseif right.is_infinite then
return true;
else
return left.duration < right.duration;
end
else
return left.duration < right.duration;
end
end);
else
table.sort(_displayed_buffs, function(left, right)
if infinite_buffs_location == "First" then
if left.is_infinite and right.is_infinite then
return left.duration > right.duration;
elseif left.is_infinite then
return false;
elseif right.is_infinite then
return true;
else
return left.duration > right.duration;
end
elseif infinite_buffs_location == "Last" then
if left.is_infinite and right.is_infinite then
return left.duration > right.duration;
elseif left.is_infinite then
return true;
elseif right.is_infinite then
return false;
else
return left.duration > right.duration;
end
else
return left.duration > right.duration;
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);
-- draw
for _, buff in ipairs(displayed_buffs) do
buffs.draw(buff, buff.buff_UI, position_on_screen, 1);
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
::continue::
end
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");
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
return this;

View File

@@ -1,163 +1,242 @@
local damage_meter_UI = {};
local this = {};
local singletons;
local config;
local customization_menu;
local player;
local players;
local non_players;
local quest_status;
local screen;
local drawing;
local language;
local utils;
local error_handler;
damage_meter_UI.last_displayed_players = {};
damage_meter_UI.freeze_displayed_players = false;
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 lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager");
local quest_hunter_info_field = lobby_manager_type_def:get_field("_questHunterInfo");
local hunter_info_field = lobby_manager_type_def:get_field("_hunterInfo");
local top_damage = 0;
local top_dps = 0;
local quest_hunter_info_type_def = quest_hunter_info_field:get_type();
local get_count_method = quest_hunter_info_type_def:get_method("get_Count");
local get_item_method = quest_hunter_info_type_def:get_method("get_Item");
this.displayed_players = {};
this.last_displayed_players = {};
this.freeze_displayed_players = false;
local hunter_info_type_def = sdk.find_type_definition("snow.LobbyManager.HunterInfo");
local member_index_field = hunter_info_type_def:get_field("_memberIndex");
function damage_meter_UI.get_players(player_info_list)
function this.update()
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 cached_config = config.current_config.damage_meter_UI;
-- other players
if player_info_list == nil then
customization_menu.status = "No player info list";
return {};
end
if this.freeze_displayed_players and not utils.table.is_empty(this.last_displayed_players) then
this.displayed_players = this.last_displayed_players;
return;
end;
local quest_players = {};
local count = get_count_method:call(player_info_list);
if count == nil then
customization_menu.status = "No player info list count";
return {};
end
for i = 0, count - 1 do
local player_info = get_item_method:call(player_info_list, i);
if player_info == nil then
goto continue
end
local player_id = member_index_field:get_data(player_info);
if player_id == nil then
goto continue
end
local _player = player.get_player(player_id);
if _player ~= nil then
if _player == player.myself and cached_config.settings.my_damage_bar_location ~= "Normal" then
goto continue
end
table.insert(quest_players, _player);
end
::continue::
end
return quest_players;
end
function damage_meter_UI.draw()
local cached_config = config.current_config.damage_meter_UI;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
if player.total.display.total_damage == 0 and cached_config.settings.hide_module_if_total_damage_is_zero then
if players.total.display.total_damage == 0 and cached_config.settings.hide_module_if_total_damage_is_zero then
return;
end
local quest_players = {};
if damage_meter_UI.freeze_displayed_players and damage_meter_UI.last_displayed_players ~= {} then
quest_players = damage_meter_UI.last_displayed_players;
elseif quest_status.flow_state == quest_status.flow_states.IN_LOBBY or quest_status.flow_state == quest_status.flow_states.IN_TRAINING_AREA then
local player_info_list = hunter_info_field:get_data(singletons.lobby_manager);
quest_players = damage_meter_UI.get_players(player_info_list);
else
local player_info_list = quest_hunter_info_field:get_data(singletons.lobby_manager);
quest_players = damage_meter_UI.get_players(player_info_list);
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 damage_meter_UI.freeze_displayed_players then
if #quest_players ~= 0 then
-- sort here
if cached_config.sorting.type == "Normal" then
if cached_config.sorting.reversed_order then
local reversed_quest_players = {};
for i = #quest_players, 1, -1 do
table.insert(reversed_quest_players, quest_players[i]);
end
quest_players = reversed_quest_players;
end
elseif cached_config.sorting.type == "DPS" then
if cached_config.sorting.reversed_order then
table.sort(quest_players, function(left, right)
return left.dps < right.dps;
end);
else
table.sort(quest_players, function(left, right)
return left.dps > right.dps;
end);
end
else
if cached_config.sorting.reversed_order then
table.sort(quest_players, function(left, right)
return left.display.total_damage < right.display.total_damage;
end);
else
table.sort(quest_players, function(left, right)
return left.display.total_damage > right.display.total_damage;
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
end
if cached_config.settings.my_damage_bar_location == "First" then
table.insert(quest_players, 1, player.myself);
elseif cached_config.settings.my_damage_bar_location == "Last" then
table.insert(quest_players, #quest_players + 1, player.myself);
elseif #player.list == 0 then
table.insert(quest_players, player.myself);
end
damage_meter_UI.last_displayed_players = quest_players;
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
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;
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;
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()
local cached_config = config.current_config.damage_meter_UI;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
if players.total.display.total_damage == 0 and cached_config.settings.hide_module_if_total_damage_is_zero then
return;
end
this.calculate_top_damage_and_dps();
local position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
-- draw total damage
if cached_config.settings.total_damage_location == "First"
and not cached_config.settings.hide_total_damage then
if not (cached_config.settings.hide_total_if_total_damage_is_zero and players.total.display.total_damage == 0) then
players.draw(players.total, position_on_screen, 1);
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
-- draw
local position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
for _, _player in ipairs(quest_players) do
if _player.display.total_damage == 0 and cached_config.settings.hide_player_if_player_damage_is_zero then
goto continue
end
if not cached_config.settings.total_damage_offset_is_relative then
position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
end
if _player == player.myself then
if cached_config.settings.hide_myself then
goto continue
end
elseif cached_config.settings.hide_other_players then
goto continue
end
player.draw(_player, position_on_screen, 1, top_damage, top_dps);
for _, player in ipairs(this.displayed_players) do
players.draw(player, position_on_screen, 1, top_damage, top_dps);
if cached_config.settings.orientation == "Horizontal" then
position_on_screen.x = position_on_screen.x + cached_config.spacing.x * global_scale_modifier;
else
@@ -165,34 +244,38 @@ function damage_meter_UI.draw()
end
::continue::
end
-- draw total damage
if cached_config.settings.hide_total_damage then
return;
end
if cached_config.settings.total_damage_location == "Last"
and not cached_config.settings.hide_total_damage then
if cached_config.settings.hide_total_if_total_damage_is_zero and player.total.display.total_damage == 0 then
return;
end
if not (cached_config.settings.hide_total_if_total_damage_is_zero and players.total.display.total_damage == 0) then
if not cached_config.settings.total_damage_offset_is_relative then
position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
end
if not cached_config.settings.total_damage_offset_is_relative then
position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
end
player.draw_total(position_on_screen, 1);
players.draw(players.total, position_on_screen, 1);
end
end
end
function damage_meter_UI.init_module()
function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons");
config = require("MHR_Overlay.Misc.config");
customization_menu = require("MHR_Overlay.UI.customization_menu");
player = require("MHR_Overlay.Damage_Meter.player");
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");
language = require("MHR_Overlay.Misc.language");
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return damage_meter_UI;
function this.init_module()
end
return this;

View File

@@ -1,59 +1,103 @@
local env_creature_UI = {};
local this = {};
local singletons;
local config;
local customization_menu;
local large_monster;
local screen;
local player;
local players;
local drawing;
local table_helpers;
local health_UI_entity;
local stamina_UI_entity;
local rage_UI_entity;
local env_creature;
local error_handler;
local utils;
local enemy_manager_type_def = sdk.find_type_definition("snow.enemy.EnemyManager");
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;
function env_creature_UI.draw()
if singletons.enemy_manager == nil then
local displayed_creatures = {};
function this.update()
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;
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 global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
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
);
for REcreature, creature in pairs(env_creature.list) do
if cached_config.settings.max_distance == 0 then
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);
local position_on_screen = draw.world_to_screen(creature.position + world_offset);
if position_on_screen == nil then
goto continue
goto continue;
end
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;
creature.distance = (player.myself_position - creature.position):length();
local opacity_scale = 1;
if creature.distance > cached_config.settings.max_distance then
goto continue
end
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);
end
@@ -62,19 +106,23 @@ function env_creature_UI.draw()
end
end
function env_creature_UI.init_module()
function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons");
config = require("MHR_Overlay.Misc.config");
customization_menu = require("MHR_Overlay.UI.customization_menu");
large_monster = require("MHR_Overlay.Monsters.large_monster");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
drawing = require("MHR_Overlay.UI.drawing");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_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");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
error_handler = require("MHR_Overlay.Misc.error_handler");
utils = require("MHR_Overlay.Misc.utils");
end
return env_creature_UI;
function this.init_module()
end
return this;

View File

@@ -1,15 +1,49 @@
local large_monster_UI = {};
local this = {};
local singletons;
local config;
local customization_menu;
local large_monster;
local screen;
local player;
local players;
local drawing;
local table_helpers;
local health_UI_entity;
local stamina_UI_entity;
local rage_UI_entity;
local error_handler;
local utils;
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 enemy_manager_type_def = sdk.find_type_definition("snow.enemy.EnemyManager");
local get_boss_enemy_count_method = enemy_manager_type_def:get_method("getBossEnemyCount");
@@ -21,239 +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 get_targeting_enemy_index_field = tg_camera_type_def:get_field("OldTargetingEmIndex");
function large_monster_UI.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;
if singletons.enemy_manager == nil then
error_handler.report("large_monster_UI.update", "Failed to access Data: enemy_manager");
return;
end
local displayed_monsters = {};
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
large_monster_list = {};
local enemy_count = get_boss_enemy_count_method:call(singletons.enemy_manager);
if enemy_count == nil then
error_handler.report("large_monster_UI.update", "Failed to access Data: enemy_count");
return;
end
for i = 0, enemy_count - 1 do
local enemy = get_boss_enemy_method:call(singletons.enemy_manager, i);
if enemy == nil then
customization_menu.status = "No enemy";
goto continue
error_handler.report("large_monster_UI.update", "Failed to access Data: enemy No. " .. tostring(i));
goto continue;
end
local monster = large_monster.list[enemy];
local monster = large_monster.get_monster(enemy);
if monster == nil then
customization_menu.status = "No large monster entry";
goto continue
error_handler.report("large_monster_UI.update", "Failed to create Large Monster Entry No. " .. tostring(i));
goto continue;
end
if update_distance then
monster.distance = (player.myself_position - monster.position):length();
end
monster.distance = (players.myself_position - monster.position):length();
if cached_config.highlighted.auto_highlight.enabled then
if highlighted_monster == nil then
highlighted_monster = monster;
table.insert(large_monster_list, 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::
end
if dynamic_enabled then
large_monster_UI.draw_dynamic(displayed_monsters, highlighted_monster, cached_config);
end
if highlighted_enabled then
large_monster_UI.draw_highlighted(highlighted_monster, cached_config);
this.update_dynamic_monsters(large_monster_list, cached_config);
end
if static_enabled then
large_monster_UI.draw_static(displayed_monsters, highlighted_monster, cached_config);
this.update_static_monsters(large_monster_list, cached_config);
end
end
function large_monster_UI.draw_dynamic(displayed_monsters, highlighted_monster, cached_config)
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
error_handler.report("large_monster_UI.draw", "Dynamic Large Monster drawing function threw an exception");
end
end
if highlighted_enabled then
local success = pcall(this.draw_highlighted, cached_config);
if not success then
error_handler.report("large_monster_UI.draw", "Highlighted Large Monster drawing function threw an exception");
end
end
if static_enabled then
local success = pcall(this.draw_static, cached_config);
if not success then
error_handler.report("large_monster_UI.draw", "Static Large Monster drawing function threw an exception");
end
end
end
function this.draw_dynamic(cached_config)
cached_config = cached_config.dynamic;
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
local i = 0;
for _, monster in ipairs(displayed_monsters) do
if cached_config.settings.max_distance == 0 then
break
end
if monster.id == 549 or monster.id == 25 or monster.id == 2073 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);
position_on_screen = draw.world_to_screen(monster.position + world_offset);
for _, monster in ipairs(displayed_dynamic_monsters) do
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);
if position_on_screen == nil then
goto continue
goto continue;
end
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;
local opacity_scale = 1;
if monster.distance > cached_config.settings.max_distance then
goto continue
end
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);
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;
::continue::
end
end
function large_monster_UI.draw_static(displayed_monsters, highlighted_monster, cached_config)
function this.draw_static(cached_config)
cached_config = cached_config.static;
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 i = 0;
for _, monster in ipairs(displayed_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
for _, monster in ipairs(displayed_static_monsters) do
local monster_position_on_screen = {
x = position_on_screen.x,
y = position_on_screen.y
@@ -265,41 +379,41 @@ function large_monster_UI.draw_static(displayed_monsters, highlighted_monster, c
monster_position_on_screen.y = monster_position_on_screen.y + cached_config.spacing.y * i * global_scale_modifier;
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;
::continue::
end
end
function large_monster_UI.draw_highlighted(monster, cached_config)
cached_config = cached_config.highlighted;
if monster == nil then
function this.draw_highlighted(cached_config)
if highlighted_monster == nil then
return;
end
cached_config = cached_config.highlighted;
local position_on_screen = screen.calculate_absolute_coordinates(cached_config.position);
if monster.dead_or_captured and cached_config.settings.hide_dead_or_captured then
return;
end
large_monster.draw(monster, "highlighted", cached_config, position_on_screen, 1);
large_monster.draw(highlighted_monster, "highlighted_UI", cached_config, position_on_screen, 1);
end
function large_monster_UI.init_module()
function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons");
config = require("MHR_Overlay.Misc.config");
customization_menu = require("MHR_Overlay.UI.customization_menu");
large_monster = require("MHR_Overlay.Monsters.large_monster");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
drawing = require("MHR_Overlay.UI.drawing");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_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");
error_handler = require("MHR_Overlay.Misc.error_handler");
utils = require("MHR_Overlay.Misc.utils");
end
return large_monster_UI;
function this.init_module()
end
return this;

View File

@@ -1,118 +1,148 @@
local small_monster_UI = {};
local this = {};
local singletons;
local config;
local small_monster;
local customization_menu;
local screen;
local player;
local players;
local drawing;
local table_helpers;
local health_UI_entity;
local stamina_UI_entity;
local error_handler;
local utils;
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 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_method = enemy_manager_type_def:get_method("getZakoEnemy");
function small_monster_UI.draw()
if singletons.enemy_manager == nil then
return;
end
local displayed_monsters = {};
function this.update()
local cached_config = config.current_config.small_monster_UI;
local 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";
if cached_config.dynamic_positioning.enabled and utils.number.is_equal(cached_config.dynamic_positioning.max_distance, 0) then
displayed_monsters = {};
return;
end
for i = 0, enemy_count - 1 do
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];
if monster == nil then
customization_menu.status = "No small monster entry";
goto continue
end
local _displayed_monsters = {};
for enemy, monster in pairs(small_monster.list) do
if monster.dead_or_captured and cached_config.settings.hide_dead_or_captured then
goto continue
end
goto continue;
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::
end
displayed_monsters = this.sort_monsters(_displayed_monsters, cached_config);
end
if cached_config.dynamic_positioning.enabled
or (not cached_config.dynamic_positioning.enabled and cached_config.static_sorting.type == "Distance") then
for _, monster in ipairs(displayed_monsters) do
monster.distance = (player.myself_position - monster.position):length();
end
end
function this.sort_monsters(_displayed_monsters, cached_config)
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
local reversed_monsters = {};
for i = #displayed_monsters, 1, -1 do
table.insert(reversed_monsters, displayed_monsters[i]);
for i = #_displayed_monsters, 1, -1 do
table.insert(reversed_monsters, _displayed_monsters[i]);
end
displayed_monsters = reversed_monsters;
_displayed_monsters = reversed_monsters;
elseif cached_config.static_sorting.type == "Health" 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;
end);
else
table.sort(displayed_monsters, function(left, right)
table.sort(_displayed_monsters, function(left, right)
return left.health < right.health;
end);
end
elseif cached_config.static_sorting.type == "Health Percentage" 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;
end);
else
table.sort(displayed_monsters, function(left, right)
table.sort(_displayed_monsters, function(left, right)
return left.health_percentage < right.health_percentage;
end);
end
elseif cached_config.static_sorting.type == "Distance" 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;
end);
else
table.sort(displayed_monsters, function(left, right)
table.sort(_displayed_monsters, function(left, right)
return left.distance < right.distance;
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;
for _, monster in ipairs(displayed_monsters) do
local position_on_screen;
if cached_config.dynamic_positioning.enabled then
local world_offset = Vector3f.new(cached_config.dynamic_positioning.world_offset.x,
if is_dynamic_positioning_enabled then
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.z);
cached_config.dynamic_positioning.world_offset.z
);
position_on_screen = draw.world_to_screen(monster.position + world_offset);
if position_on_screen == nil then
goto continue
goto continue;
end
position_on_screen.x = position_on_screen.x + cached_config.dynamic_positioning.viewport_offset.x;
@@ -121,32 +151,17 @@ function small_monster_UI.draw()
position_on_screen = screen.calculate_absolute_coordinates(cached_config.static_position);
if cached_config.settings.orientation == "Horizontal" then
position_on_screen.x = position_on_screen.x + cached_config.static_spacing.x * i;
else
position_on_screen.y = position_on_screen.y + cached_config.static_spacing.y * i;
end
end
local opacity_scale = 1;
if cached_config.dynamic_positioning.enabled then
if cached_config.dynamic_positioning.max_distance == 0 then
return;
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
if is_dynamic_positioning_enabled and cached_config.dynamic_positioning.opacity_falloff then
monster.distance = (players.myself_position - monster.position):length();
opacity_scale = 1 - (monster.distance / cached_config.dynamic_positioning.max_distance);
end
small_monster.draw(monster, cached_config, position_on_screen, opacity_scale);
i = i + 1;
@@ -154,17 +169,21 @@ function small_monster_UI.draw()
end
end
function small_monster_UI.init_module()
function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons");
config = require("MHR_Overlay.Misc.config");
customization_menu = require("MHR_Overlay.UI.customization_menu");
small_monster = require("MHR_Overlay.Monsters.small_monster");
screen = require("MHR_Overlay.Game_Handler.screen");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
drawing = require("MHR_Overlay.UI.drawing");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_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
return small_monster_UI;
function this.init_module()
end
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

@@ -1,13 +1,47 @@
local time_UI = {};
local this = {};
local time;
local screen;
local config;
local drawing;
local table_helpers;
local utils;
local error_handler;
time_UI.label = nil;
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;
function time_UI.draw()
this.label = nil;
function this.draw()
local elapsed_minutes = time.elapsed_minutes;
local elapsed_seconds = time.elapsed_seconds;
@@ -17,26 +51,29 @@ function time_UI.draw()
local position_on_screen = screen.calculate_absolute_coordinates(config.current_config.time_UI.position);
drawing.draw_label(time_UI.label, position_on_screen, 1, elapsed_minutes, elapsed_seconds);
drawing.draw_label(this.label, position_on_screen, 1, elapsed_minutes, elapsed_seconds);
end
function time_UI.init_UI()
time_UI.label = table_helpers.deep_copy(config.current_config.time_UI.time_label);
function this.init_UI()
this.label = utils.table.deep_copy(config.current_config.time_UI.time_label);
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
time_UI.label.offset.x = time_UI.label.offset.x * global_scale_modifier;
time_UI.label.offset.y = time_UI.label.offset.y * global_scale_modifier;
this.label.offset.x = this.label.offset.x * global_scale_modifier;
this.label.offset.y = this.label.offset.y * global_scale_modifier;
end
function time_UI.init_module()
function this.init_dependencies()
time = require("MHR_Overlay.Game_Handler.time");
screen = require("MHR_Overlay.Game_Handler.screen");
config = require("MHR_Overlay.Misc.config");
drawing = require("MHR_Overlay.UI.drawing");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
time_UI.init_UI()
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return time_UI;
function this.init_module()
this.init_UI()
end
return this;

View File

@@ -1,21 +1,55 @@
local ailment_UI_entity = {};
local this = {};
local config;
local table_helpers;
local utils;
local drawing;
local language;
local error_handler;
function ailment_UI_entity.new(visibility, bar, name_label, text_label, value_label, percentage_label, timer_label)
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;
function this.new(visibility, bar, name_label, text_label, value_label, percentage_label, timer_label)
local entity = {};
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
entity.visibility = visibility;
entity.bar = table_helpers.deep_copy(bar);
entity.name_label = table_helpers.deep_copy(name_label);
entity.text_label = table_helpers.deep_copy(text_label);
entity.value_label = table_helpers.deep_copy(value_label);
entity.percentage_label = table_helpers.deep_copy(percentage_label);
entity.timer_label = table_helpers.deep_copy(timer_label);
entity.bar = utils.table.deep_copy(bar);
entity.name_label = utils.table.deep_copy(name_label);
entity.text_label = utils.table.deep_copy(text_label);
entity.value_label = utils.table.deep_copy(value_label);
entity.percentage_label = utils.table.deep_copy(percentage_label);
entity.timer_label = utils.table.deep_copy(timer_label);
entity.bar.offset.x = entity.bar.offset.x * global_scale_modifier;
entity.bar.offset.y = entity.bar.offset.y * global_scale_modifier;
@@ -42,7 +76,7 @@ function ailment_UI_entity.new(visibility, bar, name_label, text_label, value_la
return entity;
end
function ailment_UI_entity.draw(ailment, ailment_UI, cached_config, position_on_screen, opacity_scale)
function this.draw(ailment, ailment_UI, cached_config, position_on_screen, opacity_scale)
if not ailment_UI.visibility then
return;
end
@@ -55,29 +89,45 @@ function ailment_UI_entity.draw(ailment, ailment_UI, cached_config, position_on_
ailment_name = ailment_name .. "x" .. tostring(ailment.activate_count);
end
local total_buildup_string = "";
if not ailment.is_active then
local include_current_value = ailment_UI.value_label.include.current_value;
local include_max_value = ailment_UI.value_label.include.max_value;
if include_current_value and include_max_value then
total_buildup_string = string.format("%.0f/%.0f", ailment.total_buildup, ailment.buildup_limit);
elseif include_current_value then
total_buildup_string = string.format("%.0f", ailment.total_buildup);
elseif include_max_value then
total_buildup_string = string.format("%.0f", ailment.buildup_limit);
end
end
if ailment.is_active then
drawing.draw_bar(ailment_UI.bar, position_on_screen, opacity_scale, ailment.timer_percentage);
drawing.draw_label(ailment_UI.name_label, position_on_screen, opacity_scale, ailment_name);
drawing.draw_label(ailment_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.buildup);
drawing.draw_label(ailment_UI.timer_label, position_on_screen, opacity_scale, ailment.minutes_left,
ailment.seconds_left);
drawing.draw_label(ailment_UI.timer_label, position_on_screen, opacity_scale, ailment.minutes_left, ailment.seconds_left);
else
drawing.draw_bar(ailment_UI.bar, position_on_screen, opacity_scale, ailment.buildup_percentage);
drawing.draw_label(ailment_UI.name_label, position_on_screen, opacity_scale, ailment_name);
drawing.draw_label(ailment_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.buildup);
drawing.draw_label(ailment_UI.value_label, position_on_screen, opacity_scale, ailment.total_buildup,
ailment.buildup_limit);
drawing.draw_label(ailment_UI.value_label, position_on_screen, opacity_scale, total_buildup_string);
drawing.draw_label(ailment_UI.percentage_label, position_on_screen, opacity_scale, 100 * ailment.buildup_percentage);
end
end
function ailment_UI_entity.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing");
config = require("MHR_Overlay.Misc.config");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return ailment_UI_entity;
function this.init_module()
end
return this;

View File

@@ -1,11 +1,45 @@
local ailment_buildup_UI_entity = {};
local table_helpers;
local this = {};
local utils;
local drawing;
local config;
local player;
local players;
local language;
local error_handler;
function ailment_buildup_UI_entity.new(buildup_bar, highlighted_buildup_bar, ailment_name_label, player_name_label,
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;
function this.new(buildup_bar, highlighted_buildup_bar, ailment_name_label, player_name_label,
buildup_value_label, buildup_percentage_label, total_buildup_label,
total_buildup_value_label)
local entity = {};
@@ -13,14 +47,14 @@ function ailment_buildup_UI_entity.new(buildup_bar, highlighted_buildup_bar, ail
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
--entity.visibility = visibility;
entity.buildup_bar = table_helpers.deep_copy(buildup_bar);
entity.highlighted_buildup_bar = table_helpers.deep_copy(highlighted_buildup_bar);
entity.ailment_name_label = table_helpers.deep_copy(ailment_name_label);
entity.player_name_label = table_helpers.deep_copy(player_name_label);
entity.buildup_value_label = table_helpers.deep_copy(buildup_value_label);
entity.buildup_percentage_label = table_helpers.deep_copy(buildup_percentage_label);
entity.total_buildup_label = table_helpers.deep_copy(total_buildup_label);
entity.total_buildup_value_label = table_helpers.deep_copy(total_buildup_value_label);
entity.buildup_bar = utils.table.deep_copy(buildup_bar);
entity.highlighted_buildup_bar = utils.table.deep_copy(highlighted_buildup_bar);
entity.ailment_name_label = utils.table.deep_copy(ailment_name_label);
entity.player_name_label = utils.table.deep_copy(player_name_label);
entity.buildup_value_label = utils.table.deep_copy(buildup_value_label);
entity.buildup_percentage_label = utils.table.deep_copy(buildup_percentage_label);
entity.total_buildup_label = utils.table.deep_copy(total_buildup_label);
entity.total_buildup_value_label = utils.table.deep_copy(total_buildup_value_label);
entity.buildup_bar.offset.x = entity.buildup_bar.offset.x * global_scale_modifier;
entity.buildup_bar.offset.y = entity.buildup_bar.offset.y * global_scale_modifier;
@@ -55,36 +89,45 @@ function ailment_buildup_UI_entity.new(buildup_bar, highlighted_buildup_bar, ail
return entity;
end
function ailment_buildup_UI_entity.draw(_player, ailment_buildup_UI, cached_config, position_on_screen, opacity_scale, top_buildup)
function this.draw(player, player_buildup, ailment_buildup_UI, cached_config, position_on_screen, opacity_scale, top_buildup)
local player_buildup_bar_percentage = 0;
if cached_config.settings.buildup_bar_relative_to == "Total Buildup" then
player_buildup_bar_percentage = _player.buildup_share;
player_buildup_bar_percentage = player_buildup.buildup_share;
else
if top_buildup ~= 0 then
player_buildup_bar_percentage = _player.buildup / top_buildup;
player_buildup_bar_percentage = player_buildup.buildup / top_buildup;
end
end
if _player.id == player.myself.id and cached_config.settings.highlighted_bar == "Me" then
if player.type == players.types.myself and cached_config.settings.highlighted_bar == "Me" then
drawing.draw_bar(ailment_buildup_UI.highlighted_buildup_bar, position_on_screen, opacity_scale, player_buildup_bar_percentage);
elseif cached_config.settings.highlighted_bar == "Top Buildup" and _player.buildup == top_buildup then
elseif cached_config.settings.highlighted_bar == "Top Buildup" and player_buildup.buildup == top_buildup then
drawing.draw_bar(ailment_buildup_UI.highlighted_buildup_bar, position_on_screen, opacity_scale, player_buildup_bar_percentage);
else
drawing.draw_bar(ailment_buildup_UI.buildup_bar, position_on_screen, opacity_scale, player_buildup_bar_percentage);
end
drawing.draw_label(ailment_buildup_UI.player_name_label, position_on_screen, opacity_scale, player.get_player(_player.id).name);
drawing.draw_label(ailment_buildup_UI.buildup_value_label, position_on_screen, opacity_scale, _player.buildup);
drawing.draw_label(ailment_buildup_UI.buildup_percentage_label, position_on_screen, opacity_scale, 100 * _player.buildup_share);
local player_name = tostring(player_buildup.id);
if player ~= nil then
player_name = player.name;
end
drawing.draw_label(ailment_buildup_UI.player_name_label, position_on_screen, opacity_scale, player_name);
drawing.draw_label(ailment_buildup_UI.buildup_value_label, position_on_screen, opacity_scale, player_buildup.buildup);
drawing.draw_label(ailment_buildup_UI.buildup_percentage_label, position_on_screen, opacity_scale, 100 * player_buildup.buildup_share);
end
function ailment_buildup_UI_entity.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing");
config = require("MHR_Overlay.Misc.config");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return ailment_buildup_UI_entity;
function this.init_module()
end
return this;

View File

@@ -1,11 +1,47 @@
local body_part_UI_entity = {};
local config;
local table_helpers;
local drawing;
local this = {};
function body_part_UI_entity.new(part_visibility, part_name_label, flinch_visibility, flinch_bar, flinch_text_label,
flinch_value_label, flinch_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)
local config;
local utils;
local drawing;
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;
function this.new(part_visibility, part_name_label,
flinch_visibility, flinch_bar, flinch_text_label, flinch_value_label, flinch_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;
@@ -15,16 +51,17 @@ function body_part_UI_entity.new(part_visibility, part_name_label, flinch_visibi
entity.flinch_visibility = flinch_visibility;
entity.break_visibility = break_visibility;
entity.loss_visibility = loss_visibility;
entity.anomaly_visibility = anomaly_visibility;
entity.part_name_label = table_helpers.deep_copy(part_name_label);
entity.part_name_label = utils.table.deep_copy(part_name_label);
entity.part_name_label.offset.x = entity.part_name_label.offset.x * global_scale_modifier;
entity.part_name_label.offset.y = entity.part_name_label.offset.y * global_scale_modifier;
entity.flinch_bar = table_helpers.deep_copy(flinch_bar);
entity.flinch_text_label = table_helpers.deep_copy(flinch_text_label);
entity.flinch_value_label = table_helpers.deep_copy(flinch_value_label);
entity.flinch_percentage_label = table_helpers.deep_copy(flinch_percentage_label);
entity.flinch_bar = utils.table.deep_copy(flinch_bar);
entity.flinch_text_label = utils.table.deep_copy(flinch_text_label);
entity.flinch_value_label = utils.table.deep_copy(flinch_value_label);
entity.flinch_percentage_label = utils.table.deep_copy(flinch_percentage_label);
entity.flinch_bar.offset.x = entity.flinch_bar.offset.x * global_scale_modifier;
entity.flinch_bar.offset.y = entity.flinch_bar.offset.y * global_scale_modifier;
@@ -42,10 +79,10 @@ function body_part_UI_entity.new(part_visibility, part_name_label, flinch_visibi
entity.flinch_percentage_label.offset.x = entity.flinch_percentage_label.offset.x * global_scale_modifier;
entity.flinch_percentage_label.offset.y = entity.flinch_percentage_label.offset.y * global_scale_modifier;
entity.break_bar = table_helpers.deep_copy(break_bar);
entity.break_text_label = table_helpers.deep_copy(break_text_label);
entity.break_value_label = table_helpers.deep_copy(break_value_label);
entity.break_percentage_label = table_helpers.deep_copy(break_percentage_label);
entity.break_bar = utils.table.deep_copy(break_bar);
entity.break_text_label = utils.table.deep_copy(break_text_label);
entity.break_value_label = utils.table.deep_copy(break_value_label);
entity.break_percentage_label = utils.table.deep_copy(break_percentage_label);
entity.break_bar.offset.x = entity.break_bar.offset.x * global_scale_modifier;
entity.break_bar.offset.y = entity.break_bar.offset.y * global_scale_modifier;
@@ -63,10 +100,10 @@ function body_part_UI_entity.new(part_visibility, part_name_label, flinch_visibi
entity.break_percentage_label.offset.x = entity.break_percentage_label.offset.x * global_scale_modifier;
entity.break_percentage_label.offset.y = entity.break_percentage_label.offset.y * global_scale_modifier;
entity.loss_bar = table_helpers.deep_copy(loss_bar);
entity.loss_text_label = table_helpers.deep_copy(loss_text_label);
entity.loss_value_label = table_helpers.deep_copy(loss_value_label);
entity.loss_health_percentage_label = table_helpers.deep_copy(loss_health_percentage_label);
entity.loss_bar = utils.table.deep_copy(loss_bar);
entity.loss_text_label = utils.table.deep_copy(loss_text_label);
entity.loss_value_label = utils.table.deep_copy(loss_value_label);
entity.loss_health_percentage_label = utils.table.deep_copy(loss_health_percentage_label);
entity.loss_bar.offset.x = entity.loss_bar.offset.x * global_scale_modifier;
entity.loss_bar.offset.y = entity.loss_bar.offset.y * global_scale_modifier;
@@ -84,19 +121,41 @@ function body_part_UI_entity.new(part_visibility, part_name_label, flinch_visibi
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.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;
end
function body_part_UI_entity.draw(part, part_UI, cached_config, position_on_screen, opacity_scale)
function this.draw(part, part_UI, cached_config, position_on_screen, opacity_scale)
if not part_UI.part_visibility then
return;
end
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_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;
end
@@ -121,40 +180,102 @@ function body_part_UI_entity.draw(part, part_UI, cached_config, position_on_scre
end
end
local health_string = string.format("%.0f/%.0f", part.health, part.max_health);
local break_health_string = string.format("%.0f/%.0f", part.break_health, part.break_max_health);
local loss_health_string = string.format("%.0f/%.0f", part.loss_health, part.loss_max_health);
-- health value string
local health_string = "";
if draw_health then
local include_health_current_value = part_UI.flinch_value_label.include.current_value;
local include_health_max_value = part_UI.flinch_value_label.include.max_value;
if include_health_current_value and include_health_max_value then
health_string = string.format("%.0f/%.0f", part.health, part.max_health);
elseif include_health_current_value then
health_string = string.format("%.0f", part.health);
elseif include_health_max_value then
health_string = string.format("%.0f", part.max_health);
end
end
-- break health value string
local break_health_string = "";
if draw_break then
local include_break_health_current_value = part_UI.break_value_label.include.current_value;
local include_break_health_max_value = part_UI.break_value_label.include.max_value;
if include_break_health_current_value and include_break_health_max_value then
break_health_string = string.format("%.0f/%.0f", part.break_health, part.break_max_health);
elseif include_break_health_current_value then
break_health_string = string.format("%.0f", part.break_health);
elseif include_break_health_max_value then
break_health_string = string.format("%.0f", part.break_max_health);
end
end
-- loss health value string
local loss_health_string = "";
if draw_sever then
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;
if include_loss_health_current_value and include_loss_health_max_value then
loss_health_string = string.format("%.0f/%.0f", part.loss_health, part.loss_max_health);
elseif include_loss_health_current_value then
loss_health_string = string.format("%.0f", part.loss_health);
elseif include_loss_health_max_value then
loss_health_string = string.format("%.0f", part.loss_max_health);
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 = {
x = position_on_screen.x + cached_config.part_health.offset.x,
y = position_on_screen.y + cached_config.part_health.offset.y,
visibility = part_UI.flinch_visibility
};
local break_position_on_screen = {
x = position_on_screen.x + cached_config.part_break.offset.x,
y = position_on_screen.y + cached_config.part_break.offset.y,
visibility = part_UI.flinch_visibility
};
local loss_position_on_screen = {
x = position_on_screen.x + cached_config.part_loss.offset.x,
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
drawing.draw_bar(part_UI.flinch_bar, flinch_position_on_screen, opacity_scale, part.health_percentage);
end
if draw_break then
if draw_break then
drawing.draw_bar(part_UI.break_bar, break_position_on_screen, opacity_scale, part.break_health_percentage);
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);
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);
if draw_health then
@@ -169,17 +290,27 @@ function body_part_UI_entity.draw(part, part_UI, cached_config, position_on_scre
drawing.draw_label(part_UI.break_percentage_label, break_position_on_screen, opacity_scale, 100 * part.break_health_percentage);
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_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);
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
function body_part_UI_entity.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing");
config = require("MHR_Overlay.Misc.config");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return body_part_UI_entity;
function this.init_module()
end
return this;

View File

@@ -0,0 +1,105 @@
local this = {};
local config;
local utils;
local drawing;
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;
function this.new(bar, name_label, timer_label)
local entity = {};
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
--entity.visibility = visibility;
entity.bar = utils.table.deep_copy(bar);
entity.name_label = utils.table.deep_copy(name_label);
entity.timer_label = utils.table.deep_copy(timer_label);
entity.bar.offset.x = entity.bar.offset.x * global_scale_modifier;
entity.bar.offset.y = entity.bar.offset.y * global_scale_modifier;
entity.bar.size.width = entity.bar.size.width * global_scale_modifier;
entity.bar.size.height = entity.bar.size.height * global_scale_modifier;
entity.bar.outline.thickness = entity.bar.outline.thickness * global_scale_modifier;
entity.bar.outline.offset = entity.bar.outline.offset * global_scale_modifier;
entity.name_label.offset.x = entity.name_label.offset.x * global_scale_modifier;
entity.name_label.offset.y = entity.name_label.offset.y * global_scale_modifier;
entity.timer_label.offset.x = entity.timer_label.offset.x * global_scale_modifier;
entity.timer_label.offset.y = entity.timer_label.offset.y * global_scale_modifier;
return entity;
end
function this.draw(buff, buff_UI, position_on_screen, opacity_scale)
local cached_config = config.current_config.buff_UI;
if not buff.is_infinite then
drawing.draw_bar(buff_UI.bar, position_on_screen, opacity_scale, buff.timer_percentage);
elseif not cached_config.settings.hide_bar_for_infinite_buffs then
drawing.draw_bar(buff_UI.bar, position_on_screen, opacity_scale, 1);
end
local buff_name = "";
if buff_UI.name_label.include.name then
buff_name = string.format("%s ", buff.name);
end
if buff_UI.name_label.include.effect_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
drawing.draw_label(buff_UI.timer_label, position_on_screen, opacity_scale, buff.minutes_left, buff.seconds_left);
elseif not cached_config.settings.hide_timer_for_infinite_buffs then
drawing.draw_label(buff_UI.timer_label, position_on_screen, opacity_scale, 0, 0);
end
end
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing");
config = require("MHR_Overlay.Misc.config");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end
return this;

View File

@@ -1,169 +1,256 @@
local damage_UI_entity = {};
local table_helpers;
local this = {};
local utils;
local drawing;
local config;
local player;
local players;
local language;
local quest_status;
local non_players;
local error_handler;
function damage_UI_entity.new(bar, highlighted_bar, player_name_label, dps_label, hunter_rank_label, value_label,
percentage_label, cart_count_label)
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;
function this.new(damage_meter_UI_elements, type)
local entity = {};
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
--entity.visibility = visibility;
entity.bar = table_helpers.deep_copy(bar);
entity.highlighted_bar = table_helpers.deep_copy(highlighted_bar);
entity.player_name_label = table_helpers.deep_copy(player_name_label);
entity.dps_label = table_helpers.deep_copy(dps_label);
entity.hunter_rank_label = table_helpers.deep_copy(hunter_rank_label);
entity.cart_count_label = table_helpers.deep_copy(cart_count_label);
entity.value_label = table_helpers.deep_copy(value_label);
entity.percentage_label = table_helpers.deep_copy(percentage_label);
entity.bar = utils.table.deep_copy(damage_meter_UI_elements.damage_bar);
entity.name_label = utils.table.deep_copy(damage_meter_UI_elements.name_label);
entity.hunter_rank_label = utils.table.deep_copy(damage_meter_UI_elements.hunter_rank_label);
entity.cart_count_label = utils.table.deep_copy(damage_meter_UI_elements.cart_count_label);
entity.dps_label = utils.table.deep_copy(damage_meter_UI_elements.dps_label);
entity.value_label = utils.table.deep_copy(damage_meter_UI_elements.damage_value_label);
entity.percentage_label = utils.table.deep_copy(damage_meter_UI_elements.damage_percentage_label);
entity.bar.offset.x = entity.bar.offset.x * global_scale_modifier;
entity.bar.offset.y = entity.bar.offset.y * global_scale_modifier;
entity.bar.size.width = entity.bar.size.width * global_scale_modifier;
entity.bar.size.height = entity.bar.size.height * global_scale_modifier;
entity.bar.outline.thickness = entity.bar.outline.thickness * global_scale_modifier;
entity.bar.outline.offset = entity.bar.outline.offset * global_scale_modifier;
entity.player_name_size_limit = config.current_config.damage_meter_UI.settings.player_name_size_limit;
entity.highlighted_bar.offset.x = entity.highlighted_bar.offset.x * global_scale_modifier;
entity.highlighted_bar.offset.y = entity.highlighted_bar.offset.y * global_scale_modifier;
entity.highlighted_bar.size.width = entity.highlighted_bar.size.width * global_scale_modifier;
entity.highlighted_bar.size.height = entity.highlighted_bar.size.height * global_scale_modifier;
entity.highlighted_bar.outline.thickness = entity.highlighted_bar.outline.thickness * global_scale_modifier;
entity.highlighted_bar.outline.offset = entity.highlighted_bar.outline.offset * global_scale_modifier;
if type == players.types.total then
entity.total_name = language.current_language.UI.total_damage;
elseif type == players.types.myself or type == players.types.other_players then
entity.type_name = language.current_language.UI.player;
elseif type == players.types.servant then
entity.type_name = language.current_language.UI.servant;
else
entity.type_name = language.current_language.UI.otomo;
end
entity.player_name_label.offset.x = entity.player_name_label.offset.x * global_scale_modifier;
entity.player_name_label.offset.y = entity.player_name_label.offset.y * global_scale_modifier;
if entity.bar ~= nil then
entity.bar.offset.x = entity.bar.offset.x * global_scale_modifier;
entity.bar.offset.y = entity.bar.offset.y * global_scale_modifier;
entity.bar.size.width = entity.bar.size.width * global_scale_modifier;
entity.bar.size.height = entity.bar.size.height * global_scale_modifier;
entity.bar.outline.thickness = entity.bar.outline.thickness * global_scale_modifier;
entity.bar.outline.offset = entity.bar.outline.offset * global_scale_modifier;
end
entity.player_name_size_limit = config.current_config.damage_meter_UI.settings.player_name_size_limit *
global_scale_modifier;
if entity.name_label ~= nil then
entity.name_label.offset.x = entity.name_label.offset.x * global_scale_modifier;
entity.name_label.offset.y = entity.name_label.offset.y * global_scale_modifier;
end
entity.dps_label.offset.x = entity.dps_label.offset.x * global_scale_modifier;
entity.dps_label.offset.y = entity.dps_label.offset.y * global_scale_modifier;
if entity.player_name_size_limit ~= nil then
entity.player_name_size_limit = entity.player_name_size_limit * global_scale_modifier;
end
entity.hunter_rank_label.offset.x = entity.hunter_rank_label.offset.x * global_scale_modifier;
entity.hunter_rank_label.offset.y = entity.hunter_rank_label.offset.y * global_scale_modifier;
if entity.hunter_rank_label ~= nil then
entity.hunter_rank_label.offset.x = entity.hunter_rank_label.offset.x * global_scale_modifier;
entity.hunter_rank_label.offset.y = entity.hunter_rank_label.offset.y * global_scale_modifier;
end
if entity.cart_count_label ~= nil then
entity.cart_count_label.offset.x = entity.cart_count_label.offset.x * global_scale_modifier;
entity.cart_count_label.offset.y = entity.cart_count_label.offset.y * global_scale_modifier;
end
entity.cart_count_label.offset.x = entity.cart_count_label.offset.x * global_scale_modifier;
entity.cart_count_label.offset.y = entity.cart_count_label.offset.y * global_scale_modifier;
if entity.dps_label ~= nil then
entity.dps_label.offset.x = entity.dps_label.offset.x * global_scale_modifier;
entity.dps_label.offset.y = entity.dps_label.offset.y * global_scale_modifier;
end
entity.value_label.offset.x = entity.value_label.offset.x * global_scale_modifier;
entity.value_label.offset.y = entity.value_label.offset.y * global_scale_modifier;
if entity.value_label ~= nil then
entity.value_label.offset.x = entity.value_label.offset.x * global_scale_modifier;
entity.value_label.offset.y = entity.value_label.offset.y * global_scale_modifier;
end
entity.percentage_label.offset.x = entity.percentage_label.offset.x * global_scale_modifier;
entity.percentage_label.offset.y = entity.percentage_label.offset.y * global_scale_modifier;
if entity.percentage_label ~= nil then
entity.percentage_label.offset.x = entity.percentage_label.offset.x * global_scale_modifier;
entity.percentage_label.offset.y = entity.percentage_label.offset.y * global_scale_modifier;
end
return entity;
end
function damage_UI_entity.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 player_include = cached_config.player_name_label.include.others;
if _player.id == player.myself.id then
player_include = cached_config.player_name_label.include.myself;
top_damage = top_damage or 0;
top_dps = top_dps or 0;
local name_include = nil;
if player.damage_UI.name_label ~= nil then
name_include = player.damage_UI.name_label.include;
end
local player_name_text = "";
if player_include.master_rank and player_include.hunter_rank then
player_name_text = string.format("[%d:%d] ", _player.master_rank, _player.hunter_rank);
elseif player_include.master_rank then
player_name_text = string.format("[%d] ", _player.master_rank);
elseif player_include.hunter_rank then
player_name_text = string.format("[%d] ", _player.hunter_rank);
local hunter_rank_include = nil;
if player.damage_UI.hunter_rank_label ~= nil then
hunter_rank_include = player.damage_UI.hunter_rank_label.include;
end
if player_include.cart_count then
player_name_text = player_name_text .. string.format("x%d ", _player.cart_count);
end
if player_include.word_player then
player_name_text = player_name_text .. language.current_language.UI.player .. " ";
end
if player_include.player_id then
player_name_text = player_name_text .. string.format("%d ", _player.id);
end
if player_include.player_name then
player_name_text = player_name_text .. _player.name;
end
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 player_damage_percentage = 0;
if player.total.display.total_damage ~= 0 then
player_damage_percentage = _player.display.total_damage / player.total.display.total_damage;
if players.total.display.total_damage ~= 0 then
player_damage_percentage = player.display.total_damage / players.total.display.total_damage;
end
local player_damage_bar_percentage = 0;
if cached_config.settings.damage_bar_relative_to == "Total Damage" then
if player.total.display.total_damage ~= 0 then
player_damage_bar_percentage = _player.display.total_damage / player.total.display.total_damage;
end
else
if top_damage ~= 0 then
player_damage_bar_percentage = _player.display.total_damage / top_damage;
if player.type ~= players.types.total then
if cached_config.settings.damage_bar_relative_to == "Total Damage" then
if players.total.display.total_damage ~= 0 then
player_damage_bar_percentage = player.display.total_damage / players.total.display.total_damage;
end
else
if top_damage ~= 0 then
player_damage_bar_percentage = player.display.total_damage / top_damage;
end
end
end
local name_text = "";
if player.type == players.types.total then
name_text = player.damage_UI.total_name;
elseif name_include ~= nil then
if _player.id == player.myself.id and cached_config.settings.highlighted_bar == "Me" then
drawing.draw_bar(_player.damage_UI.highlighted_bar, position_on_screen, opacity_scale, player_damage_bar_percentage);
elseif cached_config.settings.highlighted_bar == "Top Damage" and _player.display.total_damage == top_damage then
drawing.draw_bar(_player.damage_UI.highlighted_bar, position_on_screen, opacity_scale, player_damage_bar_percentage);
elseif cached_config.settings.highlighted_bar == "Top DPS" and _player.dps == top_dps then
drawing.draw_bar(_player.damage_UI.highlighted_bar, position_on_screen, opacity_scale, player_damage_bar_percentage);
else
drawing.draw_bar(_player.damage_UI.bar, position_on_screen, opacity_scale, player_damage_bar_percentage);
end
if _player.id == player.myself.id then
if _player.damage_UI.hunter_rank_label.include.myself.master_rank and
_player.damage_UI.hunter_rank_label.include.myself.hunter_rank then
drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale,
string.format("%d:%d", _player.master_rank, _player.hunter_rank));
elseif _player.damage_UI.hunter_rank_label.include.myself.master_rank then
drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale,
string.format("%d", _player.master_rank));
elseif _player.damage_UI.hunter_rank_label.include.myself.hunter_rank then
drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale,
string.format("%d", _player.hunter_rank));
if name_include.master_rank and name_include.hunter_rank then
name_text = string.format("[%d:%d] ", player.master_rank, player.hunter_rank);
elseif name_include.master_rank then
name_text = string.format("[%d] ", player.master_rank);
elseif name_include.hunter_rank then
name_text = string.format("[%d] ", player.hunter_rank);
elseif name_include.level then
name_text = string.format("[%d] ", player.level);
end
else
if _player.damage_UI.hunter_rank_label.include.others.master_rank and
_player.damage_UI.hunter_rank_label.include.others.hunter_rank then
drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale,
string.format("%d:%d", _player.master_rank, _player.hunter_rank));
elseif _player.damage_UI.hunter_rank_label.include.others.master_rank then
drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale,
string.format("%d", _player.master_rank));
elseif _player.damage_UI.hunter_rank_label.include.others.hunter_rank then
drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale,
string.format("%d", _player.hunter_rank));
if name_include.cart_count and is_on_quest then
name_text = name_text .. string.format("x%d ", player.cart_count);
end
if name_include.type then
name_text = name_text .. player.damage_UI.type_name .. " ";
end
if name_include.id then
name_text = name_text .. string.format("%d ", player.id);
end
if name_include.name then
name_text = name_text .. player.name;
end
end
player_name_text = drawing.limit_text_size(player_name_text, _player.damage_UI.player_name_size_limit);
local hunter_rank_string = "";
if player.damage_UI.hunter_rank_label ~= nil then
if hunter_rank_include == nil then
hunter_rank_string = string.format("%d", player.level);
elseif hunter_rank_include.master_rank and hunter_rank_include.hunter_rank then
hunter_rank_string = string.format("%d:%d", player.master_rank, player.hunter_rank);
drawing.draw_label(_player.damage_UI.player_name_label, position_on_screen, opacity_scale, player_name_text);
drawing.draw_label(_player.damage_UI.value_label, position_on_screen, opacity_scale, _player.display.total_damage);
drawing.draw_label(_player.damage_UI.percentage_label, position_on_screen, opacity_scale, 100 * player_damage_percentage);
drawing.draw_label(_player.damage_UI.dps_label, position_on_screen, opacity_scale, _player.dps);
drawing.draw_label(_player.damage_UI.cart_count_label, position_on_screen, opacity_scale, _player.cart_count);
elseif hunter_rank_include.master_rank then
hunter_rank_string = string.format("%d", player.master_rank);
elseif hunter_rank_include.hunter_rank then
hunter_rank_string = string.format("%d", player.hunter_rank);
end
end
local bar = player.damage_UI.bar;
local name_label = player.damage_UI.name_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 percentage_label = player.damage_UI.percentage_label;
local dps_label = player.damage_UI.dps_label;
if player.type ~= players.types.total then
if (cached_config.settings.highlighted_bar == "Top Damage" and player.display.total_damage == top_damage and top_damage ~= 0) or
(cached_config.settings.highlighted_bar == "Top DPS" and player.dps == top_dps and top_dps ~= 0) then
bar = players.highlighted_damage_UI.bar;
name_label = players.highlighted_damage_UI.name_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;
percentage_label = players.highlighted_damage_UI.percentage_label;
dps_label = players.highlighted_damage_UI.dps_label;
end
end
drawing.draw_bar(bar, position_on_screen, opacity_scale, player_damage_bar_percentage);
name_text = drawing.limit_text_size(name_text, player.damage_UI.player_name_size_limit);
drawing.draw_label(name_label, position_on_screen, opacity_scale, name_text);
drawing.draw_label(hunter_rank_label, position_on_screen, opacity_scale, hunter_rank_string);
drawing.draw_label(value_label, position_on_screen, opacity_scale, player.display.total_damage);
drawing.draw_label(percentage_label, position_on_screen, opacity_scale, 100 * player_damage_percentage);
drawing.draw_label(dps_label, position_on_screen, opacity_scale, player.dps);
if is_on_quest 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);
else
drawing.draw_label(cart_count_label, position_on_screen, opacity_scale, player.cart_count);
end
end
end
function damage_UI_entity.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing");
config = require("MHR_Overlay.Misc.config");
player = require("MHR_Overlay.Damage_Meter.player");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
quest_status = require("MHR_Overlay.Game_Handler.quest_status");
non_players = require("MHR_Overlay.Damage_Meter.non_players");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return damage_UI_entity;
function this.init_module()
end
return this;

View File

@@ -1,19 +1,53 @@
local health_UI_entity = {};
local table_helpers;
local this = {};
local utils;
local drawing;
local language;
local config;
local error_handler;
function health_UI_entity.new(visibility, bar, text_label, value_label, percentage_label)
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;
function this.new(visibility, bar, text_label, value_label, percentage_label)
local entity = {};
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
entity.visibility = visibility;
entity.bar = table_helpers.deep_copy(bar);
entity.text_label = table_helpers.deep_copy(text_label);
entity.value_label = table_helpers.deep_copy(value_label);
entity.percentage_label = table_helpers.deep_copy(percentage_label);
entity.bar = utils.table.deep_copy(bar);
entity.text_label = utils.table.deep_copy(text_label);
entity.value_label = utils.table.deep_copy(value_label);
entity.percentage_label = utils.table.deep_copy(percentage_label);
entity.bar.offset.x = entity.bar.offset.x * global_scale_modifier;
entity.bar.offset.y = entity.bar.offset.y * global_scale_modifier;
@@ -34,23 +68,39 @@ function health_UI_entity.new(visibility, bar, text_label, value_label, percenta
return entity;
end
function health_UI_entity.draw(monster, health_UI, position_on_screen, opacity_scale)
function this.draw(monster, health_UI, position_on_screen, opacity_scale)
if not health_UI.visibility then
return;
end
local include_current_value = health_UI.value_label.include.current_value;
local include_max_value = health_UI.value_label.include.max_value;
local health_string;
if include_current_value and include_max_value then
health_string = string.format("%.0f/%.0f", monster.health, monster.max_health);
elseif include_current_value then
health_string = string.format("%.0f", monster.health);
elseif include_max_value then
health_string = string.format("%.0f", monster.max_health);
end
drawing.draw_bar(health_UI.bar, position_on_screen, opacity_scale, monster.health_percentage);
drawing.draw_label(health_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.HP);
drawing.draw_label(health_UI.value_label, position_on_screen, opacity_scale, monster.health, monster.max_health);
drawing.draw_label(health_UI.value_label, position_on_screen, opacity_scale, health_string);
drawing.draw_label(health_UI.percentage_label, position_on_screen, opacity_scale, 100 * monster.health_percentage);
end
function health_UI_entity.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing");
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return health_UI_entity;
function this.init_module()
end
return this;

View File

@@ -1,20 +1,54 @@
local rage_UI_entity = {};
local table_helpers;
local this = {};
local utils;
local drawing;
local language;
local config;
local error_handler;
function rage_UI_entity.new(visibility, bar, text_label, value_label, percentage_label, timer_label)
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;
function this.new(visibility, bar, text_label, value_label, percentage_label, timer_label)
local entity = {};
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
entity.visibility = visibility;
entity.bar = table_helpers.deep_copy(bar);
entity.text_label = table_helpers.deep_copy(text_label);
entity.value_label = table_helpers.deep_copy(value_label);
entity.percentage_label = table_helpers.deep_copy(percentage_label);
entity.timer_label = table_helpers.deep_copy(timer_label);
entity.bar = utils.table.deep_copy(bar);
entity.text_label = utils.table.deep_copy(text_label);
entity.value_label = utils.table.deep_copy(value_label);
entity.percentage_label = utils.table.deep_copy(percentage_label);
entity.timer_label = utils.table.deep_copy(timer_label);
entity.bar.offset.x = entity.bar.offset.x * global_scale_modifier;
entity.bar.offset.y = entity.bar.offset.y * global_scale_modifier;
@@ -38,11 +72,25 @@ function rage_UI_entity.new(visibility, bar, text_label, value_label, percentage
return entity;
end
function rage_UI_entity.draw(monster, rage_UI, position_on_screen, opacity_scale)
function this.draw(monster, rage_UI, position_on_screen, opacity_scale)
if not rage_UI.visibility then
return;
end
local rage_string = "";
if not monster.is_in_rage then
local include_current_value = rage_UI.value_label.include.current_value;
local include_max_value = rage_UI.value_label.include.max_value;
if include_current_value and include_max_value then
rage_string = string.format("%.0f/%.0f", monster.rage_point, monster.rage_limit);
elseif include_current_value then
rage_string = string.format("%.0f", monster.rage_point);
elseif include_max_value then
rage_string = string.format("%.0f", monster.rage_limit);
end
end
if monster.is_in_rage then
drawing.draw_bar(rage_UI.bar, position_on_screen, opacity_scale, monster.rage_timer_percentage);
@@ -53,16 +101,20 @@ function rage_UI_entity.draw(monster, rage_UI, position_on_screen, opacity_scale
drawing.draw_bar(rage_UI.bar, position_on_screen, opacity_scale, monster.rage_percentage);
drawing.draw_label(rage_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.rage);
drawing.draw_label(rage_UI.value_label, position_on_screen, opacity_scale, monster.rage_point, monster.rage_limit);
drawing.draw_label(rage_UI.value_label, position_on_screen, opacity_scale, rage_string);
drawing.draw_label(rage_UI.percentage_label, position_on_screen, opacity_scale, 100 * monster.rage_percentage);
end
end
function rage_UI_entity.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing");
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return rage_UI_entity;
function this.init_module()
end
return this;

View File

@@ -1,20 +1,54 @@
local stamina_UI_entity = {};
local table_helpers;
local this = {};
local utils;
local drawing;
local language;
local config;
local error_handler;
function stamina_UI_entity.new(visibility, bar, text_label, value_label, percentage_label, timer_label)
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;
function this.new(visibility, bar, text_label, value_label, percentage_label, timer_label)
local entity = {};
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
entity.visibility = visibility;
entity.bar = table_helpers.deep_copy(bar);
entity.text_label = table_helpers.deep_copy(text_label);
entity.value_label = table_helpers.deep_copy(value_label);
entity.percentage_label = table_helpers.deep_copy(percentage_label);
entity.timer_label = table_helpers.deep_copy(timer_label);
entity.bar = utils.table.deep_copy(bar);
entity.text_label = utils.table.deep_copy(text_label);
entity.value_label = utils.table.deep_copy(value_label);
entity.percentage_label = utils.table.deep_copy(percentage_label);
entity.timer_label = utils.table.deep_copy(timer_label);
entity.bar.offset.x = entity.bar.offset.x * global_scale_modifier;
entity.bar.offset.y = entity.bar.offset.y * global_scale_modifier;
@@ -36,31 +70,48 @@ function stamina_UI_entity.new(visibility, bar, text_label, value_label, percent
return entity;
end
function stamina_UI_entity.draw(monster, stamina_UI, position_on_screen, opacity_scale)
function this.draw(monster, stamina_UI, position_on_screen, opacity_scale)
if not stamina_UI.visibility then
return;
end
local stamina_string = "";
if not monster.is_tired then
local include_current_value = stamina_UI.value_label.include.current_value;
local include_max_value = stamina_UI.value_label.include.max_value;
if include_current_value and include_max_value then
stamina_string = string.format("%.0f/%.0f", monster.stamina, monster.max_stamina);
elseif include_current_value then
stamina_string = string.format("%.0f", monster.stamina);
elseif include_max_value then
stamina_string = string.format("%.0f", monster.max_stamina);
end
end
drawing.draw_label(stamina_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.stamina);
if monster.is_tired then
drawing.draw_bar(stamina_UI.bar, position_on_screen, opacity_scale, monster.tired_timer_percentage);
drawing.draw_label(stamina_UI.timer_label, position_on_screen, opacity_scale, monster.tired_minutes_left,
monster.tired_seconds_left);
drawing.draw_label(stamina_UI.timer_label, position_on_screen, opacity_scale, monster.tired_minutes_left, monster.tired_seconds_left);
else
drawing.draw_bar(stamina_UI.bar, position_on_screen, opacity_scale, monster.stamina_percentage);
drawing.draw_label(stamina_UI.value_label, position_on_screen, opacity_scale, monster.stamina, monster.max_stamina);
drawing.draw_label(stamina_UI.value_label, position_on_screen, opacity_scale, stamina_string);
drawing.draw_label(stamina_UI.percentage_label, position_on_screen, opacity_scale, 100 * monster.stamina_percentage);
end
end
function stamina_UI_entity.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing");
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return stamina_UI_entity;
function this.init_module()
end
return this;

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +1,49 @@
local drawing = {};
local this = {};
local config;
local table_helpers;
local unicode_helpers;
local utils;
local error_handler;
drawing.font = nil;
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;
function drawing.init_font()
this.font = nil;
function this.init_font()
local cached_config = config.current_config.global_settings.UI_font;
drawing.font = d2d.Font.new(cached_config.family, cached_config.size, cached_config.bold, cached_config.italic);
this.font = d2d.Font.new(cached_config.family, cached_config.size, cached_config.bold, cached_config.italic);
end
function drawing.argb_color_to_abgr_color(argb_color)
function this.argb_color_to_abgr_color(argb_color)
local alpha = (argb_color >> 24) & 0xFF;
local red = (argb_color >> 16) & 0xFF;
local green = (argb_color >> 8) & 0xFF;
@@ -21,7 +54,7 @@ function drawing.argb_color_to_abgr_color(argb_color)
return abgr_color;
end
function drawing.color_to_argb(color)
function this.color_to_argb(color)
local alpha = (color >> 24) & 0xFF;
local red = (color >> 16) & 0xFF;
local green = (color >> 8) & 0xFF;
@@ -30,27 +63,27 @@ function drawing.color_to_argb(color)
return alpha, red, green, blue;
end
function drawing.argb_to_color(alpha, red, green, blue)
function this.argb_to_color(alpha, red, green, blue)
return 0x1000000 * alpha + 0x10000 * red + 0x100 * green + blue;
end
function drawing.limit_text_size(text, size_limit)
if d2d == nil or size_limit <= 0 then
function this.limit_text_size(text, size_limit)
if d2d == nil or not config.current_config.global_settings.renderer.use_d2d_if_available or size_limit <= 0 then
return text;
end
local limited_text = text;
while limited_text ~= "..." do
local text_width, text_height = drawing.font:measure(limited_text);
local text_width, text_height = this.font:measure(limited_text);
if text_width < size_limit then
break
else
local old_limited_text = limited_text;
limited_text = unicode_helpers.sub(limited_text, 1, -5) .. "...";
limited_text = utils.unicode.sub(limited_text, 1, -5) .. "...";
if limited_text == old_limited_text then
break
break;
end
end
end
@@ -58,8 +91,8 @@ function drawing.limit_text_size(text, size_limit)
return limited_text;
end
function drawing.scale_color_opacity(color, scale)
local alpha, red, green, blue = drawing.color_to_argb(color);
function this.scale_color_opacity(color, scale)
local alpha, red, green, blue = this.color_to_argb(color);
local new_alpha = math.floor(alpha * scale);
if new_alpha < 0 then
new_alpha = 0;
@@ -68,67 +101,80 @@ function drawing.scale_color_opacity(color, scale)
new_alpha = 255;
end
return drawing.argb_to_color(new_alpha, red, green, blue);
return this.argb_to_color(new_alpha, red, green, blue);
end
function drawing.scale_bar_opacity(bar, scale)
function this.scale_bar_opacity(bar, scale)
if bar == nil or scale == nil or not bar.visibility then
return;
end
bar.colors.foreground = drawing.scale_color_opacity(bar.colors.foreground, scale);
bar.colors.background = drawing.scale_color_opacity(bar.colors.background, scale);
bar.colors.foreground = this.scale_color_opacity(bar.colors.foreground, scale);
bar.colors.background = this.scale_color_opacity(bar.colors.background, scale);
end
function drawing.scale_label_opacity(label, scale)
function this.scale_label_opacity(label, scale)
if label == nil or scale == nil or not label.visibility then
return;
end
label.color = drawing.scale_color_opacity(label.color, scale);
label.shadow.color = drawing.scale_color_opacity(label.shadow.color, scale);
label.color = this.scale_color_opacity(label.color, scale);
label.shadow.color = this.scale_color_opacity(label.shadow.color, scale);
end
function drawing.draw_label(label, position, opacity_scale, ...)
function this.draw_label(label, position, opacity_scale, ...)
if label == nil or not label.visibility then
return;
end
local text = string.format(label.text, table.unpack({...}));
local text = string.format(label.text_formatting, table.unpack({...}));
if text == "" then
return;
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_y = position.y + label.offset.y;
local use_d2d = d2d ~= nil and config.current_config.global_settings.renderer.use_d2d_if_available;
if label.shadow.visibility then
local new_shadow_color = label.shadow.color;
if opacity_scale < 1 then
new_shadow_color = drawing.scale_color_opacity(new_shadow_color, opacity_scale);
new_shadow_color = this.scale_color_opacity(new_shadow_color, opacity_scale);
end
if d2d ~= nil then
d2d.text(drawing.font, text, position_x + label.shadow.offset.x, position_y + label.shadow.offset.y, new_shadow_color);
if use_d2d then
d2d.text(this.font, text, position_x + label.shadow.offset.x, position_y + label.shadow.offset.y, new_shadow_color);
else
new_shadow_color = drawing.argb_color_to_abgr_color(new_shadow_color);
new_shadow_color = this.argb_color_to_abgr_color(new_shadow_color);
draw.text(text, position_x + label.shadow.offset.x, position_y + label.shadow.offset.y, new_shadow_color);
end
end
local new_color = label.color;
if opacity_scale < 1 then
new_color = drawing.scale_color_opacity(new_color, opacity_scale);
new_color = this.scale_color_opacity(new_color, opacity_scale);
end
if d2d ~= nil then
d2d.text(drawing.font, text, position_x, position_y, new_color);
if use_d2d then
d2d.text(this.font, text, position_x, position_y, new_color);
else
new_color = drawing.argb_color_to_abgr_color(new_color);
new_color = this.argb_color_to_abgr_color(new_color);
draw.text(text, position_x, position_y, new_color);
end
end
function drawing.draw_bar(bar, position, opacity_scale, percentage)
function this.draw_bar(bar, position, opacity_scale, percentage)
if bar == nil or not bar.visibility then
return;
end
@@ -143,6 +189,7 @@ function drawing.draw_bar(bar, position, opacity_scale, percentage)
local outline_visibility = bar.outline.visibility;
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;
if not outline_visibility then
@@ -153,7 +200,7 @@ function drawing.draw_bar(bar, position, opacity_scale, percentage)
local outline_offset = bar.outline.offset;
if outline_thickness == 0 then
if utils.number.is_equal(outline_thickness, 0) then
outline_offset = 0;
end
local half_outline_offset = outline_offset / 2;
@@ -167,10 +214,21 @@ function drawing.draw_bar(bar, position, opacity_scale, percentage)
local position_x = 0;
local position_y = 0;
local foreground_width = 0;
local background_width = 0;
local width = 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
outline_position_x = position.x + bar.offset.x + half_outline_thickness;
outline_position_y = position.y + bar.offset.y + half_outline_thickness;
@@ -181,10 +239,7 @@ function drawing.draw_bar(bar, position, opacity_scale, percentage)
position_x = outline_position_x + 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;
foreground_width = width * percentage;
background_width = width - foreground_width;
width = outline_width - outline_thickness - outline_offset - outline_offset;
height = outline_height - outline_thickness - outline_offset - outline_offset;
elseif style == "Center" then
@@ -197,22 +252,16 @@ function drawing.draw_bar(bar, position, opacity_scale, percentage)
position_x = outline_position_x + 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;
foreground_width = width * percentage;
background_width = width - foreground_width;
width = outline_width - 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_y = position.y + bar.offset.y;
local width = bar.size.width;
width = bar.size.width;
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_y = position_y - half_outline_thickness - outline_offset;
@@ -220,52 +269,87 @@ function drawing.draw_bar(bar, position, opacity_scale, percentage)
outline_height = height + outline_thickness + outline_offset + outline_offset;
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 background_color = bar.colors.background;
local outline_color = bar.colors.outline;
if opacity_scale < 1 then
foreground_color = drawing.scale_color_opacity(foreground_color, opacity_scale);
background_color = drawing.scale_color_opacity(background_color, opacity_scale);
outline_color = drawing.scale_color_opacity(outline_color, opacity_scale);
foreground_color = this.scale_color_opacity(foreground_color, opacity_scale);
background_color = this.scale_color_opacity(background_color, opacity_scale);
outline_color = this.scale_color_opacity(outline_color, opacity_scale);
end
local use_d2d = d2d ~= nil;
local use_d2d = d2d ~= nil and config.current_config.global_settings.renderer.use_d2d_if_available;
-- outline
if outline_thickness ~= 0 then
-- background
if background_width ~= 0 then
if use_d2d then
d2d.outline_rect(outline_position_x, outline_position_y, outline_width, outline_height, outline_thickness,
outline_color);
d2d.fill_rect(position_x + background_shift_x, position_y + background_shift_y, background_width, background_height, background_color);
else
outline_color = drawing.argb_color_to_abgr_color(outline_color);
draw.outline_rect(outline_position_x, outline_position_y, outline_width, outline_height, outline_color);
background_color = this.argb_color_to_abgr_color(background_color);
draw.filled_rect(position_x + background_shift_x, position_y + background_shift_y, background_width, background_height, background_color)
end
end
-- foreground
if foreground_width ~= 0 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
foreground_color = drawing.argb_color_to_abgr_color(foreground_color);
draw.filled_rect(position_x, position_y, foreground_width, height, foreground_color)
foreground_color = this.argb_color_to_abgr_color(foreground_color);
draw.filled_rect(position_x + foreground_shift_x, position_y + foreground_shift_y, foreground_width, foreground_height, foreground_color)
end
end
-- background
if background_width ~= 0 then
-- outline
if outline_thickness ~= 0 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
background_color = drawing.argb_color_to_abgr_color(background_color);
draw.filled_rect(position_x + foreground_width, position_y, background_width, height, background_color)
outline_color = this.argb_color_to_abgr_color(outline_color);
draw.outline_rect(outline_position_x, outline_position_y, outline_width, outline_height, outline_color);
end
end
end
function drawing.draw_capture_line(health_UI, position, opacity_scale, percentage)
function this.draw_capture_line(health_UI, position, opacity_scale, percentage)
if health_UI == nil or not health_UI.visibility or health_UI.bar == nil or not health_UI.bar.visibility or
health_UI.bar.capture_line == nil or not health_UI.bar.capture_line.visibility or percentage >= 1 or percentage <= 0 then
return;
@@ -278,23 +362,28 @@ function drawing.draw_capture_line(health_UI, position, opacity_scale, percentag
local color = health_UI.bar.capture_line.color;
if opacity_scale < 1 then
color = drawing.scale_color_opacity(color, opacity_scale);
color = this.scale_color_opacity(color, opacity_scale);
end
if d2d ~= nil then
local use_d2d = d2d ~= nil and config.current_config.global_settings.renderer.use_d2d_if_available;
if use_d2d then
d2d.fill_rect(position_x, position_y, health_UI.bar.capture_line.size.width, health_UI.bar.capture_line.size.height,
color);
else
color = drawing.argb_color_to_abgr_color(color);
color = this.argb_color_to_abgr_color(color);
draw.filled_rect(position_x, position_y, health_UI.bar.capture_line.size.width,
health_UI.bar.capture_line.size.height, color)
end
end
function drawing.init_module()
function this.init_dependencies()
config = require("MHR_Overlay.Misc.config");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
unicode_helpers = require("MHR_Overlay.Misc.unicode_helpers");
utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
return drawing;
function this.init_module()
end
return this;

View File

@@ -3,11 +3,15 @@
"HP": "HP:",
"buildup": "Buildup:",
"gold": "Gold",
"lv": "",
"mini": "Mini",
"otomo": "Buddy",
"part_anomaly_core": "Anomaly Core",
"part_break": "Break",
"part_sever": "Sever",
"player": "Player",
"rage": "Rage:",
"servant": "Follower",
"silver": "Silver",
"stamina": "Stamina:",
"total_buildup": "Total Buildup",
@@ -15,30 +19,54 @@
},
"ailments": {
"blast": "Blast",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "Dung Bomb",
"engulfed": "Engulfed",
"exhaust": "Exhaust",
"fall_otomo_trap": "Fall Buddy 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": "Wyvern Riding",
"roar": "Roar",
"shock_otomo_trap": "Shock Buddy Trap",
"shock_trap": "Shock Trap",
"sleep": "Sleep",
"steel_fang": "Steel Fang",
"stench": "Stench",
"stun": "Stun",
"thunderblight": "Thunderblight",
"tranq_bomb": "Tranq Bomb",
"waterblight": "Waterblight"
"tremor": "Tremor",
"waterblight": "Waterblight",
"webbed": "Webbed"
},
"customization_menu": {
"UI_font": "UI Font",
"UI_font_notice": "Any changes to the font require script reload!",
"abnormal_statuses": "Abnormal Statuses",
"activation_count": "Activation Count",
"affinity_label": "Affinity Label",
"ailment_buildups": "Ailment Buildups",
"ailment_name": "Ailment Name",
"ailment_name_label": "Ailment Name Label",
@@ -46,23 +74,32 @@
"ailments": "Ailments",
"all_UI": "All 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 Damage",
"blast": "Blast",
"body_parts": "Body Parts",
"bold": "Bold",
"bomb_damage": "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_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",
"buildup": "Buildup",
"buildup_bar": "Buildup Bar",
"buildup_bars_are_relative_to": "Buildup Bars are relative to",
@@ -76,9 +113,13 @@
"closest": "Closest",
"color": "Color",
"colors": "Colors",
"config": "Config",
"creature_name_label": "Creature Name Label",
"crown": "Crown",
"crown_thresholds": "Crown Thresholds",
"current_state": "Current State",
"current_time": "Current Time",
"current_value": "Current Value",
"cutscene": "Cutscene",
"damage": "Damage",
"damage_bar": "Damage Bar",
@@ -86,38 +127,60 @@
"damage_meter_UI": "Damage Meter UI",
"damage_percentage_label": "Damage Percentage Label",
"damage_value_label": "Damage Value Label",
"dango_skills": "Dango Skills",
"debug": "Debug",
"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",
"effect_level": "Effect Level",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "Enable for",
"enabled": "Enabled",
"endemic_life": "Endemic Life",
"endemic_life_UI": "Endemic Life UI",
"endemic_life_damage": "Endemic Life Damage",
"endemic_life_buffs": "Endemic Life Buffs",
"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",
"fire_resistance_label": "Fire Resistance Label",
"first": "First",
"first_hit": "First Hit",
"flinch_count": "Flinch Count",
"foreground": "Foreground",
"freeze_dps_on_quest_clear": "Freeze DPS when Quest is cleared",
"freeze_dps_on_quest_end": "Freeze DPS on Quest End",
"global_position_modifier": "Global Position Modifier",
"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_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_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 when Buildup is 0",
"hide_all_active_ailments": "Hide All Active Ailments",
"hide_all_inactive_ailments": "Hide All Inactive Ailments",
"hide_bar_for_infinite_buffs": "Hide Bar for infinite Buffs",
"hide_dead_or_captured": "Hide Dead or Captured",
"hide_disabled_ailments": "Hide Disabled Ailments by Game",
"hide_inactive_ailments_with_no_buildup_support": "Hide Inactive Ailments with no Buildup Support",
@@ -126,28 +189,37 @@
"hide_myself": "Hide Myself",
"hide_other_players": "Hide Other Players",
"hide_player_if_player_damage_is_zero": "Hide Player if Player Damage is 0",
"hide_servants": "Hide Followers",
"hide_timer_for_infinite_buffs": "Hide Timer for infinite Buffs",
"hide_total_damage": "Hide Total Damage",
"hide_total_if_total_damage_is_zero": "Hide Total if Total Damage is 0",
"hide_undamaged_parts": "Hide Undamaged Parts",
"highest_health": "Highest Health",
"highest_health_percentage": "Highest Health Percentage",
"highlighted": "Highlighted (targeted)",
"highlighted": "Highlighted",
"highlighted_bar": "Highlighted Bar",
"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",
"in_lobby": "In Lobby",
"in_training_area": "In Training Area",
"include": "Include",
"infinite_buffs_location": "Infinite Buffs Location",
"inside": "Inside",
"installation_damage": "Installation Damage",
"installations": "Installations",
"italic": "Italic",
"item_buffs": "Item Buffs",
"join_time": "Join Time",
"killcam": "Killcam",
"kunai_damage": "Kunai Damage",
"kunai": "Kunai",
"language": "Language",
"large_monster_UI": "Large Monster UI",
"large_monster_dynamic_UI": "Large Monster Dynamic UI",
@@ -155,6 +227,9 @@
"large_monster_static_UI": "Large Monster Static UI",
"large_monsters": "Large Monsters",
"last": "Last",
"left_to_right": "Left to Right",
"level": "Level",
"level_label": "Level Label",
"loading_quest": "Loading Quest",
"loss_health": "Sever Health",
"loss_health_percentage": "Sever Health Percentage",
@@ -163,29 +238,39 @@
"master_rank": "Master Rank",
"max_distance": "Max Distance",
"max_monster_updates_per_tick": "Max Monster Updates per Tick",
"max_value": "Max Value",
"me": "Me",
"melody_effects": "Melody Effects",
"menu_font": "Menu Font",
"menu_font_change_disclaimer": "Changing Language and Menu Font Size several times will cause a crash!",
"misc_buffs": "Misc Buffs",
"mod_name": "MHR Overlay",
"mode": "Mode",
"modifiers": "Modifiers",
"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 Damage",
"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",
"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 Damage",
"other": "Other",
"other_player_otomos": "Other Player Buddies",
"other_players": "Other Players",
"otomo_damage": "Buddy Damage",
"otomo_moves": "Buddy Moves",
"otomos": "Buddies",
"outline": "Outline",
"outside": "Outside",
"part_health": "Part Health",
@@ -193,14 +278,12 @@
"part_name_label": "Part Name Label",
"percentage_label": "Percentage Label",
"performance": "Performance",
"player_damage": "Player Damage",
"player_id": "Player ID",
"player_name": "Player Name",
"player_name_label": "Player Name Label",
"player_name_size_limit": "Player Name Size Limit",
"player_spacing": "Player Spacing",
"players": "Players",
"playing_quest": "Playing Quest",
"poison_damage": "Poison Damage",
"poison": "Poison",
"position": "Position",
"press_any_key": "Press any key...",
"prioritize_large_monsters": "Large Monsters on High Priority",
@@ -210,45 +293,68 @@
"quest_start_animation": "Quest Start Animation",
"quest_time": "Quest Time",
"rage": "Rage",
"rampage_skills": "Rampage Skills",
"reframework_outdated": "Installed REFramework version is outdated. Please, update. Otherwise, MHR Overlay won't work correctly.",
"relative_offset": "Relative Offset",
"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",
"reset": "Reset",
"reversed_order": "Reversed Order",
"reward_screen": "Reward Screen",
"right_alignment_shift": "Right Alignment Shift",
"right_to_left": "Right to Left",
"servant_otomos": "Servant Buddies",
"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_other_player_otomos_separately": "Show Other Player Buddies separately",
"show_servant_otomos_separately": "Show Follower Buddies separately",
"size": "Size",
"skills": "Skills",
"small_monster_UI": "Small Monster UI",
"small_monsters": "Small Monsters",
"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": "Time Limit (seconds)",
"timer": "Timer",
"timer_delays": "Timer Delays",
"timer_label": "Timer Label",
"top_buildup": "Top Buildup",
"top_damage": "Top Damage",
"top_dps": "Top DPS",
"top_left": "Top-Left",
"top_right": "Top-Right",
"top_to_bottom": "Top to Bottom",
"total": "Total",
"total_buildup": "Total Buildup",
"total_buildup_label": "Total Buildup Label",
"total_buildup_value_label": "Total Buildup Value Label",
"total_cart_count_label": "Total Cart Count Label",
"total_damage": "Total Damage",
"total_damage_label": "Total Damage Label",
"total_damage_location": "Total Damage Bar Location",
"total_damage_offset_is_relative": "Total Damage Offset is Relative",
"total_damage_value_label": "Total Damage Value Label",
"total_dps": "Total DPS",
@@ -256,21 +362,115 @@
"tracked_damage_types": "Tracked Damage Types",
"tracked_monster_types": "Tracked Monster Types",
"type": "Type",
"update_buffs_delay": "Update Buffs (seconds)",
"update_is_online_delay": "Update Is Online (seconds)",
"update_myself_position_delay": "Update Myself Position (seconds)",
"update_player_info_delay": "Update Player Info (seconds)",
"update_players_delay": "Update Players (seconds)",
"update_quest_time_delay": "Update Quest Time (seconds)",
"update_singletons_delay": "Update Singletons (seconds)",
"update_window_size_delay": "Update Window Size (seconds)",
"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",
"weapon_skills": "Weapon Skills",
"width": "Width",
"word_player": "Word \"Player\"",
"world_offset": "World Offset",
"wyvern_riding_damage": "Wyvern Riding Damage",
"wyvern_riding": "Wyvern Riding",
"x": "X",
"y": "Y",
"z": "Z"
},
"font_name": "NotoSansKR-Bold.otf",
"dango_skills": {
"dango_adrenaline": "Dango Adrenaline",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_hunter": "Dango Hunter",
"dango_insurance": "Dango Insurance",
"dango_insurance_defense_up": "Dango Insurance Defense Up",
"super_recovery_dango": "Super Recovery Dango"
},
"endemic_life": {
"butterflame": "Butterflame",
"clothfly": "Clothfly",
"cutterfly": "Cutterfly",
"gold_wirebug": "Gold Wirebug",
"peepersects": "Peepersects",
"red_lampsquid": "Red Lampsquid",
"ruby_wirebug": "Ruby Wirebug",
"stinkmink": "Stinkmink",
"yellow_lampsquid": "Yellow Lampsquid"
},
"font_name": "NotoSans-Bold.otf",
"item_buffs": {
"adamant_seed": "Adamant Seed",
"armor_ammo": "Armor Ammo",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_ammo": "Demon Ammo",
"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"
},
"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_up": "Defense Up",
"immunity": "Immunity",
"natural_healing_up": "Natural Healing Up",
"stamina_use_down": "Stamina Use Down"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar",
"vase_of_vitality": "Vase of Vitality"
},
"parts": {
"abdomen": "Abdomen",
"amatsu_unknown": "?",
"antenna": "Antenna",
"arms": "Arms",
"arms_mud": "Arms (Mud)",
@@ -336,5 +536,164 @@
"wingclaw": "Wingclaw",
"wingclaws": "Wingclaws",
"wings": "Wings"
},
"rampage_skills": {
"chameleos_soul": "Chameleos Soul",
"kushala_daora_soul": "Kushala Daora Soul"
},
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"berserk": "Berserk",
"bladescale_hone": "Bladescale Hone",
"blood_awakening": "Blood Awakening",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragon_conversion_elemental_attack_up": "Dragon Conversion: Elem. Atk Up",
"dragon_conversion_elemental_res_up": "Dragon Conversion: Elem. Res Up",
"dragonheart": "Dragonheart",
"embolden": "Embolden",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"inspiration": "Inspiration",
"intrepid_heart": "Intrepid Heart",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"partbreaker": "Partbreaker",
"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",
"strife": "Strife",
"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,
256,
591,
1024,
1327,
7680,
7935,
8192,
8303,
65280,
65519,
0
],
"weapon_skills": {
"bow": {
"arc_shot_affinity": "Arc Shot: Affinity",
"arc_shot_brace": "Arc Shot: Brace",
"bolt_boost": "Bolt Boost",
"herculean_draw": "Herculean Draw"
},
"charge_blade": {
"element_boost": "Element Boost",
"sword_boost_mode": "Sword Boost Mode"
},
"dual_blades": {
"archdemon_mode": "Archdemon Mode",
"ironshine_silk": "Ironshine Silk"
},
"great_sword": {
"power_sheathe": "Power Sheathe"
},
"gunlance": {
"erupting_cannon": "Erupting Cannon",
"ground_splitter": "Ground Splitter"
},
"hammer": {
"impact_burst": "Impact Burst"
},
"heavy_bowgun": {
"counter_charger": "Counter Charger",
"overheat": "Overheat",
"rising_moon": "Rising Moon",
"setting_sun": "Setting Sun",
"wyvernsnipe_reload": "Wyvernsnipe Reload"
},
"hunting_horn": {
"bead_of_resonance": "Bead of Resonance",
"silkbind_shockwave": "Silkbind Shockwave",
"sonic_bloom": "Sonic Bloom"
},
"insect_glaive": {
"all_extracts_mix": "All Extracts Mix",
"orange_extract": "Orange Extract",
"red_extract": "Red Extract",
"white_extract": "White Extract"
},
"lance": {
"anchor_rage": "Anchor Rage",
"spiral_thrust": "Spiral Thrust",
"twin_wine": "Twin Wine"
},
"light_bowgun": {
"fanning_maneuver": "Fanning Maneuver",
"wyvernblast_reload": "Wyvernblast Reload"
},
"long_sword": {
"harvest_moon": "Harvest Moon",
"iai_slash": "Iai Slash",
"soaring_kick": "Soaring Kick",
"spirit_gauge": "Spirit Gauge",
"spirit_gauge_autofill": "Spirit Gauge Autofill"
},
"switch_axe": {
"amped_state": "Amped State",
"axe_heavy_slam": "Axe: Heavy Slam",
"switch_charger": "Switch Charger"
},
"sword_and_shield": {
"destroyer_oil": "Destroyer Oil"
}
},
"weapons": {
"bow": "Bow",
"charge_blade": "Charge Blade",
"dual_blades": "Dual Blades",
"great_sword": "Great Sword",
"gunlance": "Gunlance",
"hammer": "Hammer",
"heavy_bowgun": "Heavy Bowgun",
"hunting_horn": "Hunting Horn",
"insect_glaive": "Insect Glaive",
"lance": "Lance",
"light_bowgun": "Light Bowgun",
"long_sword": "Long Sword",
"switch_axe": "Switch Axe",
"sword_and_shield": "Sword & Shield"
}
}

View File

@@ -3,11 +3,15 @@
"HP": "HP:",
"buildup": "蓄積値:",
"gold": "金冠",
"lv": "",
"mini": "小型",
"otomo": "Buddy",
"part_anomaly_core": "Anomaly Core",
"part_break": "部位破壊",
"part_sever": "尻尾切断",
"player": "Player",
"rage": "怒り値:",
"servant": "Follower",
"silver": "銀冠",
"stamina": "スタミナ:",
"total_buildup": "合計蓄積値",
@@ -15,30 +19,54 @@
},
"ailments": {
"blast": "爆破",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "悪臭",
"engulfed": "Engulfed",
"exhaust": "疲労",
"fall_otomo_trap": "オトモ落とし穴",
"fall_trap": "落とし穴",
"falling_asleep": "Falling Asleep",
"fireblight": "火属性やられ",
"flash": "目くらまし",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "氷属性やられ",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "麻痺",
"poison": "毒",
"quick_sand": "流砂",
"resistance_down": "Resistance Down",
"ride": "操竜",
"roar": "Roar",
"shock_otomo_trap": "オトモしびれ罠",
"shock_trap": "しびれ罠",
"sleep": "睡眠",
"steel_fang": "ガルク噛み付き",
"stench": "Stench",
"stun": "スタン",
"thunderblight": "雷属性やられ",
"tranq_bomb": "捕獲用麻酔玉",
"waterblight": "水属性やられ"
"tremor": "Tremor",
"waterblight": "水属性やられ",
"webbed": "Webbed"
},
"customization_menu": {
"UI_font": "UI フォント",
"UI_font_notice": "フォントの変更後はスクリプトリセットを行ってください。",
"abnormal_statuses": "Abnormal Statuses",
"activation_count": "適用までのカウント",
"affinity_label": "Affinity Label",
"ailment_buildups": "状態異常の蓄積値",
"ailment_name": "状態異常表示",
"ailment_name_label": "状態異常表示ラベル",
@@ -46,23 +74,32 @@
"ailments": "状態異常表示",
"all_UI": "全てのUI",
"anchor": "固定",
"anomaly_cores": "Anomaly Cores",
"anomaly_filter": "Anomaly Core",
"anomaly_health": "Anomaly Core Health",
"anomaly_health_percentage": "Anomaly Core Health Percentage",
"apply": "適用",
"assign_new_key": "新規に割り当てるキーを入力",
"attack_label": "Attack Label",
"auto_highlight": "Auto-highlight",
"background": "背景色",
"bar": "バー",
"blast_damage": "爆破ダメージ",
"blast": "爆破",
"body_parts": "部位",
"bold": "ボールド",
"bomb_damage": "爆弾ダメージ",
"bombs": "Bombs",
"bottom_left": "左下",
"bottom_right": "右下",
"bottom_to_top": "Bottom to Top",
"break_anomaly_filter": "Break + Anomaly Core",
"break_count": "破壊時間",
"break_filter": "Break",
"break_health": "部位破壊までのダメージ状況",
"break_health_percentage": "部位破壊までのダメージ状況()",
"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",
"buildup": "蓄積値",
"buildup_bar": "蓄積値バー",
"buildup_bars_are_relative_to": "相対的な蓄積バー",
@@ -76,9 +113,13 @@
"closest": "Closest",
"color": "カラー",
"colors": "カラー",
"config": "Config",
"creature_name_label": "モンスターの名前ラベル",
"crown": "王冠",
"crown_thresholds": "王冠の閾値",
"current_state": "Current State",
"current_time": "Current Time",
"current_value": "Current Value",
"cutscene": "Cutscene",
"damage": "ダメージ",
"damage_bar": "ダメージバー",
@@ -86,38 +127,60 @@
"damage_meter_UI": "ダメージメーターUI",
"damage_percentage_label": "ダメージ割合()ラベル",
"damage_value_label": "ダメージラベル",
"dango_skills": "Dango Skills",
"debug": "Debug",
"default_state": "Default State",
"defense_label": "Defense Label",
"delete": "Delete",
"distance": "距離",
"dps": "DPS",
"dps_label": "DPSラベル",
"dps_mode": "DPS モード",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "Duplicate",
"duration": "Duration",
"dynamic_positioning": "動的な場所",
"dynamically_positioned": "モンスターに追随して表示",
"effect_level": "Effect Level",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "有効にする",
"enabled": "有効",
"endemic_life": "Endemic Life",
"endemic_life_UI": "環境生物UI",
"endemic_life_damage": "環境生物のダメージ",
"endemic_life_buffs": "Endemic Life Buffs",
"everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "Family",
"farthest": "Farthest",
"fight_time": "戦闘時間",
"fill_direction": "Fill Direction",
"filter": "フィルター",
"filter_mode": "Filter Mode",
"fire_resistance_label": "Fire Resistance Label",
"first": "最初",
"first_hit": "初撃",
"flinch_count": "ひるみ回数",
"foreground": "前面",
"freeze_dps_on_quest_clear": "Freeze DPS when Quest is cleared",
"freeze_dps_on_quest_end": "Freeze DPS on Quest End",
"global_position_modifier": "全体的な位置の調整",
"global_scale_modifier": "全体的なスケールの調整",
"global_settings": "全体設定",
"health": "体力",
"health_anomaly_filter": "Health + Anomaly Core",
"health_break_anomaly_filter": "Health + Break + Anomaly Core",
"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_label": "Health Label",
"health_percentage": "ダメージ割合()",
"health_severe_filter": "Health + Severe",
"health_sever_anomaly_filter": "Health + Sever + Anomaly Core",
"health_sever_filter": "Health + Sever",
"height": "ヘイト",
"hide_ailments_with_zero_buildup": "蓄積値がゼロの時に状態異常の表示を隠す",
"hide_all_active_ailments": "全ての有効な状態異常を隠す",
"hide_all_inactive_ailments": "全ての無効な状態異常を隠す",
"hide_bar_for_infinite_buffs": "Hide Bar for infinite Buffs",
"hide_dead_or_captured": "討伐済み、または捕獲済みも表示する",
"hide_disabled_ailments": "無効な状態異常を隠す",
"hide_inactive_ailments_with_no_buildup_support": "累積値がなく、非活性な異常状態を隠す",
@@ -126,28 +189,37 @@
"hide_myself": "自分自身の表示を隠す",
"hide_other_players": "ほかのプレイヤーの表示を隠す",
"hide_player_if_player_damage_is_zero": "プレイヤーのダメージが0の場合、プレイヤーの表示を隠す",
"hide_servants": "Hide Followers",
"hide_timer_for_infinite_buffs": "Hide Timer for infinite Buffs",
"hide_total_damage": "合計ダメージの表示を隠す",
"hide_total_if_total_damage_is_zero": "合計ダメージが0の場合、合計の表示を隠す",
"hide_undamaged_parts": "攻撃していない部位の表示を隠す",
"highest_health": "Highest Health",
"highest_health_percentage": "Highest Health Percentage",
"highlighted": "詳細表示 (ターゲット)",
"highlighted": "詳細表示",
"highlighted_bar": "ハイライトされたバー",
"highlighted_buildup_bar": "ハイライトされた蓄積値バー",
"highlighted_damage_bar": "ハイライトされたダメージバー",
"highlighted_targeted": "詳細表示 (ターゲット)",
"history": "History",
"history_size": "History Size",
"horizontal": "水平",
"hotkeys": "ホットキー",
"hunter_rank": "ハンターランク",
"hunter_rank_label": "ハンターランクのラベル",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID",
"in_lobby": "In Lobby",
"in_training_area": "In Training Area",
"include": "含める情報",
"infinite_buffs_location": "Infinite Buffs Location",
"inside": "Inside",
"installation_damage": "設備のダメージ",
"installations": "Installations",
"italic": "イタリック",
"item_buffs": "Item Buffs",
"join_time": "参加時間",
"killcam": "Killcam",
"kunai_damage": "クナイダメージ",
"kunai": "Kunai",
"language": "表示言語",
"large_monster_UI": "大型モンスターUI",
"large_monster_dynamic_UI": "大型モンスターのダイナミック表示UI",
@@ -155,6 +227,9 @@
"large_monster_static_UI": "大型モンスターのスタティック表示UI",
"large_monsters": "大型モンスター",
"last": "最後",
"left_to_right": "Left to Right",
"level": "Level",
"level_label": "Level Label",
"loading_quest": "Loading Quest",
"loss_health": "尻尾切断までの体力",
"loss_health_percentage": "尻尾切断までの体力()",
@@ -163,29 +238,39 @@
"master_rank": "マスターランク",
"max_distance": "最大距離",
"max_monster_updates_per_tick": "モンスター情報をアップデートする間隔",
"max_value": "Max Value",
"me": "自分",
"melody_effects": "Melody Effects",
"menu_font": "メニューで使うフォント",
"menu_font_change_disclaimer": "言語とメニューのフォントサイズを何度も変更すると、クラッシュが発生します。",
"misc_buffs": "Misc Buffs",
"mod_name": "MHR Overlay",
"mode": "Mode",
"modifiers": "全体的な調整",
"module_visibility_based_on_game_state": "Module Visibility based on Game State",
"modules": "モジュール",
"monster_can_be_captured": "捕獲可能なモンスター",
"monster_damage": "モンスターダメージ",
"monster_id": "モンスターID",
"monster_name": "モンスター名",
"monster_name_label": "モンスター名ラベル",
"monsters": "Monsters",
"my_damage_bar_location": "自身のダメージバーの場所",
"my_otomos": "My Buddies",
"myself": "Myself",
"name": "Name",
"name_label": "Name Label",
"new": "New",
"none": "設定なし",
"normal": "標準",
"offset": "基準点からの位置",
"offset_is_relative_to_parts": "部位表示に対する相対的な位置",
"opacity_falloff": "透明度を上げる",
"orientation": "並べ方",
"other_damage": "その他のダメージ",
"other": "Other",
"other_player_otomos": "Other Player Buddies",
"other_players": "他のプレイヤー",
"otomo_damage": "オトモのダメージ",
"otomo_moves": "Buddy Moves",
"otomos": "Buddies",
"outline": "Outline",
"outside": "Outside",
"part_health": "部位体力",
@@ -193,14 +278,12 @@
"part_name_label": "部位名ラベル",
"percentage_label": "パーセンテージラベル",
"performance": "パフォーマンス",
"player_damage": "プレイヤーダメージ",
"player_id": "プレイヤーID",
"player_name": "プレイヤー名",
"player_name_label": "プレイヤー名ラベル",
"player_name_size_limit": "プレイヤー名のサイズ上限",
"player_spacing": "プレイヤー表示の間隔",
"players": "Players",
"playing_quest": "Playing Quest",
"poison_damage": "毒ダメージ",
"poison": "毒",
"position": "位置",
"press_any_key": "何かボタンを押してください。",
"prioritize_large_monsters": "大型モンスターを優先する",
@@ -210,45 +293,68 @@
"quest_start_animation": "Quest Start Animation",
"quest_time": "クエスト時間",
"rage": "怒り値",
"rampage_skills": "Rampage Skills",
"reframework_outdated": "Installed REFramework version is outdated. Please, update. Otherwise, MHR Overlay won't work correctly.",
"relative_offset": "相対的な表示位置",
"rename": "Rename",
"render_highlighted_monster": "ハイライトされたモンスターをレンダリング(表示)する",
"render_inactive_anomaly_cores": "Render Inactive Anomaly Cores",
"render_not_highlighted_monsters": "ハイライトされていないモンスターをレンダリング(表示)する",
"renderer": "Renderer",
"reset": "Reset",
"reversed_order": "逆順",
"reward_screen": "Reward Screen",
"right_alignment_shift": "Right Alignment Shift",
"right_to_left": "Right to Left",
"servant_otomos": "Servant Buddies",
"servants": "Followers",
"settings": "設定",
"severe_filter": "Severe",
"sever_anomaly_filter": "Sever + Anomaly Core",
"sever_filter": "Sever",
"shadow": "影",
"show_my_otomos_separately": "Show my Buddies separately",
"show_other_player_otomos_separately": "Show Other Player Buddies separately",
"show_servant_otomos_separately": "Show Follower Buddies separately",
"size": "サイズ",
"skills": "Skills",
"small_monster_UI": "小型モンスターUI",
"small_monsters": "小型モンスター",
"sorting": "ソート",
"spacing": "間隔",
"stamina": "スタミナ",
"stamina_label": "Stamina Label",
"static_orientation": "モンスター情報の配置を修正",
"static_position": "モンスター情報の場所を修正",
"static_sorting": "モンスター情報の並べ替えを修正",
"static_spacing": "モンスター情報間の距離を修正",
"statically_positioned": "モンスター情報の一覧表示",
"stats_UI": "Stats UI",
"status": "ステータス",
"style": "Style",
"summary_screen": "Summary Screen",
"text_label": "テキストラベル",
"thickness": "Thickness",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "タイムUI",
"time_label": "タイムラベル",
"time_limit": "タイムリミット(s.)",
"timer": "Timer",
"timer_delays": "Timer Delays",
"timer_label": "タイマーラベル",
"top_buildup": "最高蓄積値",
"top_damage": "最高ダメージ",
"top_dps": "最高DPS",
"top_left": "左上",
"top_right": "右上",
"top_to_bottom": "Top to Bottom",
"total": "Total",
"total_buildup": "蓄積合計",
"total_buildup_label": "合計蓄積ラベル",
"total_buildup_value_label": "合計蓄積値ラベル",
"total_cart_count_label": "Total Cart Count Label",
"total_damage": "合計ダメージ",
"total_damage_label": "合計ダメージラベル",
"total_damage_location": "Total Damage Bar Location",
"total_damage_offset_is_relative": "トータルダメージの表示位置を調整",
"total_damage_value_label": "合計ダメージ値ラベル",
"total_dps": "トータルDPS",
@@ -256,21 +362,115 @@
"tracked_damage_types": "ダメージタイプでの追跡",
"tracked_monster_types": "モンスタータイプでの追跡",
"type": "タイプ",
"update_buffs_delay": "Update Buffs (seconds)",
"update_is_online_delay": "Update Is Online (seconds)",
"update_myself_position_delay": "Update Myself Position (seconds)",
"update_player_info_delay": "Update Player Info (seconds)",
"update_players_delay": "Update Players (seconds)",
"update_quest_time_delay": "Update Quest Time (seconds)",
"update_singletons_delay": "Update Singletons (seconds)",
"update_window_size_delay": "Update Window Size (seconds)",
"use_d2d_if_available": "Use Direct2D if available",
"value": "Value",
"value_label": "バリューラベル",
"vertical": "縦",
"viewport_offset": "表示領域からの位置",
"visible": "表示する",
"water_resistance_label": "Water Resistance Label",
"weapon_skills": "Weapon Skills",
"width": "幅",
"word_player": "Word \"Player\"",
"world_offset": "表示位置",
"wyvern_riding_damage": "操竜ダメージ",
"wyvern_riding": "Wyvern Riding",
"x": "X",
"y": "Y",
"z": "Z"
},
"dango_skills": {
"dango_adrenaline": "Dango Adrenaline",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_hunter": "Dango Hunter",
"dango_insurance": "Dango Insurance",
"dango_insurance_defense_up": "Dango Insurance Defense Up",
"super_recovery_dango": "Super Recovery Dango"
},
"endemic_life": {
"butterflame": "Butterflame",
"clothfly": "Clothfly",
"cutterfly": "Cutterfly",
"gold_wirebug": "Gold Wirebug",
"peepersects": "Peepersects",
"red_lampsquid": "Red Lampsquid",
"ruby_wirebug": "Ruby Wirebug",
"stinkmink": "Stinkmink",
"yellow_lampsquid": "Yellow Lampsquid"
},
"font_name": "NotoSansJP-Bold.otf",
"item_buffs": {
"adamant_seed": "Adamant Seed",
"armor_ammo": "Armor Ammo",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_ammo": "Demon Ammo",
"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"
},
"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_up": "Defense Up",
"immunity": "Immunity",
"natural_healing_up": "Natural Healing Up",
"stamina_use_down": "Stamina Use Down"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar",
"vase_of_vitality": "Vase of Vitality"
},
"parts": {
"abdomen": "腹部",
"amatsu_unknown": "?",
"antenna": "触角",
"arms": "腕",
"arms_mud": "腕(泥)",
@@ -336,5 +536,170 @@
"wingclaw": "翼爪",
"wingclaws": "Wingclaws",
"wings": "翼"
},
"rampage_skills": {
"chameleos_soul": "Chameleos Soul",
"kushala_daora_soul": "Kushala Daora Soul"
},
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"berserk": "Berserk",
"bladescale_hone": "Bladescale Hone",
"blood_awakening": "Blood Awakening",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragon_conversion_elemental_attack_up": "Dragon Conversion: Elem. Atk Up",
"dragon_conversion_elemental_res_up": "Dragon Conversion: Elem. Res Up",
"dragonheart": "Dragonheart",
"embolden": "Embolden",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"inspiration": "Inspiration",
"intrepid_heart": "Intrepid Heart",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"partbreaker": "Partbreaker",
"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",
"strife": "Strife",
"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,
11904,
12031,
12288,
12543,
12784,
19903,
19968,
40959,
63744,
64255,
65072,
65103,
65280,
65519,
0
],
"weapon_skills": {
"bow": {
"arc_shot_affinity": "Arc Shot: Affinity",
"arc_shot_brace": "Arc Shot: Brace",
"bolt_boost": "Bolt Boost",
"herculean_draw": "Herculean Draw"
},
"charge_blade": {
"element_boost": "Element Boost",
"sword_boost_mode": "Sword Boost Mode"
},
"dual_blades": {
"archdemon_mode": "Archdemon Mode",
"ironshine_silk": "Ironshine Silk"
},
"great_sword": {
"power_sheathe": "Power Sheathe"
},
"gunlance": {
"erupting_cannon": "Erupting Cannon",
"ground_splitter": "Ground Splitter"
},
"hammer": {
"impact_burst": "Impact Burst"
},
"heavy_bowgun": {
"counter_charger": "Counter Charger",
"overheat": "Overheat",
"rising_moon": "Rising Moon",
"setting_sun": "Setting Sun",
"wyvernsnipe_reload": "Wyvernsnipe Reload"
},
"hunting_horn": {
"bead_of_resonance": "Bead of Resonance",
"silkbind_shockwave": "Silkbind Shockwave",
"sonic_bloom": "Sonic Bloom"
},
"insect_glaive": {
"all_extracts_mix": "All Extracts Mix",
"orange_extract": "Orange Extract",
"red_extract": "Red Extract",
"white_extract": "White Extract"
},
"lance": {
"anchor_rage": "Anchor Rage",
"spiral_thrust": "Spiral Thrust",
"twin_wine": "Twin Wine"
},
"light_bowgun": {
"fanning_maneuver": "Fanning Maneuver",
"wyvernblast_reload": "Wyvernblast Reload"
},
"long_sword": {
"harvest_moon": "Harvest Moon",
"iai_slash": "Iai Slash",
"soaring_kick": "Soaring Kick",
"spirit_gauge": "Spirit Gauge",
"spirit_gauge_autofill": "Spirit Gauge Autofill"
},
"switch_axe": {
"amped_state": "Amped State",
"axe_heavy_slam": "Axe: Heavy Slam",
"switch_charger": "Switch Charger"
},
"sword_and_shield": {
"destroyer_oil": "Destroyer Oil"
}
},
"weapons": {
"bow": "Bow",
"charge_blade": "Charge Blade",
"dual_blades": "Dual Blades",
"great_sword": "Great Sword",
"gunlance": "Gunlance",
"hammer": "Hammer",
"heavy_bowgun": "Heavy Bowgun",
"hunting_horn": "Hunting Horn",
"insect_glaive": "Insect Glaive",
"lance": "Lance",
"light_bowgun": "Light Bowgun",
"long_sword": "Long Sword",
"switch_axe": "Switch Axe",
"sword_and_shield": "Sword & Shield"
}
}

View File

@@ -3,11 +3,15 @@
"HP": "체력:",
"buildup": "누적치:",
"gold": "금관",
"lv": "",
"mini": "최소",
"otomo": "동반자",
"part_anomaly_core": "괴이핵",
"part_break": "파괴",
"part_sever": "절단",
"player": "헌터",
"rage": "분노:",
"servant": "맹우",
"silver": "은관",
"stamina": "스태미나:",
"total_buildup": "총 누적치",
@@ -15,30 +19,54 @@
},
"ailments": {
"blast": "폭파",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "거름탄",
"engulfed": "Engulfed",
"exhaust": "탈진",
"fall_otomo_trap": "동반자 구멍 함정",
"fall_trap": "구멍 함정",
"falling_asleep": "Falling Asleep",
"fireblight": "불바위구리",
"flash": "섬광",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "진흙구리",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "마비",
"poison": "독",
"quick_sand": "유사(모래함정)",
"resistance_down": "Resistance Down",
"ride": "용조종",
"roar": "Roar",
"shock_otomo_trap": "동반자 마비덫",
"shock_trap": "마비덫",
"sleep": "수면",
"steel_fang": "강철아",
"stench": "Stench",
"stun": "기절",
"thunderblight": "번개털구리",
"tranq_bomb": "포획용마취옥",
"waterblight": "진흙구리"
"tremor": "Tremor",
"waterblight": "진흙구리",
"webbed": "Webbed"
},
"customization_menu": {
"UI_font": "UI 글꼴",
"UI_font_notice": "글꼴 변경시 스크립트를 리로드 해야합니다!",
"abnormal_statuses": "Abnormal Statuses",
"activation_count": "활성 횟수",
"affinity_label": "Affinity Label",
"ailment_buildups": "상태이상 누적치",
"ailment_name": "상태이상 이름",
"ailment_name_label": "상태이상 이름 정보",
@@ -46,26 +74,35 @@
"ailments": "상태이상",
"all_UI": "모든 UI",
"anchor": "기준",
"anomaly_cores": "괴이핵",
"anomaly_filter": "괴이핵",
"anomaly_health": "괴이핵 체력",
"anomaly_health_percentage": "괴이핵 체력 비율",
"apply": "적용",
"assign_new_key": "새 키를 할당",
"attack_label": "Attack Label",
"auto_highlight": "자동 타겟 설정",
"background": "배경색",
"bar": "",
"blast_damage": "폭파 대미지",
"bar": "막대",
"blast": "폭파",
"body_parts": "부위",
"bold": "굵게",
"bomb_damage": "폭탄 대미지",
"bottom_left": "좌하단",
"bottom_right": "우하단",
"bombs": "폭탄",
"bottom_left": "왼쪽 아래",
"bottom_right": "오른쪽 아래",
"bottom_to_top": "아래에서 위로",
"break_anomaly_filter": "파괴 + 괴이핵",
"break_count": "파괴 횟수",
"break_filter": "파괴",
"break_health": "파괴 수치",
"break_health_percentage": "파괴 수치 비율",
"break_max_count": "최대 파괴 횟수",
"break_severe_filter": "파괴 + 절단",
"break_sever_anomaly_filter": "파괴 + 절단 + 괴이핵",
"break_sever_filter": "파괴 + 절단",
"buff_UI": "버프 UI",
"buildup": "누적치",
"buildup_bar": "누적치 ",
"buildup_bars_are_relative_to": "기준으로 누적치 ",
"buildup_bar": "누적치 막대",
"buildup_bars_are_relative_to": "기준으로 누적치 막대",
"buildup_percentage": "누적치 비율",
"buildup_percentage_label": "누적치 비율 정보",
"buildup_value_label": "누적치 값 정보",
@@ -76,86 +113,124 @@
"closest": "가장 가까운",
"color": "색상",
"colors": "색상",
"config": "설정",
"creature_name_label": "환경생물 이름 정보",
"crown": "금관",
"crown_thresholds": "금관 판정값",
"cutscene": "Cutscene",
"current_state": "현재 상태",
"current_time": "Current Time",
"current_value": "현재 값",
"cutscene": "컷신",
"damage": "대미지",
"damage_bar": "대미지 ",
"damage_bars_are_relative_to": "기준으로 대미지 바",
"damage_bar": "대미지 막대",
"damage_bars_are_relative_to": "대미지 막대 순서",
"damage_meter_UI": "대미지 미터 UI",
"damage_percentage_label": "대미지 비율 정보",
"damage_value_label": "대미지 값 정보",
"distance": "거리",
"dango_skills": "Dango Skills",
"debug": "Debug",
"default_state": "기본 상태",
"defense_label": "Defense Label",
"delete": "삭제하기",
"distance": "간격",
"dps": "DPS",
"dps_label": "DPS 정보",
"dps_mode": "DPS 모드",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "복제하기",
"duration": "지속시간",
"dynamic_positioning": "유동 위치",
"dynamically_positioned": "유동 위치 UI",
"effect_level": "Effect Level",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "표시 대상",
"enabled": "사용함",
"endemic_life": "환경생물",
"endemic_life_UI": "환경생물 UI",
"endemic_life_damage": "환경생물 대미지",
"endemic_life_buffs": "Endemic Life Buffs",
"everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "글꼴",
"farthest": "가장 멀리있는",
"fight_time": "전투 시간",
"fill_direction": "채우는 방향",
"filter": "필터",
"first": "처음",
"filter_mode": "필터 모드",
"fire_resistance_label": "Fire Resistance Label",
"first": "맨 앞",
"first_hit": "첫 공격",
"flinch_count": "경직 횟수",
"foreground": "전경색",
"freeze_dps_on_quest_clear": "퀘스트 종료시 DPS 집계 정지",
"freeze_dps_on_quest_end": "퀘스트 종료시 DPS 멈춤",
"global_position_modifier": "전역 위치 배율",
"global_scale_modifier": "전역 크기 배율",
"global_settings": "전역 설정",
"health": "체력",
"health_anomaly_filter": "체력 + 괴이핵",
"health_break_anomaly_filter": "체력 + 파괴 + 괴이핵",
"health_break_filter": "체력 + 파괴",
"health_break_severe_filter": "체력 + 파괴 + 절단",
"health_break_sever_anomaly_filter": "체력 + 파괴 + 절단 + 괴이핵",
"health_break_sever_filter": "체력 + 파괴 + 절단",
"health_filter": "체력",
"health_label": "Health Label",
"health_percentage": "체력 비율",
"health_severe_filter": "체력 + 절단",
"health_sever_anomaly_filter": "체력 + 절단 + 괴이핵",
"health_sever_filter": "체력 + 절단",
"height": "높이",
"hide_ailments_with_zero_buildup": "누적치가 0이면 상태이상 숨김",
"hide_all_active_ailments": "걸린 상태이상 모두 숨김",
"hide_all_inactive_ailments": "걸리지 않은 상태이상 모두 숨김",
"hide_dead_or_captured": "토벌되거나 포획되면 숨김",
"hide_disabled_ailments": "비활성화된 상태이상 숨김",
"hide_inactive_ailments_with_no_buildup_support": "누적치가 없고 걸리지 않은 상태이상 숨김",
"hide_inactive_creatures": "쿨타임인 환경생물 숨김",
"hide_module_if_total_damage_is_zero": "총 대미지가 0이면 UI 숨김",
"hide_myself": "내 정보 숨김",
"hide_other_players": "다른 헌터 정보 숨김",
"hide_player_if_player_damage_is_zero": "헌터 대미지가 0이면 헌터 숨김",
"hide_total_damage": "모든 대미지 숨김",
"hide_total_if_total_damage_is_zero": "총 대미지가 0이면 모두 숨김이 높은",
"hide_undamaged_parts": "피해를 입히지 않은 부위 숨김",
"hide_ailments_with_zero_buildup": "누적치가 0이면 상태이상 표시 안 함",
"hide_all_active_ailments": "걸린 상태이상 모두 표시 안 함",
"hide_all_inactive_ailments": "걸리지 않은 상태이상 모두 표시 안 함",
"hide_bar_for_infinite_buffs": "무한 버프의 막대는 표시 안 함",
"hide_dead_or_captured": "토벌되거나 포획되면 표시 안 함",
"hide_disabled_ailments": "비활성화된 상태이상 표시 안 함",
"hide_inactive_ailments_with_no_buildup_support": "누적치가 없고 걸리지 않은 상태이상 표시 안 함",
"hide_inactive_creatures": "쿨타임인 환경생물 표시 안 함",
"hide_module_if_total_damage_is_zero": "총 대미지가 0이면 UI 표시 안 함",
"hide_myself": "내 정보 표시 안 함",
"hide_other_players": "다른 헌터 정보 표시 안 함",
"hide_player_if_player_damage_is_zero": "헌터 대미지가 0이면 헌터 표시 안 함",
"hide_servants": "맹우 표시 안 함",
"hide_timer_for_infinite_buffs": "무한 버프는 표시 안 함",
"hide_total_damage": "모든 대미지 표시 안 함",
"hide_total_if_total_damage_is_zero": "총 대미지가 0이면 모두 표시 안 함",
"hide_undamaged_parts": "피해를 입히지 않은 부위 표시 안 함",
"highest_health": "가장 체력이 높은",
"highest_health_percentage": "가장 체력 비율이 높은",
"highlighted": "타겟이 된 몬스터 표시",
"highlighted_bar": "타겟이 된 몬스터 ",
"highlighted_buildup_bar": "타겟이 된 몬스터 누적치 ",
"highlighted_damage_bar": "타겟이 된 몬스터 대미지 ",
"highlighted": "주시대상",
"highlighted_bar": "주시대상 몬스터 막대",
"highlighted_buildup_bar": "주시대상 몬스터 누적치 막대",
"highlighted_damage_bar": "주시대상 몬스터 대미지 막대",
"highlighted_targeted": "주시대상 몬스터 표시",
"history": "History",
"history_size": "History Size",
"horizontal": "가로",
"hotkeys": "단축키",
"hunter_rank": "헌터 랭크",
"hunter_rank_label": "헌터 랭크 정보",
"in_lobby": "In Lobby",
"in_training_area": "In Training Area",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID",
"in_lobby": "로비 내",
"in_training_area": "훈련구역 내",
"include": "포함",
"infinite_buffs_location": "Infinite Buffs Location",
"inside": "내부",
"installation_damage": "설비 대미지",
"installations": "설",
"italic": "기울임",
"item_buffs": "Item Buffs",
"join_time": "참가 시간",
"killcam": "Killcam",
"kunai_damage": "쿠나이 대미지",
"killcam": "처치 영상",
"kunai": "쿠나이",
"language": "언어",
"large_monster_UI": "대형 몬스터 UI",
"large_monster_dynamic_UI": "대형 몬스터 유동 UI",
"large_monster_highlighted_UI": "타겟이 된 대형 몬스터 UI",
"large_monster_highlighted_UI": "주시대상 대형 몬스터 UI",
"large_monster_static_UI": "대형 몬스터 고정 UI",
"large_monsters": "대형 몬스터",
"last": "마지막",
"loading_quest": "Loading Quest",
"last": "맨 뒤",
"left_to_right": "왼쪽에서 오른쪽",
"level": "레벨",
"level_label": "레벨 정보",
"loading_quest": "퀘스트 로딩 중",
"loss_health": "절단 수치",
"loss_health_percentage": "절단 수치 비율",
"lowest_health": "가장 체력이 낮은",
@@ -163,29 +238,39 @@
"master_rank": "마스터 랭크",
"max_distance": "최대 거리",
"max_monster_updates_per_tick": "틱당 최대 몬스터 갱신 횟수",
"max_value": "최대값",
"me": "나",
"melody_effects": "Melody Effects",
"menu_font": "메뉴 글꼴",
"menu_font_change_disclaimer": "언어 및 메뉴 글꼴 크기를 여러 번 변경하면 비정상 종료가 될 수 있습니다!",
"misc_buffs": "Misc Buffs",
"mod_name": "MHR Overlay",
"mode": "모드",
"modifiers": "설정 배율",
"module_visibility_based_on_game_state": "Module Visibility based on Game State",
"modules": "UI",
"module_visibility_based_on_game_state": "게임 상태에 따라 모듈 표시",
"modules": "모듈",
"monster_can_be_captured": "몬스터 포획 가능",
"monster_damage": "몬스터 대미지",
"monster_id": "Monster ID",
"monster_id": "몬스터 ID",
"monster_name": "몬스터명",
"monster_name_label": "몬스터명 정보",
"my_damage_bar_location": "내 대미지 바 위치",
"monsters": "몬스터",
"my_damage_bar_location": "내 대미지 막대 위치",
"my_otomos": "내 동반자",
"myself": "나",
"name": "이름",
"name_label": "이름 정보",
"new": "새로 만들기",
"none": "없음",
"normal": "보통",
"offset": "거리",
"offset_is_relative_to_parts": "거리를 부위 기준으로",
"normal": "기본",
"offset": "오프셋",
"offset_is_relative_to_parts": "오프셋을 부위 기준으로",
"opacity_falloff": "투명도 감소",
"orientation": "방향",
"other_damage": "기타 대미지",
"other": "기타",
"other_player_otomos": "다른 플레이어 동반자",
"other_players": "다른 헌터",
"otomo_damage": "동반자 대미지",
"otomo_moves": "Buddy Moves",
"otomos": "동반자",
"outline": "외곽선",
"outside": "외부",
"part_health": "부위 수치",
@@ -193,84 +278,199 @@
"part_name_label": "부위 정보",
"percentage_label": "비율 정보",
"performance": "성능",
"player_damage": "헌터 대미지",
"player_id": "헌터 ID",
"player_name": "헌터명",
"player_name_label": "헌터명 정보",
"player_name_size_limit": "헌터명 크기 제한",
"player_spacing": "플레이어 간격",
"playing_quest": "Playing Quest",
"poison_damage": "독 대미지",
"players": "모든 플레이어",
"playing_quest": "퀘스트 중",
"poison": "독",
"position": "위치",
"press_any_key": "설정할 키를 누르세요...",
"prioritize_large_monsters": "대형 몬스터를 우선적으로",
"quest_end_animation": "Quest End Animation",
"quest_end_screen": "Quest End Screen",
"quest_end_timer": "Quest End Timer",
"quest_start_animation": "Quest Start Animation",
"quest_end_animation": "퀘스트 종료 영상",
"quest_end_screen": "퀘스트 종료 화면",
"quest_end_timer": "퀘스트 종료 타이머",
"quest_start_animation": "퀘스트 시작 영상",
"quest_time": "퀘스트 시간",
"rage": "분노",
"rampage_skills": "Rampage Skills",
"reframework_outdated": "설치된 REFramework가 구버전입니다. 업데이트 하지 않으면 MHR Overlay가 제대로 동작하지 않을 수 있습니다.",
"relative_offset": "상대적 위치 거리",
"render_highlighted_monster": "타겟이 된 몬스터 표시",
"render_not_highlighted_monsters": "타겟이 아닌 몬스터 표시",
"relative_offset": "상대적 위치 오프셋",
"rename": "이름 변경",
"render_highlighted_monster": "주시대상 몬스터 표시",
"render_inactive_anomaly_cores": "비활성화 된 괴이핵 표시",
"render_not_highlighted_monsters": "주시대상이 아닌 아닌 몬스터 표시",
"renderer": "렌더링",
"reset": "리셋",
"reversed_order": "역순",
"reward_screen": "Reward Screen",
"reward_screen": "보상 화면",
"right_alignment_shift": "우측정렬 이동",
"right_to_left": "오른쪽에서 왼쪽",
"servant_otomos": "맹우 동반자",
"servants": "맹우",
"settings": "설정",
"severe_filter": "절단",
"sever_anomaly_filter": "절단 + 괴이핵",
"sever_filter": "절단",
"shadow": "그림자",
"show_my_otomos_separately": "내 동반자를 따로",
"show_other_player_otomos_separately": "다른 플레이어의 동반자를 따로",
"show_servant_otomos_separately": "맹우의 동반자를 따로",
"size": "크기",
"skills": "Skills",
"small_monster_UI": "소형 몬스터 UI",
"small_monsters": "소형 몬스터",
"sorting": "정렬방법",
"spacing": "간격",
"stamina": "스태미나",
"stamina_label": "Stamina Label",
"static_orientation": "고정 방향",
"static_position": "고정 위치",
"static_sorting": "고정 정렬방법",
"static_spacing": "고정 간격",
"statically_positioned": "고정 위치 UI",
"stats_UI": "Stats UI",
"status": "상태",
"style": "스타일",
"summary_screen": "Summary Screen",
"summary_screen": "결과 요약 화면",
"text_label": "텍스트 정보",
"thickness": "두께",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "시간 UI",
"time_label": "시간 정보",
"time_limit": "시간 제한 (단위: 초)",
"timer": "타이머",
"timer_delays": "Timer Delays",
"timer_label": "타이머 정보",
"top_buildup": "총 누적치",
"top_damage": "최고 대미지",
"top_dps": "최고 DPS",
"top_left": "좌상단",
"top_right": "우상단",
"top_left": "왼쪽 위",
"top_right": "오른쪽 위",
"top_to_bottom": "위에서 아래",
"total": "전체",
"total_buildup": "총 누적치",
"total_buildup_label": "총 누적치 정보",
"total_buildup_value_label": "총 누적치 값 정보",
"total_cart_count_label": "총 수레 횟수 정보",
"total_damage": "총 대미지",
"total_damage_label": "총 대미지 정보",
"total_damage_offset_is_relative": "총 대미지 거리를 상대적 값으로",
"total_damage_location": "총 대미지 막대 위치",
"total_damage_offset_is_relative": "총 대미지 오프셋을 상대적 값으로",
"total_damage_value_label": "총 대미지 값 정보",
"total_dps": "총 DPS",
"total_dps_label": "총 DPS 정보",
"tracked_damage_types": "추적할 대미지 종류",
"tracked_monster_types": "추적할 몬스터 타입",
"type": "순으로",
"type": "종류",
"update_buffs_delay": "Update Buffs (seconds)",
"update_is_online_delay": "Update Is Online (seconds)",
"update_myself_position_delay": "Update Myself Position (seconds)",
"update_player_info_delay": "Update Player Info (seconds)",
"update_players_delay": "Update Players (seconds)",
"update_quest_time_delay": "Update Quest Time (seconds)",
"update_singletons_delay": "Update Singletons (seconds)",
"update_window_size_delay": "Update Window Size (seconds)",
"use_d2d_if_available": "가능한 Direct2D를 사용함",
"value": "Value",
"value_label": "값 정보",
"vertical": "세로",
"viewport_offset": "뷰포트 거리",
"viewport_offset": "뷰포트 오프셋",
"visible": "표시함",
"water_resistance_label": "Water Resistance Label",
"weapon_skills": "Weapon Skills",
"width": "너비",
"word_player": "\"헌터\" 명칭",
"world_offset": "전역 거리",
"wyvern_riding_damage": "용조종 대미지",
"world_offset": "전역 오프셋",
"wyvern_riding": "용조종",
"x": "X",
"y": "Y",
"z": "Z"
},
"dango_skills": {
"dango_adrenaline": "Dango Adrenaline",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_hunter": "Dango Hunter",
"dango_insurance": "Dango Insurance",
"dango_insurance_defense_up": "Dango Insurance Defense Up",
"super_recovery_dango": "Super Recovery Dango"
},
"endemic_life": {
"butterflame": "Butterflame",
"clothfly": "Clothfly",
"cutterfly": "Cutterfly",
"gold_wirebug": "Gold Wirebug",
"peepersects": "Peepersects",
"red_lampsquid": "Red Lampsquid",
"ruby_wirebug": "Ruby Wirebug",
"stinkmink": "Stinkmink",
"yellow_lampsquid": "Yellow Lampsquid"
},
"font_name": "NotoSansKR-Bold.otf",
"item_buffs": {
"adamant_seed": "Adamant Seed",
"armor_ammo": "Armor Ammo",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_ammo": "Demon Ammo",
"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"
},
"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_up": "Defense Up",
"immunity": "Immunity",
"natural_healing_up": "Natural Healing Up",
"stamina_use_down": "Stamina Use Down"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar",
"vase_of_vitality": "Vase of Vitality"
},
"parts": {
"abdomen": "배",
"amatsu_unknown": "?",
"antenna": "더듬이",
"arms": "팔",
"arms_mud": "팔(진흙)",
@@ -327,7 +527,7 @@
"tail_mud": "꼬리(진흙)",
"tail_tip": "꼬리끝",
"tail_windsac": "꼬리(바람주머니)",
"thundersacs": "Thundersacs",
"thundersacs": "번개주머니",
"torso": "몸통",
"torso_mud": "몸통(진흙)",
"unknown": "?",
@@ -336,5 +536,176 @@
"wingclaw": "날개발톱",
"wingclaws": "날개발톱",
"wings": "날개"
},
"rampage_skills": {
"chameleos_soul": "Chameleos Soul",
"kushala_daora_soul": "Kushala Daora Soul"
},
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"berserk": "Berserk",
"bladescale_hone": "Bladescale Hone",
"blood_awakening": "Blood Awakening",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragon_conversion_elemental_attack_up": "Dragon Conversion: Elem. Atk Up",
"dragon_conversion_elemental_res_up": "Dragon Conversion: Elem. Res Up",
"dragonheart": "Dragonheart",
"embolden": "Embolden",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"inspiration": "Inspiration",
"intrepid_heart": "Intrepid Heart",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"partbreaker": "Partbreaker",
"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",
"strife": "Strife",
"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,
11904,
12031,
12288,
12351,
12592,
12687,
12800,
19903,
19968,
40959,
44032,
55215,
63744,
64255,
65072,
65103,
65280,
65519,
0
],
"weapon_skills": {
"bow": {
"arc_shot_affinity": "Arc Shot: Affinity",
"arc_shot_brace": "Arc Shot: Brace",
"bolt_boost": "Bolt Boost",
"herculean_draw": "Herculean Draw"
},
"charge_blade": {
"element_boost": "Element Boost",
"sword_boost_mode": "Sword Boost Mode"
},
"dual_blades": {
"archdemon_mode": "Archdemon Mode",
"ironshine_silk": "Ironshine Silk"
},
"great_sword": {
"power_sheathe": "Power Sheathe"
},
"gunlance": {
"erupting_cannon": "Erupting Cannon",
"ground_splitter": "Ground Splitter"
},
"hammer": {
"impact_burst": "Impact Burst"
},
"heavy_bowgun": {
"counter_charger": "Counter Charger",
"overheat": "Overheat",
"rising_moon": "Rising Moon",
"setting_sun": "Setting Sun",
"wyvernsnipe_reload": "Wyvernsnipe Reload"
},
"hunting_horn": {
"bead_of_resonance": "Bead of Resonance",
"silkbind_shockwave": "Silkbind Shockwave",
"sonic_bloom": "Sonic Bloom"
},
"insect_glaive": {
"all_extracts_mix": "All Extracts Mix",
"orange_extract": "Orange Extract",
"red_extract": "Red Extract",
"white_extract": "White Extract"
},
"lance": {
"anchor_rage": "Anchor Rage",
"spiral_thrust": "Spiral Thrust",
"twin_wine": "Twin Wine"
},
"light_bowgun": {
"fanning_maneuver": "Fanning Maneuver",
"wyvernblast_reload": "Wyvernblast Reload"
},
"long_sword": {
"harvest_moon": "Harvest Moon",
"iai_slash": "Iai Slash",
"soaring_kick": "Soaring Kick",
"spirit_gauge": "Spirit Gauge",
"spirit_gauge_autofill": "Spirit Gauge Autofill"
},
"switch_axe": {
"amped_state": "Amped State",
"axe_heavy_slam": "Axe: Heavy Slam",
"switch_charger": "Switch Charger"
},
"sword_and_shield": {
"destroyer_oil": "Destroyer Oil"
}
},
"weapons": {
"bow": "Bow",
"charge_blade": "Charge Blade",
"dual_blades": "Dual Blades",
"great_sword": "Great Sword",
"gunlance": "Gunlance",
"hammer": "Hammer",
"heavy_bowgun": "Heavy Bowgun",
"hunting_horn": "Hunting Horn",
"insect_glaive": "Insect Glaive",
"lance": "Lance",
"light_bowgun": "Light Bowgun",
"long_sword": "Long Sword",
"switch_axe": "Switch Axe",
"sword_and_shield": "Sword & Shield"
}
}

View File

@@ -3,11 +3,15 @@
"HP": "ОЗ:",
"buildup": "Накопление",
"gold": "Золото",
"lv": "",
"mini": "Мини",
"otomo": "Cпутник",
"part_anomaly_core": "Ядро аномалии",
"part_break": "Повреждение",
"part_sever": "Отсечение",
"player": "Игрок",
"rage": "Ярость:",
"servant": "Последователь",
"silver": "Серебро",
"stamina": "Выносливость:",
"total_buildup": "Общее накопление",
@@ -15,30 +19,54 @@
},
"ailments": {
"blast": "Взрыв",
"blastblight": "Взрывная порча",
"bleeding": "Кровотечение",
"bloodblight": "Кровавая порча",
"deadly_poison": "Смертельный яд",
"defense_down": "Защита снижена",
"dragonblight": "Драконья Порча",
"dung_bomb": "Навозная бомба",
"engulfed": "Окутывание",
"exhaust": "Усталость",
"fall_otomo_trap": "Волчья яма спутника",
"fall_trap": "Волчья яма",
"falling_asleep": "Засыпание",
"fireblight": "Огненная порча",
"flash": "Оглушение",
"frenzy": "Бешенство",
"frenzy_infection": "Инфекция бешенства",
"frenzy_overcome": "Преодоление бешенства",
"frostblight": "Ледяная (морозная) порча",
"hellfireblight": "Порча адского пламени",
"iceblight": "Ледяная порча",
"leeched": "Истощение",
"major_bubbleblight": "Великая пузырьковая порча",
"minor_bubbleblight": "Малая пузырьковая порча",
"muck": "Грязь",
"paralysis": "Паралич",
"poison": "Отравление",
"quick_sand": "Зыбучий песок",
"resistance_down": "Сопротивление снижено",
"ride": "Езда на виверне",
"roar": "Рык",
"shock_otomo_trap": "Шоковая ловушка спутника",
"shock_trap": "Шоковая ловушка",
"sleep": "Сон",
"steel_fang": "Стальной клык",
"stench": "Зловоние",
"stun": "Оглушение",
"thunderblight": "Грозовая порча",
"tranq_bomb": "Снотворная порча",
"waterblight": "Водяная порча"
"tremor": "Тряска",
"waterblight": "Водяная порча",
"webbed": "В паутине"
},
"customization_menu": {
"UI_font": "Шрифт интерфейса",
"UI_font_notice": "Любые изменения шрифта требуют перезагрузку скрипта!",
"abnormal_statuses": "Аномальные статусы",
"activation_count": "Кол-во активаций",
"affinity_label": "Метка мастерства",
"ailment_buildups": "Накопление аномального статуса",
"ailment_name": "Название аномального статуса",
"ailment_name_label": "Метка названия аномального статуса",
@@ -46,23 +74,32 @@
"ailments": "Аномальные статусы",
"all_UI": "Весь интерфейс",
"anchor": "Привязка",
"anomaly_cores": "Ядра аномалии",
"anomaly_filter": "Ядро аномалии",
"anomaly_health": "Здоровье ядра аномалии",
"anomaly_health_percentage": "Здоровье ядра аномалии в процентах",
"apply": "Применить",
"assign_new_key": "Привязать клавишу",
"attack_label": "Метка Атаки",
"auto_highlight": "Автофокус",
"background": "Фон",
"bar": "Шкала",
"blast_damage": "Урон от взрыва",
"blast": "Взрыв",
"body_parts": "Части тела",
"bold": "Жирный",
"bomb_damage": "Урон от бомб",
"bombs": "Бомбы",
"bottom_left": "Левый нижний угол",
"bottom_right": "Правй нижний угол",
"bottom_to_top": "Снизу вверх",
"break_anomaly_filter": "Повреждение + Ядро аномалии",
"break_count": "Счётчик повреждений",
"break_filter": "Повреждение",
"break_health": "Повреждение части",
"break_health_percentage": "Повреждение части в процентах",
"break_max_count": "Максимальное кол-во повреждений",
"break_severe_filter": "Повреждение + Отсечение",
"break_sever_anomaly_filter": "Повреждение + Отсечение + Ядро аномалии",
"break_sever_filter": "Повреждение + Отсечение",
"buff_UI": "Интерфейс эффектов",
"buildup": "Накопление",
"buildup_bar": "Шкала накопления",
"buildup_bars_are_relative_to": "Шкалы накопления расположены относительно к",
@@ -70,15 +107,19 @@
"buildup_percentage_label": "Метка накопления в процентах",
"buildup_value_label": "Метка значения накопления",
"capture_line": "Линия здоровья захвата",
"cart_count": "Кол-во потерь сознания",
"cart_count_label": "Метка кол-ва потерь сознания",
"cart_count": "Кол-во смертей",
"cart_count_label": "Метка кол-ва смертей",
"center": "Центр",
"closest": "Ближайший",
"color": "Цвет",
"colors": "Цвета",
"config": "Файл конфигурации",
"creature_name_label": "Метка имени существа",
"crown": "Корона",
"crown_thresholds": "Лимиты корон",
"current_state": "Текущее состояние",
"current_time": "Текущее время",
"current_value": "Текущее значение",
"cutscene": "Катсцена",
"damage": "Урон",
"damage_bar": "Шкала урона",
@@ -86,38 +127,60 @@
"damage_meter_UI": "Интерфейс модуля урона",
"damage_percentage_label": "Метка урона в процентах",
"damage_value_label": "Метка значений урона",
"dango_skills": "Навыки данго",
"debug": "Отладка",
"default_state": "Состояние по умолчанию",
"defense_label": "Метка защиты",
"delete": "Удалить",
"distance": "Расстояние",
"dps": "Урон в секунду",
"dps_label": "Метка урона в секунду",
"dps_mode": "Режим урона в секунду",
"dragon_resistance_label": "Метка сопротивления дракону",
"duplicate": "Дублировать",
"duration": "Продолжительность",
"dynamic_positioning": "Динамическое позиционирование",
"dynamically_positioned": "Рассположенный динамично",
"effect_level": "Уровень эффекта",
"element_2_label": "Метка элемента 2",
"element_label": "Метка элемента",
"enable_for": "Показывать для",
"enabled": "Включить",
"endemic_life": "Местная живность",
"endemic_life_UI": "Интерфейс местной живности",
"endemic_life_damage": "Урон от окружения",
"endemic_life_buffs": "Эффекты местной живности",
"everything_seems_to_be_ok": "Кажется, всё в порядке!",
"family": "Семейство",
"farthest": "Самый дальний",
"fight_time": "Время в бою",
"fill_direction": "Направление заполнения",
"filter": "Фильтр",
"filter_mode": "Режим Фильтра",
"fire_resistance_label": "Метка сопротивления огню",
"first": "Первый",
"first_hit": "Первый удар",
"flinch_count": "Кол-во вздрагиваний",
"foreground": "Передний план",
"freeze_dps_on_quest_clear": "Заморозить УВС после завершения квеста",
"freeze_dps_on_quest_end": "Заморозить УВС после завершения квеста",
"global_position_modifier": "Глобальный модификатор расположения",
"global_scale_modifier": "Глобальный модификатор размера",
"global_settings": "Общие настройки",
"health": "Здоровье",
"health_anomaly_filter": "Здоровье + Ядро аномалии",
"health_break_anomaly_filter": "Здоровье + Повреждение + Ядро аномалии",
"health_break_filter": "Здоровье + Повреждение",
"health_break_severe_filter": "Здоровье + Повреждение + Отсечение",
"health_break_sever_anomaly_filter": "Здоровье + Повреждение + Отсечение + Ядро аномалии",
"health_break_sever_filter": "Здоровье + Повреждение + Отсечение",
"health_filter": "Здоровье",
"health_label": "Метка здоровья",
"health_percentage": "Здоровье в процентах",
"health_severe_filter": "Здоровье + Отсечение",
"health_sever_anomaly_filter": "Здоровье + Отсечение + Ядро аномалии",
"health_sever_filter": "Здоровье + Отсечение",
"height": "Высота",
"hide_ailments_with_zero_buildup": "Скрыть аномальный статус, если накопление равно 0",
"hide_all_active_ailments": "Скрыть все активные аномальные статусы",
"hide_all_inactive_ailments": "Скрыть все неактивные аномальные статусы",
"hide_bar_for_infinite_buffs": "Скрыть шкалу у бесконечных эффектов",
"hide_dead_or_captured": "Скрыть мёртвых и захваченных монстров",
"hide_disabled_ailments": "Скрыть отключенные аномальные статусы",
"hide_inactive_ailments_with_no_buildup_support": "Скрыть неактивные аномальные статусы без поддержки накопления",
@@ -126,6 +189,8 @@
"hide_myself": "Скрыть себя",
"hide_other_players": "Скрыть остальных игроков",
"hide_player_if_player_damage_is_zero": "Скрыть игрока, если его урон равен 0",
"hide_servants": "Скрыть последователей",
"hide_timer_for_infinite_buffs": "Скрыть таймер у бесконечных эффектов",
"hide_total_damage": "Скрыть общий урон",
"hide_total_if_total_damage_is_zero": "Скрыть общий урон, если он равен 0",
"hide_undamaged_parts": "Скрыть неповреждённые части тела",
@@ -135,19 +200,26 @@
"highlighted_bar": "Помеченная шкала",
"highlighted_buildup_bar": "Помеченная шкала накопления",
"highlighted_damage_bar": "Помеченная шкала урона",
"highlighted_targeted": "Помеченный",
"history": "История",
"history_size": "Размер истории",
"horizontal": "Горизонтально",
"hotkeys": "Горячие клавиши",
"hunter_rank": "Ранг охотника",
"hunter_rank_label": "Метка ранга охотника",
"ice_resistance_label": "Метка сопротивления льду",
"id": "ID",
"in_lobby": "В лобби",
"in_training_area": "В тренировочной зоне",
"include": "Элементы",
"infinite_buffs_location": "Позиция бесконечных эффектов",
"inside": "Внутри",
"installation_damage": "Урон от установок",
"installations": "Установки",
"italic": "Курсив",
"item_buffs": "Эффекты предметов",
"join_time": "Время присоединения",
"killcam": "Камера смерти",
"kunai_damage": "Урон от кунаев",
"kunai": "Кунаи",
"language": "Язык",
"large_monster_UI": "Интерфейс больший монстров",
"large_monster_dynamic_UI": "Динамический интерфейс больших монстров",
@@ -155,6 +227,9 @@
"large_monster_static_UI": "Статический интерфейс больших монстров",
"large_monsters": "Большие монстры",
"last": "Последний",
"left_to_right": "Слева направо",
"level": "Уровень",
"level_label": "Метка уровня",
"loading_quest": "Загрузка квеста",
"loss_health": "Отсечение части",
"loss_health_percentage": "Отсечение части в процентах",
@@ -163,29 +238,39 @@
"master_rank": "Ранг мастера",
"max_distance": "Макс. расстояние",
"max_monster_updates_per_tick": "Макс. кол-во обновлений за тик",
"max_value": "Максимальное значение",
"me": "Я",
"melody_effects": "Эффекты мелодии",
"menu_font": "Шрифт меню",
"menu_font_change_disclaimer": "Изменение языка и размера шрифта меню несколько раз приведёт к вылету!",
"misc_buffs": "Разные эффекты",
"mod_name": "MHR Overlay",
"mode": "Режим",
"modifiers": "Модификаторы",
"module_visibility_based_on_game_state": "Видимость модулей в зависимости от состояния игры",
"modules": "Модули",
"monster_can_be_captured": "Монстр может быть схвачен",
"monster_damage": "Урон от монстров",
"monster_id": "ИД монстра",
"monster_name": "Имя монстра",
"monster_name_label": "Метка имени монстра",
"monsters": "Монстры",
"my_damage_bar_location": "Позиция моей шкалы урона",
"my_otomos": "Мои спутники",
"myself": "Я",
"name": "Имя",
"name_label": "Метка имени",
"new": "Создать",
"none": "Нет",
"normal": "Обычный",
"offset": "Сдвиг",
"offset_is_relative_to_parts": "Сдвиг относителен к частям тела",
"opacity_falloff": "Увеличение прозрачности от расстояния",
"orientation": "Ориентация",
"other_damage": "Другой урон",
"other": "Другое",
"other_player_otomos": "Спутники других игроков",
"other_players": "Другие игроки",
"otomo_damage": "Урон от отомо",
"otomo_moves": "Навыки спутника",
"otomos": "Спутники",
"outline": "Обводка",
"outside": "Снаружи",
"part_health": "Здоровье части",
@@ -193,14 +278,12 @@
"part_name_label": "Метка имени части тела",
"percentage_label": "Метка процентов",
"performance": "Производительность",
"player_damage": "Урон игрока",
"player_id": "ИД игрока",
"player_name": "Имя игрока",
"player_name_label": "Метка имени игрока",
"player_name_size_limit": "Ограничить ширину имени игрока",
"player_spacing": "Расстояние между игроками",
"players": "Игроки",
"playing_quest": "Во время квеста",
"poison_damage": "Урон от отравления",
"poison": "Отравление",
"position": "Расположение",
"press_any_key": "Нажмите любую клавишу...",
"prioritize_large_monsters": "Большие монстры в приоритете",
@@ -210,45 +293,68 @@
"quest_start_animation": "Анимация начала квеста",
"quest_time": "Время квеста",
"rage": "Ярость",
"rampage_skills": "Навыки буйства",
"reframework_outdated": "Установленная версия REFramework устарела. Пожалуйста, обновитесь, иначе MHR Overlay будет работать некорректно.",
"relative_offset": "Относительный сдвиг",
"rename": "Переименовать",
"render_highlighted_monster": "Показывать помеченного монстра",
"render_inactive_anomaly_cores": "Показывать неактивные ядра аномалии",
"render_not_highlighted_monsters": "Показывать непомеченных монстров",
"renderer": "Рендерер",
"reset": "Сбросить",
"reversed_order": "Обратный порядок",
"reward_screen": "Экран наград",
"right_alignment_shift": "Сдвиг для выравнивания по правому краю",
"right_to_left": "Справа налево",
"servant_otomos": "Спутники последователей",
"servants": "Последователи",
"settings": "Настройки",
"severe_filter": "Отсечение",
"sever_anomaly_filter": "Отсечение + Ядро аномалии",
"sever_filter": "Отсечение",
"shadow": "Тень",
"show_my_otomos_separately": "Показывать моих спутников отдельно",
"show_other_player_otomos_separately": "Показывать спутников других игроков отдельно",
"show_servant_otomos_separately": "Показывать спутников последователей отдельно",
"size": "Размер",
"skills": "Навыки",
"small_monster_UI": "Интерфейс малых монстров",
"small_monsters": "Малые монстры",
"sorting": "Сортировка",
"spacing": "Расстояние между элементами",
"stamina": "Выносливость",
"stamina_label": "Метка выносливости",
"static_orientation": "Статичная ориентация",
"static_position": "Статичное расположение",
"static_sorting": "Статичная сортировка",
"static_spacing": "Статичное расстояние между элементами",
"statically_positioned": "Рассположенный статично",
"stats_UI": "Интерфейс статуса",
"status": "Статус",
"style": "Стиль",
"summary_screen": "Экран Результатов",
"summary_screen": "Экран результатов",
"text_label": "Текстовая метка",
"thickness": "Толщина",
"thunder_resistance_label": "Метка сопротивления грозе",
"time_UI": "Интерфейс времени",
"time_label": "Метка времени",
"time_limit": "Ограничение по времени",
"time_limit": "Ограничение по времени (cек.)",
"timer": "Таймер",
"timer_delays": "Задержка таймеров",
"timer_label": "Метка таймера",
"top_buildup": "Наибольшее накопление",
"top_damage": "Наибольший урон",
"top_dps": "Наибольший урон в секунду",
"top_left": "Левый верхний угол",
"top_right": "Правый верхний угол",
"top_to_bottom": "Сверху вниз",
"total": "Всего",
"total_buildup": "Общее накопление",
"total_buildup_label": "Метка общего накопления",
"total_buildup_value_label": "Метка значения общего накопления",
"total_cart_count_label": "Метка общего кол-ва смертей",
"total_damage": "Общий урон",
"total_damage_label": "Метка общего урона",
"total_damage_location": "Позиция общего урона",
"total_damage_offset_is_relative": "Относительный сдвиг общего урона",
"total_damage_value_label": "Метка значений общего урона",
"total_dps": "Общий урон в секунду",
@@ -256,21 +362,115 @@
"tracked_damage_types": "Отслеживаемые типы урона",
"tracked_monster_types": "Отслеживаемые типы монстров",
"type": "Тип",
"update_buffs_delay": "Обновление эффектов (cек.)",
"update_is_online_delay": "Обновление онлайн статуса (cек.)",
"update_myself_position_delay": "Обновление собственных координат (cек.)",
"update_player_info_delay": "Обновление информации об игроке (cек.)",
"update_players_delay": "Обновление списка игроков (cек.)",
"update_quest_time_delay": "Обновление продолжительности задания (cек.)",
"update_singletons_delay": "Обновление синглтонов (cек.)",
"update_window_size_delay": "Обновление размеров окна (cек.)",
"use_d2d_if_available": "Использовать Direct2D, если доступен",
"value": "Значение",
"value_label": "Метка значений",
"vertical": "Вертикально",
"viewport_offset": "Сдвиг в экранном пространстве",
"visible": "Включить",
"water_resistance_label": "Метка сопротивления воде",
"weapon_skills": "Навыки оружия",
"width": "Ширина",
"word_player": "Слово \"Игрок\"",
"world_offset": "Сдвиг в игровом пространстве",
"wyvern_riding_damage": "Урон от езды на виверне",
"wyvern_riding": "Езда на виверне",
"x": "X",
"y": "Y",
"z": "Z"
},
"font_name": "NotoSansKR-Bold.otf",
"dango_skills": {
"dango_adrenaline": "Данго-адреналин",
"dango_booster": "Данго-усилитель",
"dango_bulker": "Данго-пижон",
"dango_connector": "Данго-сцепщик",
"dango_defender": "Данго-защитник",
"dango_flyer": "Данго-пилот",
"dango_glutton": "Данго-обжора",
"dango_hunter": "Данго-охотник",
"dango_insurance": "Данго-страховщик",
"dango_insurance_defense_up": "Данго-страховщик: усил. защиты",
"super_recovery_dango": "Супервосстан. данго"
},
"endemic_life": {
"butterflame": "Огнебабочка",
"clothfly": "Тканебабочка",
"cutterfly": "Стрекоза-нож",
"gold_wirebug": "Золотой Протожук",
"peepersects": "Глазобабочки",
"red_lampsquid": "Крс. Лампокальм.",
"ruby_wirebug": "Рубиновый Протожук",
"stinkmink": "Пахучка",
"yellow_lampsquid": "Жлт. Лампокальм."
},
"font_name": "NotoSans-Bold.otf",
"item_buffs": {
"adamant_seed": "Адамант. зерно",
"armor_ammo": "Защитные снаряды",
"armorskin": "Бронир. кожа",
"dash_juice": "Сок бодрости",
"demon_ammo": "Демон. снаряды",
"demon_powder": "Демон. порошок",
"demondrug": "Демон. снадобье",
"gourmet_fish": "Вкусная рыба",
"hardshell_powder": "Пор. из скорлупы",
"immunizer": "Иммунатор",
"mega_armorskin": "Мегабронир. кожа",
"mega_demondrug": "Мегадемон. снад.",
"might_seed": "Зер. могущества"
},
"melody_effects": {
"affinity_up": "Усиление мастерства",
"attack_and_affinity_up": "Усиление атаки и мастерства",
"attack_and_defense_up": "Усиление атаки и защиты",
"attack_up": "Усиление атаки",
"blight_negated": "Снятие порчи",
"defense_up": "Усиление защиты",
"divine_protection": "Божественная защита",
"earplugs_l": "Наушники (L)",
"earplugs_s": "Наушники (S)",
"elemental_attack_boost": "Усиление атаки стихией",
"environment_damage_negated": "Отмена урона окружением",
"health_recovery_l": "Восст. здоровья (L)",
"health_recovery_s": "Восст. здоровья (S)",
"health_recovery_s_antidote": "Восст. здоровья (S) + по-ядие",
"health_regeneration": "Регенерация ",
"infernal_melody": "Песня яростного пламени",
"knockbacks_negated": "Нейтрализация сбив. с ног",
"self_improvement": "Самосовершенствование",
"sharpness_extension": "Увеличение остроты",
"sharpness_loss_reduced": "Замедление затупления",
"sharpness_regeneration": "Регенерация остроты",
"sonic_barrier": "Звуковой барьер",
"sonic_wave": "Звуковая волна",
"stamina_recovery_up": "Улучш. восст. выносливости",
"stamina_use_reduced": "Усиление выносливости",
"stun_negated": "Нейтрализация оглушения",
"tremors_negated": "Нейтрализация тряски",
"wind_pressure_negated": "Отмена давления ветра"
},
"misc_buffs": {
"attack_up": "Усиление атаки",
"defense_up": "Усиление защиты",
"immunity": "Устойчивость",
"natural_healing_up": "Естественное лечение",
"stamina_use_down": "Уменьшение расхода выносливости"
},
"otomo_moves": {
"go_fight_win": "Сражайся, побеждай",
"power_drum": "Барабан силы",
"rousing_roar": "Воодушевляющий рев",
"vase_of_vitality": "Ваза живучести"
},
"parts": {
"abdomen": "Брюхо",
"amatsu_unknown": "?",
"antenna": "Антернна",
"arms": "Передние лапы",
"arms_mud": "Передние лапы (в грязи)",
@@ -336,5 +536,170 @@
"wingclaw": "Крыло-коготь",
"wingclaws": "Крыло-коготь",
"wings": "Крылья"
},
"rampage_skills": {
"chameleos_soul": "Душа Хамелеоса",
"kushala_daora_soul": "Душа Кушалы Даоры"
},
"skills": {
"adrenaline_rush": "Прилив адреналина",
"affinity_sliding": "Мастерский подкат",
"agitator": "Подстрекатель",
"berserk": "Безумец",
"bladescale_hone": "Острая чешуя",
"blood_awakening": "Пробуждение крови",
"bloodlust": "Кровожадность",
"burst": "Выброс",
"coalescence": "Сращивание",
"counterstrike": "Контрудар",
"dereliction": "Упущение",
"dragon_conversion_elemental_attack_up": "Преобраз-е дракона: усил. эл. атаки",
"dragon_conversion_elemental_res_up": "Преобраз-е дракона: усил. сопротивл.",
"dragonheart": "Драконье сердце",
"embolden": "Воодушевление",
"frenzied_bloodlust": "Буйная кровожадность",
"furious": "Гнев",
"grinder_s": "Дробилка (S)",
"heaven_sent": "Божий посланник",
"hellfire_cloak": "Завеса ад. пламени",
"heroics": "Героизм",
"inspiration": "Вдохновение",
"intrepid_heart": "бесстрашное сердце",
"latent_power": "Скрытая энергия",
"maximum_might": "Макс. могущество",
"offensive_guard": "Агрессивная защита",
"partbreaker": "Рассекатель",
"peak_performance": "На высоте",
"powder_mantle_blue": "Порошковый покров (синий)",
"powder_mantle_red": "Порошковый покров (красный)",
"protective_polish": "Защитная полировка",
"resentment": "Презрение",
"resuscitate": "Оживление",
"spiribirds_call": "Зов Духоптицы",
"status_trigger": "Смена статуса",
"strife": "Борьба",
"wall_runner": "Бегун по стенам",
"wind_mantle": "Мантия ветра"
},
"stats": {
"affinity": "Мастерство",
"attack": "Атака",
"defense": "Защита",
"dragon": "Дракон",
"dragon_resistance": "Сопрот. дракону",
"fire": "Огонь",
"fire_resistance": "Сопрот. огню",
"ice": "Лед",
"ice_resistance": "Сопрот. льду",
"stamina": "Выносливость",
"thunder": "Гроза",
"thunder_resistance": "Сопрот. грозе",
"water": "Вода",
"water_resistance": "Сопрот. воде"
},
"unicode_glyph_ranges": [
32,
255,
256,
383,
1024,
1327,
7680,
7935,
8192,
8303,
65280,
65519,
0,
64255,
65072,
65103,
65280,
65519,
0
],
"weapon_skills": {
"bow": {
"arc_shot_affinity": "Выстрел дугой: мастерство",
"arc_shot_brace": "Выстрел дугой: сгруппир.",
"bolt_boost": "Усиление снарядов",
"herculean_draw": "Натяжение Геркулеса"
},
"charge_blade": {
"element_boost": "Усиление стихии",
"sword_boost_mode": "Режим усиления меча"
},
"dual_blades": {
"archdemon_mode": "Режим архидемона",
"ironshine_silk": "Блестящий шелк"
},
"great_sword": {
"power_sheathe": "Мощное убирание оружия"
},
"gunlance": {
"erupting_cannon": "Вулканическая пушка",
"ground_splitter": "Раскол земли"
},
"hammer": {
"impact_burst": "Взрыв от удара"
},
"heavy_bowgun": {
"counter_charger": "Заряженная контратака",
"overheat": "Перегрев",
"rising_moon": "Восходящая луна",
"setting_sun": "Заходящее солнце",
"wyvernsnipe_reload": "Перезарядка меткости виверны"
},
"hunting_horn": {
"bead_of_resonance": "Бусина резонанса",
"silkbind_shockwave": "Волна паутины",
"sonic_bloom": "Звуковой цветов"
},
"insect_glaive": {
"all_extracts_mix": "Смесь всех экстрактов",
"orange_extract": "Оранжевый экстракт",
"red_extract": "Красный экстракт",
"white_extract": "Белый экстракт"
},
"lance": {
"anchor_rage": "Опорный гнев",
"spiral_thrust": "Спиральный выпад",
"twin_wine": "Побеги-близнецы"
},
"light_bowgun": {
"fanning_maneuver": "Веерный маневр",
"wyvernblast_reload": "Перезарядка взрыва виверны"
},
"long_sword": {
"harvest_moon": "Луна урожая",
"iai_slash": "Удар на выхвате",
"soaring_kick": "Парящий удар ногой",
"spirit_gauge": "Шкала духа",
"spirit_gauge_autofill": "Самозаполнение шкалы духа"
},
"switch_axe": {
"amped_state": "Усил. состояние",
"axe_heavy_slam": "Топор: Неистовый удар",
"switch_charger": "Выкидной заряд"
},
"sword_and_shield": {
"destroyer_oil": "Масло уничтожения"
}
},
"weapons": {
"bow": "Лук",
"charge_blade": "Силовой клинок",
"dual_blades": "Два клинка",
"great_sword": "Двуручный меч",
"gunlance": "Копьепушка",
"hammer": "Молот",
"heavy_bowgun": "Тяжелое лукорудие",
"hunting_horn": "Охотничий рог",
"insect_glaive": "Глефа насекомых",
"lance": "Копье",
"light_bowgun": "Легкое лукорудие",
"long_sword": "Бастард",
"switch_axe": "Выкидной топор",
"sword_and_shield": "Меч и щит"
}
}

View File

@@ -3,11 +3,15 @@
"HP": "生命:",
"buildup": "积累值:",
"gold": "金冠",
"lv": "",
"mini": "小型",
"part_break": "Break",
"part_sever": "Sever",
"otomo": "随从",
"part_anomaly_core": "Anomaly Core",
"part_break": "部位破坏",
"part_sever": "部位切断",
"player": "玩家",
"rage": "愤怒值:",
"servant": "盟友",
"silver": "银冠",
"stamina": "耐力:",
"total_buildup": "总积累值",
@@ -15,30 +19,54 @@
},
"ailments": {
"blast": "爆破",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "异臭球",
"engulfed": "Engulfed",
"exhaust": "减气",
"fall_otomo_trap": "随从落穴陷阱",
"fall_trap": "落穴陷阱",
"falling_asleep": "Falling Asleep",
"fireblight": "火异常状态",
"flash": "闪光",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "冰异常状态",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "麻痹",
"poison": "中毒",
"quick_sand": "流沙",
"resistance_down": "Resistance Down",
"ride": "御龙",
"roar": "Roar",
"shock_otomo_trap": "随从麻痹陷阱",
"shock_trap": "麻痹陷阱",
"sleep": "睡眠",
"steel_fang": "双刃锁镰",
"stench": "Stench",
"stun": "昏厥",
"thunderblight": "雷异常状态",
"tranq_bomb": "捕获用麻醉球",
"waterblight": "水异常状态"
"tremor": "Tremor",
"waterblight": "水异常状态",
"webbed": "Webbed"
},
"customization_menu": {
"UI_font": "UI字体",
"UI_font_notice": "当更改字体时,请重新加载脚本!",
"abnormal_statuses": "Abnormal Statuses",
"activation_count": "激活次数",
"affinity_label": "Affinity Label",
"ailment_buildups": "状态异常积累值",
"ailment_name": "状态异常名",
"ailment_name_label": "状态异常标签",
@@ -46,23 +74,32 @@
"ailments": "状态异常",
"all_UI": "所有UI",
"anchor": "锚点",
"apply": "Apply",
"anomaly_cores": "Anomaly Cores",
"anomaly_filter": "Anomaly Core",
"anomaly_health": "Anomaly Core Health",
"anomaly_health_percentage": "Anomaly Core Health Percentage",
"apply": "应用",
"assign_new_key": "指定新按键",
"auto_highlight": "Auto-highlight",
"attack_label": "Attack Label",
"auto_highlight": "自动高亮",
"background": "背景",
"bar": "状态条",
"blast_damage": "爆破伤害",
"blast": "爆破",
"body_parts": "身体部位",
"bold": "粗体",
"bomb_damage": "炸弹伤害",
"bombs": "Bombs",
"bottom_left": "左下",
"bottom_right": "右下",
"bottom_to_top": "Bottom to Top",
"break_anomaly_filter": "Break + Anomaly Core",
"break_count": "破坏次数",
"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_filter": "破坏",
"break_health": "破坏值",
"break_health_percentage": "破坏值百分比",
"break_max_count": "最大破坏次数",
"break_sever_anomaly_filter": "Break + Sever + Anomaly Core",
"break_sever_filter": "破坏+切断",
"buff_UI": "Buff UI",
"buildup": "积累值",
"buildup_bar": "积累值条",
"buildup_bars_are_relative_to": "积累值条基于",
@@ -70,84 +107,119 @@
"buildup_percentage_label": "积累值百分比标签",
"buildup_value_label": "积累值标签",
"capture_line": "可捕捉线",
"cart_count": "Cart Count",
"cart_count_label": "Cart Count Label",
"center": "Center",
"closest": "Closest",
"cart_count": "猫车数",
"cart_count_label": "猫车数标签",
"center": "中央",
"closest": "最近的",
"color": "颜色",
"colors": "颜色",
"config": "设置",
"creature_name_label": "生物名标签",
"crown": "皇冠",
"crown_thresholds": "皇冠阈值",
"cutscene": "Cutscene",
"current_state": "当前阶段",
"current_time": "Current Time",
"current_value": "当前值",
"cutscene": "过场动画",
"damage": "伤害",
"damage_bar": "伤害条",
"damage_bars_are_relative_to": "伤害条基于",
"damage_meter_UI": "伤害统计UI",
"damage_percentage_label": "伤害百分比标签",
"damage_value_label": "伤害量标签",
"dango_skills": "Dango Skills",
"debug": "Debug",
"default_state": "默认阶段",
"defense_label": "Defense Label",
"delete": "删除",
"distance": "距离",
"dps": "DPS",
"dps_label": "DPS标签",
"dps_mode": "DPS模式",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "复制",
"duration": "持续时间",
"dynamic_positioning": "动态位置",
"dynamically_positioned": "动态位置",
"effect_level": "Effect Level",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "开启",
"enabled": "开启",
"endemic_life": "Endemic Life",
"endemic_life_UI": "环境生物UI",
"endemic_life_damage": "Endemic Life Damage",
"endemic_life_buffs": "Endemic Life Buffs",
"everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "字体",
"farthest": "Farthest",
"farthest": "最远",
"fight_time": "战斗时间",
"fill_direction": "Fill Direction",
"filter": "筛选器",
"filter_mode": "筛选方式",
"fire_resistance_label": "Fire Resistance Label",
"first": "第一",
"first_hit": "第一击",
"flinch_count": "胆怯次数",
"foreground": "前景",
"freeze_dps_on_quest_clear": "Freeze DPS when Quest is cleared",
"freeze_dps_on_quest_end": "任务结束时冻结DPS",
"global_position_modifier": "全局位置更改",
"global_scale_modifier": "全局比例更改",
"global_settings": "全局设定",
"health": "生命",
"health_break_filter": "Health + Break",
"health_break_severe_filter": "Health + Break + Severe",
"health_filter": "Health",
"health_anomaly_filter": "Health + Anomaly Core",
"health_break_anomaly_filter": "Health + Break + Anomaly Core",
"health_break_filter": "生命+破坏",
"health_break_sever_anomaly_filter": "Health + Break + Sever + Anomaly Core",
"health_break_sever_filter": "生命+破坏+切断",
"health_filter": "生命",
"health_label": "Health Label",
"health_percentage": "生命百分比",
"health_severe_filter": "Health + Severe",
"health_sever_anomaly_filter": "Health + Sever + Anomaly Core",
"health_sever_filter": "生命+切断",
"height": "高度",
"hide_ailments_with_zero_buildup": "当积累值为0时隐藏该状态异常",
"hide_all_active_ailments": "隐藏所有激活的状态异常",
"hide_all_inactive_ailments": "隐藏所有没有激活的状态异常",
"hide_bar_for_infinite_buffs": "隐藏无限Buff的状态条",
"hide_dead_or_captured": "隐藏死亡或被捕获的怪物",
"hide_disabled_ailments": "隐藏禁用的状态异常",
"hide_inactive_ailments_with_no_buildup_support": "隐藏无积累值的非激活状态异常",
"hide_inactive_creatures": "隐藏没有激活的生物",
"hide_module_if_total_damage_is_zero": "当总伤害为0时隐藏该模块",
"hide_myself": "Hide Myself",
"hide_other_players": "Hide Other Players",
"hide_myself": "隐藏我自己",
"hide_other_players": "隐藏其他玩家",
"hide_player_if_player_damage_is_zero": "当玩家伤害为0时隐藏该玩家",
"hide_total_damage": "Hide Total Damage",
"hide_servants": "隐藏盟友",
"hide_timer_for_infinite_buffs": "隐藏无限Buff的计时器",
"hide_total_damage": "隐藏总伤害",
"hide_total_if_total_damage_is_zero": "当总伤害为0时隐藏总伤害",
"hide_undamaged_parts": "隐藏没有受到伤害的部位",
"highest_health": "Highest Health",
"highest_health_percentage": "Highest Health Percentage",
"highlighted": "高亮(目标)",
"highest_health": "最高生命值",
"highest_health_percentage": "最高生命百分比",
"highlighted": "高亮",
"highlighted_bar": "高亮条",
"highlighted_buildup_bar": "高亮积累值条",
"highlighted_damage_bar": "高亮伤害条",
"highlighted_targeted": "高亮目标[锁定目标的UI]",
"history": "History",
"history_size": "History Size",
"horizontal": "水平",
"hotkeys": "热键",
"hunter_rank": "猎人等",
"hunter_rank": "猎人等",
"hunter_rank_label": "猎人等级标签",
"in_lobby": "In Lobby",
"in_training_area": "In Training Area",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID",
"in_lobby": "在大厅",
"in_training_area": "在修炼场",
"include": "包含",
"inside": "Inside",
"installation_damage": "设备伤害",
"infinite_buffs_location": "Infinite Buffs Location",
"inside": "里面",
"installations": "Installations",
"italic": "斜体",
"item_buffs": "Item Buffs",
"join_time": "加入时间",
"killcam": "Killcam",
"kunai_damage": "苦无伤害",
"killcam": "击杀镜头",
"kunai": "Kunai",
"language": "语言",
"large_monster_UI": "大型怪物UI",
"large_monster_dynamic_UI": "大型怪物浮动UI",
@@ -155,100 +227,134 @@
"large_monster_static_UI": "大型怪物固定UI",
"large_monsters": "大型怪物群",
"last": "最后",
"loading_quest": "Loading Quest",
"loss_health": "Sever Health",
"loss_health_percentage": "Sever Health Percentage",
"lowest_health": "Lowest Health",
"lowest_health_percentage": "Lowest Health Percentage",
"master_rank": "Master Rank",
"left_to_right": "Left to Right",
"level": "等级",
"level_label": "等级标签",
"loading_quest": "任务加载中",
"loss_health": "切断值",
"loss_health_percentage": "切断值百分比",
"lowest_health": "最低生命值",
"lowest_health_percentage": "最低生命百分比",
"master_rank": "大师等级",
"max_distance": "最大距离",
"max_monster_updates_per_tick": "每次更新的最大怪物数量",
"max_value": "最大值",
"me": "我",
"melody_effects": "Melody Effects",
"menu_font": "菜单字体",
"menu_font_change_disclaimer": "Changing Language and Menu Font Size several times will cause a crash!",
"menu_font_change_disclaimer": "多次改变字体或语言会导致崩溃!",
"misc_buffs": "Misc Buffs",
"mod_name": "MHR Overlay",
"mode": "Mode",
"mode": "模式",
"modifiers": "更改项",
"module_visibility_based_on_game_state": "Module Visibility based on Game State",
"module_visibility_based_on_game_state": "基于游戏状态的模组可视化设置",
"modules": "模块",
"monster_can_be_captured": "可捕获的怪物",
"monster_damage": "怪物伤害",
"monster_id": "Monster ID",
"monster_id": "怪物ID",
"monster_name": "怪物名",
"monster_name_label": "怪物名标签",
"monsters": "Monsters",
"my_damage_bar_location": "我的伤害条位置",
"my_otomos": "我的随从",
"myself": "我自己",
"name": "名称",
"name_label": "名字标签",
"new": "新建",
"none": "空",
"normal": "正常",
"offset": "偏移",
"offset_is_relative_to_parts": "根据部位偏移",
"opacity_falloff": "透明度增加",
"orientation": "方向",
"other_damage": "Other Damage",
"other": "Other",
"other_player_otomos": "其他玩家的随从",
"other_players": "其他玩家",
"otomo_damage": "随从伤害",
"outline": "Outline",
"outside": "Outside",
"part_health": "Part Health",
"otomo_moves": "Buddy Moves",
"otomos": "Buddies",
"outline": "轮廓",
"outside": "外面",
"part_health": "部位生命值",
"part_name": "部位名",
"part_name_label": "部位名标签",
"percentage_label": "百分比标签",
"performance": "性能",
"player_damage": "玩家伤害",
"player_id": "玩家ID",
"player_name": "玩家名",
"player_name_label": "玩家名标签",
"player_name_size_limit": "Player Name Size Limit",
"player_name_size_limit": "玩家名长度限制",
"player_spacing": "玩家间距",
"playing_quest": "Playing Quest",
"poison_damage": "中毒伤害",
"players": "Players",
"playing_quest": "操作界面/正常游玩时",
"poison": "中毒",
"position": "位置",
"press_any_key": "按任意键...",
"prioritize_large_monsters": "大型怪物优先",
"quest_end_animation": "Quest End Animation",
"quest_end_screen": "Quest End Screen",
"quest_end_timer": "Quest End Timer",
"quest_start_animation": "Quest Start Animation",
"quest_end_animation": "任务结束动画",
"quest_end_screen": "任务结束界面",
"quest_end_timer": "任务结束计时器",
"quest_start_animation": "任务开始动画",
"quest_time": "任务时间",
"rage": "愤怒",
"reframework_outdated": "Installed REFramework version is outdated. Please, update. Otherwise, MHR Overlay won't work correctly.",
"rampage_skills": "Rampage Skills",
"reframework_outdated": "已安装的REFramework版本过低请更新。否则MHR Overlay不能正常工作。",
"relative_offset": "相对偏移",
"rename": "重命名",
"render_highlighted_monster": "渲染高亮怪物",
"render_inactive_anomaly_cores": "Render Inactive Anomaly Cores",
"render_not_highlighted_monsters": "渲染非高亮怪物",
"renderer": "渲染器",
"reset": "重置",
"reversed_order": "逆向排序",
"reward_screen": "Reward Screen",
"reward_screen": "奖励界面",
"right_alignment_shift": "Right Alignment Shift",
"right_to_left": "Right to Left",
"servant_otomos": "盟友随从",
"servants": "盟友",
"settings": "设定",
"severe_filter": "Severe",
"sever_anomaly_filter": "Sever + Anomaly Core",
"sever_filter": "切断",
"shadow": "阴影",
"show_my_otomos_separately": "分开显示我的随从",
"show_other_player_otomos_separately": "分开显示其他玩家的随从",
"show_servant_otomos_separately": "分开显示盟友的随从",
"size": "大小",
"skills": "Skills",
"small_monster_UI": "小型怪物UI",
"small_monsters": "小型怪物群",
"sorting": "排序方式",
"spacing": "间距",
"stamina": "耐力",
"stamina_label": "Stamina Label",
"static_orientation": "固定方向",
"static_position": "固定位置",
"static_sorting": "固定排序",
"static_spacing": "固定间距",
"statically_positioned": "固定位置",
"stats_UI": "Stats UI",
"status": "状态",
"style": "Style",
"summary_screen": "Summary Screen",
"style": "样式",
"summary_screen": "总结界面",
"text_label": "文字标签",
"thickness": "Thickness",
"thickness": "粗细度",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "时间UI",
"time_label": "时间标签",
"time_limit": "时间限制(秒)",
"timer": "计时器",
"timer_delays": "Timer Delays",
"timer_label": "计时器标签",
"top_buildup": "最高积累值",
"top_damage": "最高伤害",
"top_damage": "Top Damage",
"top_dps": "最高DPS",
"top_left": "左上",
"top_right": "右上",
"top_to_bottom": "Top to Bottom",
"total": "总计",
"total_buildup": "总积累值",
"total_buildup_label": "总积累值标签",
"total_buildup_value_label": "总积累值标签",
"total_cart_count_label": "总猫车数标签",
"total_damage": "总伤害",
"total_damage_label": "总伤害标签",
"total_damage_location": "总伤害条位置",
"total_damage_offset_is_relative": "总伤害相对偏移",
"total_damage_value_label": "总伤害量标签",
"total_dps": "总DPS",
@@ -256,85 +362,344 @@
"tracked_damage_types": "跟踪的伤害类型",
"tracked_monster_types": "跟踪的怪物类型",
"type": "类型",
"update_buffs_delay": "Update Buffs (seconds)",
"update_is_online_delay": "Update Is Online (seconds)",
"update_myself_position_delay": "Update Myself Position (seconds)",
"update_player_info_delay": "Update Player Info (seconds)",
"update_players_delay": "Update Players (seconds)",
"update_quest_time_delay": "Update Quest Time (seconds)",
"update_singletons_delay": "Update Singletons (seconds)",
"update_window_size_delay": "Update Window Size (seconds)",
"use_d2d_if_available": "可用时使用Direct2D",
"value": "Value",
"value_label": "数字",
"vertical": "垂直",
"viewport_offset": "窗口偏移",
"visible": "可见",
"water_resistance_label": "Water Resistance Label",
"weapon_skills": "Weapon Skills",
"width": "宽度",
"word_player": "名称 \"玩家\"",
"world_offset": "整体偏移",
"wyvern_riding_damage": "Wyvern Riding Damage",
"wyvern_riding": "Wyvern Riding",
"x": "X轴",
"y": "Y轴",
"z": "Z轴"
},
"dango_skills": {
"dango_adrenaline": "Dango Adrenaline",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_hunter": "Dango Hunter",
"dango_insurance": "Dango Insurance",
"dango_insurance_defense_up": "Dango Insurance Defense Up",
"super_recovery_dango": "Super Recovery Dango"
},
"endemic_life": {
"butterflame": "Butterflame",
"clothfly": "Clothfly",
"cutterfly": "Cutterfly",
"gold_wirebug": "Gold Wirebug",
"peepersects": "Peepersects",
"red_lampsquid": "Red Lampsquid",
"ruby_wirebug": "Ruby Wirebug",
"stinkmink": "Stinkmink",
"yellow_lampsquid": "Yellow Lampsquid"
},
"font_name": "NotoSansSC-Bold.otf",
"item_buffs": {
"adamant_seed": "Adamant Seed",
"armor_ammo": "Armor Ammo",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_ammo": "Demon Ammo",
"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"
},
"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_up": "Defense Up",
"immunity": "Immunity",
"natural_healing_up": "Natural Healing Up",
"stamina_use_down": "Stamina Use Down"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar",
"vase_of_vitality": "Vase of Vitality"
},
"parts": {
"abdomen": "腹部",
"antenna": "Antenna",
"amatsu_unknown": "?",
"antenna": "触角",
"arms": "手臂",
"arms_mud": "Arms (Mud)",
"arms_mud": "手臂(泥)",
"back": "背部",
"back_windsac": "背部(风袋)",
"body": "本体",
"body_mud": "Body (Mud)",
"body_mud": "身体(泥)",
"carapace": "甲壳",
"chest": "Chest",
"chest": "胸部",
"chest_windsac": "胸部(风袋)",
"claw": "爪",
"crest": "Crest",
"crest": "头冠",
"dorsal_fin": "背鳍",
"foreleg": "Foreleg",
"forelegs": "Forelegs",
"foreleg": "前腿",
"forelegs": "前腿",
"head": "头部",
"head_mud": "头部(泥)",
"hind_leg": "Hind Leg",
"hind_legs": "Hind Legs",
"hind_leg": "后腿",
"hind_legs": "后腿",
"large_mudbulb": "大泥球",
"left_arm": "左臂",
"left_arm_ice": "左臂(冰)",
"left_claw": "Left Claw",
"left_claw": "左爪",
"left_cutwing": "左刃翼",
"left_foreleg": "Foreleg L",
"left_hind_leg": "Hind Leg L",
"left_foreleg": "左前腿",
"left_hind_leg": "左后腿",
"left_leg": "左腿",
"left_leg_mud": "Leg L (Mud)",
"left_legs": "左腿",
"left_leg_mud": "左腿(泥)",
"left_legs": "左腿",
"left_wing": "左翼",
"left_wingclaw": "Wingclaw L",
"left_wingclaw": "左翼爪",
"legs": "四肢",
"lower_back": "下背部",
"lower_body": "下半身",
"mane": "鬃毛",
"mudbulb": "Mudbulb",
"mudbulb": "泥球",
"neck": "颈部",
"rear": "臀部",
"right_arm": "右臂",
"right_arm_ice": "右臂(冰)",
"right_claw": "Right Claw",
"right_claw": "右爪",
"right_cutwing": "右刃翼",
"right_foreleg": "Foreleg R",
"right_hind_leg": "Hind Leg R",
"right_foreleg": "右前腿",
"right_hind_leg": "右后腿",
"right_leg": "右腿",
"right_leg_mud": "Leg R (Mud)",
"right_legs": "右腿",
"right_leg_mud": "右腿(泥)",
"right_legs": "右腿",
"right_wing": "右翼",
"right_wingclaw": "Wingclaw R",
"right_wingclaw": "右翼爪",
"rock": "岩石",
"shell": "Shell",
"shell": "",
"spinning": "旋转中",
"tail": "尾巴",
"tail_mud": "尾巴(泥)",
"tail_tip": "Tail Tip",
"tail_tip": "尾尖",
"tail_windsac": "尾巴(风袋)",
"thundersacs": "Thundersacs",
"thundersacs": "雷袋",
"torso": "躯干",
"torso_mud": "Torso (Mud)",
"unknown": "?",
"upper_back": "上背",
"torso_mud": "躯干(泥)",
"unknown": "未知【等待更新】",
"upper_back": "上背",
"upper_body": "上半身",
"wingclaw": "Wingclaw",
"wingclaws": "Wingclaws",
"wingclaw": "翼爪",
"wingclaws": "翼爪",
"wings": "翼"
},
"rampage_skills": {
"chameleos_soul": "Chameleos Soul",
"kushala_daora_soul": "Kushala Daora Soul"
},
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"berserk": "Berserk",
"bladescale_hone": "Bladescale Hone",
"blood_awakening": "Blood Awakening",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragon_conversion_elemental_attack_up": "Dragon Conversion: Elem. Atk Up",
"dragon_conversion_elemental_res_up": "Dragon Conversion: Elem. Res Up",
"dragonheart": "Dragonheart",
"embolden": "Embolden",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"inspiration": "Inspiration",
"intrepid_heart": "Intrepid Heart",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"partbreaker": "Partbreaker",
"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",
"strife": "Strife",
"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,
11904,
12031,
12288,
12351,
12800,
19903,
19968,
40959,
63744,
64255,
65072,
65103,
65280,
65519,
0
],
"weapon_skills": {
"bow": {
"arc_shot_affinity": "Arc Shot: Affinity",
"arc_shot_brace": "Arc Shot: Brace",
"bolt_boost": "Bolt Boost",
"herculean_draw": "Herculean Draw"
},
"charge_blade": {
"element_boost": "Element Boost",
"sword_boost_mode": "Sword Boost Mode"
},
"dual_blades": {
"archdemon_mode": "Archdemon Mode",
"ironshine_silk": "Ironshine Silk"
},
"great_sword": {
"power_sheathe": "Power Sheathe"
},
"gunlance": {
"erupting_cannon": "Erupting Cannon",
"ground_splitter": "Ground Splitter"
},
"hammer": {
"impact_burst": "Impact Burst"
},
"heavy_bowgun": {
"counter_charger": "Counter Charger",
"overheat": "Overheat",
"rising_moon": "Rising Moon",
"setting_sun": "Setting Sun",
"wyvernsnipe_reload": "Wyvernsnipe Reload"
},
"hunting_horn": {
"bead_of_resonance": "Bead of Resonance",
"silkbind_shockwave": "Silkbind Shockwave",
"sonic_bloom": "Sonic Bloom"
},
"insect_glaive": {
"all_extracts_mix": "All Extracts Mix",
"orange_extract": "Orange Extract",
"red_extract": "Red Extract",
"white_extract": "White Extract"
},
"lance": {
"anchor_rage": "Anchor Rage",
"spiral_thrust": "Spiral Thrust",
"twin_wine": "Twin Wine"
},
"light_bowgun": {
"fanning_maneuver": "Fanning Maneuver",
"wyvernblast_reload": "Wyvernblast Reload"
},
"long_sword": {
"harvest_moon": "Harvest Moon",
"iai_slash": "Iai Slash",
"soaring_kick": "Soaring Kick",
"spirit_gauge": "Spirit Gauge",
"spirit_gauge_autofill": "Spirit Gauge Autofill"
},
"switch_axe": {
"amped_state": "Amped State",
"axe_heavy_slam": "Axe: Heavy Slam",
"switch_charger": "Switch Charger"
},
"sword_and_shield": {
"destroyer_oil": "Destroyer Oil"
}
},
"weapons": {
"bow": "Bow",
"charge_blade": "Charge Blade",
"dual_blades": "Dual Blades",
"great_sword": "Great Sword",
"gunlance": "Gunlance",
"hammer": "Hammer",
"heavy_bowgun": "Heavy Bowgun",
"hunting_horn": "Hunting Horn",
"insect_glaive": "Insect Glaive",
"lance": "Lance",
"light_bowgun": "Light Bowgun",
"long_sword": "Long Sword",
"switch_axe": "Switch Axe",
"sword_and_shield": "Sword & Shield"
}
}

View File

@@ -3,11 +3,15 @@
"HP": "生命:",
"buildup": "累積值:",
"gold": "金冠",
"lv": "",
"mini": "小型",
"otomo": "Buddy",
"part_anomaly_core": "Anomaly Core",
"part_break": "Break",
"part_sever": "Sever",
"player": "玩家",
"rage": "憤怒值:",
"servant": "Follower",
"silver": "銀冠",
"stamina": "耐力:",
"total_buildup": "總累積值",
@@ -15,30 +19,54 @@
},
"ailments": {
"blast": "爆破",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "異臭",
"engulfed": "Engulfed",
"exhaust": "疲勞",
"fall_otomo_trap": "隨從地洞陷阱",
"fall_trap": "地洞陷阱",
"falling_asleep": "Falling Asleep",
"fireblight": "火屬性異常",
"flash": "失明",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "冰屬性異常",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "麻痺",
"poison": "毒",
"quick_sand": "流沙",
"resistance_down": "Resistance Down",
"ride": "操龍",
"roar": "Roar",
"shock_otomo_trap": "隨從麻痺陷阱",
"shock_trap": "麻痺陷阱",
"sleep": "睡眠",
"steel_fang": "獵犬鋼牙",
"stench": "Stench",
"stun": "暈眩",
"thunderblight": "雷屬性異常",
"tranq_bomb": "麻醉",
"waterblight": "水屬性異常"
"tremor": "Tremor",
"waterblight": "水屬性異常",
"webbed": "Webbed"
},
"customization_menu": {
"UI_font": "UI 字型",
"UI_font_notice": "當更改文字時,請重新載入",
"abnormal_statuses": "Abnormal Statuses",
"activation_count": "觸發次數",
"affinity_label": "Affinity Label",
"ailment_buildups": "異常狀態累積值",
"ailment_name": "異常狀態",
"ailment_name_label": "異常狀態名稱",
@@ -46,23 +74,32 @@
"ailments": "異常狀態",
"all_UI": "全部UI",
"anchor": "錨點",
"anomaly_cores": "Anomaly Cores",
"anomaly_filter": "Anomaly Core",
"anomaly_health": "Anomaly Core Health",
"anomaly_health_percentage": "Anomaly Core Health Percentage",
"apply": "套用",
"assign_new_key": "指定新按鍵",
"attack_label": "Attack Label",
"auto_highlight": "自動高亮",
"background": "圖形化顯示條的背景底色",
"bar": "圖形化顯示條",
"blast_damage": "爆破傷害",
"blast": "爆破",
"body_parts": "身體部位",
"bold": "粗體",
"bomb_damage": "爆炸傷害",
"bombs": "Bombs",
"bottom_left": "左下",
"bottom_right": "右下",
"bottom_to_top": "Bottom to Top",
"break_anomaly_filter": "Break + Anomaly Core",
"break_count": "破壞次數",
"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",
"buildup": "累積值",
"buildup_bar": "累積值條",
"buildup_bars_are_relative_to": "累積值條顯示位置調整",
@@ -76,9 +113,13 @@
"closest": "最近的",
"color": "調色盤",
"colors": "調色盤",
"config": "Config",
"creature_name_label": "環境生物名稱",
"crown": "皇冠",
"crown_thresholds": "皇冠的大小判定範圍",
"current_state": "Current State",
"current_time": "Current Time",
"current_value": "Current Value",
"cutscene": "Cutscene",
"damage": "傷害",
"damage_bar": "傷害條",
@@ -86,38 +127,60 @@
"damage_meter_UI": "傷害量計算 UI",
"damage_percentage_label": "傷害量百分比",
"damage_value_label": "傷害量",
"dango_skills": "Dango Skills",
"debug": "Debug",
"default_state": "Default State",
"defense_label": "Defense Label",
"delete": "Delete",
"distance": "距離",
"dps": "DPS",
"dps_label": "DPS文字",
"dps_mode": "DPS模式",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "Duplicate",
"duration": "Duration",
"dynamic_positioning": "浮動的資訊位置",
"dynamically_positioned": "浮動的魔物資訊",
"effect_level": "Effect Level",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "啟用對象",
"enabled": "啟用",
"endemic_life": "Endemic Life",
"endemic_life_UI": "環境生物 UI",
"endemic_life_damage": "環境生物傷害",
"endemic_life_buffs": "Endemic Life Buffs",
"everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "字體",
"farthest": "最遠的",
"fight_time": "戰鬥時間",
"fill_direction": "Fill Direction",
"filter": "篩選器",
"filter_mode": "Filter Mode",
"fire_resistance_label": "Fire Resistance Label",
"first": "第一",
"first_hit": "第一擊",
"flinch_count": "膽怯次數",
"foreground": "圖形化顯示條的底色",
"freeze_dps_on_quest_clear": "當任務結束時凍結DPS",
"freeze_dps_on_quest_end": "Freeze DPS on Quest End",
"global_position_modifier": "全域位置更改",
"global_scale_modifier": "全域比例更改",
"global_settings": "全域設定",
"health": "血量",
"health_anomaly_filter": "Health + Anomaly Core",
"health_break_anomaly_filter": "Health + Break + Anomaly Core",
"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_label": "Health Label",
"health_percentage": "血量百分比",
"health_severe_filter": "Health + Severe",
"health_sever_anomaly_filter": "Health + Sever + Anomaly Core",
"health_sever_filter": "Health + Sever",
"height": "高度",
"hide_ailments_with_zero_buildup": "當累積值為0時,隱藏該異常狀態",
"hide_all_active_ailments": "隱藏觸發中的異常狀態",
"hide_all_inactive_ailments": "隱藏尚未被觸發的異常狀態",
"hide_bar_for_infinite_buffs": "Hide Bar for infinite Buffs",
"hide_dead_or_captured": "隱藏死亡或被捕獲的魔物",
"hide_disabled_ailments": "隱藏並停用所有異常狀態",
"hide_inactive_ailments_with_no_buildup_support": "隱藏無累積值的非觸發下異常狀態",
@@ -126,28 +189,37 @@
"hide_myself": "隱藏自己",
"hide_other_players": "隱藏其他玩家",
"hide_player_if_player_damage_is_zero": "當玩家傷害為0時,隱藏玩家傷害",
"hide_servants": "Hide Followers",
"hide_timer_for_infinite_buffs": "Hide Timer for infinite Buffs",
"hide_total_damage": "隱藏總傷害",
"hide_total_if_total_damage_is_zero": "當總傷害為0時,隱藏總傷害",
"hide_undamaged_parts": "隱藏沒受到傷害的部位",
"highest_health": "最高血量",
"highest_health_percentage": "最高血量百分比",
"highlighted": "鎖定的魔物資訊(目標)",
"highlighted": "鎖定的魔物資訊",
"highlighted_bar": "重點條",
"highlighted_buildup_bar": "重點累積條",
"highlighted_damage_bar": "重點傷害條",
"highlighted_targeted": "鎖定的魔物資訊(目標)",
"history": "History",
"history_size": "History Size",
"horizontal": "水平",
"hotkeys": "快捷鍵",
"hunter_rank": "獵人等級",
"hunter_rank_label": "獵人等級",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID",
"in_lobby": "In Lobby",
"in_training_area": "In Training Area",
"include": "細部資訊調整",
"infinite_buffs_location": "Infinite Buffs Location",
"inside": "內部",
"installation_damage": "設備傷害",
"installations": "Installations",
"italic": "斜體",
"item_buffs": "Item Buffs",
"join_time": "加入時間",
"killcam": "Killcam",
"kunai_damage": "苦無傷害",
"kunai": "Kunai",
"language": "語言",
"large_monster_UI": "大型魔物 UI",
"large_monster_dynamic_UI": "大型魔物浮動 UI",
@@ -155,6 +227,9 @@
"large_monster_static_UI": "大型魔物固定 UI",
"large_monsters": "大型魔物群",
"last": "最後",
"left_to_right": "Left to Right",
"level": "Level",
"level_label": "Level Label",
"loading_quest": "Loading Quest",
"loss_health": "Sever Health",
"loss_health_percentage": "Sever Health Percentage",
@@ -163,29 +238,39 @@
"master_rank": "大師等級",
"max_distance": "最大距離",
"max_monster_updates_per_tick": "每次更新的最大魔物數量",
"max_value": "Max Value",
"me": "我",
"melody_effects": "Melody Effects",
"menu_font": "選單字體大小",
"menu_font_change_disclaimer": "重複變更語言和選單字型大小有可能會當機!",
"misc_buffs": "Misc Buffs",
"mod_name": "MHR Overlay",
"mode": "Mode",
"modifiers": "更改項",
"module_visibility_based_on_game_state": "Module Visibility based on Game State",
"modules": "模組",
"monster_can_be_captured": "可捕獲的魔物",
"monster_damage": "魔物傷害",
"monster_id": "Monster ID",
"monster_name": "魔物名稱",
"monster_name_label": "魔物名稱",
"monsters": "Monsters",
"my_damage_bar_location": "我的傷害條",
"my_otomos": "My Buddies",
"myself": "Myself",
"name": "Name",
"name_label": "Name Label",
"new": "New",
"none": "空",
"normal": "正常",
"offset": "位置",
"offset_is_relative_to_parts": "與部位顯示相對偏移",
"opacity_falloff": "透明度提高",
"orientation": "對齊方式",
"other_damage": "其他傷害",
"other": "Other",
"other_player_otomos": "Other Player Buddies",
"other_players": "其他玩家",
"otomo_damage": "隨從傷害",
"otomo_moves": "Buddy Moves",
"otomos": "Buddies",
"outline": "描邊",
"outside": "外部",
"part_health": "部位血量",
@@ -193,14 +278,12 @@
"part_name_label": "部位名稱",
"percentage_label": "百分比",
"performance": "效能",
"player_damage": "玩家傷害量",
"player_id": "玩家ID",
"player_name": "玩家名稱",
"player_name_label": "玩家名稱",
"player_name_size_limit": "玩家名稱大小限制",
"player_spacing": "玩家間格",
"players": "Players",
"playing_quest": "Playing Quest",
"poison_damage": "毒傷害",
"poison": "毒",
"position": "位置",
"press_any_key": "輸入任意鍵...",
"prioritize_large_monsters": "大型魔物優先",
@@ -210,45 +293,68 @@
"quest_start_animation": "Quest Start Animation",
"quest_time": "任務時間",
"rage": "憤怒度",
"rampage_skills": "Rampage Skills",
"reframework_outdated": "已安裝的 REFramework 版本已過期. 麻煩請更新版本, 否則 MHR Overlay 無法正確作用.",
"relative_offset": "相對偏移",
"rename": "Rename",
"render_highlighted_monster": "渲染目標魔物",
"render_inactive_anomaly_cores": "Render Inactive Anomaly Cores",
"render_not_highlighted_monsters": "渲染非目標魔物",
"renderer": "Renderer",
"reset": "Reset",
"reversed_order": "反向排序",
"reward_screen": "Reward Screen",
"right_alignment_shift": "Right Alignment Shift",
"right_to_left": "Right to Left",
"servant_otomos": "Servant Buddies",
"servants": "Followers",
"settings": "設定",
"severe_filter": "Severe",
"sever_anomaly_filter": "Sever + Anomaly Core",
"sever_filter": "Sever",
"shadow": "陰影",
"show_my_otomos_separately": "Show my Buddies separately",
"show_other_player_otomos_separately": "Show Other Player Buddies separately",
"show_servant_otomos_separately": "Show Follower Buddies separately",
"size": "大小",
"skills": "Skills",
"small_monster_UI": "小型魔物 UI",
"small_monsters": "小型魔物群",
"sorting": "排序方式",
"spacing": "間距",
"stamina": "耐力",
"stamina_label": "Stamina Label",
"static_orientation": "固定魔物資訊的對齊方式",
"static_position": "固定魔物資訊的位置",
"static_sorting": "固定魔物資訊的排序",
"static_spacing": "固定魔物資訊的間距",
"statically_positioned": "固定的魔物資訊",
"stats_UI": "Stats UI",
"status": "狀態",
"style": "樣式",
"summary_screen": "Summary Screen",
"text_label": "文字",
"thickness": "粗細",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "時間 UI",
"time_label": "時間",
"time_limit": "時限 (秒)",
"timer": "Timer",
"timer_delays": "Timer Delays",
"timer_label": "計時器",
"top_buildup": "最高累積值",
"top_damage": "最高傷害",
"top_dps": "最高 DPS",
"top_left": "左上",
"top_right": "右上",
"top_to_bottom": "Top to Bottom",
"total": "Total",
"total_buildup": "總累積值",
"total_buildup_label": "總累積值文字",
"total_buildup_value_label": "總累積值數值文字",
"total_cart_count_label": "Total Cart Count Label",
"total_damage": "總傷害",
"total_damage_label": "總傷害文字",
"total_damage_location": "Total Damage Bar Location",
"total_damage_offset_is_relative": "總傷害顯示位置調整",
"total_damage_value_label": "總傷害量",
"total_dps": "全體DPS",
@@ -256,21 +362,115 @@
"tracked_damage_types": "追蹤的傷害類型",
"tracked_monster_types": "追蹤的魔物類型",
"type": "類型",
"update_buffs_delay": "Update Buffs (seconds)",
"update_is_online_delay": "Update Is Online (seconds)",
"update_myself_position_delay": "Update Myself Position (seconds)",
"update_player_info_delay": "Update Player Info (seconds)",
"update_players_delay": "Update Players (seconds)",
"update_quest_time_delay": "Update Quest Time (seconds)",
"update_singletons_delay": "Update Singletons (seconds)",
"update_window_size_delay": "Update Window Size (seconds)",
"use_d2d_if_available": "Use Direct2D if available",
"value": "Value",
"value_label": "數字",
"vertical": "垂直",
"viewport_offset": "視窗的位置",
"visible": "可見",
"water_resistance_label": "Water Resistance Label",
"weapon_skills": "Weapon Skills",
"width": "寬度",
"word_player": "名稱 \"玩家\"",
"world_offset": "地圖中的位置",
"wyvern_riding_damage": "操龍傷害",
"wyvern_riding": "Wyvern Riding",
"x": "X軸",
"y": "Y軸",
"z": "Z軸"
},
"dango_skills": {
"dango_adrenaline": "Dango Adrenaline",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_hunter": "Dango Hunter",
"dango_insurance": "Dango Insurance",
"dango_insurance_defense_up": "Dango Insurance Defense Up",
"super_recovery_dango": "Super Recovery Dango"
},
"endemic_life": {
"butterflame": "Butterflame",
"clothfly": "Clothfly",
"cutterfly": "Cutterfly",
"gold_wirebug": "Gold Wirebug",
"peepersects": "Peepersects",
"red_lampsquid": "Red Lampsquid",
"ruby_wirebug": "Ruby Wirebug",
"stinkmink": "Stinkmink",
"yellow_lampsquid": "Yellow Lampsquid"
},
"font_name": "NotoSansTC-Bold.otf",
"item_buffs": {
"adamant_seed": "Adamant Seed",
"armor_ammo": "Armor Ammo",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_ammo": "Demon Ammo",
"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"
},
"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_up": "Defense Up",
"immunity": "Immunity",
"natural_healing_up": "Natural Healing Up",
"stamina_use_down": "Stamina Use Down"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar",
"vase_of_vitality": "Vase of Vitality"
},
"parts": {
"abdomen": "腹部",
"amatsu_unknown": "?",
"antenna": "觸角",
"arms": "手臂",
"arms_mud": "手臂 (泥)",
@@ -336,5 +536,170 @@
"wingclaw": "翼爪",
"wingclaws": "翼爪",
"wings": "翅膀"
},
"rampage_skills": {
"chameleos_soul": "Chameleos Soul",
"kushala_daora_soul": "Kushala Daora Soul"
},
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"berserk": "Berserk",
"bladescale_hone": "Bladescale Hone",
"blood_awakening": "Blood Awakening",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragon_conversion_elemental_attack_up": "Dragon Conversion: Elem. Atk Up",
"dragon_conversion_elemental_res_up": "Dragon Conversion: Elem. Res Up",
"dragonheart": "Dragonheart",
"embolden": "Embolden",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"inspiration": "Inspiration",
"intrepid_heart": "Intrepid Heart",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"partbreaker": "Partbreaker",
"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",
"strife": "Strife",
"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,
11904,
12031,
12288,
12351,
12800,
19903,
19968,
40959,
63744,
64255,
65072,
65103,
65280,
65519,
0
],
"weapon_skills": {
"bow": {
"arc_shot_affinity": "Arc Shot: Affinity",
"arc_shot_brace": "Arc Shot: Brace",
"bolt_boost": "Bolt Boost",
"herculean_draw": "Herculean Draw"
},
"charge_blade": {
"element_boost": "Element Boost",
"sword_boost_mode": "Sword Boost Mode"
},
"dual_blades": {
"archdemon_mode": "Archdemon Mode",
"ironshine_silk": "Ironshine Silk"
},
"great_sword": {
"power_sheathe": "Power Sheathe"
},
"gunlance": {
"erupting_cannon": "Erupting Cannon",
"ground_splitter": "Ground Splitter"
},
"hammer": {
"impact_burst": "Impact Burst"
},
"heavy_bowgun": {
"counter_charger": "Counter Charger",
"overheat": "Overheat",
"rising_moon": "Rising Moon",
"setting_sun": "Setting Sun",
"wyvernsnipe_reload": "Wyvernsnipe Reload"
},
"hunting_horn": {
"bead_of_resonance": "Bead of Resonance",
"silkbind_shockwave": "Silkbind Shockwave",
"sonic_bloom": "Sonic Bloom"
},
"insect_glaive": {
"all_extracts_mix": "All Extracts Mix",
"orange_extract": "Orange Extract",
"red_extract": "Red Extract",
"white_extract": "White Extract"
},
"lance": {
"anchor_rage": "Anchor Rage",
"spiral_thrust": "Spiral Thrust",
"twin_wine": "Twin Wine"
},
"light_bowgun": {
"fanning_maneuver": "Fanning Maneuver",
"wyvernblast_reload": "Wyvernblast Reload"
},
"long_sword": {
"harvest_moon": "Harvest Moon",
"iai_slash": "Iai Slash",
"soaring_kick": "Soaring Kick",
"spirit_gauge": "Spirit Gauge",
"spirit_gauge_autofill": "Spirit Gauge Autofill"
},
"switch_axe": {
"amped_state": "Amped State",
"axe_heavy_slam": "Axe: Heavy Slam",
"switch_charger": "Switch Charger"
},
"sword_and_shield": {
"destroyer_oil": "Destroyer Oil"
}
},
"weapons": {
"bow": "Bow",
"charge_blade": "Charge Blade",
"dual_blades": "Dual Blades",
"great_sword": "Great Sword",
"gunlance": "Gunlance",
"hammer": "Hammer",
"heavy_bowgun": "Heavy Bowgun",
"hunting_horn": "Hunting Horn",
"insect_glaive": "Insect Glaive",
"lance": "Lance",
"light_bowgun": "Light Bowgun",
"long_sword": "Long Sword",
"switch_axe": "Switch Axe",
"sword_and_shield": "Sword & Shield"
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.