104 Commits

Author SHA1 Message Date
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
67 changed files with 8219 additions and 1268 deletions

135
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">Mod that exposes in-game data about monsters, creatures, players and damage. Draws a highly customizable UI.</p>
<p align="center">This mod is solely intended to empower players with means of self-improvement. Please don't use the information provided by this tool to make hurtful comments and actions toward other players.</p>
</p>
Exposes in-game data about monsters, creatures, players and damage. Draws a highly customizable UI. <p align="center">
<a href="https://github.com/greencomfytea/mhr-overlay/graphs/contributors">
<img alt="Contributors" src="https://custom-icon-badges.demolab.com/github/contributors/greencomfytea/mhr-overlay?logo=person-add" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/issues">
<img alt="Issues" src="https://custom-icon-badges.demolab.com/github/issues/greencomfytea/mhr-overlay?logo=issue-opened" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/issues">
<img alt="Issues Closed" src="https://custom-icon-badges.demolab.com/github/issues-closed/greencomfytea/mhr-overlay?logo=issue-closed" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/pulls">
<img alt="Pull Requests" src="https://custom-icon-badges.demolab.com/github/issues-pr/greencomfytea/mhr-overlay?logo=git-pull-request" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/pulls">
<img alt="Pull Requests Closed" src="https://custom-icon-badges.demolab.com/github/issues-pr-closed/greencomfytea/mhr-overlay?logo=git-pull-request-closed" />
</a>
<br>
<a href="https://github.com/greencomfytea/mhr-overlay/blob/main/LICENSE">
<img alt="License" src="https://custom-icon-badges.demolab.com/github/license/greencomfytea/mhr-overlay?logo=law" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/releases">
<img alt="Release Version" src="https://custom-icon-badges.demolab.com/github/v/release/greencomfytea/mhr-overlay?logo=tag" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/releases">
<img alt="Release Date" src="https://custom-icon-badges.demolab.com/github/release-date/greencomfytea/mhr-overlay?logo=clock" />
</a>
<a href="">
<img alt="Platform" src="https://custom-icon-badges.demolab.com/badge/platform-win%20%7C%20linux%20%7C%20steam%20deck-blue?logo=device-desktop" />
</a>
<a href="">
<img alt="Maintenance" src="https://custom-icon-badges.demolab.com/maintenance/yes/2023?logo=tools" />
</a>
<br>
<a href="https://www.nexusmods.com/monsterhunterrise/mods/26">
<img alt="REFramework Dependency" src="https://custom-icon-badges.demolab.com/badge/dependency-REFramework%20v1.503%2B-green?logo=package-dependencies" />
</a>
<a href="https://www.nexusmods.com/monsterhunterrise/mods/134">
<img alt="REFramework Direct2D Dependency" src="https://custom-icon-badges.demolab.com/badge/dependency-REFramework%20Direct2D%20v0.4.0%2B-yellow?logo=package-dependencies" />
</a>
<br>
<br>
<a href="https://github.com/greencomfytea/mhr-overlay/commits/main">
<img alt="Commits" src="https://custom-icon-badges.demolab.com/github/commit-activity/t/greencomfytea/mhr-overlay?logo=git-commit" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/commits/main">
<img alt="Last Commit" src="https://custom-icon-badges.demolab.com/github/last-commit/greencomfytea/mhr-overlay?logo=git-commit" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/commits/main">
<img alt="Commits Since" src="https://custom-icon-badges.demolab.com/github/commits-since/greencomfytea/mhr-overlay/latest?logo=git-commit" />
</a>
<br>
<a href="https://github.com/greencomfytea/mhr-overlay/graphs/commit-activity">
<img alt="Commit Activity (Year)" src="https://custom-icon-badges.demolab.com/github/commit-activity/y/greencomfytea/mhr-overlay?logo=pulse" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/graphs/commit-activity">
<img alt="Commit Activity (Month)" src="https://custom-icon-badges.demolab.com/github/commit-activity/m/greencomfytea/mhr-overlay?logo=pulse" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/graphs/commit-activity">
<img alt="Commit Activity (Week)" src="https://custom-icon-badges.demolab.com/github/commit-activity/w/greencomfytea/mhr-overlay?logo=pulse" />
</a>
<br>
<br>
<a href="">
<img alt="Repo Size" src="https://custom-icon-badges.demolab.com/github/repo-size/greencomfytea/mhr-overlay?logo=database" />
</a>
<a href="">
<img alt="Line Count" src="https://sloc.xyz/github/greencomfytea/mhr-overlay" />
</a>
<a href="">
<img alt="COCOMO" src="https://sloc.xyz/github/greencomfytea/mhr-overlay/?category=cocomo" />
</a>
<a href="">
<img alt="Goto Counter" src="https://custom-icon-badges.demolab.com/github/search/greencomfytea/mhr-overlay/goto?logo=git-compare" />
</a>
<br>
<a href="https://github.com/sponsors/greencomfytea">
<img alt="Sponsors" src="https://custom-icon-badges.demolab.com/github/sponsors/greencomfytea?logo=heart" />
</a>
<a href="https://github.com/GreenComfyTea/mhr-overlay/watchers">
<img alt="Watchers" src="https://custom-icon-badges.demolab.com/github/watchers/greencomfytea/mhr-overlay?logo=eye" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/forks">
<img alt="Forks" src="https://custom-icon-badges.demolab.com/github/forks/greencomfytea/mhr-overlay?logo=repo-forked" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/stargazers">
<img alt="Stars" src="https://custom-icon-badges.demolab.com/github/stars/greencomfytea/mhr-overlay?logo=star" />
</a>
<a href="https://github.com/greencomfytea/mhr-overlay/graphs/traffic">
<img alt="Hits" src="https://custom-icon-badges.demolab.com/endpoint?url=https://hits.dwyl.com/greencomfytea/mhr-overlay.json?color=blue&logo=eye" />
</a>
<br>
<br>
<a href="https://www.nexusmods.com/monsterhunterrise/mods/50">
<img alt="Website" src="https://custom-icon-badges.demolab.com/website?down_color=red&down_message=down&up_color=brightgreen&up_message=up&logo=link&url=https://www.nexusmods.com/monsterhunterrise/mods/50" />
</a>
<a href="https://github.com/greencomfytea?tab=followers">
<img alt="Followers" src="https://custom-icon-badges.demolab.com/github/followers/greencomfytea?logo=people" />
</a>
<a href="https://twitter.com/greencomfytea">
<img alt="Twitter" src="https://img.shields.io/twitter/follow/greencomfytea?logo=twitter" />
</a>
<a href="https://www.twitch.tv/greencomfytea">
<img alt="Twitch" src="https://img.shields.io/twitch/status/greencomfytea?logo=twitch" />
</a>
<br>
<a href="https://github.com/greencomfytea">
<img alt="Author" src="https://custom-icon-badges.demolab.com/badge/author-GreenComfyTea-green?logo=person" />
</a>
<a href="https://github.com/topics/open-source">
<img alt="Open Source" src="https://img.shields.io/badge/open%20source-%20yes-brightgreen?logo=openvpn" />
</a>
<a href="https://cursey.github.io/reframework-book/index.html#lua-scripting">
<img alt="Written in" src="https://custom-icon-badges.demolab.com/badge/written in-lua-000080?logo=terminal" />
</a>
</p>
**This mod is solely intended to empower players with means of self-improvement. Please don't use the information provided by this tool to make hurtful comments and actions toward other players.** <p align="center">
<a>
![50-1659789731-551420562](https://user-images.githubusercontent.com/30152047/183250401-9f2898dd-feb4-4903-802c-c9d398261f11.png) <img align="center" src="https://user-images.githubusercontent.com/30152047/183250401-9f2898dd-feb4-4903-802c-c9d398261f11.png" />
</a>
</p>
# Links # Links
* **[Nexus Mods](https://www.nexusmods.com/monsterhunterrise/mods/50)** * **[Nexus Mods](https://www.nexusmods.com/monsterhunterrise/mods/50)**
@@ -15,8 +135,8 @@ Exposes in-game data about monsters, creatures, players and damage. Draws a high
* **[Troubleshooting](https://github.com/GreenComfyTea/MHR-Overlay/wiki/Troubleshooting)** * **[Troubleshooting](https://github.com/GreenComfyTea/MHR-Overlay/wiki/Troubleshooting)**
# Requirements # Requirements
1. [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26) (v1.503 or above); 1. [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26) (v1.503+);
2. [REFramework Direct2D](https://www.nexusmods.com/monsterhunterrise/mods/134) (v0.4.0 or above). 2. [REFramework Direct2D](https://www.nexusmods.com/monsterhunterrise/mods/134) (v0.4.0+) - Needed for Unicode Support.
# How to install: # How to install:
1. Install [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26); 1. Install [REFramework](https://www.nexusmods.com/monsterhunterrise/mods/26);
@@ -53,4 +173,3 @@ You can support me by donating! I would appreciate it! But anyway, thank you for
<a href="https://ko-fi.com/greencomfytea"> <a href="https://ko-fi.com/greencomfytea">
<img alt="Qries" src="https://panels.twitch.tv/panel-48897356-image-c2fcf835-87e4-408e-81e8-790789c7acbc"> <img alt="Qries" src="https://panels.twitch.tv/panel-48897356-image-c2fcf835-87e4-408e-81e8-790789c7acbc">
</a> </a>

View File

@@ -35,13 +35,23 @@ local quest_status = require("MHR_Overlay.Game_Handler.quest_status");
local screen = require("MHR_Overlay.Game_Handler.screen"); local screen = require("MHR_Overlay.Game_Handler.screen");
local singletons = require("MHR_Overlay.Game_Handler.singletons"); local singletons = require("MHR_Overlay.Game_Handler.singletons");
local time = require("MHR_Overlay.Game_Handler.time"); local time = require("MHR_Overlay.Game_Handler.time");
local error_handler = require("MHR_Overlay.Misc.error_handler");
local config = require("MHR_Overlay.Misc.config"); local config = require("MHR_Overlay.Misc.config");
local language = require("MHR_Overlay.Misc.language"); local language = require("MHR_Overlay.Misc.language");
local part_names = require("MHR_Overlay.Misc.part_names"); local part_names = require("MHR_Overlay.Misc.part_names");
local utils = require("MHR_Overlay.Misc.utils"); local utils = require("MHR_Overlay.Misc.utils");
--local buffs = require("MHR_Overlay.Buffs.buffs"); local player_info = require("MHR_Overlay.Misc.player_info");
local buffs = require("MHR_Overlay.Buffs.buffs");
local consumables = require("MHR_Overlay.Buffs.consumables");
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 dangos = require("MHR_Overlay.Buffs.dangos");
local abnormal_statuses = require("MHR_Overlay.Buffs.abnormal_statuses");
local otomo_moves = require("MHR_Overlay.Buffs.otomo_moves");
local players = require("MHR_Overlay.Damage_Meter.players"); local players = require("MHR_Overlay.Damage_Meter.players");
local non_players = require("MHR_Overlay.Damage_Meter.non_players"); local non_players = require("MHR_Overlay.Damage_Meter.non_players");
@@ -63,7 +73,8 @@ local large_monster_UI = require("MHR_Overlay.UI.Modules.large_monster_UI");
local small_monster_UI = require("MHR_Overlay.UI.Modules.small_monster_UI"); local small_monster_UI = require("MHR_Overlay.UI.Modules.small_monster_UI");
local time_UI = require("MHR_Overlay.UI.Modules.time_UI"); local time_UI = require("MHR_Overlay.UI.Modules.time_UI");
local env_creature_UI = require("MHR_Overlay.UI.Modules.env_creature_UI"); local env_creature_UI = require("MHR_Overlay.UI.Modules.env_creature_UI");
--local buff_UI = require("MHR_Overlay.UI.Modules.buff_UI"); local buff_UI = require("MHR_Overlay.UI.Modules.buff_UI");
local stats_UI = require("MHR_Overlay.UI.Modules.stats_UI");
local body_part_UI_entity = require("MHR_Overlay.UI.UI_Entities.body_part_UI_entity"); local body_part_UI_entity = require("MHR_Overlay.UI.UI_Entities.body_part_UI_entity");
local damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.damage_UI_entity"); local damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.damage_UI_entity");
@@ -72,7 +83,7 @@ local stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity"
local rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity"); local rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity");
local ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity"); local ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity");
local ailment_buildup_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_buildup_UI_entity"); local ailment_buildup_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_buildup_UI_entity");
--local buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity"); local buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
local customization_menu = require("MHR_Overlay.UI.customization_menu"); local customization_menu = require("MHR_Overlay.UI.customization_menu");
local label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); local label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
@@ -92,15 +103,93 @@ local drawing = require("MHR_Overlay.UI.drawing");
------------------------INIT MODULES------------------------- ------------------------INIT MODULES-------------------------
-- #region -- #region
error_handler.init_dependencies();
screen.init_dependencies();
singletons.init_dependencies();
utils.init_dependencies();
time.init_dependencies();
language.init_dependencies();
config.init_dependencies();
part_names.init_dependencies();
damage_UI_entity.init_dependencies();
health_UI_entity.init_dependencies();
stamina_UI_entity.init_dependencies();
rage_UI_entity.init_dependencies();
ailment_UI_entity.init_dependencies();
ailment_buildup_UI_entity.init_dependencies();
body_part_UI_entity.init_dependencies();
buff_UI_entity.init_dependencies();
player_info.init_dependencies();
buffs.init_dependencies();
consumables.init_dependencies();
melody_effects.init_dependencies();
endemic_life_buffs.init_dependencies();
skills.init_dependencies();
dangos.init_dependencies();
abnormal_statuses.init_dependencies();
otomo_moves.init_dependencies();
damage_hook.init_dependencies();
players.init_dependencies();
non_players.init_dependencies();
quest_status.init_dependencies();
env_creature_hook.init_dependencies();
env_creature.init_dependencies();
body_part.init_dependencies();
ailments.init_dependencies();
large_monster.init_dependencies();
monster_hook.init_dependencies();
small_monster.init_dependencies();
ailment_hook.init_dependencies();
ailment_buildup.init_dependencies();
label_customization.init_dependencies();
bar_customization.init_dependencies();
line_customization.init_dependencies();
large_monster_UI_customization.init_dependencies();
label_customization.init_dependencies();
bar_customization.init_dependencies();
health_customization.init_dependencies();
stamina_customization.init_dependencies();
rage_customization.init_dependencies();
body_parts_customization.init_dependencies();
ailments_customization.init_dependencies();
ailment_buildups_customization.init_dependencies();
module_visibility_customization.init_dependencies();
customization_menu.init_dependencies();
drawing.init_dependencies();
damage_meter_UI.init_dependencies();
large_monster_UI.init_dependencies();
small_monster_UI.init_dependencies();
time_UI.init_dependencies();
env_creature_UI.init_dependencies();
buff_UI.init_dependencies();
stats_UI.init_dependencies();
keyboard.init_dependencies();
------------------------------------------------------------
error_handler.init_module();
language.init_module();
config.init_module();
part_names.init_module();
screen.init_module(); screen.init_module();
singletons.init_module(); singletons.init_module();
utils.init_module(); utils.init_module();
time.init_module(); time.init_module();
language.init_module();
config.init_module();
part_names.init_module();
damage_UI_entity.init_module(); damage_UI_entity.init_module();
health_UI_entity.init_module(); health_UI_entity.init_module();
stamina_UI_entity.init_module(); stamina_UI_entity.init_module();
@@ -108,9 +197,18 @@ rage_UI_entity.init_module();
ailment_UI_entity.init_module(); ailment_UI_entity.init_module();
ailment_buildup_UI_entity.init_module(); ailment_buildup_UI_entity.init_module();
body_part_UI_entity.init_module(); body_part_UI_entity.init_module();
--buff_UI_entity.init_module(); buff_UI_entity.init_module();
--buffs.init_module(); player_info.init_module();
buffs.init_module();
consumables.init_module();
melody_effects.init_module();
endemic_life_buffs.init_module();
skills.init_module();
dangos.init_module();
abnormal_statuses.init_module();
otomo_moves.init_module();
damage_hook.init_module(); damage_hook.init_module();
players.init_module(); players.init_module();
@@ -151,7 +249,8 @@ large_monster_UI.init_module();
small_monster_UI.init_module(); small_monster_UI.init_module();
time_UI.init_module(); time_UI.init_module();
env_creature_UI.init_module(); env_creature_UI.init_module();
--buff_UI.init_module(); buff_UI.init_module();
stats_UI.init_module();
keyboard.init_module(); keyboard.init_module();
@@ -162,68 +261,107 @@ log.info("[MHR Overlay] Loaded.");
----------------------------LOOP----------------------------- ----------------------------LOOP-----------------------------
-- #region -- #region
local function draw_modules(module_visibility_config, flow_state_name) local function update_modules(module_visibility_config, flow_state_name)
if module_visibility_config.small_monster_UI and config.current_config.small_monster_UI.enabled then if module_visibility_config.small_monster_UI and config.current_config.small_monster_UI.enabled then
local success = pcall(small_monster_UI.draw); local success = pcall(small_monster_UI.update);
if not success then if not success then
customization_menu.status = string.format("[%s] Small Monster UI Drawing Function threw an Exception", flow_state_name); error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Small Monster UI Update Function threw an Exception", flow_state_name));
end end
end end
local large_monster_UI_config = config.current_config.large_monster_UI; local large_monster_UI_config = config.current_config.large_monster_UI;
local dynamic_enabled = large_monster_UI_config.dynamic.enabled and local dynamic_enabled = large_monster_UI_config.dynamic.enabled and module_visibility_config.large_monster_dynamic_UI;
module_visibility_config.large_monster_dynamic_UI; local static_enabled = large_monster_UI_config.static.enabled and module_visibility_config.large_monster_static_UI;
local static_enabled = large_monster_UI_config.static.enabled and local highlighted_enabled = large_monster_UI_config.highlighted.enabled and module_visibility_config.large_monster_highlighted_UI;
module_visibility_config.large_monster_static_UI;
local highlighted_enabled = large_monster_UI_config.highlighted.enabled and if dynamic_enabled or static_enabled or highlighted_enabled then
module_visibility_config.large_monster_highlighted_UI; local success = pcall(large_monster_UI.update, dynamic_enabled, static_enabled, highlighted_enabled);
if not success then
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Large Monster UI Update Function threw an Exception", flow_state_name));
end
end
if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then
local success = pcall(damage_meter_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Damage Meter UI Update Function threw an Exception", flow_state_name));
end
end
if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then
local success = pcall(env_creature_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Endemic Life UI Update Function threw an Exception", flow_state_name));
end
end
if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then
local success = pcall(buff_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_modules", string.format("[%s] Buff UI Update Function threw an Exception", flow_state_name));
end
end
end
local function draw_modules(module_visibility_config, flow_state_name)
if module_visibility_config.small_monster_UI and config.current_config.small_monster_UI.enabled then
local success = pcall(small_monster_UI.draw);
if not success then
error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Small Monster UI Draw Function threw an Exception", flow_state_name));
end
end
local large_monster_UI_config = config.current_config.large_monster_UI;
local dynamic_enabled = large_monster_UI_config.dynamic.enabled and module_visibility_config.large_monster_dynamic_UI;
local static_enabled = large_monster_UI_config.static.enabled and module_visibility_config.large_monster_static_UI;
local highlighted_enabled = large_monster_UI_config.highlighted.enabled and module_visibility_config.large_monster_highlighted_UI;
if dynamic_enabled or static_enabled or highlighted_enabled then if dynamic_enabled or static_enabled or highlighted_enabled then
local success = pcall(large_monster_UI.draw, dynamic_enabled, static_enabled, highlighted_enabled); local success = pcall(large_monster_UI.draw, dynamic_enabled, static_enabled, highlighted_enabled);
if not success then if not success then
customization_menu.status = string.format("[%s] Large Monster UI Drawing Function threw an Exception", flow_state_name); error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Large Monster UI Draw Function threw an Exception", flow_state_name));
end end
end end
if config.current_config.time_UI.enabled and module_visibility_config.time_UI then if config.current_config.time_UI.enabled and module_visibility_config.time_UI then
local success = pcall(time_UI.draw); local success = pcall(time_UI.draw);
if not success then if not success then
customization_menu.status = string.format("[%s] Time UI Drawing Function threw an Exception", flow_state_name); error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Time UI Draw Function threw an Exception", flow_state_name));
end end
end end
if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then
local success = pcall(damage_meter_UI.draw); local success = pcall(damage_meter_UI.draw);
if not success then if not success then
customization_menu.status = string.format("[%s] Damage Meter UI Drawing Function threw an Exception", flow_state_name); error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Damage Meter UI Draw Function threw an Exception", flow_state_name));
end end
end end
if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then
local success = pcall(env_creature_UI.draw); local success = pcall(env_creature_UI.draw);
if not success then if not success then
customization_menu.status = string.format("[%s] Endemic Life UI Drawing Function threw an Exception", flow_state_name); error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Endemic Life UI Draw Function threw an Exception", flow_state_name));
end end
end end
--[[if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then
local success = truepcall(buff_UI.draw); local success = pcall(buff_UI.draw);
if not success then if not success then
customization_menu.status = string.format("[%s] Buff UI Drawing Function threw an Exception", flow_state_name); error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Buff UI Draw Function threw an Exception", flow_state_name));
end
end
if config.current_config.stats_UI.enabled and module_visibility_config.stats_UI then
local success = pcall(stats_UI.draw);
if not success then
error_handler.report("MHR_Overlay.draw_modules", string.format("[%s] Stats UI Draw Function threw an Exception", flow_state_name));
end
end end
end]]
end end
local function main_loop() local function update_UI()
customization_menu.status = "OK";
singletons.init();
screen.update_window_size();
players.update_myself_position();
quest_status.update_is_online();
--quest_status.update_is_quest_host();
time.tick();
if quest_status.flow_state == quest_status.flow_states.IN_TRAINING_AREA then if quest_status.flow_state == quest_status.flow_states.IN_TRAINING_AREA then
local large_monster_UI_config = config.current_config.large_monster_UI; local large_monster_UI_config = config.current_config.large_monster_UI;
@@ -233,33 +371,111 @@ local function main_loop()
local static_enabled = large_monster_UI_config.static.enabled and module_visibility_config.large_monster_static_UI; local static_enabled = large_monster_UI_config.static.enabled and module_visibility_config.large_monster_static_UI;
local highlighted_enabled = large_monster_UI_config.highlighted.enabled and module_visibility_config.large_monster_highlighted_UI; local highlighted_enabled = large_monster_UI_config.highlighted.enabled and module_visibility_config.large_monster_highlighted_UI;
if dynamic_enabled or static_enabled or highlighted_enabled then
local success = pcall(large_monster_UI.update, dynamic_enabled, static_enabled, highlighted_enabled);
if not success then
error_handler.report("MHR_Overlay.update_loop", "[In Training Area] Large Monster UI Update Function threw an Exception");
end
end
if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then
local success = pcall(damage_meter_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_modules", "[In Training Area] Damage Meter UI Update Function threw an Exception");
end
end
if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then
local success = pcall(env_creature_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_loop", "[In Training Area] Endemic Life UI Update Function threw an Exception");
end
end
if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then
local success = pcall(buff_UI.update);
if not success then
error_handler.report("MHR_Overlay.update_loop", "[In Training Area] Buff UI Update Function threw an Exception");
end
end
elseif quest_status.flow_state == quest_status.flow_states.CUTSCENE then
update_modules(config.current_config.global_settings.module_visibility.cutscene, "Cutscene");
elseif quest_status.flow_state == quest_status.flow_states.LOADING_QUEST then
update_modules(config.current_config.global_settings.module_visibility.loading_quest, "Loading Quest");
elseif quest_status.flow_state == quest_status.flow_states.QUEST_START_ANIMATION then
update_modules(config.current_config.global_settings.module_visibility.quest_start_animation, "Quest Start Animation");
elseif quest_status.flow_state >= quest_status.flow_states.PLAYING_QUEST and quest_status.flow_state <= quest_status.flow_states.WYVERN_RIDING_START_ANIMATION then
update_modules(config.current_config.global_settings.module_visibility.playing_quest, "Playing Quest");
elseif quest_status.flow_state == quest_status.flow_states.KILLCAM then
update_modules(config.current_config.global_settings.module_visibility.killcam, "Killcam");
elseif quest_status.flow_state == quest_status.flow_states.QUEST_END_TIMER then
update_modules(config.current_config.global_settings.module_visibility.quest_end_timer, "Quest End Timer");
elseif quest_status.flow_state == quest_status.flow_states.QUEST_END_ANIMATION then
update_modules(config.current_config.global_settings.module_visibility.quest_end_animation, "Quest End Animation");
elseif quest_status.flow_state == quest_status.flow_states.QUEST_END_SCREEN then
update_modules(config.current_config.global_settings.module_visibility.quest_end_screen, "Quest End Screen");
elseif quest_status.flow_state == quest_status.flow_states.REWARD_SCREEN then
update_modules(config.current_config.global_settings.module_visibility.reward_screen, "Reward Screen");
elseif quest_status.flow_state == quest_status.flow_states.SUMMARY_SCREEN then
update_modules(config.current_config.global_settings.module_visibility.summary_screen, "Summary Screen");
end
end
local function draw_loop()
if quest_status.flow_state == quest_status.flow_states.IN_LOBBY then
local module_visibility_config = config.current_config.global_settings.module_visibility.in_lobby;
if config.current_config.stats_UI.enabled and module_visibility_config.stats_UI then
local success = pcall(stats_UI.draw);
if not success then
error_handler.report("MHR_Overlay.main_loop", "[In Training Area] Stats UI Draw Function threw an Exception");
end
end
elseif quest_status.flow_state == quest_status.flow_states.IN_TRAINING_AREA then
local large_monster_UI_config = config.current_config.large_monster_UI;
local module_visibility_config = config.current_config.global_settings.module_visibility.in_training_area;
local dynamic_enabled = large_monster_UI_config.dynamic.enabled and module_visibility_config.large_monster_dynamic_UI;
local static_enabled = large_monster_UI_config.static.enabled and module_visibility_config.large_monster_static_UI;
local highlighted_enabled = large_monster_UI_config.highlighted.enabled and module_visibility_config.large_monster_highlighted_UI;
if dynamic_enabled or static_enabled or highlighted_enabled then if dynamic_enabled or static_enabled or highlighted_enabled then
local success = pcall(large_monster_UI.draw, dynamic_enabled, static_enabled, highlighted_enabled); local success = pcall(large_monster_UI.draw, dynamic_enabled, static_enabled, highlighted_enabled);
if not success then if not success then
customization_menu.status = "[In Training Area] Large Monster UI Drawing Function threw an Exception"; error_handler.report("MHR_Overlay.main_loop", "[In Training Area] Large Monster UI Draw Function threw an Exception");
end end
end end
if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then if config.current_config.damage_meter_UI.enabled and module_visibility_config.damage_meter_UI then
local success = pcall(damage_meter_UI.draw); local success = pcall(damage_meter_UI.draw);
if not success then if not success then
customization_menu.status = "[In Training Area] Damage Meter UI Drawing Function threw an Exception"; error_handler.report("MHR_Overlay.main_loop", "[In Training Area] Damage Meter UI Draw Function threw an Exception");
end end
end end
if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then if config.current_config.endemic_life_UI.enabled and module_visibility_config.endemic_life_UI then
local success = pcall(env_creature_UI.draw); local success = pcall(env_creature_UI.draw);
if not success then if not success then
customization_menu.status = "[In Training Area] Endemic Life UI Drawing Function threw an Exception"; error_handler.report("MHR_Overlay.main_loop", "[In Training Area] Endemic Life UI Draw Function threw an Exception");
end end
end end
--[[if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then if config.current_config.buff_UI.enabled and module_visibility_config.buff_UI then
local success = pcall(buff_UI.draw); local success = pcall(buff_UI.draw);
if not success then if not success then
customization_menu.status = "[In Training Area] Buff UI Drawing Function threw an Exception"; error_handler.report("MHR_Overlay.main_loop", "[In Training Area] Buff UI Draw Function threw an Exception");
end
end
if config.current_config.stats_UI.enabled and module_visibility_config.stats_UI then
local success = pcall(stats_UI.draw);
if not success then
error_handler.report("MHR_Overlay.main_loop", "[In Training Area] Stats UI Draw Function threw an Exception");
end
end end
end]]
elseif quest_status.flow_state == quest_status.flow_states.CUTSCENE then elseif quest_status.flow_state == quest_status.flow_states.CUTSCENE then
@@ -297,38 +513,38 @@ re.on_draw_ui(function()
end); end);
re.on_frame(function() re.on_frame(function()
if not reframework:is_drawing_ui() then if reframework:is_drawing_ui() then
customization_menu.is_opened = false;
end
if customization_menu.is_opened then
pcall(customization_menu.draw); pcall(customization_menu.draw);
end end
keyboard.update();
end); end);
-- #endregion -- #endregion
--------------------------RE_IMGUI--------------------------- --------------------------RE_IMGUI---------------------------
----------------------------D2D------------------------------ -----------------------Loop Callbacks------------------------
-- #region -- #region
if d2d ~= nil then if d2d ~= nil then
d2d.register(function() d2d.register(function()
drawing.init_font(); drawing.init_font();
end, function() end, function()
if config.current_config.global_settings.renderer.use_d2d_if_available then if config.current_config.global_settings.renderer.use_d2d_if_available then
main_loop(); draw_loop();
end end
end); end);
end end
re.on_frame(function() re.on_frame(function()
time.update_timers();
keyboard.update();
if d2d == nil or not config.current_config.global_settings.renderer.use_d2d_if_available then if d2d == nil or not config.current_config.global_settings.renderer.use_d2d_if_available then
main_loop(); draw_loop();
end end
end); end);
-- #endregion -- #endregion
----------------------------D2D------------------------------ -----------------------Loop Callbacks------------------------
time.init_global_timers();
time.new_timer(update_UI, 0.5);
if imgui.begin_table == nil then if imgui.begin_table == nil then
re.msg(language.current_language.customization_menu.reframework_outdated); re.msg(language.current_language.customization_menu.reframework_outdated);

View File

@@ -0,0 +1,370 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local time;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
fireblight = nil,
waterblight = nil,
iceblight = nil,
thunderblight = nil,
dragonblight = nil,
blastblight = nil,
minor_bubbleblight = nil,
major_bubbleblight = nil,
hellfireblight = nil,
bloodblight = nil,
poison = nil,
deadly_poison = nil,
stun = nil,
paralysis = nil,
sleep = nil,
defense_down = nil,
resistance_down = nil,
tremor = nil,
roar = nil,
webbed = nil,
stench = nil,
leeched = nil,
whirlwind = nil,
bleeding = nil,
frenzy = nil,
frenzy_overcome = nil,
frenzy_infection = nil,
engulfed = nil,
frostblight = nil,
muck = nil
};
local frenzy_infected_duration = 121;
local player_quest_base_type_def = sdk.find_type_definition("snow.player.PlayerQuestBase");
-- Fireblight
local fire_duration_timer = player_quest_base_type_def:get_field("_FireLDurationTimer");
-- Waterblight
local water_duration_timer = player_quest_base_type_def:get_field("_WaterLDurationTimer");
-- Iceblight
local ice_duration_timer = player_quest_base_type_def:get_field("_IceLDurationTimer");
-- Thunderblight
local thunder_duration_timer = player_quest_base_type_def:get_field("_ThunderLDurationTimer");
-- Dragonblight
local dragon_duration_timer = player_quest_base_type_def:get_field("_DragonLDurationTimer");
-- blastblight
local bomb_duration_timer = 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 = player_quest_base_type_def:get_field("_BubbleDamageTimer");
-- Hellfireblight
local oni_bomb_duration_timer = player_quest_base_type_def:get_field("_OniBombDurationTimer");
-- Bloodblight
local mystery_debuff_timer = 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 = player_quest_base_type_def:get_field("_PoisonDurationTimer");
-- Stun
local stun_duration_timer = player_quest_base_type_def:get_field("_StunDurationTimer");
-- Sleep
local sleep_duration_timer = player_quest_base_type_def:get_field("_SleepDurationTimer");
-- Paralysis
local paralyze_duration_timer = player_quest_base_type_def:get_field("_ParalyzeDurationTimer");
-- Defense Down
local defense_down_duration_timer = player_quest_base_type_def:get_field("_DefenceDownDurationTimer");
-- Resistance Down
local resistance_down_duration_timer = player_quest_base_type_def:get_field("_ResistanceDownDurationTimer");
-- Tremor
local quake_duration_timer = player_quest_base_type_def:get_field("_QuakeDurationTimer");
-- Roar
local ear_duration_timer = player_quest_base_type_def:get_field("_EarDurationTimer");
-- Webbed
local beto_duration_timer = player_quest_base_type_def:get_field("_BetoDurationTimer");
-- Stench
local stink_duration_timer = player_quest_base_type_def:get_field("_StinkDurationTimer");
-- Leeched
local blooding_enemy_timer = player_quest_base_type_def:get_field("_BloodingEnemyTimer");
-- Bleeding
local bleeding_debuff_timer = 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");
local cache = {};
function this.update(player, player_data)
--local item_parameter = get_ref_item_parameter_method:call(singletons.player_manager);
--if item_parameter == nil then
-- error_handler.report("consumables.update", "Failed to access Data: item_parameter");
-- return;
--end
-- Missing:
-- whirlwind?
-- Wind Pressure?
this.update_poison(player);
this.update_bubbleblight(player);
this.update_muck(player);
this.update_frenzy_infection(player);
this.update_generic_timer("fireblight", player, fire_duration_timer);
this.update_generic_timer("waterblight", player, water_duration_timer);
this.update_generic_timer("iceblight", player, ice_duration_timer);
this.update_generic_timer("thunderblight", player, thunder_duration_timer);
this.update_generic_timer("dragonblight", player, dragon_duration_timer);
this.update_generic_timer("blastblight", player, bomb_duration_timer);
this.update_generic_timer("hellfireblight", player, oni_bomb_duration_timer);
this.update_generic_timer("bloodblight", player, mystery_debuff_timer);
this.update_generic_timer("stun", player, stun_duration_timer);
this.update_generic_timer("paralysis", player, paralyze_duration_timer);
this.update_generic_timer("sleep", player, sleep_duration_timer);
this.update_generic_timer("defense_down", player, defense_down_duration_timer);
this.update_generic_timer("resistance_down", player, resistance_down_duration_timer);
this.update_generic_timer("tremor", player, quake_duration_timer);
this.update_generic_timer("roar", player, ear_duration_timer);
this.update_generic_timer("webbed", player, beto_duration_timer);
this.update_generic_timer("stench", player, stink_duration_timer);
this.update_generic_timer("leeched", player, blooding_enemy_timer, true);
this.update_generic_timer("bleeding", player, bleeding_debuff_timer);
this.update_generic_timer("frenzy", player, virus_onset_timer_field);
this.update_generic_timer("frenzy_overcome", player_data, virus_overcome_buff_timer_field);
this.update_generic_boolean_value_method("engulfed", player, get_is_vacuum_damage_method);
this.update_generic_boolean_value_method("frostblight", player, get_is_frozen_damage_method);
end
function this.update_generic_timer(debuff_key, timer_owner, timer_field, is_infinite)
if is_infinite == nil then is_infinite = false; end
local timer = timer_field:get_data(timer_owner);
if timer == nil then
error_handler.report("abnormal_statuses.update_generic_timer", string.format("Failed to access Data: %s_timer", debuff_key));
return;
end
if utils.number.is_equal(timer, 0) then
this.list[debuff_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
this.update_generic(debuff_key, timer);
end
function this.update_generic_boolean_value_method(debuff_key, value_owner, value_method)
local value = value_method:call(value_owner);
if value == nil then
error_handler.report("abnormal_statuses.update_generic_boolean_value_method", string.format("Failed to access Data: %s_value", debuff_key));
return;
end
if not value then
this.list[debuff_key] = nil;
return;
end
this.update_generic(debuff_key, nil);
end
function this.update_bubbleblight(player)
local bubble_Type = bubble_type_field:get_data(player);
if bubble_Type == nil then
error_handler.report("abnormal_statuses.update_bubbleblight", "Failed to access Data: bubble_Type");
return;
end
if bubble_Type == 0 then
this.list.minor_bubbleblight = nil;
this.list.major_bubbleblight = nil;
return;
end
if bubble_Type == 1 then
this.update_generic_timer("minor_bubbleblight", player, bubble_damage_timer);
this.list.major_bubbleblight = nil;
else
this.update_generic_timer("major_bubbleblight", player, bubble_damage_timer);
this.list.minor_bubbleblight = nil;
end
end
function this.update_poison(player)
local poison_level = poison_level_field:get_data(player);
if poison_level == nil then
error_handler.report("abnormal_statuses.update_poison", "Failed to access Data: poison_level");
return;
end
if poison_level == 0 then
this.list.poison = nil;
this.list.deadly_poison = nil;
return;
end
if poison_level == 1 then
this.update_generic_timer("poison", player, poison_duration_timer);
this.list.deadly_poison = nil;
else
this.update_generic_timer("deadly_poison", player, poison_duration_timer);
this.list.poison = nil;
end
end
function this.update_muck(player)
local is_mud_damage = get_is_mud_damage_method:call(player);
if is_mud_damage == nil then
error_handler.report("abnormal_statuses.update_generic_boolean_value_method", "Failed to access Data: is_mud_damage");
return;
end
local is_gold_mud_damage = get_is_gold_mud_damage_method:call(player);
if is_gold_mud_damage == nil then
error_handler.report("abnormal_statuses.update_generic_boolean_value_method", "Failed to access Data: is_gold_mud_damage");
return;
end
if not is_mud_damage and not is_gold_mud_damage then
this.list.muck = nil;
return;
end
this.update_generic("muck", nil);
end
function this.update_frenzy_infection(player)
local virus_accumulator_value = virus_accumulator_field:get_data(player);
if virus_accumulator_value == nil then
error_handler.report("abnormal_statuses.update_frenzy_infection", "Failed to access Data: virus_accumulator_value");
return;
end
local virus_timer = virus_timer_field:get_data(player);
if virus_timer == nil then
error_handler.report("abnormal_statuses.update_frenzy_infection", "Failed to access Data: virus_timer");
return;
end
if virus_accumulator_value == 0 and utils.number.is_equal(virus_timer, 0)then
this.list.frenzy_infection = nil;
return;
end
local timer = frenzy_infected_duration - (virus_accumulator_value + virus_timer / 60);
this.update_generic("frenzy_infection", timer, frenzy_infected_duration);
end
function this.update_generic(debuff_key, timer, duration)
duration = duration or timer;
local debuff = this.list[debuff_key];
if debuff == nil then
local name = language.current_language.ailments[debuff_key];
if name == nil then
name = debuff_key;
end
debuff = buffs.new(buffs.types.debuff, debuff_key, name, 1, duration);
this.list[debuff_key] = debuff;
elseif timer ~= nil then
buffs.update_timer(debuff, timer);
end
end
function this.init_names()
for debuff_key, debuff in pairs(this.list) do
local name = language.current_language.ailments[debuff_key];
if name == nil then
name = debuff_key;
end
debuff.name = name;
end
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
time = require("MHR_Overlay.Game_Handler.time");
end
function this.init_module()
end
return this;

View File

@@ -2,6 +2,20 @@ local this = {};
local buff_UI_entity; local buff_UI_entity;
local config; local config;
local singletons;
local players;
local consumables;
local melody_effects;
local utils;
local language;
local time;
local quest_status;
local error_handler;
local endemic_life_buffs;
local skills;
local dangos;
local abnormal_statuses;
local otomo_moves;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -35,14 +49,49 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
this.list = {}; this.types = {
consumable = 0,
melody_effect = 1,
dango = 2,
skill = 4,
debuff = 8
};
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_method = player_manager_type_def:get_method("getPlayer");
local find_master_player_method = player_manager_type_def:get_method("findMasterPlayer");
local player_base_type_def = find_master_player_method:get_return_type();
local get_player_data_method = player_base_type_def:get_method("get_PlayerData");
local player_lobby_base_type_def = sdk.find_type_definition("snow.player.PlayerLobbyBase");
function this.new(type, key, name, level, duration)
local is_infinite = false;
if name == nil then
name = utils.constants.uninitialized_string;
end
if duration == nil then
duration = 0;
end
if utils.number.is_equal(duration, 0) then
is_infinite = true;
end
level = level or 1;
function this.new(name)
local buff = {}; local buff = {};
buff.type = type;
buff.key = key;
buff.name = name; buff.name = name;
buff.timer = 0; buff.level = level;
buff.duration = 0;
buff.timer = duration;
buff.duration = duration;
buff.is_active = true; buff.is_active = true;
@@ -51,7 +100,9 @@ function this.new(name)
buff.minutes_left = 0; buff.minutes_left = 0;
buff.seconds_left = 0; buff.seconds_left = 0;
buff.is_infinite = false; buff.is_infinite = is_infinite;
this.update_timer(buff, buff.timer);
this.init_UI(buff); this.init_UI(buff);
@@ -67,42 +118,103 @@ function this.init_UI(buff)
buff.buff_UI = buff_UI_entity.new(cached_config.bar, cached_config.name_label, cached_config.timer_label); buff.buff_UI = buff_UI_entity.new(cached_config.bar, cached_config.name_label, cached_config.timer_label);
end end
function this.init_names()
consumables.init_names();
melody_effects.init_names();
endemic_life_buffs.init_names();
skills.init_names();
dangos.init_names();
abnormal_statuses.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
local is_player_lobby_base = master_player:get_type_definition() == player_lobby_base_type_def;
local master_player_data = get_player_data_method:call(master_player);
if master_player_data ~= nil then
consumables.update(master_player_data);
otomo_moves.update(master_player_data);
if not is_player_lobby_base then
skills.update(master_player, master_player_data);
dangos.update(master_player, master_player_data);
endemic_life_buffs.update(master_player, master_player_data);
abnormal_statuses.update(master_player, master_player_data);
end
else
error_handler.report("buffs.update", "Failed to access Data: master_player_data");
end
melody_effects.update(master_player);
end
function this.update_timer(buff, timer)
if timer < 0 then
timer = 0;
end
if timer > buff.duration 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.draw(buff, buff_UI, position_on_screen, opacity_scale) function this.draw(buff, buff_UI, position_on_screen, opacity_scale)
buff_UI_entity.draw(buff, buff_UI, position_on_screen, opacity_scale); buff_UI_entity.draw(buff, buff_UI, position_on_screen, opacity_scale);
end end
function this.init_module()
function this.init_dependencies()
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity"); buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
consumables = require("MHR_Overlay.Buffs.consumables");
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");
dangos = require("MHR_Overlay.Buffs.dangos");
abnormal_statuses = require("MHR_Overlay.Buffs.abnormal_statuses");
otomo_moves = require("MHR_Overlay.Buffs.otomo_moves");
end
function this.init_module()
local buff = this.new("Enviroment Damage Negated");
buff.duration = 90;
buff.timer = 65;
buff.timer_percentage = 0.66;
buff.minutes_left = 1;
buff.seconds_left = 5
this.list["Enviroment Damage Negated"] = buff;
local buff = this.new("Sharpness Loss Reduced");
buff.duration = 120;
buff.timer = 70;
buff.timer_percentage = 0.583;
buff.minutes_left = 1;
buff.seconds_left = 10
this.list["Sharpness Loss Reduced"] = buff;
local buff = this.new("Sharpness Loss Reduced 2");
buff.duration = 120;
buff.timer = 70;
buff.timer_percentage = 0.583;
buff.minutes_left = 1;
buff.seconds_left = 10
buff.is_infinite = true;
this.list["Sharpness Loss Reduced 2"] = buff;
end end
return this; return this;

View File

@@ -0,0 +1,327 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
demondrug = nil,
mega_demondrug = nil,
armorskin = nil,
mega_armorskin = nil,
might_seed = nil,
adamant_seed = nil,
demon_powder = nil,
hardshell_powder = nil,
immunizer = nil,
dash_juice = nil,
gourmet_fish = nil,
};
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_data_method = player_manager_type_def:get_method("get_PlayerData");
local get_ref_item_parameter_method = player_manager_type_def:get_method("get_RefItemParameter");
local player_user_data_item_parameter_type_def = get_ref_item_parameter_method:get_return_type();
local demondrug_atk_up_field = player_user_data_item_parameter_type_def:get_field("_DemondrugAtkUp");
local great_demondrug_atk_up_field = player_user_data_item_parameter_type_def:get_field("_GreatDemondrugAtkUp");
local armorskin_def_up_field = player_user_data_item_parameter_type_def:get_field("_ArmorSkinDefUp");
local great_armorskin_def_up_field = player_user_data_item_parameter_type_def:get_field("_GreatArmorSkinDefUp");
local might_seed_timer_field = player_user_data_item_parameter_type_def:get_field("_MightSeedTimer");
local adamant_seed_timer_field = player_user_data_item_parameter_type_def:get_field("_AdamantSeedTimer");
local demondrug_powder_timer_field = player_user_data_item_parameter_type_def:get_field("_DemondrugPowderTimer");
local armorskin_powder_timer_field = player_user_data_item_parameter_type_def:get_field("_ArmorSkinPowderTimer");
local vitalizer_timer_const_field = player_user_data_item_parameter_type_def:get_field("_VitalizerTimer");
local stamina_up_buff_second_field = player_user_data_item_parameter_type_def:get_field("_StaminaUpBuffSecond");
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Demondrug/Mega Demondrug
local atk_up_alive_field = player_data_type_def:get_field("_AtkUpAlive");
-- Armorskin/Mega Armorskin
local def_up_alive_field = player_data_type_def:get_field("_DefUpAlive");
-- 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");
-- Adamant Seed
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");
-- Demon Powder
local atk_up_item_second_field = player_data_type_def:get_field("_AtkUpItemSecond");
local atk_up_item_second_timer_field = player_data_type_def:get_field("_AtkUpItemSecondTimer");
-- Hardshell Powder
local def_up_item_second_field = player_data_type_def:get_field("_DefUpItemSecond");
local def_up_item_second_timer_field = player_data_type_def:get_field("_DefUpItemSecondTimer");
-- Immunizer
local vitalizer_timer_field = player_data_type_def:get_field("_VitalizerTimer");
-- Dash Juice
local stamina_up_buff_second_timer_field = player_data_type_def:get_field("_StaminaUpBuffSecondTimer");
-- Gourmet Fish
local fish_regene_enable_field = player_data_type_def:get_field("_FishRegeneEnableTimer");
function this.update(player_data)
local item_parameter = get_ref_item_parameter_method:call(singletons.player_manager);
if item_parameter == nil then
error_handler.report("consumables.update", "Failed to access Data: item_parameter");
return;
end
this.update_demondrug(player_data, item_parameter);
this.update_armorskin(player_data, item_parameter);
this.update_gourmet_fish(player_data, item_parameter);
this.update_generic("might_seed", player_data, item_parameter,
atk_up_buff_second_field, atk_up_buff_second_timer_field, might_seed_timer_field);
this.update_generic("adamant_seed", player_data, item_parameter,
def_up_buff_second_field, def_up_buff_second_timer_field, adamant_seed_timer_field);
this.update_generic("demon_powder", player_data, item_parameter,
atk_up_item_second_field, atk_up_item_second_timer_field, demondrug_powder_timer_field);
this.update_generic("hardshell_powder", player_data, item_parameter,
def_up_item_second_field, def_up_item_second_timer_field, armorskin_powder_timer_field);
this.update_generic("immunizer", player_data, item_parameter,
nil, vitalizer_timer_field, vitalizer_timer_const_field);
this.update_generic("dash_juice", player_data, item_parameter,
nil, stamina_up_buff_second_timer_field, stamina_up_buff_second_field);
end
function this.update_generic(consumable_key, player_data, item_parameter, value_field, timer_field, timer_const_value_field)
if value_field ~= nil then
local value = value_field:get_data(player_data);
if value == nil then
error_handler.report("consumables.update_generic", string.format("Failed to access Data: %s_value", consumable_key));
return;
end
if value == 0 then
this.list[consumable_key] = nil;
return;
end
end
local timer = timer_field:get_data(player_data);
if timer == nil then
error_handler.report("consumables.update_generic", string.format("Failed to access Data: %s_timer", consumable_key));
return;
end
if value_field == nil and utils.number.is_equal(timer, 0)then
this.list[consumable_key] = nil;
return;
end
local consumable = this.list[consumable_key];
if consumable == nil then
local timer_const_value = timer_const_value_field:get_data(item_parameter);
if timer_const_value == nil then
error_handler.report("consumables.update_generic", string.format("Failed to access Data: %s_timer_const_value", consumable_key));
return;
end
local name = language.current_language.consumables[consumable_key];
consumable = buffs.new(buffs.types.consumable, consumable_key, name, 1, timer_const_value);
this.list[consumable_key] = consumable;
else
buffs.update_timer(consumable, timer / 60);
end
end
function this.update_demondrug(player_data, item_parameter)
local demondrug_value = atk_up_alive_field:get_data(player_data);
if demondrug_value == nil then
error_handler.report("consumables.update_demondrug", "Failed to access Data: demondrug_value");
return;
end
if demondrug_value == 0 then
this.list.demondrug = nil;
this.list.mega_demondrug = nil;
return;
end
local demondrug_const_value = demondrug_atk_up_field:get_data(item_parameter);
if demondrug_const_value == nil then
error_handler.report("consumables.update_demondrug", "Failed to access Data: demondrug_const_value");
return;
end
local mega_demondrug_const_value = great_demondrug_atk_up_field:get_data(item_parameter);
if mega_demondrug_const_value == nil then
error_handler.report("consumables.update_demondrug", "Failed to access Data: mega_demondrug_const_value");
return;
end
if demondrug_value == demondrug_const_value then
local buff = this.list.demondrug;
if buff ~= nil and buff.value == demondrug_value then
return;
end
local name = language.current_language.consumables.demondrug;
this.list.demondrug = buffs.new(buffs.types.consumable, "demondrug", name);
this.list.mega_demondrug = nil;
elseif demondrug_value == mega_demondrug_const_value then
local buff = this.list.mega_demondrug;
if buff ~= nil and buff.value == demondrug_value then
return;
end
local name = language.current_language.consumables.mega_demondrug;
this.list.demondrug = nil;
this.list.mega_demondrug = buffs.new(buffs.types.consumable, "mega_demondrug", name);
end
end
function this.update_armorskin(player_data, item_parameter)
local armorskin_value = def_up_alive_field:get_data(player_data);
if armorskin_value == nil then
error_handler.report("consumables.update_armorskin", "Failed to access Data: armorskin_value");
return;
end
if armorskin_value == 0 then
this.list.armorskin = nil;
this.list.mega_armorskin = nil;
return;
end
local armorskin_const_value = armorskin_def_up_field:get_data(item_parameter);
if armorskin_const_value == nil then
error_handler.report("consumables.update_armorskin", "Failed to access Data: armorskin_const_value");
return;
end
local mega_armorskin_const_value = great_armorskin_def_up_field:get_data(item_parameter);
if mega_armorskin_const_value == nil then
error_handler.report("consumables.update_armorskin", "Failed to access Data: mega_armorskin_const_value");
return;
end
if armorskin_value == armorskin_const_value then
local buff = this.list.armorskin;
if buff ~= nil and buff.value == armorskin_value then
return;
end
local name = language.current_language.consumables.armorskin;
this.list.armorskin = buffs.new(buffs.types.consumable, "armorskin", name);
this.list.mega_armorskin = nil;
elseif armorskin_value == mega_armorskin_const_value then
local buff = this.list.mega_armorskin;
if buff ~= nil and buff.value == armorskin_value then
return;
end
local name = language.current_language.consumables.mega_armorskin;
this.list.armorskin = nil;
this.list.mega_armorskin = buffs.new(buffs.types.consumable, "mega_armorskin", name);
end
end
function this.update_gourmet_fish(player_data, item_parameter)
local gourmet_fish_timer = fish_regene_enable_field:get_data(player_data);
if gourmet_fish_timer == nil then
error_handler.report("consumables.update_gourmet_fish", "Failed to access Data: gourmet_fish_timer");
return;
end
if utils.number.is_equal(gourmet_fish_timer, 0) then
this.list.gourmet_fish = nil;
return;
end
local buff = this.list.gourmet_fish;
if buff == nil then
--local gourmet_fish_timer_const_value = stamina_up_buff_second_field:get_data(item_parameter);
--if gourmet_fish_timer_const_value == nil then
-- error_handler.report("consumables.update_gourmet_fish", "Failed to access Data: gourmet_fish_timer_const_value");
-- return;
--end
local name = language.current_language.consumables.gourmet_fish;
buff = buffs.new(buffs.types.consumable, "gourmet_fish", name, 1, gourmet_fish_timer);
this.list.gourmet_fish = buff;
else
buffs.update_timer(buff, gourmet_fish_timer / 60);
end
end
function this.init_names()
for consumable_key, consumable in pairs(this.list) do
local name = language.current_language.consumables[consumable_key];
if name == nil then
name = consumable_key;
end
consumable.name = name;
end
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,326 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
dango_defender = nil,
dango_adrenaline = nil
};
this.is_dango_adrenaline_active = false;
local dango_defender_minimal_value = 200;
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_data_method = player_manager_type_def:get_method("get_PlayerData");
local get_ref_item_parameter_method = player_manager_type_def:get_method("get_RefItemParameter");
local player_user_data_item_parameter_type_def = get_ref_item_parameter_method:get_return_type();
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Dango Defender
local kitchen_skill_048_field = player_data_type_def:get_field("_KitchenSkill048_Damage");
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");
function this.update(player, player_data)
local item_parameter = get_ref_item_parameter_method:call(singletons.player_manager);
if item_parameter == nil then
error_handler.report("dangos.update", "Failed to access Data: item_parameter");
return;
end
this.update_generic_number_value_field("dango_defender", player_data, kitchen_skill_048_field, nil, true, dango_defender_minimal_value);
this.update_dango_adrenaline();
end
function this.update_generic_timer(dango_key, timer_owner, timer_field, is_infinite)
if is_infinite == nil then is_infinite = false; end
local timer = nil;
if timer_field ~= nil then
timer = timer_field:get_data(timer_owner);
if timer == nil then
error_handler.report("dangos.update_generic_timer", string.format("Failed to access Data: %s_timer", dango_key));
return;
end
if utils.number.is_equal(timer, 0) then
this.list[dango_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
end
this.update_generic(dango_key, 1, timer);
end
function this.update_generic_number_value_field(dango_key, timer_owner, value_field, timer_field, is_infinite, minimal_value)
if minimal_value == nil then minimal_value = 1; end
if is_infinite == nil then is_infinite = false; end
local level = 1;
if value_field ~= nil then
local value = value_field:get_data(timer_owner);
if value == nil then
error_handler.report("dangos.update_generic_number_value_field", string.format("Failed to access Data: %s_value", dango_key));
return;
end
if value < minimal_value then
this.list[dango_key] = nil;
return;
end
end
local timer = nil;
if timer_field ~= nil then
timer = timer_field:get_data(timer_owner);
if timer == nil then
error_handler.report("dangos.update_generic_number_value_field", string.format("Failed to access Data: %s_timer", dango_key));
return;
end
if value_field == nil and utils.number.is_equal(timer, 0) then
this.list[dango_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
end
this.update_generic(dango_key, level, timer);
end
function this.update_generic_boolean_value_field(dango_key, timer_owner, value_field, timer_field, is_infinite, minimal_value)
if minimal_value == nil then minimal_value = true; end
if is_infinite == nil then is_infinite = false; end
if value_field ~= nil then
local value = value_field:get_data(timer_owner);
if value == nil then
error_handler.report("dangos.update_generic_boolean_value_field", string.format("Failed to access Data: %s_value", dango_key));
return;
end
if value < minimal_value then
this.list[dango_key] = nil;
return;
end
end
local timer = nil;
if timer_field ~= nil then
timer = timer_field:get_data(timer_owner);
if timer == nil then
error_handler.report("dangos.update_generic_boolean_value_field", string.format("Failed to access Data: %s_timer", dango_key));
return;
end
if value_field == nil and utils.number.is_equal(timer, 0) then
this.list[dango_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
end
this.update_generic(dango_key, 1, timer);
end
function this.update_generic_number_value_method(dango_key, timer_owner, value_method, timer_field, is_infinite, minimal_value)
if minimal_value == nil then minimal_value = 1; end
if is_infinite == nil then is_infinite = false; end
local level = 1;
if value_method ~= nil then
local value = value_method:call(timer_owner);
if value == nil then
error_handler.report("dangos.update_generic_number_value_method", string.format("Failed to access Data: %s_value", dango_key));
return;
end
if value < minimal_value then
this.list[dango_key] = nil;
return;
end
end
local timer = nil;
if timer_field ~= nil then
timer = timer_field:get_data(timer_owner);
if timer == nil then
error_handler.report("dangos.update_generic_number_value_method", string.format("Failed to access Data: %s_timer", dango_key));
return;
end
if value_method == nil and utils.number.is_equal(timer, 0) then
this.list[dango_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
end
this.update_generic(dango_key, level, timer);
end
function this.update_generic_boolean_value_method(dango_key, timer_owner, value_method, timer_field, is_infinite, minimal_value)
if minimal_value == nil then minimal_value = true; end
if is_infinite == nil then is_infinite = false; end
if value_method ~= nil then
local value = value_method:call(timer_owner);
if value == nil then
error_handler.report("dangos.update_generic_boolean_value_method", string.format("Failed to access Data: %s_value", dango_key));
return;
end
if value ~= minimal_value then
this.list[dango_key] = nil;
return;
end
end
local timer = nil;
if timer_field ~= nil then
timer = timer_field:get_data(timer_owner);
if timer == nil then
error_handler.report("dangos.update_generic_boolean_value_method", string.format("Failed to access Data: %s_timer", dango_key));
return;
end
if value_method == nil and utils.number.is_equal(timer, 0) then
this.list[dango_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
end
this.update_generic(dango_key, 1, timer);
end
function this.update_generic(dango_key, level, timer, duration)
duration = duration or timer;
local dango = this.list[dango_key];
if dango == nil then
local name = language.current_language.dangos[dango_key];
dango = buffs.new(buffs.types.dango, dango_key, name, level, duration);
this.list[dango_key] = dango;
else
dango.level = level;
if timer ~= nil then
buffs.update_timer(dango, timer);
end
end
end
function this.update_dango_adrenaline()
if not this.is_dango_adrenaline_active then
this.list.dango_adrenaline = nil;
return;
end
this.update_generic("dango_adrenaline", 1);
end
function this.init_names()
for dango_key, dango in pairs(this.list) do
local name = language.current_language.dangos[dango_key];
if name == nil then
name = dango_key;
end
dango.name = name;
end
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,177 @@
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 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,
ruby_wirebug = nil,
gold_wirebug = nil
};
local marionette_mode_types = { "ruby_wirebug", "gold_wirebug" };
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_data_method = player_manager_type_def:get_method("get_PlayerData");
local get_ref_item_parameter_method = player_manager_type_def:get_method("get_RefItemParameter");
local player_user_data_item_parameter_type_def = get_ref_item_parameter_method:get_return_type();
local demondrug_atk_up_field = player_user_data_item_parameter_type_def:get_field("_DemondrugAtkUp");
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Cutterfly
local crit_up_ec_second_timer_field = player_data_type_def:get_field("_CritUpEcSecondTimer");
-- Clothfly
local def_up_buff_second_rate_timer_field = player_data_type_def:get_field("_DefUpBuffSecondRateTimer");
-- Ruby/Gold Wirebugs
local wirebug_powerup_timer_field = player_data_type_def:get_field("_WireBugPowerUpTimer");
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)
this.update_generic_timer("cutterfly", player_data, crit_up_ec_second_timer_field);
this.update_generic_timer("clothfly", player_data, def_up_buff_second_rate_timer_field);
this.update_ruby_and_gold_wirebugs(player, player_data);
end
function this.update_generic_timer(endemic_life_buff_key, timer_owner, timer_field, is_infinite)
if is_infinite == nil then is_infinite = false; end
local timer = nil;
if timer_field ~= nil then
timer = timer_field:get_data(timer_owner);
if timer == nil then
error_handler.report("endemic_life_buffs.update_generic_timer", string.format("Failed to access Data: %s_timer", endemic_life_buff_key));
return;
end
if utils.number.is_equal(timer, 0) then
this.list[endemic_life_buff_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
end
this.update_generic(endemic_life_buff_key, 1, timer);
end
function this.update_generic(endemic_life_buff_key, level, timer, duration)
duration = duration or timer;
if singletons.message_manager == nil then
error_handler.report("endemic_life_buffs.update_generic", "Failed to access Data: message_manager");
return;
end
local endemic_life_buff = this.list[endemic_life_buff_key];
if endemic_life_buff == nil then
local name = get_env_creature_name_message_method:call(singletons.message_manager, env_creature.creature_ids[endemic_life_buff_key]);
if name == nil then
error_handler.report("endemic_life_buffs.update_generic", string.format("Failed to access Data: %s -> name", endemic_life_buff_key));
return;
end
endemic_life_buff = buffs.new(buffs.types.endemic_life_buff, endemic_life_buff_key, name, level, duration);
this.list[endemic_life_buff_key] = endemic_life_buff;
else
endemic_life_buff.level = level;
if timer ~= nil then
buffs.update_timer(endemic_life_buff, timer);
end
end
end
function this.update_ruby_and_gold_wirebugs(player, player_data)
local marionette_mode_type = get_marionette_mode_type_method:call(player);
if marionette_mode_type == nil then
error_handler.report("endemic_life_buffs.update_ruby_and_gold_wirebugs", "Failed to access Data: marionette_mode_type");
end
if marionette_mode_type ~= 1 and marionette_mode_type ~= 2 then
this.list.ruby_wirebug = nil;
this.list.gold_wirebug = nil;
return;
elseif marionette_mode_type ~= 1 then
this.list.ruby_wirebug = nil;
else
this.list.gold_wirebug = nil;
end
local endemic_life_buff_key = marionette_mode_types[marionette_mode_type];
this.update_generic_timer(endemic_life_buff_key, player_data, wirebug_powerup_timer_field);
end
function this.init_names()
-- Nothing to do here
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");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,196 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
local 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
};
local melody_effect_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 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)");
function this.update(master_player)
local music_data_array = music_data_field:get_data(master_player);
if music_data_array == nil then
error_handler.report("melody_effects.update", "Failed to access Data: music_data_array");
return;
end
local length = get_length_method:call(music_data_array) - 1;
if length == nil then
error_handler.report("melody_effects.update", "Failed to access Data: music_data_array -> length");
return;
end
for i = 0, length do
local music_data = get_value_method:call(music_data_array, i);
if music_data == nil then
error_handler.report("melody_effects.update", "Failed to access Data: music_data No." .. tostring(i));
goto continue;
end
this.update_melody_effect(i+1, music_data);
::continue::
end
end
function this.update_melody_effect(lua_index, melody_data)
local melody_timer = time_field:get_data(melody_data);
if melody_timer == nil then
error_handler.report("melody_effects.update", "Failed to access Data: melody_timer No. " .. tostring(lua_index - 1));
return;
end
if utils.number.is_equal(melody_timer, 0) then
this.list[lua_index] = nil;
return;
end
local melody_effect = this.list[lua_index];
if melody_effect == nil then
local melody_effect_key = melody_effect_keys[lua_index];
local name = language.current_language.melody_effects[melody_effect_key];
melody_effect = buffs.new(buffs.types.melody_effect, melody_effect_key, name, 1, melody_timer / 60);
this.list[lua_index] = melody_effect;
else
buffs.update_timer(melody_effect, melody_timer / 60);
end
end
function this.init_names()
for index, dango in pairs(this.list) do
local name = language.current_language.dangos[dango.key];
if name == nil then
name = dango.key;
end
dango.name = name;
end
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end
return this;

View File

@@ -0,0 +1,315 @@
local this = {};
local buffs;
local buff_UI_entity;
local config;
local singletons;
local players;
local utils;
local language;
local error_handler;
local env_creature;
local player_info;
local time;
local abnormal_statuses;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
rousing_roar = nil,
power_drum = nil,
go_fight_win = nil
};
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_data_method = player_manager_type_def:get_method("get_PlayerData");
local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData");
-- Palico: Rousing Roar
local beast_roar_otomo_timer_field = player_data_type_def:get_field("_BeastRoarOtomoTimer");
-- Palico: Power Drum
local kijin_otomo_timer_field = player_data_type_def:get_field("_KijinOtomoTimer");
-- Palico: Go, Fight, Win
local runhigh_otomo_timer_field = player_data_type_def:get_field("_RunhighOtomoTimer");
function this.update(player_data)
this.update_generic_timer("rousing_roar", player_data, beast_roar_otomo_timer_field);
this.update_generic_timer("power_drum", player_data, kijin_otomo_timer_field);
this.update_generic_timer("go_fight_win", player_data, runhigh_otomo_timer_field);
end
function this.update_generic_timer(otomo_move_key, timer_owner, timer_field, is_infinite)
if is_infinite == nil then is_infinite = false; end
local timer = nil;
if timer_field ~= nil then
timer = timer_field:get_data(timer_owner);
if timer == nil then
error_handler.report("otomo_moves.update_generic_timer", string.format("Failed to access Data: %s_timer", otomo_move_key));
return;
end
if utils.number.is_equal(timer, 0) then
this.list[otomo_move_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
end
this.update_generic(otomo_move_key, 1, timer);
end
function this.update_generic_number_value_field(otomo_move_key, timer_owner, value_field, timer_field, is_infinite, minimal_value)
if minimal_value == nil then minimal_value = 1; end
if is_infinite == nil then is_infinite = false; end
local level = 1;
if value_field ~= nil then
local value = value_field:get_data(timer_owner);
if value == nil then
error_handler.report("otomo_moves.update_generic_number_value_field", string.format("Failed to access Data: %s_value", otomo_move_key));
return;
end
if value < minimal_value then
this.list[otomo_move_key] = nil;
return;
end
end
local timer = nil;
if timer_field ~= nil then
timer = timer_field:get_data(timer_owner);
if timer == nil then
error_handler.report("otomo_moves.update_generic_number_value_field", string.format("Failed to access Data: %s_timer", otomo_move_key));
return;
end
if value_field == nil and utils.number.is_equal(timer, 0) then
this.list[otomo_move_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
end
this.update_generic(otomo_move_key, level, timer);
end
function this.update_generic_boolean_value_field(otomo_move_key, timer_owner, value_field, timer_field, is_infinite, minimal_value)
if minimal_value == nil then minimal_value = true; end
if is_infinite == nil then is_infinite = false; end
if value_field ~= nil then
local value = value_field:get_data(timer_owner);
if value == nil then
error_handler.report("otomo_moves.update_generic_boolean_value_field", string.format("Failed to access Data: %s_value", otomo_move_key));
return;
end
if value < minimal_value then
this.list[otomo_move_key] = nil;
return;
end
end
local timer = nil;
if timer_field ~= nil then
timer = timer_field:get_data(timer_owner);
if timer == nil then
error_handler.report("otomo_moves.update_generic_boolean_value_field", string.format("Failed to access Data: %s_timer", otomo_move_key));
return;
end
if value_field == nil and utils.number.is_equal(timer, 0) then
this.list[otomo_move_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
end
this.update_generic(otomo_move_key, 1, timer);
end
function this.update_generic_number_value_method(otomo_move_key, timer_owner, value_method, timer_field, is_infinite, minimal_value)
if minimal_value == nil then minimal_value = 1; end
if is_infinite == nil then is_infinite = false; end
local level = 1;
if value_method ~= nil then
local value = value_method:call(timer_owner);
if value == nil then
error_handler.report("otomo_moves.update_generic_number_value_method", string.format("Failed to access Data: %s_value", otomo_move_key));
return;
end
if value < minimal_value then
this.list[otomo_move_key] = nil;
return;
end
end
local timer = nil;
if timer_field ~= nil then
timer = timer_field:get_data(timer_owner);
if timer == nil then
error_handler.report("otomo_moves.update_generic_number_value_method", string.format("Failed to access Data: %s_timer", otomo_move_key));
return;
end
if value_method == nil and utils.number.is_equal(timer, 0) then
this.list[otomo_move_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
end
this.update_generic(otomo_move_key, level, timer);
end
function this.update_generic_boolean_value_method(otomo_move_key, timer_owner, value_method, timer_field, is_infinite, minimal_value)
if minimal_value == nil then minimal_value = true; end
if is_infinite == nil then is_infinite = false; end
if value_method ~= nil then
local value = value_method:call(timer_owner);
if value == nil then
error_handler.report("otomo_moves.update_generic_boolean_value_method", string.format("Failed to access Data: %s_value", otomo_move_key));
return;
end
if value ~= minimal_value then
this.list[otomo_move_key] = nil;
return;
end
end
local timer = nil;
if timer_field ~= nil then
timer = timer_field:get_data(timer_owner);
if timer == nil then
error_handler.report("otomo_moves.update_generic_boolean_value_method", string.format("Failed to access Data: %s_timer", otomo_move_key));
return;
end
if value_method == nil and utils.number.is_equal(timer, 0) then
this.list[otomo_move_key] = nil;
return;
end
if is_infinite then
timer = nil;
else
timer = timer / 60;
end
end
this.update_generic(otomo_move_key, 1, timer);
end
function this.update_generic(otomo_move_key, level, timer, duration)
duration = duration or timer;
local otomo_move = this.list[otomo_move_key];
if otomo_move == nil then
local name = language.current_language.otomo_moves[otomo_move_key];
otomo_move = buffs.new(buffs.types.otomo_move, otomo_move_key, name, level, duration);
this.list[otomo_move_key] = otomo_move;
else
otomo_move.level = level;
if timer ~= nil then
buffs.update_timer(otomo_move, timer);
end
end
end
function this.init_names()
for otomo_move_key, otomo_move in pairs(this.list) do
local name = language.current_language.otomo_moves[otomo_move_key];
if name == nil then
name = otomo_move_key;
end
otomo_move.name = name;
end
end
function this.init_dependencies()
buffs = require("MHR_Overlay.Buffs.buffs");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity");
singletons = require("MHR_Overlay.Game_Handler.singletons");
players = require("MHR_Overlay.Damage_Meter.players");
language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
env_creature = require("MHR_Overlay.Endemic_Life.env_creature");
player_info = require("MHR_Overlay.Misc.player_info");
time = require("MHR_Overlay.Game_Handler.time");
abnormal_statuses = require("MHR_Overlay.Buffs.abnormal_statuses");
end
function this.init_module()
end
return this;

File diff suppressed because it is too large Load Diff

View File

@@ -8,6 +8,7 @@ local ailments;
local singletons; local singletons;
local non_players; local non_players;
local utils; local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -106,11 +107,13 @@ function this.update_damage(enemy, enemy_calc_damage_info)
local is_large_monster = is_boss_enemy_method:call(enemy); local is_large_monster = is_boss_enemy_method:call(enemy);
if is_large_monster == nil then if is_large_monster == nil then
error_handler.report("damage_hook.update_damage", "Failed to access Data: is_large_monster");
return; return;
end end
local dead_or_captured = check_die_method:call(enemy); local dead_or_captured = check_die_method:call(enemy);
if dead_or_captured == nil then if dead_or_captured == nil then
error_handler.report("damage_hook.update_damage", "Failed to access Data: dead_or_captured");
return; return;
end end
@@ -260,14 +263,8 @@ end
function this.cart(dead_player_id, flag_cat_skill_insurance) function this.cart(dead_player_id, flag_cat_skill_insurance)
-- flag_cat_skill_insurance = 0 -- flag_cat_skill_insurance = 0
-- flag_cat_skill_insurance = 1 -- flag_cat_skill_insurance = 1
local player = players.list[dead_player_id];
if player == nil then
return;
end
player.cart_count = player.cart_count + 1; quest_status.update_cart_count();
quest_status.get_cart_count();
end end
function this.on_stock_direct_marionette_finish_shoot_hit_parts_damage(enemy, damage_rate, is_endure, is_ignore_multi_rate, category, no) function this.on_stock_direct_marionette_finish_shoot_hit_parts_damage(enemy, damage_rate, is_endure, is_ignore_multi_rate, category, no)
@@ -295,6 +292,7 @@ function this.on_stock_direct_marionette_finish_shoot_hit_parts_damage(enemy, da
end end
if player == nil then if player == nil then
error_handler.report("damage_hook.on_stock_direct_marionette_finish_shoot_hit_parts_damage", "Failed to create Player Entry");
return; return;
end end
@@ -354,11 +352,13 @@ function this.on_anomaly_core_break(anomaly_core_part)
end end
if anomaly_monster == nil then if anomaly_monster == nil then
error_handler.report("damage_hook.on_anomaly_core_break", "No Anomaly Monster Found");
return; return;
end end
local anomaly_core_break_damage_rate = get_mystery_core_break_damage_rate_method:call(anomaly_monster.enemy); 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 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; return;
end end
@@ -373,7 +373,7 @@ function this.on_anomaly_core_break(anomaly_core_part)
players.update_damage(players.total, players.damage_types.anomaly_core, true, damage_object); players.update_damage(players.total, players.damage_types.anomaly_core, true, damage_object);
end end
function this.init_module() function this.init_dependencies()
quest_status = require("MHR_Overlay.Game_Handler.quest_status"); quest_status = require("MHR_Overlay.Game_Handler.quest_status");
players = require("MHR_Overlay.Damage_Meter.players"); players = require("MHR_Overlay.Damage_Meter.players");
small_monster = require("MHR_Overlay.Monsters.small_monster"); small_monster = require("MHR_Overlay.Monsters.small_monster");
@@ -382,7 +382,10 @@ function this.init_module()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
non_players = require("MHR_Overlay.Damage_Meter.non_players"); non_players = require("MHR_Overlay.Damage_Meter.non_players");
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
sdk.hook(stock_direct_marionette_finish_shoot_hit_parts_damage_method, function(args) sdk.hook(stock_direct_marionette_finish_shoot_hit_parts_damage_method, function(args)
local enemy = sdk.to_managed_object(args[2]); local enemy = sdk.to_managed_object(args[2]);
local damage_rate = sdk.to_float(args[3]); local damage_rate = sdk.to_float(args[3]);

View File

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

View File

@@ -10,6 +10,8 @@ local drawing;
local language; local language;
local non_players; local non_players;
local utils; local utils;
local error_handler;
local large_monster;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -48,8 +50,6 @@ this.myself = nil;
this.myself_position = Vector3f.new(0, 0, 0); this.myself_position = Vector3f.new(0, 0, 0);
this.total = nil; this.total = nil;
this.display_list = {};
this.highlighted_damage_UI = nil; this.highlighted_damage_UI = nil;
this.damage_types = { this.damage_types = {
@@ -90,8 +90,8 @@ function this.new(id, name, master_rank, hunter_rank, type)
player.cart_count = 0; player.cart_count = 0;
player.join_time = -1; player.join_time = utils.constants.uninitialized_int;
player.first_hit_time = -1; player.first_hit_time = utils.constants.uninitialized_int;
player.dps = 0; player.dps = 0;
player.small_monsters = this.init_damage_sources(); player.small_monsters = this.init_damage_sources();
@@ -136,11 +136,12 @@ function this.get_player(player_id)
end end
function this.update_damage(player, damage_source_type, is_large_monster, damage_object) function this.update_damage(player, damage_source_type, is_large_monster, damage_object)
if player == nil then if player == nil then
return; return;
end end
if player.first_hit_time == -1 then if player.first_hit_time == utils.constants.uninitialized_int then
player.first_hit_time = time.total_elapsed_script_seconds; player.first_hit_time = time.total_elapsed_script_seconds;
end end
@@ -155,6 +156,7 @@ end
function this.update_display(player) function this.update_display(player)
if player == nil then if player == nil then
error_handler.report("players.update_display", "Missing Parameter: player");
return; return;
end end
@@ -359,7 +361,7 @@ end
function this.update_player_dps(player) function this.update_player_dps(player)
local cached_config = config.current_config.damage_meter_UI.settings; local cached_config = config.current_config.damage_meter_UI.settings;
if player.join_time == -1 then if player.join_time == utils.constants.uninitialized_int then
player.join_time = time.total_elapsed_script_seconds; player.join_time = time.total_elapsed_script_seconds;
end end
@@ -380,54 +382,6 @@ function this.update_player_dps(player)
this.total.dps = this.total.dps + player.dps; this.total.dps = this.total.dps + player.dps;
end end
function this.sort_players()
local cached_config = config.current_config.damage_meter_UI;
if cached_config.settings.my_damage_bar_location == "Normal" then
table.insert(this.display_list, this.myself);
end
-- sort here
if cached_config.sorting.type == "Normal" then
if cached_config.sorting.reversed_order then
table.sort(this.display_list, function(left, right)
return left.id > right.id;
end);
else
table.sort(this.display_list, function(left, right)
return left.id < right.id;
end);
end
elseif cached_config.sorting.type == "DPS" then
if cached_config.sorting.reversed_order then
table.sort(this.display_list, function(left, right)
return left.dps < right.dps;
end);
else
table.sort(this.display_list, function(left, right)
return left.dps > right.dps;
end);
end
else
if cached_config.sorting.reversed_order then
table.sort(this.display_list, function(left, right)
return left.display.total_damage < right.display.total_damage;
end);
else
table.sort(this.display_list, function(left, right)
return left.display.total_damage > right.display.total_damage;
end);
end
end
if cached_config.settings.my_damage_bar_location == "First" then
table.insert(this.display_list, 1, this.myself);
elseif cached_config.settings.my_damage_bar_location == "Last" then
table.insert(this.display_list, this.myself);
end
end
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager"); local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local find_master_player_method = player_manager_type_def:get_method("findMasterPlayer"); local find_master_player_method = player_manager_type_def:get_method("findMasterPlayer");
@@ -436,27 +390,33 @@ local get_pos_field = player_base_type_def:get_method("get_Pos");
function this.update_myself_position() function this.update_myself_position()
if singletons.player_manager == nil then if singletons.player_manager == nil then
customization_menu.status = "No player manager"; error_handler.report("players.update_myself_position", "Failed to access Data: player_manager");
return;
end
if quest_status.flow_state == quest_status.flow_states.NONE
or quest_status.flow_state == quest_status.flow_states.CUTSCENE then
return; return;
end end
local master_player = find_master_player_method:call(singletons.player_manager); local master_player = find_master_player_method:call(singletons.player_manager);
if master_player == nil then if master_player == nil then
customization_menu.status = "No master player"; error_handler.report("players.update_myself_position", "Failed to access Data: master_player");
return; return;
end end
local position = get_pos_field:call(master_player); local position = get_pos_field:call(master_player);
if position ~= nil then if position == nil then
this.myself_position = position; error_handler.report("players.update_myself_position", "Failed to access Data: position");
end end
this.myself_position = position;
end end
function this.init() function this.init()
this.list = {}; this.list = {};
this.display_list = {};
this.total = this.new(0, "Total", 0, 0, this.types.total); this.total = this.new(0, "Total", 0, 0, this.types.total);
this.myself = this.new(-1, "DummyMHROverlay", -1, -1, this.types.myself); this.myself = this.new(-1, "MHROverlayDummy", -1, -1, this.types.myself);
end end
local lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager"); local lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager");
@@ -486,35 +446,45 @@ local get_master_rank_method = progress_manager_type_def:get_method("get_MasterR
local get_master_player_id_method = player_manager_type_def:get_method("getMasterPlayerID"); local get_master_player_id_method = player_manager_type_def:get_method("getMasterPlayerID");
function this.update_player_list(is_on_quest) function this.update_players()
local is_on_quest = quest_status.flow_state ~= quest_status.flow_states.IN_LOBBY and quest_status.flow_state ~= quest_status.flow_states.IN_TRAINING_AREA;
if is_on_quest then if is_on_quest then
this.update_player_list_(quest_hunter_info_field); this.update_player_list(quest_hunter_info_field);
else else
this.update_player_list_(hunter_info_field); this.update_player_list(hunter_info_field);
end end
non_players.update_servant_list();
non_players.update_otomo_list(is_on_quest, quest_status.is_online);
this.update_dps(false);
quest_status.update_cart_count();
end end
function this.update_player_list_(hunter_info_field_) function this.update_player_list(hunter_info_field_)
local cached_config = config.current_config.damage_meter_UI; local cached_config = config.current_config.damage_meter_UI;
if singletons.lobby_manager == nil then if singletons.lobby_manager == nil then
error_handler.report("players.update_player_list", "Failed to access Data: lobby_manager");
return; return;
end end
if singletons.progress_manager == nil then if singletons.progress_manager == nil then
error_handler.report("players.update_player_list", "Failed to access Data: progress_manager");
return; return;
end end
-- myself player -- myself player
local myself_player_info = my_hunter_info_field:get_data(singletons.lobby_manager); local myself_player_info = my_hunter_info_field:get_data(singletons.lobby_manager);
if myself_player_info == nil then if myself_player_info == nil then
customization_menu.status = "No myself player info list"; error_handler.report("players.update_player_list", "Failed to access Data: myself_player_info");
return; return;
end end
local myself_player_name = name_field:get_data(myself_player_info); local myself_player_name = name_field:get_data(myself_player_info);
if myself_player_name == nil then if myself_player_name == nil then
customization_menu.status = "No myself player name"; error_handler.report("players.update_player_list", "Failed to access Data: myself_player_name");
return; return;
end end
@@ -524,7 +494,7 @@ function this.update_player_list_(hunter_info_field_)
local myself_id = get_master_player_id_method:call(singletons.player_manager); local myself_id = get_master_player_id_method:call(singletons.player_manager);
if myself_id == nil then if myself_id == nil then
customization_menu.status = "No myself player id"; error_handler.report("players.update_player_list", "Failed to access Data: myself_id");
return; return;
end end
@@ -535,28 +505,29 @@ function this.update_player_list_(hunter_info_field_)
end end
-- other players -- other players
local player_info_list = hunter_info_field_:get_data(singletons.lobby_manager); local player_info_array = hunter_info_field_:get_data(singletons.lobby_manager);
if player_info_list == nil then if player_info_array == nil then
customization_menu.status = "No player info list"; error_handler.report("players.update_player_list", "Failed to access Data: player_info_array");
return; return;
end end
local count = get_count_method:call(player_info_list); local count = get_count_method:call(player_info_array);
if count == nil then if count == nil then
customization_menu.status = "No player info list count"; error_handler.report("players.update_player_list", "Failed to access Data: player_info_array -> count");
return; return;
end end
for i = 0, count - 1 do for i = 0, count - 1 do
local player_info = get_item_method:call(player_info_list, i); local player_info = get_item_method:call(player_info_array, i);
if player_info == nil then if player_info == nil then
goto continue error_handler.report("players.update_player_list", "Failed to access Data: player_info No. " .. tostring(i));
goto continue;
end end
local id = member_index_field:get_data(player_info); local id = member_index_field:get_data(player_info);
if id == nil then if id == nil then
goto continue error_handler.report("players.update_player_list", string.format("Failed to access Data: player_info No. %d -> id", i));
goto continue;
end end
local hunter_rank = hunter_rank_field:get_data(player_info) or 0; local hunter_rank = hunter_rank_field:get_data(player_info) or 0;
@@ -564,13 +535,13 @@ function this.update_player_list_(hunter_info_field_)
local name = name_field:get_data(player_info); local name = name_field:get_data(player_info);
if name == nil then if name == nil then
goto continue error_handler.report("players.update_player_list", string.format("Failed to access Data: player_info No. %d -> name", i));
goto continue;
end end
local player = this.list[id]; local player = this.list[id];
if player == nil then if player == nil then
if name == this.myself.name then if name == this.myself.name then
player = this.new(id, name, master_rank, hunter_rank, this.types.myself); player = this.new(id, name, master_rank, hunter_rank, this.types.myself);
this.myself = player; this.myself = player;
@@ -592,10 +563,6 @@ function this.update_player_list_(hunter_info_field_)
end end
end end
if player ~= this.myself then
table.insert(this.display_list, player);
end
::continue:: ::continue::
end end
end end
@@ -622,7 +589,7 @@ function this.draw(player, position_on_screen, opacity_scale, top_damage, top_dp
damage_UI_entity.draw(player, position_on_screen, opacity_scale, top_damage, top_dps); damage_UI_entity.draw(player, position_on_screen, opacity_scale, top_damage, top_dps);
end end
function this.init_module() function this.init_dependencies()
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
@@ -633,7 +600,11 @@ function this.init_module()
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
non_players = require("MHR_Overlay.Damage_Meter.non_players"); non_players = require("MHR_Overlay.Damage_Meter.non_players");
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
large_monster = require("MHR_Overlay.Monsters.large_monster");
end
function this.init_module()
this.init(); this.init();
end end

View File

@@ -5,6 +5,7 @@ local customization_menu;
local singletons; local singletons;
local config; local config;
local utils; local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -40,6 +41,13 @@ local package = package;
this.list = {}; this.list = {};
this.creature_ids = {
cutterfly = 50,
clothfly = 7,
ruby_wirebug = 62,
gold_wirebug = 63
};
function this.new(REcreature) function this.new(REcreature)
local creature = {}; local creature = {};
@@ -80,15 +88,17 @@ local get_pos_method = environment_creature_base_type_def:get_method("get_Pos");
function this.init(creature, REcreature) function this.init(creature, REcreature)
local creature_type = creature_type_field:get_data(REcreature); local creature_type = creature_type_field:get_data(REcreature);
if creature_type == nil then if creature_type == nil then
customization_menu.status = "No env creature type"; error_handler.report("env_creature.init", "Failed to access Data: creature_type");
return; return;
end end
local creature_name = get_env_creature_name_message_method:call(singletons.message_manager, local creature_name = get_env_creature_name_message_method:call(singletons.message_manager, creature_type);
creature_type); if creature_name == nil then
if creature_name ~= nil then error_handler.report("env_creature.init", "Failed to access Data: creature_name");
creature.name = creature_name; return;
end end
creature.name = creature_name;
end end
function this.init_UI(creature) function this.init_UI(creature)
@@ -110,9 +120,11 @@ function this.update_position(REcreature, creature)
end end
local position = get_pos_method:call(REcreature); local position = get_pos_method:call(REcreature);
if position ~= nil then if position == nil then
creature.position = position; error_handler.report("env_creature.update_position", "Failed to access Data: position");
end end
creature.position = position;
end end
function this.update(REcreature, creature) function this.update(REcreature, creature)
@@ -125,9 +137,11 @@ function this.update(REcreature, creature)
end end
local is_inactive = creature_is_inactive_field:get_data(REcreature); local is_inactive = creature_is_inactive_field:get_data(REcreature);
if is_inactive ~= nil then if is_inactive == nil then
creature.is_inactive = is_inactive; error_handler.report("env_creature.update", "Failed to access Data: is_inactive");
end end
creature.is_inactive = is_inactive;
end end
function this.draw(creature, position_on_screen, opacity_scale) function this.draw(creature, position_on_screen, opacity_scale)
@@ -143,7 +157,7 @@ function this.init_list()
this.list = {}; this.list = {};
end end
function this.init_module() function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -154,6 +168,10 @@ function this.init_module()
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
--ailments = require("MHR_Overlay.Monsters.ailments"); --ailments = require("MHR_Overlay.Monsters.ailments");
--ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity"); --ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,6 +2,7 @@ local this = {};
local utils; local utils;
local language; local language;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -83,13 +84,18 @@ function this.init_default()
}, },
module_visibility = { module_visibility = {
in_lobby = {
stats_UI = true
},
in_training_area = { in_training_area = {
large_monster_dynamic_UI = true, large_monster_dynamic_UI = true,
large_monster_static_UI = true, large_monster_static_UI = true,
large_monster_highlighted_UI = true, large_monster_highlighted_UI = true,
damage_meter_UI = true, damage_meter_UI = true,
endemic_life_UI = true, endemic_life_UI = true,
--buff_UI = true buff_UI = true,
stats_UI = true
}, },
cutscene = { cutscene = {
@@ -100,7 +106,8 @@ function this.init_default()
time_UI = false, time_UI = false,
damage_meter_UI = false, damage_meter_UI = false,
endemic_life_UI = false, endemic_life_UI = false,
--buff_UI = false buff_UI = false,
stats_UI = false
}, },
loading_quest = { loading_quest = {
@@ -111,7 +118,8 @@ function this.init_default()
time_UI = false, time_UI = false,
damage_meter_UI = false, damage_meter_UI = false,
endemic_life_UI = false, endemic_life_UI = false,
--buff_UI = false buff_UI = false,
stats_UI = false
}, },
quest_start_animation = { quest_start_animation = {
@@ -122,7 +130,8 @@ function this.init_default()
time_UI = true, time_UI = true,
damage_meter_UI = true, damage_meter_UI = true,
endemic_life_UI = true, endemic_life_UI = true,
--buff_UI = true buff_UI = true,
stats_UI = true
}, },
playing_quest = { playing_quest = {
@@ -133,7 +142,8 @@ function this.init_default()
time_UI = true, time_UI = true,
damage_meter_UI = true, damage_meter_UI = true,
endemic_life_UI = true, endemic_life_UI = true,
--buff_UI = true buff_UI = true,
stats_UI = true
}, },
killcam = { killcam = {
@@ -144,7 +154,8 @@ function this.init_default()
time_UI = true, time_UI = true,
damage_meter_UI = true, damage_meter_UI = true,
endemic_life_UI = true, endemic_life_UI = true,
--buff_UI = true buff_UI = true,
stats_UI = true
}, },
quest_end_timer = { quest_end_timer = {
@@ -155,7 +166,8 @@ function this.init_default()
time_UI = true, time_UI = true,
damage_meter_UI = true, damage_meter_UI = true,
endemic_life_UI = true, endemic_life_UI = true,
--buff_UI = true buff_UI = true,
stats_UI = true
}, },
quest_end_animation = { quest_end_animation = {
@@ -166,7 +178,8 @@ function this.init_default()
time_UI = false, time_UI = false,
damage_meter_UI = false, damage_meter_UI = false,
endemic_life_UI = false, endemic_life_UI = false,
--buff_UI = false buff_UI = false,
stats_UI = false
}, },
quest_end_screen = { quest_end_screen = {
@@ -177,7 +190,9 @@ function this.init_default()
time_UI = false, time_UI = false,
damage_meter_UI = false, damage_meter_UI = false,
endemic_life_UI = false, endemic_life_UI = false,
--buff_UI = false buff_UI = false,
stats_UI = false
}, },
reward_screen = { reward_screen = {
@@ -188,7 +203,8 @@ function this.init_default()
time_UI = true, time_UI = true,
damage_meter_UI = true, damage_meter_UI = true,
endemic_life_UI = false, endemic_life_UI = false,
--buff_UI = false buff_UI = false,
stats_UI = false
}, },
summary_screen = { summary_screen = {
@@ -199,7 +215,8 @@ function this.init_default()
time_UI = true, time_UI = true,
damage_meter_UI = true, damage_meter_UI = true,
endemic_life_UI = false, endemic_life_UI = false,
--buff_UI = false buff_UI = false,
stats_UI = false
}, },
}, },
@@ -476,6 +493,11 @@ function this.init_default()
y = 40 y = 40
}, },
relative_offset = {
x = 0,
y = 45
},
spacing = { spacing = {
x = 0, x = 0,
y = 24 y = 24
@@ -6118,6 +6140,7 @@ function this.init_default()
x = 205, x = 205,
y = 0 y = 0
}, },
color = 0xFFF59FC4, color = 0xFFF59FC4,
shadow = { shadow = {
@@ -7034,10 +7057,10 @@ function this.init_default()
visibility = true, visibility = true,
settings = { settings = {
right_alignment_shift = 0 right_alignment_shift = 6
}, },
text_formatting = "%6.1f%%", text_formatting = "%.1f%%",
offset = { offset = {
x = 262, x = 262,
@@ -7452,7 +7475,7 @@ function this.init_default()
} }
}, },
--[[buff_UI = { buff_UI = {
enabled = true, enabled = true,
settings = { settings = {
@@ -7487,6 +7510,10 @@ function this.init_default()
text_formatting = "%s", text_formatting = "%s",
include = {
skill_level = true
},
offset = { offset = {
x = 5, x = 5,
y = 0 y = 0
@@ -7564,7 +7591,437 @@ function this.init_default()
outline = 0xC0000000 outline = 0xC0000000
} }
} }
}]] },
stats_UI = {
enabled = false,
position = {
x = 0,
y = 0,
-- Possible values: "Top-Left", "Top-Right", "Bottom-Left", "Bottom-Right"
anchor = "Bottom-Right"
},
health_label = {
visibility = false,
settings = {
right_alignment_shift = 16
},
text_formatting = "%s",
include = {
name = true,
value = true,
max_value = true
},
offset = {
x = -514,
y = -35
},
color = 0xFFFEFF88,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
stamina_label = {
visibility = false,
settings = {
right_alignment_shift = 16
},
text_formatting = "%s",
include = {
name = true,
value = true,
max_value = true
},
offset = {
x = -382,
y = -35
},
color = 0xFFFEFF88,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
attack_label = {
visibility = true,
settings = {
right_alignment_shift = 11
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -353,
y = -17
},
color = 0xFFF27979,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
affinity_label = {
visibility = true,
settings = {
right_alignment_shift = 14
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -242,
y = -17
},
color = 0xFFF27979,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
defense_label = {
visibility = true,
settings = {
right_alignment_shift = 13
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -103,
y = -17
},
color = 0xFFBFF7FF,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
fire_resistance_label = {
visibility = false,
settings = {
right_alignment_shift = 13
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -625,
y = -53
},
color = 0xFFF27979,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
water_resistance_label = {
visibility = false,
settings = {
right_alignment_shift = 14
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -507,
y = -53
},
color = 0xFF7AB8F8,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
thunder_resistance_label = {
visibility = false,
settings = {
right_alignment_shift = 16
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -382,
y = -53
},
color = 0xFFFEFF88,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
ice_resistance_label = {
visibility = false,
settings = {
right_alignment_shift = 12
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -228,
y = -53
},
color = 0xFFBFF7FF,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
dragon_resistance_label = {
visibility = false,
settings = {
right_alignment_shift = 15
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -117,
y = -53
},
color = 0xFFB999FF,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
element_label = {
visibility = false,
settings = {
right_alignment_shift = 14
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -110,
y = -35
},
color = 0xFFF59FC4,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
element_2_label = {
visibility = false,
settings = {
right_alignment_shift = 14
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -242,
y = -35
},
color = 0xFFF59FC4,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
},
debug = {
history_size = 64
},
customization_menu = {
position = {
x = 360,
y = 50
},
size = {
width = 785,
height = 500
},
pivot = {
x = 0,
y = 0
}
}
}; };
end end
@@ -7572,7 +8029,7 @@ function this.load_current_config_value()
local loaded_config = json.load_file(this.current_config_value_file_name); local loaded_config = json.load_file(this.current_config_value_file_name);
if loaded_config ~= nil then if loaded_config ~= nil then
if loaded_config.config == nil then if loaded_config.config == nil then
log.info("[MHR Overlay] old config.json loaded successfully"); log.info("[MHR Overlay] Old config.json Loaded Successfully");
local config_save = { local config_save = {
config = this.current_config_name config = this.current_config_name
@@ -7590,11 +8047,12 @@ function this.load_current_config_value()
is_old_config_transferred = true; is_old_config_transferred = true;
else else
log.info("[MHR Overlay] config.json loaded successfully"); log.info("[MHR Overlay] config.json Loaded Successfully");
this.current_config_name = loaded_config.config; this.current_config_name = loaded_config.config;
end end
else else
log.error("[MHR Overlay] Failed to load config.json"); log.error("[MHR Overlay] Failed to Load config.json");
error_handler.report("config.load_current_config_value", "Failed to Load config.json");
end end
end end
@@ -7615,8 +8073,7 @@ function this.load_configs()
local loaded_config = json.load_file(config_file_name); local loaded_config = json.load_file(config_file_name);
if loaded_config ~= nil then if loaded_config ~= nil then
log.info("[MHR Overlay] " .. config_name .. ".json loaded successfully"); log.info(string.format("[MHR Overlay] %s.json Loaded Successfully", config_name));
local merged_config = utils.table.merge(this.default_config, loaded_config); local merged_config = utils.table.merge(this.default_config, loaded_config);
merged_config.version = this.version; merged_config.version = this.version;
@@ -7630,7 +8087,8 @@ function this.load_configs()
this.current_config = merged_config; this.current_config = merged_config;
end end
else else
log.error("[MHR Overlay] Failed to load " .. config_name .. ".json"); log.error(string.format("[MHR Overlay] Failed to Load %s.json", config_name));
error_handler.report("config.load_configs", string.format("Failed to Load %s.json", config_name));
end end
::continue:: ::continue::
@@ -7664,7 +8122,8 @@ function this.save(file_name, config_table)
if success then if success then
log.info("[MHR Overlay] " .. file_name .. " saved successfully"); log.info("[MHR Overlay] " .. file_name .. " saved successfully");
else else
log.error("[MHR Overlay] Failed to save " .. file_name); error_handler.report("config.load_configs", string.format("Failed to Save %s", file_name));
log.error(string.format("[MHR Overlay] Failed to Save %s", file_name));
end end
end end
@@ -7716,10 +8175,13 @@ function this.update(index)
this.save_current_config_name(); this.save_current_config_name();
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
this.init_default(); this.init_default();
this.load_current_config_value(); this.load_current_config_value();
this.load_configs(); this.load_configs();

View File

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

View File

@@ -1,6 +1,7 @@
local this = {}; local this = {};
local utils; local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -170,12 +171,15 @@ this.default_language = {
sleep = "Sleep", sleep = "Sleep",
stun = "Stun", stun = "Stun",
flash = "Flash", flash = "Flash",
poison = "Poison",
blast = "Blast", blast = "Blast",
exhaust = "Exhaust", exhaust = "Exhaust",
ride = "Wyvern Riding", ride = "Wyvern Riding",
waterblight = "Waterblight",
poison = "Poison",
deadly_poison = "Deadly Poison",
fireblight = "Fireblight", fireblight = "Fireblight",
waterblight = "Waterblight",
iceblight = "Iceblight", iceblight = "Iceblight",
thunderblight = "Thunderblight", thunderblight = "Thunderblight",
@@ -186,7 +190,283 @@ this.default_language = {
steel_fang = "Steel Fang", steel_fang = "Steel Fang",
quick_sand = "Quick Sand", quick_sand = "Quick Sand",
fall_otomo_trap = "Fall Buddy Trap", fall_otomo_trap = "Fall Buddy Trap",
shock_otomo_trap = "Shock Buddy Trap" shock_otomo_trap = "Shock Buddy Trap",
dragonblight = "Dragonblight",
blastblight = "Blastblight",
hellfireblight = "Hellfireblight",
bloodblight = "Bloodblight",
frostblight = "Frostblight",
minor_bubbleblight = "Minor Bubbleblight",
major_bubbleblight = "Major Bubbleblight",
defense_down = "Defense Down",
resistance_down = "Resistance Down",
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"
},
consumables = {
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"
},
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"
},
skills = {
-- attack_boost = "Attack Boost",
agitator = "Agitator",
peak_performance = "Peak Performance",
resentment = "Resentment",
resuscitate = "Resuscitate",
-- critical_eye = "Critical Eye",
-- critical_boost = "Critical Boost",
-- weakness_exploit = "Weakness Exploit",
latent_power = "Latent Power",
maximum_might = "Maximum Might",
-- critical_element = "Critical Element",
-- masters_touch = "Master's Touch",
-- fire_attack = "Fire Attack",
-- water_attack = "Water Attack",
-- ice_attack = "Ice Attack",
-- thunder_attack = "Thunder Attack",
-- dragon_attack = "Dragon Attack",
-- poison_attack = "Poison Attack",
-- paralysis_attack = "Paralysis Attack",
-- sleep_attack = "Sleep Attack",
-- blast_attack = "Blast Attack",
-- handicraft = "Handicraft",
-- razor_sharp = "Razor Sharp",
-- spare_shot = "Spare Shot",
protective_polish = "Protective Polish",
-- minds_eye = "Mind's Eye",
-- ballistics = "Ballistics",
-- bludgeoner = "Bludgeoner",
-- bow_charge_plus = "Bow Charge Plus",
-- focus = "Focus",
-- power_prolonger = "Power Prolonger",
-- marathon_runner = "Marathon Runner",
-- constitution= "Constitution",
-- stamina_surge = "Stamina Surge",
-- guard = "Guard",
-- guard_up = "Guard Up",
offensive_guard = "Offensive Guard",
-- critical_draw = "Critical Draw",
-- punishing_draw = "Punishing Draw",
-- quick_sheathe = "Quick Sheathe",
-- slugger = "Slugger",
-- stamina_thief = "Stamina Thief",
affinity_sliding = "Affinity Sliding",
-- horn_maestro = "Horn Maestro",
-- artillery = "Artillery",
-- load_shells = "Load Shells",
-- special_ammo_boost = "Special Ammo Boost",
-- normal_rapid_up = "Normal/Rapid Up",
-- pierce_up = "Pierce Up",
-- spread_up = "Spread Up",
-- ammo_up = "Ammo Up",
-- reload_speed = "Reload Speed",
-- recoil_down = "Recoil Down",
-- steadiness = "Steadiness",
-- rapid_fire_up = "Rapid Fire Up",
-- defense_boost = "Defense Boost",
-- divine_blessing = "Divine Blessing",
-- recovery_up = "Recovery Up",
-- recovery_speed = "Recovery Speed",
-- speed_eating = "Speed Eating",
-- earplugs = "Earplugs",
-- windproof = "Windproof",
-- tremor_resistance = "Tremor Resistance",
-- bubbly_dance = "Bubbly Dance",
-- evade_window = "Evade Window",
-- evade_extender = "Evade Extender",
-- fire_resistance = "Fire Resistance",
-- water_resistance = "Water Resistance",
-- ice_resistance = "Ice Resistance",
-- thunder_resistance = "Thunder Resistance",
-- Dragon_resistance = "Dragon Resistance",
-- blight_resistance = "Blight Resistance",
-- poison_resistance = "Poison Resistance",
-- paralysis_resistance = "Paralysis Resistance",
-- sleep_resistance = "Sleep Resistance",
-- stun_resistance = "Stun Resistance",
-- muck_resistance = "Muck Resistance",
-- blast_resistance = "Blast Resistance",
-- botanist = "Botanist",
-- geologist = "Geologist",
-- partbreaker = "Partbreaker",
-- capture_master = "Capture Master",
-- carving_master = "Carving Master",
-- good_luck = "Good Luck",
-- speed_sharpening = "Speed Sharpening",
-- bombardier = "Bombardier",
-- mushroomancer = "Mushroomancer",
-- item_prolonger = "Item Prolonger",
-- wide_range = "Wide-Range",
-- free_meal = "Free Meal",
heroics = "Heroics",
-- fortify = "Fortify",
-- flinch_free = "Flinch Free",
-- jump_master = "Jump Master",
-- carving_pro = "Carving Pro",
-- hunger_resistance = "Hunger Resistance",
-- leap_of_faith = "Leap of Faith",
-- diversion = "Diversion",
-- master_mounter = "Master Mounter",
-- chameleos_blessing = "Chameleos Blessing",
-- kushala_blessing = "Kushala Blessing",
-- teostra_blessing = "Teostra Blessing",
dragonheart = "Dragonheart",
-- wirebug_whisperer = "Wirebug Whisperer",
wall_runner = "Wall Runner",
counterstrike = "Counterstrike",
-- rapid_morph = "Rapid Morph",
hellfire_cloak = "Hellfire Cloak",
-- wind_alignment = "Wind Alignment",
-- thunder_alignment = "Thunder Alignment",
-- stormsoul = "Stormsoul",
-- blood_rite = "Blood Rite",
dereliction = "Dereliction",
furious = "Furious",
-- mail_of_hellfire = "Mail of Hellfire",
coalescence = "Coalescence",
bloodlust = "Bloodlust",
-- defiance = "Defiance",
-- sneak_attack = "Sneak Attack",
adrenaline_rush = "Adrenaline Rush",
-- redirection = "Redirection",
-- spiribirds_call = "Spiribird's Call",
-- charge_master = "Charge Master",
-- foray = "Foray",
-- tune_up = "Tune-Up",
grinder_s = "Grinder (S)",
-- bladescale_hone = "Bladescale Hone",
-- wall_runner_boost = "Wall Runner (Boost)",
-- quick_breath = "Quick Breath",
-- element_exploit = "Element Exploit",
burst = "Burst",
-- guts = "Guts",
status_trigger = "Status Trigger",
intrepid_heart = "Intrepid Heart",
-- buildup_boost = "Buildup Boost",
-- embolden = "Embolden",
wind_mantle = "Wind Mantle",
-- powder_mantle = "Powder Mantle",
-- berserk = "Berserk",
-- strife = "Strife",
-- frostcraft = "Frostcraft",
-- dragon_conversion = "Dragon Conversion",
heaven_sent = "Heaven-Sent",
frenzied_bloodlust = "Frenzied Bloodlust",
-- blood_awakening = "Blood Awakening",
-- shock_absorber = "Shock Absorber",
-- inspiration = "Inspiration",
kushala_daora_soul = "Kushala Daora Soul",
},
dangos = {
dango_hurler = "Dango Hurler",
dango_specialist = "Dango Specialist",
dango_deflector = "Dango Deflector",
dango_bulker = "Dango Bulker",
dango_booster = "Dango Booster",
dango_slugger = "Dango Slugger",
dango_bombardier = "Dango Bombardier",
dango_temper = "Dango Temper",
dango_connector = "Dango Connector",
dango_insurance = "Dango Insurance",
dango_defender_hi = "Dango Defender (Hi)",
dango_medic = "Dango Medic",
dango_medic_hi = "Dango Medic (Hi)",
dango_reviver = "Dango Reviver",
dango_immunizer = "Dango Immunizer",
dango_fire_res = "Dango Fire Res",
dango_water_res = "Dango Water Res",
dango_thunder_res = "Dango Thunder Res ",
dango_ice_res = "Dango Ice Res",
dango_dragon_res = "Dango Dragon Res",
dango_fire_res_hi = "Dango Fire Res (Hi)",
dango_water_res_hi = "Dango Water Res (Hi)",
dango_thunder_res_hi = "Dango Thunder Res (Hi)",
dango_ice_res_hi = "Dango Ice Res (Hi)",
dango_dragon_res_hi = "Dango Dragon Res (Hi)",
dango_moxie = "Dango Moxie",
dango_adrenaline = "Dango Adrenaline",
dango_defender = "Dango Defender",
dango_guard = "Dango Guard",
dango_driver = "Dango Driver",
dango_polisher = "Dango Polisher",
dango_pyro = "Dango Pyro",
dango_feet = "Dango Feet",
dango_marksman = "Dango Marksman",
dango_wall_runner = "Dango Wall Runner",
dango_fighter = "Dango Fighter",
dango_glutton = "Dango Glutton",
dango_weakener = "Dango Weakener",
dango_rider = "Dango Rider",
dango_hunter = "Dango Hunter",
dango_shifter = "Dango Shifter",
super_recovery_dango = "Super Recovery Dango",
dango_flyer = "Dango Flyer"
},
otomo_moves = {
rousing_roar = "Rousing Roar",
power_drum = "Power Drum",
go_fight_win = "Go, Fight, Win"
}, },
UI = { UI = {
@@ -563,7 +843,49 @@ this.default_language = {
top_to_bottom = "Top to Bottom", top_to_bottom = "Top to Bottom",
bottom_to_top = "Bottom to Top", bottom_to_top = "Bottom to Top",
right_alignment_shift = "Right Alignment Shift" right_alignment_shift = "Right Alignment Shift",
debug = "Debug",
current_time = "Current Time",
everything_seems_to_be_ok = "Everything seems to be OK!",
history = "History",
history_size = "History Size",
value = "Value",
stats_UI = "Stats UI",
health_label = "Health Label",
stamina_label = "Stamina Label",
attack_label = "Attack Label",
defense_label = "Defense Label",
affinity_label = "Affinity Label",
fire_resistance_label = "Fire Resistance Label",
water_resistance_label = "Water Resistance Label",
thunder_resistance_label = "Thunder Resistance Label",
ice_resistance_label = "Ice Resistance Label",
dragon_resistance_label = "Dragon Resistance Label",
element_label = "Element Label",
element_2_label = "Element 2 Label"
},
stats = {
attack = "Attack",
defense = "Defense",
affinity = "Affinity",
fire_resistance = "Fire Res";
water_resistance = "Water Res";
thunder_resistance = "Thunder Res";
ice_resistance = "Ice Res";
dragon_resistance = "Dragon Res";
stamina = "Stamina",
fire = "Fire",
water = "Water",
thunder = "Thunder",
ice = "Ice",
dragon = "Dragon",
} }
}; };
@@ -582,18 +904,17 @@ function this.load()
local loaded_language = json.load_file(language_file_name); local loaded_language = json.load_file(language_file_name);
if loaded_language ~= nil then if loaded_language ~= nil then
log.info(string.format("[MHR Overlay] %s.json Loaded Successfully", language_file_name));
log.info("[MHR Overlay] " .. language_file_name .. ".json loaded successfully");
table.insert(this.language_names, language_name); table.insert(this.language_names, language_name);
local merged_language = utils.table.merge(this.default_language, loaded_language); local merged_language = utils.table.merge(this.default_language, loaded_language);
table.insert(this.languages, merged_language); table.insert(this.languages, merged_language);
this.save(language_file_name, merged_language); this.save(language_file_name, merged_language);
else else
log.error("[MHR Overlay] Failed to load " .. language_file_name .. ".json"); error_handler.report("language.load", string.format("Failed to load %s.json", language_file_name));
log.error(string.format("[MHR Overlay] Failed to Load %s.json", language_file_name));
end end
end end
end end
@@ -601,9 +922,10 @@ end
function this.save(file_name, language_table) function this.save(file_name, language_table)
local success = json.dump_file(file_name, language_table); local success = json.dump_file(file_name, language_table);
if success then if success then
log.info("[MHR Overlay] " .. file_name .. " saved successfully"); log.info(string.format("[MHR Overlay] %s Saved Successfully", file_name));
else else
log.error("[MHR Overlay] Failed to save " .. file_name); error_handler.report("language.save", string.format("[MHR Overlay] Failed to Save %s", file_name));
log.error(string.format("[MHR Overlay] Failed to Save %s", file_name));
end end
end end
@@ -615,9 +937,12 @@ function this.update(index)
this.current_language = this.languages[index]; this.current_language = this.languages[index];
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
this.save_default(); this.save_default();
this.load(); this.load();
this.current_language = this.default_language; this.current_language = this.default_language;

View File

@@ -1,6 +1,7 @@
local this = {}; local this = {};
local language; local language;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -954,9 +955,12 @@ function this.get_part_name(monster_id, part_id)
return part_name; return part_name;
end end
function this.init_module() function this.init_dependencies()
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
this.init(); this.init();
end end

View File

@@ -0,0 +1,324 @@
local this = {};
local drawing;
local customization_menu;
local singletons;
local config;
local utils;
local error_handler;
local quest_status;
local time;
local dangos;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
health = 0;
max_health = 0;
attack = 0;
defense = 0;
affinity = 0;
stamina = 0;
max_stamina = -1;
element_type = 0;
element_attack = 0;
element_type_2 = 0;
element_attack_2 = 0;
fire_resistance = 0;
water_resistance = 0;
thunder_resistance = 0;
ice_resistance = 0;
dragon_resistance = 0;
};
local should_health_update = true;
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_method = player_manager_type_def:get_method("getPlayer");
local find_master_player_method = player_manager_type_def:get_method("findMasterPlayer");
local player_base_type_def = find_master_player_method:get_return_type();
local get_player_data_method = player_base_type_def:get_method("get_PlayerData");
local player_data_type_def = get_player_data_method:get_return_type();
local get_vital_method = player_data_type_def:get_method("get_vital");
local attack_field = player_data_type_def:get_field("_Attack");
local defence_field = player_data_type_def:get_field("_Defence");
local critical_rate_field = player_data_type_def:get_field("_CriticalRate");
local vital_max_field = player_data_type_def:get_field("_vitalMax");
local stamina_field = player_data_type_def:get_field("_stamina");
local stamina_max_field = player_data_type_def:get_field("_staminaMax");
local element_type_field = player_data_type_def:get_field("_ElementType");
local element_attack_field = player_data_type_def:get_field("_ElementAttack");
local element_type_2nd_field = player_data_type_def:get_field("_ElementType2nd");
local element_attack_2nd_field = player_data_type_def:get_field("_ElementAttack2nd");
local resistance_element_field = player_data_type_def:get_field("_ResistanceElement");
local system_array_type_def = sdk.find_type_definition("System.Array");
local get_length_method = system_array_type_def:get_method("get_Length");
local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)");
local player_quest_base_type_def = sdk.find_type_definition("snow.player.PlayerQuestBase");
local player_quest_base_update_method = player_quest_base_type_def:get_method("update");
local is_master_player_method = player_quest_base_type_def:get_method("isMasterPlayer");
local player_base_type_def = sdk.find_type_definition("snow.player.PlayerBase");
-- Dango Adrenaline
local is_kitchen_skill_predicament_powerup_method = player_base_type_def:get_method("isKitchenSkillPredicamentPowerUp");
local 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_valtype = get_value_method:call(resistance_element_array, 0);
if fire_resistance_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: fire_resistance_valtype");
return;
end
local fire_resistance = fire_resistance_valtype:get_field("mValue");
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_valtype = get_value_method:call(resistance_element_array, 1);
if water_resistance_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: water_resistance_valtype");
return;
end
local water_resistance = water_resistance_valtype:get_field("mValue");
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_valtype = get_value_method:call(resistance_element_array, 2);
if thunder_resistance_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: thunder_resistance_valtype");
return;
end
local thunder_resistance = thunder_resistance_valtype:get_field("mValue");
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_valtype = get_value_method:call(resistance_element_array, 3);
if ice_resistance_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: ice_resistance_valtype");
return;
end
local ice_resistance = ice_resistance_valtype:get_field("mValue");
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_valtype = get_value_method:call(resistance_element_array, 4);
if dragon_resistance_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: dragon_resistance_valtype");
return;
end
local dragon_resistance = dragon_resistance_valtype:get_field("mValue");
if dragon_resistance ~= nil then
this.list.dragon_resistance = math.floor(dragon_resistance);
else
error_handler.report("player_info.update_resistances", "Failed to access Data: dragon_resistance");
return;
end
end
function this.on_pre_player_update(quest_player_base)
if not should_health_update then
return;
end
if quest_player_base ~= master_player_ref then
return;
end
this.update_health(quest_player_base);
this.update_dango_adrenaline(quest_player_base);
should_health_update = false;
end
function this.update_health(quest_player_base)
local vital = get_vital_method:call(master_player_data_ref);
if vital == nil then
error_handler.report("player_info.update_health", "Failed to access Data: vital");
return;
end
this.list.health = vital;
end
function this.update_dango_adrenaline(quest_player_base)
local is_kitchen_skill_predicament_powerup = is_kitchen_skill_predicament_powerup_method:call(master_player_ref);
if is_kitchen_skill_predicament_powerup == nil then
error_handler.report("player_info.update_dango_adrenaline", "Failed to access Data: is_kitchen_skill_predicament_powerup");
return;
end
dangos.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");
dangos = require("MHR_Overlay.Buffs.dangos");
end
function this.init_module()
sdk.hook(player_quest_base_update_method, function(args)
local quest_player_base = sdk.to_managed_object(args[2]);
this.on_pre_player_update(quest_player_base);
end, function(retval)
return retval;
end);
end
return this;

View File

@@ -1,5 +1,7 @@
local this = {}; local this = {};
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
local pairs = pairs; local pairs = pairs;
@@ -39,6 +41,7 @@ local is_empty;
local unicode_map; local unicode_map;
local unicode_relative_position; local unicode_relative_position;
local unicode_chars; local unicode_chars;
local epsilon = 0.000001;
this.table = {}; this.table = {};
this.number = {}; this.number = {};
@@ -49,6 +52,11 @@ this.vec4 = {};
this.math = {}; this.math = {};
this.unicode = {}; this.unicode = {};
this.constants = {};
this.constants.uninitialized_int = -420;
this.constants.uninitialized_string = "Uninitialized";
this.constants.epsilon = epsilon;
function this.table.tostring(table_) function this.table.tostring(table_)
if type(table_) == "number" or type(table_) == "boolean" or type(table_) == "string" then if type(table_) == "number" or type(table_) == "boolean" or type(table_) == "string" then
return tostring(table_); return tostring(table_);
@@ -223,6 +231,14 @@ function this.number.is_even(value)
return value % 2 == 0; return value % 2 == 0;
end end
function this.number.is_equal(value1, value2)
if math.abs(value1 - value2) < epsilon then
return true;
end
return false;
end
function this.string.trim(str) function this.string.trim(str)
return str:match("^%s*(.-)%s*$"); return str:match("^%s*(.-)%s*$");
end end
@@ -413,6 +429,10 @@ function this.unicode.sub(str, i, j)
return string.sub(str, i, b + c - 1); return string.sub(str, i, b + c - 1);
end end
function this.init_dependencies()
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module() function this.init_module()
end end

View File

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

View File

@@ -4,6 +4,7 @@ local small_monster;
local large_monster; local large_monster;
local config; local config;
local ailments; local ailments;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -62,16 +63,19 @@ local blast_adjust_rate_method = blast_param_type:get_method("get_BlastDamageAdj
function this.poison_proc(poison_param) function this.poison_proc(poison_param)
if poison_param == nil then if poison_param == nil then
error_handler.report("ailment_hook.poison_proc", "Missing Parameter: poison_param");
return; return;
end end
local enemy = get_enemy_method:call(poison_param); local enemy = get_enemy_method:call(poison_param);
if enemy == nil then if enemy == nil then
error_handler.report("ailment_hook.poison_proc", "Failed to access Data: enemy");
return; return;
end end
local is_large = is_boss_enemy_method:call(enemy); local is_large = is_boss_enemy_method:call(enemy);
if is_large == nil then if is_large == nil then
error_handler.report("ailment_hook.poison_proc", "Failed to access Data: is_large");
return; return;
end end
@@ -90,16 +94,19 @@ end
function this.blast_proc(blast_param) function this.blast_proc(blast_param)
if blast_param == nil then if blast_param == nil then
error_handler.report("ailment_hook.blast_proc", "Missing Parameter: blast_param");
return; return;
end end
local enemy = get_enemy_method:call(blast_param); local enemy = get_enemy_method:call(blast_param);
if enemy == nil then if enemy == nil then
error_handler.report("ailment_hook.blast_proc", "Failed to access Data: enemy");
return; return;
end end
local is_large = is_boss_enemy_method:call(enemy); local is_large = is_boss_enemy_method:call(enemy);
if is_large == nil then if is_large == nil then
error_handler.report("ailment_hook.blast_proc", "Failed to access Data: is_large");
return; return;
end end
@@ -113,7 +120,6 @@ function this.blast_proc(blast_param)
local blast_damage = blast_damage_method:call(blast_param); local blast_damage = blast_damage_method:call(blast_param);
local blast_adjust_rate = blast_adjust_rate_method:call(blast_param); local blast_adjust_rate = blast_adjust_rate_method:call(blast_param);
ailments.apply_ailment_damage(monster, ailments.blast_id, blast_damage * blast_adjust_rate); ailments.apply_ailment_damage(monster, ailments.blast_id, blast_damage * blast_adjust_rate);
ailments.clear_ailment_contribution(monster, ailments.blast_id); ailments.clear_ailment_contribution(monster, ailments.blast_id);
end end
@@ -122,10 +128,15 @@ function this.stock_damage()
for enemy, monster in pairs(large_monster.list) do for enemy, monster in pairs(large_monster.list) do
local damage_param = get_damage_param_method:call(enemy); local damage_param = get_damage_param_method:call(enemy);
if damage_param == nil then if damage_param == nil then
goto continue error_handler.report("ailment_hook.stock_damage", "Failed to access Data: large_monster -> damage_param");
goto continue;
end end
local poison_param = poison_param_field:get_data(damage_param); local poison_param = poison_param_field:get_data(damage_param);
if poison_param == nil then
error_handler.report("ailment_hook.stock_damage", "Failed to access Data: large_monster -> poison_param");
goto continue;
end
ailments.update_poison(monster, poison_param); ailments.update_poison(monster, poison_param);
::continue:: ::continue::
@@ -134,22 +145,30 @@ function this.stock_damage()
for enemy, monster in pairs(small_monster.list) do for enemy, monster in pairs(small_monster.list) do
local damage_param = get_damage_param_method:call(enemy); local damage_param = get_damage_param_method:call(enemy);
if damage_param == nil then if damage_param == nil then
goto continue error_handler.report("ailment_hook.stock_damage", "Failed to access Data: small_monster -> damage_param");
goto continue;
end end
local poison_param = poison_param_field:get_data(damage_param); local poison_param = poison_param_field:get_data(damage_param);
if poison_param == nil then
error_handler.report("ailment_hook.stock_damage", "Failed to access Data: small_monster -> poison_param");
goto continue;
end
ailments.update_poison(monster, poison_param); ailments.update_poison(monster, poison_param);
::continue:: ::continue::
end end
end end
function this.init_module() function this.init_dependencies()
small_monster = require("MHR_Overlay.Monsters.small_monster"); small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster"); large_monster = require("MHR_Overlay.Monsters.large_monster");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
ailments = require("MHR_Overlay.Monsters.ailments"); ailments = require("MHR_Overlay.Monsters.ailments");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
sdk.hook(stock_damage_method, function(args) sdk.hook(stock_damage_method, function(args)
pcall(this.stock_damage, sdk.to_managed_object(args[2])); pcall(this.stock_damage, sdk.to_managed_object(args[2]));
end, function(retval) end, function(retval)

View File

@@ -9,6 +9,8 @@ local time;
local small_monster; local small_monster;
local large_monster; local large_monster;
local non_players; local non_players;
local error_handler;
local utils;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -94,7 +96,7 @@ function this.new(_ailments, ailment_id)
new_ailment.buildup_percentage = 0; new_ailment.buildup_percentage = 0;
new_ailment.timer = 0; new_ailment.timer = 0;
new_ailment.duration = 100000; new_ailment.duration = 0;
new_ailment.timer_percentage = 0; new_ailment.timer_percentage = 0;
new_ailment.minutes_left = 0; new_ailment.minutes_left = 0;
@@ -247,8 +249,6 @@ end
local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase"); local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase");
local get_damage_param_method = enemy_character_base_type_def:get_method("get_DamageParam"); local get_damage_param_method = enemy_character_base_type_def:get_method("get_DamageParam");
local damage_param_type_def = get_damage_param_method:get_return_type(); local damage_param_type_def = get_damage_param_method:get_return_type();
local get_condition_param_method = damage_param_type_def:get_method("get_ConditionParam"); local get_condition_param_method = damage_param_type_def:get_method("get_ConditionParam");
@@ -272,15 +272,18 @@ local poison_damage_field = poison_param_type_def:get_field("<Damage>k__BackingF
local poison_get_is_damage_method = poison_param_type_def:get_method("get_IsDamage"); local poison_get_is_damage_method = poison_param_type_def:get_method("get_IsDamage");
local system_array_type_def = sdk.find_type_definition("System.Array"); local system_array_type_def = sdk.find_type_definition("System.Array");
local length_method = system_array_type_def:get_method("get_Length"); local get_length_method = system_array_type_def:get_method("get_Length");
local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)"); local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)");
function this.update_ailments(enemy, monster) function this.update_ailments(enemy, monster)
if enemy == nil then if enemy == nil then
error_handler.report("ailments.update_ailments", "Missing Parameter: enemy");
return; return;
end end
local damage_param = get_damage_param_method:call(enemy); local damage_param = get_damage_param_method:call(enemy);
if damage_param == nil then if damage_param == nil then
error_handler.report("ailments.update_ailments", "Failed to access Data: damage_param");
return; return;
end end
@@ -297,24 +300,26 @@ function this.update_ailments(enemy, monster)
end end
local condition_param_array = get_condition_param_method:call(damage_param); local condition_param_array = get_condition_param_method:call(damage_param);
if condition_param_array == nil then if condition_param_array == nil then
error_handler.report("ailments.update_ailments", "Failed to access Data: condition_param_array");
return; return;
end end
local condition_param_array_length = length_method:call(condition_param_array); local condition_param_array_length = get_length_method:call(condition_param_array);
if condition_param_array_length == nil then if condition_param_array_length == nil then
error_handler.report("ailments.update_ailments", "Failed to access Data: condition_param_array_length");
return; return;
end end
for id = 0, condition_param_array_length - 1 do for id = 0, condition_param_array_length - 1 do
if id == this.stun_id or id == this.poison_id or id == this.blast_id then if id == this.stun_id or id == this.poison_id or id == this.blast_id then
goto continue goto continue;
end end
local ailment_param = get_value_method:call(condition_param_array, id); local ailment_param = get_value_method:call(condition_param_array, id);
if ailment_param == nil then if ailment_param == nil then
goto continue error_handler.report("ailments.update_ailments", "Failed to access Data: ailment_param No. " .. tostring(id));
goto continue;
end end
this.update_ailment(monster, ailment_param, id); this.update_ailment(monster, ailment_param, id);
@@ -326,16 +331,22 @@ function this.update_stun_poison_blast_ailments(monster, damage_param)
local stun_param = stun_param_field:get_data(damage_param); local stun_param = stun_param_field:get_data(damage_param);
if stun_param ~= nil then if stun_param ~= nil then
this.update_ailment(monster, stun_param, this.stun_id); this.update_ailment(monster, stun_param, this.stun_id);
else
error_handler.report("ailments.update_stun_poison_blast_ailments", "Failed to access Data: stun_param");
end end
local poison_param = poison_param_field:get_data(damage_param); local poison_param = poison_param_field:get_data(damage_param);
if poison_param ~= nil then if poison_param ~= nil then
this.update_ailment(monster, poison_param, this.poison_id); this.update_ailment(monster, poison_param, this.poison_id);
else
error_handler.report("ailments.update_stun_poison_blast_ailments", "Failed to access Data: poison_param");
end end
local blast_param = blast_param_field:get_data(damage_param); local blast_param = blast_param_field:get_data(damage_param);
if blast_param ~= nil then if blast_param ~= nil then
this.update_ailment(monster, blast_param, this.blast_id); this.update_ailment(monster, blast_param, this.blast_id);
else
error_handler.report("ailments.update_stun_poison_blast_ailments", "Failed to access Data: blast_param");
end end
end end
@@ -348,12 +359,12 @@ function this.update_ailment(monster, ailment_param, id)
local duration = get_active_time_method:call(ailment_param); local duration = get_active_time_method:call(ailment_param);
local is_active = get_is_active_method:call(ailment_param); local is_active = get_is_active_method:call(ailment_param);
local activate_count = -999; local activate_count = nil;
local buildup = -999; local buildup = nil;
local buildup_limit = 9999; local buildup_limit = nil;
if activate_count_array ~= nil then if activate_count_array ~= nil then
local activate_count_array_length = length_method:call(activate_count_array); local activate_count_array_length = get_length_method:call(activate_count_array);
if activate_count_array_length ~= nil then if activate_count_array_length ~= nil then
@@ -361,18 +372,20 @@ function this.update_ailment(monster, ailment_param, id)
local activate_count_valuetype = get_value_method:call(activate_count_array, 0); local activate_count_valuetype = get_value_method:call(activate_count_array, 0);
if activate_count_valuetype ~= nil then if activate_count_valuetype ~= nil then
local _activate_count = activate_count_valuetype:get_field("mValue"); activate_count = activate_count_valuetype:get_field("mValue");
else
if _activate_count ~= nil then error_handler.report("ailments.update_ailment", "Failed to access Data: activate_count_valuetype");
activate_count = _activate_count;
end
end end
end end
else
error_handler.report("ailments.update_ailment", "Failed to access Data: activate_count_array_length");
end end
else
error_handler.report("ailments.update_ailment", "Failed to access Data: activate_count_array");
end end
if buildup_array ~= nil then if buildup_array ~= nil then
local buildup_array_length = length_method:call(buildup_array); local buildup_array_length = get_length_method:call(buildup_array);
if buildup_array_length ~= nil then if buildup_array_length ~= nil then
@@ -380,18 +393,20 @@ function this.update_ailment(monster, ailment_param, id)
local buildup_valuetype = get_value_method:call(buildup_array, 0); local buildup_valuetype = get_value_method:call(buildup_array, 0);
if buildup_valuetype ~= nil then if buildup_valuetype ~= nil then
local _buildup = buildup_valuetype:get_field("mValue"); buildup = buildup_valuetype:get_field("mValue");
else
if _buildup ~= nil then error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_valuetype");
buildup = _buildup;
end
end end
end end
else
error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_array_length");
end end
else
error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_array");
end end
if buildup_limit_array ~= nil then if buildup_limit_array ~= nil then
local buildup_limit_array_length = length_method:call(buildup_limit_array); local buildup_limit_array_length = get_length_method:call(buildup_limit_array);
if buildup_limit_array_length ~= nil then if buildup_limit_array_length ~= nil then
@@ -399,14 +414,16 @@ function this.update_ailment(monster, ailment_param, id)
local buildup_limit_valuetype = get_value_method:call(buildup_limit_array, 0); local buildup_limit_valuetype = get_value_method:call(buildup_limit_array, 0);
if buildup_limit_valuetype ~= nil then if buildup_limit_valuetype ~= nil then
local _buildup_limit = buildup_limit_valuetype:get_field("mValue"); buildup_limit = buildup_limit_valuetype:get_field("mValue");
else
if _buildup_limit ~= nil then error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_limit_valuetype");
buildup_limit = _buildup_limit;
end
end end
end end
else
error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_limit_array_length");
end end
else
error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_limit_array");
end end
if is_enable == nil then if is_enable == nil then
@@ -429,6 +446,8 @@ function this.update_ailment(monster, ailment_param, id)
end end
monster.ailments[id].activate_count = activate_count; monster.ailments[id].activate_count = activate_count;
else
error_handler.report("ailments.update_ailment", "Failed to access Data: activate_count");
end end
if buildup ~= nil then if buildup ~= nil then
@@ -437,6 +456,8 @@ function this.update_ailment(monster, ailment_param, id)
end end
monster.ailments[id].total_buildup = buildup; monster.ailments[id].total_buildup = buildup;
else
error_handler.report("ailments.update_ailment", "Failed to access Data: buildup");
end end
if buildup_limit ~= nil then if buildup_limit ~= nil then
@@ -445,6 +466,8 @@ function this.update_ailment(monster, ailment_param, id)
end end
monster.ailments[id].buildup_limit = buildup_limit; monster.ailments[id].buildup_limit = buildup_limit;
else
error_handler.report("ailments.update_ailment", "Failed to access Data: buildup_limit");
end end
if buildup ~= nil and buildup_limit ~= nil and buildup_limit ~= 0 then if buildup ~= nil and buildup_limit ~= nil and buildup_limit ~= 0 then
@@ -503,18 +526,33 @@ end
-- Code by coavins -- Code by coavins
function this.update_poison(monster, poison_param) function this.update_poison(monster, poison_param)
if monster == nil then if monster == nil then
error_handler.report("ailments.update_poison", "Missing Parameter: monster");
return;
end
if poison_param == nil then
error_handler.report("ailments.update_poison", "Missing Parameter: poison_param");
return; return;
end end
if poison_param ~= nil then
--if poison tick, apply damage --if poison tick, apply damage
local is_damage = poison_get_is_damage_method:call(poison_param); local is_damage = poison_get_is_damage_method:call(poison_param);
if is_damage then if is_damage == nil then
error_handler.report("ailments.update_poison", "Failed to access Data: is_damage");
return;
end
if not is_damage then
return;
end
local poison_damage = poison_damage_field:get_data(poison_param); local poison_damage = poison_damage_field:get_data(poison_param);
if poison_damage == nil then
error_handler.report("ailments.update_poison", "Failed to access Data: poison_damage");
return;
end
this.apply_ailment_damage(monster, this.poison_id, poison_damage); this.apply_ailment_damage(monster, this.poison_id, poison_damage);
end
end
end end
function this.draw(monster, ailment_UI, cached_config, ailments_position_on_screen, opacity_scale) function this.draw(monster, ailment_UI, cached_config, ailments_position_on_screen, opacity_scale)
@@ -526,115 +564,118 @@ function this.draw(monster, ailment_UI, cached_config, ailments_position_on_scre
for id, ailment in pairs(monster.ailments) do for id, ailment in pairs(monster.ailments) do
if id == this.paralyze_id then if id == this.paralyze_id then
if not cached_config.filter.paralysis then if not cached_config.filter.paralysis then
goto continue goto continue;
end end
elseif id == this.sleep_id then elseif id == this.sleep_id then
if not cached_config.filter.sleep then if not cached_config.filter.sleep then
goto continue goto continue;
end end
elseif id == this.stun_id then elseif id == this.stun_id then
if not cached_config.filter.stun then if not cached_config.filter.stun then
goto continue goto continue;
end end
elseif id == this.flash_id then elseif id == this.flash_id then
if not cached_config.filter.flash then if not cached_config.filter.flash then
goto continue goto continue;
end end
elseif id == this.poison_id then elseif id == this.poison_id then
if not cached_config.filter.poison then if not cached_config.filter.poison then
goto continue goto continue;
end end
elseif id == this.blast_id then elseif id == this.blast_id then
if not cached_config.filter.blast then if not cached_config.filter.blast then
goto continue goto continue;
end end
elseif id == this.exhaust_id then elseif id == this.exhaust_id then
if not cached_config.filter.exhaust then if not cached_config.filter.exhaust then
goto continue goto continue;
end end
elseif id == this.ride_id then elseif id == this.ride_id then
if not cached_config.filter.ride then if not cached_config.filter.ride then
goto continue goto continue;
end end
elseif id == this.water_id then elseif id == this.water_id then
if not cached_config.filter.waterblight then if not cached_config.filter.waterblight then
goto continue goto continue;
end end
elseif id == this.fire_id then elseif id == this.fire_id then
if not cached_config.filter.fireblight then if not cached_config.filter.fireblight then
goto continue goto continue;
end end
elseif id == this.ice_id then elseif id == this.ice_id then
if not cached_config.filter.iceblight then if not cached_config.filter.iceblight then
goto continue goto continue;
end end
elseif id == this.thunder_id then elseif id == this.thunder_id then
if not cached_config.filter.thunderblight then if not cached_config.filter.thunderblight then
goto continue goto continue;
end end
elseif id == this.fall_trap_id then elseif id == this.fall_trap_id then
if not cached_config.filter.fall_trap then if not cached_config.filter.fall_trap then
goto continue goto continue;
end end
elseif id == this.shock_trap_id then elseif id == this.shock_trap_id then
if not cached_config.filter.shock_trap then if not cached_config.filter.shock_trap then
goto continue goto continue;
end end
elseif id == this.capture_id then elseif id == this.capture_id then
if not cached_config.filter.tranq_bomb then if not cached_config.filter.tranq_bomb then
goto continue goto continue;
end end
elseif id == this.koyashi_id then elseif id == this.koyashi_id then
if not cached_config.filter.dung_bomb then if not cached_config.filter.dung_bomb then
goto continue goto continue;
end end
elseif id == this.steel_fang_id then elseif id == this.steel_fang_id then
if not cached_config.filter.steel_fang then if not cached_config.filter.steel_fang then
goto continue goto continue;
end end
elseif id == this.fall_quick_sand_id then elseif id == this.fall_quick_sand_id then
if not cached_config.filter.quick_sand then if not cached_config.filter.quick_sand then
goto continue goto continue;
end end
elseif id == this.fall_otomo_trap_id then elseif id == this.fall_otomo_trap_id then
if not cached_config.filter.fall_otomo_trap then if not cached_config.filter.fall_otomo_trap then
goto continue goto continue;
end end
elseif id == this.shock_otomo_trap_id then elseif id == this.shock_otomo_trap_id then
if not cached_config.filter.shock_otomo_trap then if not cached_config.filter.shock_otomo_trap then
goto continue goto continue;
end end
else else
goto continue goto continue;
end end
if cached_config.settings.hide_ailments_with_zero_buildup and ailment.total_buildup == 0 and if cached_config.settings.hide_ailments_with_zero_buildup
ailment.buildup_limit ~= 0 and ailment.total_buildup == 0
and ailment.activate_count == 0 and not ailment.is_active then and ailment.buildup_limit ~= 0
goto continue and ailment.activate_count == 0
and not ailment.is_active then
goto continue;
end end
if cached_config.settings.hide_inactive_ailments_with_no_buildup_support and ailment.buildup_limit == 0 and if cached_config.settings.hide_inactive_ailments_with_no_buildup_support
not ailment.is_active then and ailment.buildup_limit == 0
goto continue and not ailment.is_active then
goto continue;
end end
if cached_config.settings.hide_all_inactive_ailments and not ailment.is_active then if cached_config.settings.hide_all_inactive_ailments and not ailment.is_active then
goto continue goto continue;
end end
if cached_config.settings.hide_all_active_ailments and ailment.is_active then if cached_config.settings.hide_all_active_ailments and ailment.is_active then
goto continue goto continue;
end end
if cached_config.settings.hide_disabled_ailments and not ailment.is_enable then if cached_config.settings.hide_disabled_ailments and not ailment.is_enable then
goto continue goto continue;
end end
if cached_config.settings.time_limit ~= 0 and if cached_config.settings.time_limit ~= 0
time.total_elapsed_script_seconds - ailment.last_change_time > cached_config.settings.time_limit and and time.total_elapsed_script_seconds - ailment.last_change_time > cached_config.settings.time_limit
not ailment.is_active then and not ailment.is_active then
goto continue goto continue;
end end
table.insert(displayed_ailments, ailment); table.insert(displayed_ailments, ailment);
@@ -682,14 +723,21 @@ function this.draw(monster, ailment_UI, cached_config, ailments_position_on_scre
ailment_UI_entity.draw(ailment, ailment_UI, cached_config, ailment_position_on_screen, opacity_scale); ailment_UI_entity.draw(ailment, ailment_UI, cached_config, ailment_position_on_screen, opacity_scale);
end end
end end
function this.apply_ailment_buildup(monster, player, otomo, ailment_type, ailment_buildup) function this.apply_ailment_buildup(monster, player, otomo, ailment_type, ailment_buildup)
if monster == nil or if monster == nil then
(ailment_type ~= this.poison_id and ailment_type ~= this.blast_id and ailment_type ~= this.stun_id) error_handler.report("ailments.apply_ailment_buildup", "Missing Parameter: monster");
or (ailment_buildup == 0 or ailment_buildup == nil) then return;
end
if ailment_buildup == nil then
error_handler.report("ailments.apply_ailment_buildup", "Missing Parameter: ailment_buildup");
return;
end
if (ailment_type ~= this.poison_id and ailment_type ~= this.blast_id and ailment_type ~= this.stun_id)
or ailment_buildup == 0 then
return; return;
end end
@@ -709,7 +757,6 @@ function this.apply_ailment_buildup(monster, player, otomo, ailment_type, ailmen
monster.ailments[ailment_type].otomo_buildup[otomo] = (monster.ailments[ailment_type].otomo_buildup[otomo] or 0) + ailment_buildup; monster.ailments[ailment_type].otomo_buildup[otomo] = (monster.ailments[ailment_type].otomo_buildup[otomo] or 0) + ailment_buildup;
end end
this.calculate_ailment_contribution(monster, ailment_type); this.calculate_ailment_contribution(monster, ailment_type);
end end
@@ -751,7 +798,17 @@ end
-- Code by coavins -- Code by coavins
function this.apply_ailment_damage(monster, ailment_type, ailment_damage) function this.apply_ailment_damage(monster, ailment_type, ailment_damage)
-- we only track poison and blast for now -- we only track poison and blast for now
if ailment_type == nil or ailment_damage == nil then if monster == nil then
error_handler.report("ailments.apply_ailment_damage", "Missing Parameter: monster");
end
if ailment_type == nil then
error_handler.report("ailments.apply_ailment_damage", "Missing Parameter: ailment_type");
return;
end
if ailment_damage == nil then
error_handler.report("ailments.apply_ailment_damage", "Missing Parameter: ailment_damage");
return; return;
end end
@@ -798,10 +855,7 @@ function this.apply_ailment_damage(monster, ailment_type, ailment_damage)
local player = players.get_player(otomo.id); local player = players.get_player(otomo.id);
if player ~= nil then
players.update_damage(player, otomo_damage_source_type, monster.is_large, damage_object); players.update_damage(player, otomo_damage_source_type, monster.is_large, damage_object);
end
players.update_damage(otomo, otomo_damage_source_type, monster.is_large, damage_object); players.update_damage(otomo, otomo_damage_source_type, monster.is_large, damage_object);
end end
@@ -814,7 +868,7 @@ function this.apply_ailment_damage(monster, ailment_type, ailment_damage)
players.update_damage(players.total, damage_source_type, monster.is_large, damage_object); players.update_damage(players.total, damage_source_type, monster.is_large, damage_object);
end end
function this.init_module() function this.init_dependencies()
players = require("MHR_Overlay.Damage_Meter.players"); players = require("MHR_Overlay.Damage_Meter.players");
non_players = require("MHR_Overlay.Damage_Meter.non_players"); non_players = require("MHR_Overlay.Damage_Meter.non_players");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
@@ -824,6 +878,11 @@ function this.init_module()
time = require("MHR_Overlay.Game_Handler.time"); time = require("MHR_Overlay.Game_Handler.time");
small_monster = require("MHR_Overlay.Monsters.small_monster"); small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster"); large_monster = require("MHR_Overlay.Monsters.large_monster");
error_handler = require("MHR_Overlay.Misc.error_handler");
utils = require("MHR_Overlay.Misc.utils");
end
function this.init_module()
end end
return this; return this;

View File

@@ -12,6 +12,7 @@ local drawing;
local part_names; local part_names;
local time; local time;
local utils; local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -50,7 +51,6 @@ this.list = {};
function this.new(id, name) function this.new(id, name)
local part = {}; local part = {};
part.id = id; part.id = id;
part.name = name; part.name = name;
@@ -316,19 +316,19 @@ function this.draw(monster, part_UI, cached_config, parts_position_on_screen, op
and ((part.break_health == part.break_max_health and part.break_count == 0) or not break_supported) and ((part.break_health == part.break_max_health and part.break_count == 0) or not break_supported)
and ((part.loss_health == part.loss_max_health and not part.is_severed) or not sever_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 and ((part.anomaly_health == part.anomaly_max_health) or not anomaly_supported) then
goto continue goto continue;
end end
if (not part_UI.flinch_visibility or not health_supported) if (not part_UI.flinch_visibility or not health_supported)
and (not part_UI.break_visibility or not break_supported or part.break_count >= part.break_max_count) and (not part_UI.break_visibility or not break_supported or part.break_count >= part.break_max_count)
and (not part_UI.loss_visibility or not sever_supported or part.is_severed) 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 and (not part_UI.anomaly_visibility or not anomaly_supported) then
goto continue goto continue;
end end
if cached_config.settings.time_limit ~= 0 and if cached_config.settings.time_limit ~= 0 and
time.total_elapsed_script_seconds - part.last_change_time > cached_config.settings.time_limit then time.total_elapsed_script_seconds - part.last_change_time > cached_config.settings.time_limit then
goto continue goto continue;
end end
table.insert(displayed_parts, part); table.insert(displayed_parts, part);
@@ -462,7 +462,7 @@ function this.draw(monster, part_UI, cached_config, parts_position_on_screen, op
return last_part_position_on_screen; return last_part_position_on_screen;
end end
function this.init_module() function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -475,6 +475,10 @@ function this.init_module()
part_names = require("MHR_Overlay.Misc.part_names"); part_names = require("MHR_Overlay.Misc.part_names");
time = require("MHR_Overlay.Game_Handler.time"); time = require("MHR_Overlay.Game_Handler.time");
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -19,6 +19,8 @@ local players;
local time; local time;
local body_part; local body_part;
local part_names; local part_names;
local error_handler;
local quest_status;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -53,9 +55,18 @@ local ValueType = ValueType;
local package = package; local package = package;
this.list = {}; this.list = {};
this.highlighted_id = -1;
this.monster_ids = {
chameleos = 25,
toadversary = 131,
lucent_nargacuga = 549,
risen_chameleos = 2073
}
function this.new(enemy) function this.new(enemy)
local monster = {}; local monster = {};
monster.enemy = enemy; monster.enemy = enemy;
monster.is_large = true; monster.is_large = true;
@@ -63,9 +74,10 @@ function this.new(enemy)
monster.unique_id = 0; monster.unique_id = 0;
monster.health = 0; monster.health = 0;
monster.max_health = 999999; monster.max_health = 0;
monster.health_percentage = 0; monster.health_percentage = 0;
monster.missing_health = 0; monster.missing_health = 0;
monster.is_health_update_requested = true;
monster.is_capturable = true; monster.is_capturable = true;
monster.capture_health = 0; monster.capture_health = 0;
@@ -78,12 +90,12 @@ function this.new(enemy)
monster.is_tired = false; monster.is_tired = false;
monster.stamina = 0; monster.stamina = 0;
monster.max_stamina = 1000; monster.max_stamina = 0;
monster.stamina_percentage = 0; monster.stamina_percentage = 0;
monster.missing_stamina = 0; monster.missing_stamina = 0;
monster.tired_timer = 0; monster.tired_timer = 0;
monster.tired_duration = 600; monster.tired_duration = 0;
monster.tired_total_seconds_left = 0; monster.tired_total_seconds_left = 0;
monster.tired_minutes_left = 0; monster.tired_minutes_left = 0;
@@ -92,12 +104,12 @@ function this.new(enemy)
monster.is_in_rage = false; monster.is_in_rage = false;
monster.rage_point = 0; monster.rage_point = 0;
monster.rage_limit = 3000; monster.rage_limit = 0;
monster.rage_count = 0; monster.rage_count = 0;
monster.rage_percentage = 0; monster.rage_percentage = 0;
monster.rage_timer = 0; monster.rage_timer = 0;
monster.rage_duration = 600; monster.rage_duration = 0;
monster.rage_total_seconds_left = 0; monster.rage_total_seconds_left = 0;
monster.rage_minutes_left = 0; monster.rage_minutes_left = 0;
@@ -108,17 +120,16 @@ function this.new(enemy)
monster.distance = 0; monster.distance = 0;
monster.name = "Large Monster"; monster.name = "Large Monster";
monster.size = 1; monster.size = 0;
monster.small_border = 0; monster.small_border = 0;
monster.big_border = 5; monster.big_border = 0;
monster.king_border = 10; monster.king_border = 0;
monster.crown = ""; monster.crown = "";
monster.is_anomaly = false; monster.is_anomaly = false;
monster.parts = {}; monster.parts = {};
monster.ailments = ailments.init_ailments(); monster.ailments = ailments.init_ailments();
monster.rider_id = -1; monster.rider_id = -1;
monster.dynamic_UI = {}; monster.dynamic_UI = {};
@@ -131,17 +142,12 @@ function this.new(enemy)
this.init_UI(monster, monster.highlighted_UI, config.current_config.large_monster_UI.highlighted); this.init_UI(monster, monster.highlighted_UI, config.current_config.large_monster_UI.highlighted);
this.update_position(enemy, monster); this.update_position(enemy, monster);
local physical_param = this.update_health(enemy, monster);
this.update_stamina(enemy, monster, nil); this.update_stamina(enemy, monster, nil);
this.update_stamina_timer(enemy, monster, nil); this.update_stamina_timer(enemy, monster, nil);
this.update_rage(enemy, monster, nil); this.update_rage(enemy, monster, nil);
this.update_rage_timer(enemy, monster, nil); this.update_rage_timer(enemy, monster, nil);
this.update(enemy, monster); this.update(enemy, monster);
pcall(this.update_parts, enemy, monster, physical_param);
pcall(this.update_anomaly_parts, enemy, monster, nil); pcall(this.update_anomaly_parts, enemy, monster, nil);
if this.list[enemy] == nil then if this.list[enemy] == nil then
@@ -156,6 +162,7 @@ function this.get_monster(enemy)
if monster == nil then if monster == nil then
monster = this.new(enemy); monster = this.new(enemy);
end end
return monster; return monster;
end end
@@ -222,7 +229,7 @@ local get_mario_player_index_method = mario_param_type:get_method("get_MarioPlay
local get_pos_field = enemy_character_base_type_def:get_method("get_Pos"); local get_pos_field = enemy_character_base_type_def:get_method("get_Pos");
local system_array_type_def = sdk.find_type_definition("System.Array"); local system_array_type_def = sdk.find_type_definition("System.Array");
local length_method = system_array_type_def:get_method("get_Length"); local get_length_method = system_array_type_def:get_method("get_Length");
local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)"); local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)");
-- Lucent Nargacuga -- Lucent Nargacuga
@@ -256,33 +263,49 @@ local core_parts_get_is_active_method = enemy_mystery_core_parts_type_def:get_me
local core_parts_get_dying_vital_threashold_method = enemy_mystery_core_parts_type_def:get_method("get_DyingVitalThreashold"); local core_parts_get_dying_vital_threashold_method = enemy_mystery_core_parts_type_def:get_method("get_DyingVitalThreashold");
local on_break_method = enemy_mystery_core_parts_type_def:get_method("onBreak"); local on_break_method = enemy_mystery_core_parts_type_def:get_method("onBreak");
local gui_manager_type_def = sdk.find_type_definition("snow.gui.GuiManager");
local get_tg_camera_method = gui_manager_type_def:get_method("get_refGuiHud_TgCamera");
local tg_camera_type_def = get_tg_camera_method:get_return_type();
local get_targeting_enemy_index_field = tg_camera_type_def:get_field("OldTargetingEmIndex");
local lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager");
local receive_quest_hunter_info_method = lobby_manager_type_def:get_method("receiveQuestHunterInfo");
function this.init(monster, enemy) function this.init(monster, enemy)
local enemy_type = enemy_type_field:get_data(enemy); local monster_id = enemy_type_field:get_data(enemy);
if enemy_type == nil then if monster_id == nil then
customization_menu.status = "No enemy type"; error_handler.report("large_monster.init", "Failed to access Data: enemy_type");
return; return;
end end
monster.id = enemy_type; monster.id = monster_id;
if monster.id == 549 or monster.id == 25 or monster.id == 2073 then if monster_id == this.monster_ids.lucent_nargacuga or monster_id == this.monster_ids.chameleos or monster_id == this.monster_ids.risen_chameleos then
monster.can_go_stealth = true; monster.can_go_stealth = true;
end end
local enemy_name = get_enemy_name_message_method:call(singletons.message_manager, enemy_type); local enemy_name = get_enemy_name_message_method:call(singletons.message_manager, monster_id);
if enemy_name ~= nil then if enemy_name ~= nil then
monster.name = enemy_name; monster.name = enemy_name;
else
error_handler.report("large_monster.init", "Failed to access Data: enemy_name");
end end
if monster_id ~= this.monster_ids.toadversary then
local set_info = get_set_info_method:call(enemy); local set_info = get_set_info_method:call(enemy);
if set_info ~= nil then if set_info ~= nil then
local unique_id = get_unique_id_method:call(set_info); local unique_id = get_unique_id_method:call(set_info);
if unique_id ~= nil then if unique_id ~= nil then
monster.unique_id = unique_id; monster.unique_id = unique_id;
else
error_handler.report("large_monster.init", "Failed to access Data: unique_id");
end end
else
error_handler.report("large_monster.init", "Failed to access Data: set_info");
end end
local size_info = find_enemy_size_info_method:call(singletons.enemy_manager, enemy_type); local size_info = find_enemy_size_info_method:call(singletons.enemy_manager, monster_id);
if size_info ~= nil then if size_info ~= nil then
local small_border = get_small_border_method:call(size_info); local small_border = get_small_border_method:call(size_info);
local big_border = get_big_border_method:call(size_info); local big_border = get_big_border_method:call(size_info);
@@ -292,18 +315,26 @@ function this.init(monster, enemy)
if small_border ~= nil then if small_border ~= nil then
monster.small_border = small_border; monster.small_border = small_border;
else
error_handler.report("large_monster.init", "Failed to access Data: small_border");
end end
if big_border ~= nil then if big_border ~= nil then
monster.big_border = big_border; monster.big_border = big_border;
else
error_handler.report("large_monster.init", "Failed to access Data: big_border");
end end
if king_border ~= nil then if king_border ~= nil then
monster.king_border = king_border; monster.king_border = king_border;
else
error_handler.report("large_monster.init", "Failed to access Data: king_border");
end end
if size ~= nil then if size ~= nil then
monster.size = size; monster.size = size;
else
error_handler.report("large_monster.init", "Failed to access Data: size");
end end
if monster.size <= monster.small_border then if monster.size <= monster.small_border then
@@ -313,6 +344,9 @@ function this.init(monster, enemy)
elseif monster.size >= monster.big_border then elseif monster.size >= monster.big_border then
monster.crown = language.current_language.UI.silver; monster.crown = language.current_language.UI.silver;
end end
else
error_handler.report("large_monster.init", "Failed to access Data: size_info");
end
end end
local is_capture_enable = true; local is_capture_enable = true;
@@ -325,11 +359,16 @@ function this.init(monster, enemy)
local is_capture_enable_ = capture_param:call("get_IsEnable"); local is_capture_enable_ = capture_param:call("get_IsEnable");
if is_capture_enable_ ~= nil then if is_capture_enable_ ~= nil then
is_capture_enable = is_capture_enable_; is_capture_enable = is_capture_enable_;
else
error_handler.report("large_monster.init", "Failed to access Data: is_capture_enable_");
end end
else
error_handler.report("large_monster.init", "Failed to access Data: capture_param");
end end
else
error_handler.report("large_monster.init", "Failed to access Data: damage_param");
end end
--local curia_param = enemy:get_field("<CuriaParam>k__BackingField");
local mystery_param = get_mystery_param_method:call(enemy); local mystery_param = get_mystery_param_method:call(enemy);
local is_anomaly = mystery_param ~= nil; local is_anomaly = mystery_param ~= nil;
@@ -425,16 +464,24 @@ function this.init_UI(monster, monster_UI, cached_config)
body_part.init_part_names(monster.id, monster.parts); body_part.init_part_names(monster.id, monster.parts);
end end
function this.request_health_update()
for enemy, monster in pairs(this.list) do
monster.is_health_update_requested = true;
end
end
function this.update_position(enemy, monster) function this.update_position(enemy, monster)
if not config.current_config.large_monster_UI.dynamic.enabled and if not config.current_config.large_monster_UI.dynamic.enabled
config.current_config.large_monster_UI.static.sorting.type ~= "Distance" then and config.current_config.large_monster_UI.static.sorting.type ~= "Distance" then
return; return;
end end
local position = get_pos_field:call(enemy); local position = get_pos_field:call(enemy);
if position ~= nil then if position == nil then
monster.position = position; error_handler.report("large_monster.update_position", "Failed to access Data: position");
end end
monster.position = position;
end end
-- Code by coavins -- Code by coavins
@@ -442,26 +489,31 @@ function this.update_all_riders()
for enemy, monster in pairs(this.list) do for enemy, monster in pairs(this.list) do
-- get marionette rider -- get marionette rider
local mario_param = get_mario_param_method:call(enemy); local mario_param = get_mario_param_method:call(enemy);
if mario_param ~= nil then if mario_param == nil then
local is_marionette = get_is_marionette_method:call(mario_param); error_handler.report("large_monster.update_all_riders", "Failed to access Data: mario_param");
goto continue;
end
local is_marionette = get_is_marionette_method:call(mario_param);
if is_marionette == nil then if is_marionette == nil then
error_handler.report("large_monster.update_all_riders", "Failed to access Data: is_marionette");
goto continue; goto continue;
end end
if is_marionette then if is_marionette then
local player_id = get_mario_player_index_method:call(mario_param); local player_id = get_mario_player_index_method:call(mario_param);
if player_id ~= nil then if player_id == nil then
monster.rider_id = player_id; error_handler.report("large_monster.update_all_riders", "Failed to access Data: player_id");
goto continue;
end end
monster.rider_id = player_id;
else else
monster.rider_id = -1; monster.rider_id = -1;
end end
end
::continue:: ::continue::
end end
end end
function this.update(enemy, monster) function this.update(enemy, monster)
@@ -476,38 +528,48 @@ function this.update(enemy, monster)
local dead_or_captured = check_die_method:call(enemy); local dead_or_captured = check_die_method:call(enemy);
if dead_or_captured ~= nil then if dead_or_captured ~= nil then
monster.dead_or_captured = dead_or_captured; monster.dead_or_captured = dead_or_captured;
else
error_handler.report("large_monster.update", "Failed to access Data: dead_or_captured");
end end
local is_disp_icon_mini_map = is_disp_icon_mini_map_method:call(enemy); local is_disp_icon_mini_map = is_disp_icon_mini_map_method:call(enemy);
if is_disp_icon_mini_map ~= nil then if is_disp_icon_mini_map ~= nil then
monster.is_disp_icon_mini_map = is_disp_icon_mini_map; monster.is_disp_icon_mini_map = is_disp_icon_mini_map;
else
error_handler.report("large_monster.update", "Failed to access Data: is_disp_icon_mini_map");
end end
if monster.id == 549 or monster.id == 25 or monster.id == 2073 then if monster.id == this.monster_ids.lucent_nargacuga or monster.id == this.monster_ids.chameleos or monster.id == this.monster_ids.risen_chameleos then
monster.can_go_stealth = true; monster.can_go_stealth = true;
end end
if monster.can_go_stealth then if monster.can_go_stealth then
-- Lucent Nargacuga -- Lucent Nargacuga
if monster.id == 549 then if monster.id == this.monster_ids.lucent_nargacuga then
local is_stealth = is_stealth_method:call(enemy); local is_stealth = is_stealth_method:call(enemy);
if is_stealth ~= nil then if is_stealth == nil then
monster.is_stealth = is_stealth; monster.is_stealth = is_stealth;
else
error_handler.report("large_monster.update", "Failed to access Data: is_stealth");
end end
-- Chameleos and Risen Chameleos -- Chameleos and Risen Chameleos
elseif monster.id == 25 or monster.id == 2073 then elseif monster.id == this.monster_ids.chameleos or monster.id == this.monster_ids.risen_chameleos then
local stealth_controller = get_stealth_ctrl_method:call(enemy); local stealth_controller = get_stealth_ctrl_method:call(enemy);
if stealth_controller ~= nil then if stealth_controller ~= nil then
local status = get_current_status_method:call(stealth_controller); local status = get_current_status_method:call(stealth_controller);
if status >= 2 then if status == nil then
error_handler.report("large_monster.update", "Failed to access Data: status");
elseif status >= 2 then
monster.is_stealth = true; monster.is_stealth = true;
else else
monster.is_stealth = false; monster.is_stealth = false;
end end
else
error_handler.report("large_monster.update", "Failed to access Data: stealth_controller");
end end
end end
end end
pcall(ailments.update_ailments, enemy, monster); pcall(ailments.update_ailments, enemy, monster);
@@ -530,26 +592,45 @@ function this.update_health(enemy, monster)
local physical_param = get_physical_param_method:call(enemy); local physical_param = get_physical_param_method:call(enemy);
if physical_param == nil then if physical_param == nil then
customization_menu.status = "No physical param"; error_handler.report("large_monster.update_health", "Failed to access Data: physical_param");
return nil; return nil;
end end
local vital_param = get_vital_method:call(physical_param, 0, 0); local vital_param = get_vital_method:call(physical_param, 0, 0);
if vital_param == nil then if vital_param == nil then
customization_menu.status = "No vital param"; error_handler.report("large_monster.update_health", "Failed to access Data: vital_param");
return nil; return nil;
end end
monster.health = get_current_method:call(vital_param) or monster.health; local health = get_current_method:call(vital_param);
monster.max_health = get_max_method:call(vital_param) or monster.max_health; if health ~= nil then
monster.capture_health = get_capture_hp_vital_method:call(physical_param) or monster.capture_health; monster.health = health;
else
monster.missing_health = monster.max_health - monster.health; error_handler.report("large_monster.update_health", "Failed to access Data: health");
if monster.max_health ~= 0 then
monster.health_percentage = monster.health / monster.max_health;
monster.capture_percentage = monster.capture_health / monster.max_health;
end end
local max_health = get_max_method:call(vital_param);
if max_health ~= nil then
monster.max_health = max_health;
else
error_handler.report("large_monster.update_health", "Failed to access Data: max_health");
end
local capture_health = get_capture_hp_vital_method:call(physical_param);
if capture_health ~= nil then
monster.capture_health = capture_health;
else
error_handler.report("large_monster.update_health", "Failed to access Data: capture_health");
end
monster.missing_health = max_health - health;
if monster.max_health ~= 0 then
monster.health_percentage = health / max_health;
monster.capture_percentage = capture_health / max_health;
end
monster.is_health_update_requested = false;
return physical_param; return physical_param;
end end
@@ -569,9 +650,9 @@ function this.update_stamina(enemy, monster, stamina_param)
end end
if stamina_param == nil then if stamina_param == nil then
stamina_param =get_stamina_param_method:call(enemy); stamina_param = get_stamina_param_method:call(enemy);
if stamina_param == nil then if stamina_param == nil then
customization_menu.status = "No stamina param"; error_handler.report("large_monster.update_stamina", "Failed to access Data: stamina_param");
return; return;
end end
end end
@@ -579,14 +660,34 @@ function this.update_stamina(enemy, monster, stamina_param)
local is_tired = is_tired_method:call(stamina_param, false); local is_tired = is_tired_method:call(stamina_param, false);
if is_tired ~= nil then if is_tired ~= nil then
monster.is_tired = is_tired; monster.is_tired = is_tired;
else
error_handler.report("large_monster.update_stamina", "Failed to access Data: is_tired");
return;
end end
monster.stamina = get_stamina_method:call(stamina_param) or monster.stamina; if is_tired then
monster.max_stamina = get_max_stamina_method:call(stamina_param) or monster.max_stamina; return;
end
monster.missing_stamina = monster.max_stamina - monster.stamina; local stamina = get_stamina_method:call(stamina_param);
if monster.max_stamina ~= 0 then if stamina ~= nil then
monster.stamina_percentage = monster.stamina / monster.max_stamina; monster.stamina = stamina;
else
error_handler.report("large_monster.update_stamina", "Failed to access Data: stamina");
return;
end
local max_stamina = get_max_stamina_method:call(stamina_param);
if max_stamina ~= nil then
monster.max_stamina = max_stamina;
else
error_handler.report("large_monster.update_stamina", "Failed to access Data: max_stamina");
return;
end
monster.missing_stamina = max_stamina - stamina;
if max_stamina ~= 0 then
monster.stamina_percentage = stamina / max_stamina;
end end
end end
@@ -608,7 +709,7 @@ function this.update_stamina_timer(enemy, monster, stamina_param)
if stamina_param == nil then if stamina_param == nil then
stamina_param = get_stamina_param_method:call(enemy); stamina_param = get_stamina_param_method:call(enemy);
if stamina_param == nil then if stamina_param == nil then
customization_menu.status = "No stamina param"; error_handler.report("large_monster.update_stamina_timer", "Failed to access Data: stamina_param");
return; return;
end end
end end
@@ -616,14 +717,32 @@ function this.update_stamina_timer(enemy, monster, stamina_param)
local is_tired = is_tired_method:call(stamina_param, false); local is_tired = is_tired_method:call(stamina_param, false);
if is_tired ~= nil then if is_tired ~= nil then
monster.is_tired = is_tired; monster.is_tired = is_tired;
else
error_handler.report("large_monster.update_stamina_timer", "Failed to access Data: is_tired");
return;
end end
if not is_tired then
return;
end
monster.tired_timer = get_remaining_tired_time_method:call(stamina_param) or monster.tired_timer; local tired_timer = get_remaining_tired_time_method:call(stamina_param);
monster.tired_duration = get_total_tired_time_method:call(stamina_param) or monster.tired_duration; if tired_timer ~= nil then
monster.tired_timer = tired_timer;
else
error_handler.report("large_monster.update_stamina_timer", "Failed to access Data: tired_timer");
return;
end
if monster.is_tired then local tired_duration = get_total_tired_time_method:call(stamina_param);
monster.tired_total_seconds_left = monster.tired_timer; if tired_duration ~= nil then
monster.tired_duration = tired_duration;
else
error_handler.report("large_monster.update_stamina_timer", "Failed to access Data: tired_duration");
return;
end
monster.tired_total_seconds_left = tired_timer;
if monster.tired_total_seconds_left < 0 then if monster.tired_total_seconds_left < 0 then
monster.tired_total_seconds_left = 0; monster.tired_total_seconds_left = 0;
end end
@@ -631,9 +750,8 @@ function this.update_stamina_timer(enemy, monster, stamina_param)
monster.tired_minutes_left = math.floor(monster.tired_total_seconds_left / 60); monster.tired_minutes_left = math.floor(monster.tired_total_seconds_left / 60);
monster.tired_seconds_left = monster.tired_total_seconds_left - 60 * monster.tired_minutes_left; monster.tired_seconds_left = monster.tired_total_seconds_left - 60 * monster.tired_minutes_left;
if monster.tired_duration ~= 0 then if tired_duration ~= 0 then
monster.tired_timer_percentage = monster.tired_total_seconds_left / monster.tired_duration; monster.tired_timer_percentage = monster.tired_total_seconds_left / tired_duration;
end
end end
end end
@@ -655,17 +773,41 @@ function this.update_rage(enemy, monster, anger_param)
if anger_param == nil then if anger_param == nil then
anger_param = get_anger_param_method:call(enemy); anger_param = get_anger_param_method:call(enemy);
if anger_param == nil then if anger_param == nil then
customization_menu.status = "No anger param"; error_handler.report("large_monster.update_rage", "Failed to access Data: anger_param");
return; return;
end end
end end
local is_in_rage = is_anger_method:call(anger_param);
if is_in_rage ~= nil then
monster.is_in_rage = is_in_rage;
else
error_handler.report("large_monster.update_rage", "Failed to access Data: is_in_rage");
return;
end
monster.rage_point = get_anger_point_method:call(anger_param) or monster.rage_point; if is_in_rage then
monster.rage_limit = get_limit_anger_method:call(anger_param) or monster.rage_limit; return;
end
if monster.rage_limit ~= 0 then local rage_point = get_anger_point_method:call(anger_param);
monster.rage_percentage = monster.rage_point / monster.rage_limit; if rage_point ~= nil then
monster.rage_point = rage_point;
else
error_handler.report("large_monster.update_rage", "Failed to access Data: rage_point");
return;
end
local rage_limit = get_limit_anger_method:call(anger_param);
if rage_limit ~= nil then
monster.rage_limit = rage_limit;
else
error_handler.report("large_monster.update_rage", "Failed to access Data: rage_limit");
return;
end
if rage_limit ~= 0 then
monster.rage_percentage = rage_point / rage_limit;
end end
end end
@@ -687,7 +829,7 @@ function this.update_rage_timer(enemy, monster, anger_param)
if anger_param == nil then if anger_param == nil then
anger_param = get_anger_param_method:call(enemy); anger_param = get_anger_param_method:call(enemy);
if anger_param == nil then if anger_param == nil then
customization_menu.status = "No anger param"; error_handler.report("large_monster.update_rage_timer", "Failed to access Data: anger_param");
return; return;
end end
end end
@@ -695,13 +837,32 @@ function this.update_rage_timer(enemy, monster, anger_param)
local is_in_rage = is_anger_method:call(anger_param); local is_in_rage = is_anger_method:call(anger_param);
if is_in_rage ~= nil then if is_in_rage ~= nil then
monster.is_in_rage = is_in_rage; monster.is_in_rage = is_in_rage;
else
error_handler.report("large_monster.update_rage_timer", "Failed to access Data: is_in_rage");
return;
end end
monster.rage_timer = get_remaining_anger_time_method:call(anger_param) or monster.rage_timer; if not is_in_rage then
monster.rage_duration = get_total_anger_time_method:call(anger_param) or monster.rage_duration; return;
end
if monster.is_in_rage then local rage_timer = get_remaining_anger_time_method:call(anger_param);
monster.rage_total_seconds_left = monster.rage_timer; if rage_timer ~= nil then
monster.rage_timer = rage_timer;
else
error_handler.report("large_monster.update_rage_timer", "Failed to access Data: rage_timer");
return;
end
local rage_duration = get_total_anger_time_method:call(anger_param);
if rage_duration ~= nil then
monster.rage_duration = rage_duration;
else
error_handler.report("large_monster.update_rage_timer", "Failed to access Data: rage_duration");
return;
end
monster.rage_total_seconds_left = rage_timer;
if monster.rage_total_seconds_left < 0 then if monster.rage_total_seconds_left < 0 then
monster.rage_total_seconds_left = 0; monster.rage_total_seconds_left = 0;
end end
@@ -709,9 +870,8 @@ function this.update_rage_timer(enemy, monster, anger_param)
monster.rage_minutes_left = math.floor(monster.rage_total_seconds_left / 60); monster.rage_minutes_left = math.floor(monster.rage_total_seconds_left / 60);
monster.rage_seconds_left = monster.rage_total_seconds_left - 60 * monster.rage_minutes_left; monster.rage_seconds_left = monster.rage_total_seconds_left - 60 * monster.rage_minutes_left;
if monster.rage_duration ~= 0 then if rage_duration ~= 0 then
monster.rage_timer_percentage = monster.rage_total_seconds_left / monster.rage_duration; monster.rage_timer_percentage = monster.rage_total_seconds_left / rage_duration;
end
end end
end end
@@ -745,31 +905,32 @@ function this.update_parts(enemy, monster, physical_param)
if physical_param == nil then if physical_param == nil then
physical_param = get_physical_param_method:call(enemy); physical_param = get_physical_param_method:call(enemy);
if physical_param == nil then if physical_param == nil then
customization_menu.status = "No physical param"; error_handler.report("large_monster.update_parts", "Failed to access Data: physical_param");
return; return;
end end
end end
local damage_param = get_damage_param_method:call(enemy); local damage_param = get_damage_param_method:call(enemy);
if damage_param == nil then if damage_param == nil then
customization_menu.status = "No damage param"; error_handler.report("large_monster.update_parts", "Failed to access Data: damage_param");
return; return;
end end
local enemy_parts_damage_info = enemy_parts_damage_info_field:get_data(damage_param); local enemy_parts_damage_info = enemy_parts_damage_info_field:get_data(damage_param);
if enemy_parts_damage_info == nil then if enemy_parts_damage_info == nil then
customization_menu.status = "No parts damage info"; error_handler.report("large_monster.update_parts", "Failed to access Data: enemy_parts_damage_info");
return; return;
end end
local core_parts_array = get_part_info_array_method:call(enemy_parts_damage_info); local core_parts_array = get_part_info_array_method:call(enemy_parts_damage_info);
if core_parts_array == nil then if core_parts_array == nil then
customization_menu.status = "No parts damage info array"; error_handler.report("large_monster.update_parts", "Failed to access Data: core_parts_array");
return; return;
end end
local core_parts_array_length = length_method:call(core_parts_array); local core_parts_array_length = get_length_method:call(core_parts_array);
if core_parts_array_length == nil then if core_parts_array_length == nil then
error_handler.report("large_monster.update_parts", "Failed to access Data: core_parts_array_length");
return; return;
end end
@@ -778,7 +939,8 @@ function this.update_parts(enemy, monster, physical_param)
local enemy_parts_info = get_value_method:call(core_parts_array, i); local enemy_parts_info = get_value_method:call(core_parts_array, i);
if enemy_parts_info == nil then if enemy_parts_info == nil then
goto continue error_handler.report("large_monster.update_parts", "Failed to access Data: enemy_parts_info No. " .. tostring(i));
goto continue;
end end
local part = monster.parts[part_id]; local part = monster.parts[part_id];
@@ -795,53 +957,91 @@ function this.update_parts(enemy, monster, physical_param)
if cached_config.dynamic.body_parts.part_health.visibility if cached_config.dynamic.body_parts.part_health.visibility
or cached_config.static.body_parts.part_health.visibility or cached_config.static.body_parts.part_health.visibility
or cached_config.highlighted.body_parts.part_health.visibility then or cached_config.highlighted.body_parts.part_health.visibility then
local part_vital = get_vital_method:call(physical_param, 1, i); local part_vital = get_vital_method:call(physical_param, 1, i);
if part_vital ~= nil then if part_vital ~= nil then
local part_current = get_current_method:call(part_vital) or -1;
local part_max = get_max_method:call(part_vital) or -1;
local part_current = get_current_method:call(part_vital);
if part_current == nil then
error_handler.report("large_monster.update_parts", string.format("Failed to access Data: enemy_parts_info No. %d -> part_current", i));
end
local part_max = get_max_method:call(part_vital);
if part_max == nil then
error_handler.report("large_monster.update_parts", string.format("Failed to access Data: enemy_parts_info No. %d -> part_max", i));
end
if part_current ~= nil and part_max ~= nil then
body_part.update_flinch(part, part_current, part_max); body_part.update_flinch(part, part_current, part_max);
end
else
error_handler.report("large_monster.update_parts", string.format("Failed to access Data: enemy_parts_info No. %d -> part_vital", i));
end end
end end
if cached_config.dynamic.body_parts.part_break.visibility if cached_config.dynamic.body_parts.part_break.visibility
or cached_config.static.body_parts.part_break.visibility or cached_config.static.body_parts.part_break.visibility
or cached_config.highlighted.body_parts.part_break.visibility then or cached_config.highlighted.body_parts.part_break.visibility then
local part_break_vital = get_vital_method:call(physical_param, 2, i); local part_break_vital = get_vital_method:call(physical_param, 2, i);
if part_break_vital ~= nil then if part_break_vital ~= nil then
local part_break_current = get_current_method:call(part_break_vital) or -1;
local part_break_max = get_max_method:call(part_break_vital) or -1;
local part_break_count = -1;
local part_break_max_count = -1;
if enemy_parts_info ~= nil then local part_break_current = get_current_method:call(part_break_vital);
part_break_count = get_parts_break_damage_level_method:call(enemy_parts_info) or part_break_count; if part_break_current == nil then
part_break_max_count = get_parts_break_damage_max_level_method:call(enemy_parts_info) or part_break_max_count; error_handler.report("large_monster.update_parts", string.format("Failed to access Data: enemy_parts_info No. %d -> part_break_current", i));
end end
body_part.update_break(part, part_break_current, part_break_max, part_break_count, part_break_max_count) local part_break_max = get_max_method:call(part_break_vital);
if part_break_max == nil then
error_handler.report("large_monster.update_parts", string.format("Failed to access Data: enemy_parts_info No. %d -> part_break_max", i));
end
local part_break_count = get_parts_break_damage_level_method:call(enemy_parts_info);
if part_break_count == nil then
error_handler.report("large_monster.update_parts", string.format("Failed to access Data: enemy_parts_info No. %d -> part_break_count", i));
end
local part_break_max_count = get_parts_break_damage_max_level_method:call(enemy_parts_info);
if part_break_max_count == nil then
error_handler.report("large_monster.update_parts", string.format("Failed to access Data: enemy_parts_info No. %d -> part_break_max_count", i));
end
if part_break_current ~= nil and part_break_max ~= nil and part_break_count ~= nil and part_break_max_count ~= nil then
body_part.update_break(part, part_break_current, part_break_max, part_break_count, part_break_max_count);
end
else
error_handler.report("large_monster.update_parts", string.format("Failed to access Data: enemy_parts_info No. %d -> part_break_vital", i));
end end
end end
if cached_config.dynamic.body_parts.part_loss.visibility if cached_config.dynamic.body_parts.part_loss.visibility
or cached_config.static.body_parts.part_loss.visibility or cached_config.static.body_parts.part_loss.visibility
or cached_config.highlighted.body_parts.part_loss.visibility then or cached_config.highlighted.body_parts.part_loss.visibility then
local part_loss_vital = get_vital_method:call(physical_param, 3, i); local part_loss_vital = get_vital_method:call(physical_param, 3, i);
if part_loss_vital ~= nil then if part_loss_vital ~= nil then
local part_loss_current = get_current_method:call(part_loss_vital) or -1;
local part_loss_max = get_max_method:call(part_loss_vital) or -1;
local is_severed = false;
if enemy_parts_info ~= nil then local part_loss_current = get_current_method:call(part_loss_vital);
local _is_severed = get_parts_loss_state_method:call(enemy_parts_info); if part_loss_current == nil then
if _is_severed ~= nil then error_handler.report("large_monster.update_parts", string.format("Failed to access Data: enemy_parts_info No. %d -> part_loss_current", i));
is_severed = _is_severed;
end
end end
local part_loss_max = get_max_method:call(part_loss_vital);
if part_loss_max == nil then
error_handler.report("large_monster.update_parts", string.format("Failed to access Data: enemy_parts_info No. %d -> part_loss_max", i));
end
local is_severed = get_parts_loss_state_method:call(enemy_parts_info);
if is_severed == nil then
error_handler.report("large_monster.update_parts", string.format("Failed to access Data: enemy_parts_info No. %d -> is_severed", i));
end
if part_loss_current ~= nil and part_loss_max ~= nil and is_severed ~= nil then
body_part.update_loss(part, part_loss_current, part_loss_max, is_severed); body_part.update_loss(part, part_loss_current, part_loss_max, is_severed);
end end
else
error_handler.report("large_monster.update_parts", string.format("Failed to access Data: enemy_parts_info No. %d -> part_loss_vital", i));
end
end end
::continue:: ::continue::
@@ -878,12 +1078,13 @@ function this.update_anomaly_parts(enemy, monster, mystery_param)
local core_parts_array = core_parts_array_field:get_data(mystery_param); local core_parts_array = core_parts_array_field:get_data(mystery_param);
if core_parts_array == nil then if core_parts_array == nil then
customization_menu.status = "No core parts array"; error_handler.report("large_monster.update_anomaly_parts", "Failed to access Data: core_parts_array");
return; return;
end end
local core_parts_array_length = length_method:call(core_parts_array); local core_parts_array_length = get_length_method:call(core_parts_array);
if core_parts_array_length == nil then if core_parts_array_length == nil then
error_handler.report("large_monster.update_anomaly_parts", "Failed to access Data: core_parts_array_length");
return; return;
end end
@@ -892,7 +1093,8 @@ function this.update_anomaly_parts(enemy, monster, mystery_param)
local core_part = get_value_method:call(core_parts_array, i); local core_part = get_value_method:call(core_parts_array, i);
if core_part == nil then if core_part == nil then
goto continue error_handler.report("large_monster.update_anomaly_parts", "Failed to access Data: core_part No. " .. tostring(i));
goto continue;
end end
local part = monster.parts[part_id]; local part = monster.parts[part_id];
@@ -907,18 +1109,36 @@ function this.update_anomaly_parts(enemy, monster, mystery_param)
end end
local part_vital = core_parts_get_vital_method:call(core_part); local part_vital = core_parts_get_vital_method:call(core_part);
local part_is_active = core_parts_get_is_active_method:call(core_part); if part_vital == nil then
--local part_dying_vital_threshold = core_parts_get_dying_vital_threashold_method:call(core_part); error_handler.report("large_monster.update_anomaly_parts", "Failed to access Data: part_vital No. " .. tostring(i));
return;
if part_is_active == nil then
part_is_active = false;
end end
if part_vital ~= nil then local part_is_active = core_parts_get_is_active_method:call(core_part);
local part_current = get_current_method:call(part_vital) or -1; if part_is_active == nil then
local part_max = get_max_method:call(part_vital) or -1; error_handler.report("large_monster.update_anomaly_parts", "Failed to access Data: part_is_active No. " .. tostring(i));
local part_is_enabled = is_enable_method:call(part_vital); return;
end
--local part_dying_vital_threshold = core_parts_get_dying_vital_threashold_method:call(core_part);
local part_current = get_current_method:call(part_vital);
if part_current == nil then
error_handler.report("large_monster.update_anomaly_parts", "Failed to access Data: part_current No. " .. tostring(i));
goto continue;
end
local part_max = get_max_method:call(part_vital);
if part_max == nil then
error_handler.report("large_monster.update_anomaly_parts", "Failed to access Data: part_max No. " .. tostring(i));
goto continue;
end
local part_is_enabled = is_enable_method:call(part_vital);
if part_is_enabled == nil then
error_handler.report("large_monster.update_anomaly_parts", "Failed to access Data: part_is_enabled No. " .. tostring(i));
goto continue;
end
if not part_is_enabled then if not part_is_enabled then
goto continue; goto continue;
@@ -926,23 +1146,41 @@ function this.update_anomaly_parts(enemy, monster, mystery_param)
body_part.update_anomaly(part, core_part, part_current, part_max, part_is_active); body_part.update_anomaly(part, core_part, part_current, part_max, part_is_active);
end
::continue:: ::continue::
end end
end end
function this.draw(monster, type, cached_config, position_on_screen, opacity_scale) function this.update_highlighted_id()
local monster_UI; if quest_status.flow_state <= quest_status.flow_states.IN_LOBBY
or quest_status.flow_state == quest_status.flow_states.LOADING_QUEST
if type == "dynamic" then or quest_status.flow_state == quest_status.flow_states.CUTSCENE
monster_UI = monster.dynamic_UI; or quest_status.flow_state >= quest_status.flow_states.QUEST_END_ANIMATION then
elseif type == "static" then return;
monster_UI = monster.static_UI;
else
monster_UI = monster.highlighted_UI;
end end
if singletons.gui_manager == nil then
error_handler.report("large_monster.update_highlighted_id", "Failed to access Data: gui_manager");
return;
end
local gui_hud_target_camera = get_tg_camera_method:call(singletons.gui_manager);
if gui_hud_target_camera == nil then
error_handler.report("large_monster.update_highlighted_id", "Failed to access Data: gui_hud_target_camera");
return;
end
local highlighted_id = get_targeting_enemy_index_field:get_data(gui_hud_target_camera);
if highlighted_id == nil then
error_handler.report("large_monster_UI.update_highlighted_id", "Failed to access Data: highlighted_id");
return;
end
this.highlighted_id = highlighted_id;
end
function this.draw(monster, type, cached_config, position_on_screen, opacity_scale)
local monster_UI = monster[type];
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier; local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
local monster_name_text = ""; local monster_name_text = "";
@@ -951,20 +1189,29 @@ function this.draw(monster, type, cached_config, position_on_screen, opacity_sca
end end
if cached_config.monster_name_label.include.monster_id then if cached_config.monster_name_label.include.monster_id then
monster_name_text = monster_name_text .. tostring(monster.id) .. " "; monster_name_text = string.format("%s%s ", monster_name_text, tostring(monster.id));
end end
if cached_config.monster_name_label.include.crown and monster.crown ~= "" then if cached_config.monster_name_label.include.crown and monster.crown ~= "" then
monster_name_text = monster_name_text .. string.format("%s ", monster.crown); monster_name_text = string.format("%s%s ", monster_name_text, monster.crown);
end end
if cached_config.monster_name_label.include.size then if cached_config.monster_name_label.include.size and monster.size > 0 then
monster_name_text = monster_name_text .. string.format("#%.0f ", 100 * monster.size); monster_name_text = string.format("%s#%.0f ", monster_name_text, 100 * monster.size);
end end
if cached_config.monster_name_label.include.scrown_thresholds then if cached_config.monster_name_label.include.crown_thresholds then
monster_name_text = monster_name_text .. string.format("<=%.0f >=%.0f >=%.0f", 100 * monster.small_border, if monster.small_border ~= -1 then
100 * monster.big_border, 100 * monster.king_border); monster_name_text = string.format("%s<=%.0f ", monster_name_text, 100 * monster.small_border);
end
if monster.big_border ~= -1 then
monster_name_text = string.format("%s>=%.0f ", monster_name_text, 100 * monster.big_border);
end
if monster.king_border ~= -1 then
monster_name_text = string.format("%s>=%.0f ", monster_name_text, 100 * monster.king_border);
end
end end
if monster.is_capturable and monster.health < monster.capture_health then if monster.is_capturable and monster.health < monster.capture_health then
@@ -1033,13 +1280,15 @@ function this.init_list()
this.list = {}; this.list = {};
end end
function this.init_module() function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons"); singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
body_part = require("MHR_Overlay.Monsters.body_part"); body_part = require("MHR_Overlay.Monsters.body_part");
quest_status = require("MHR_Overlay.Game_Handler.quest_status");
health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_UI_entity"); health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_UI_entity");
stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity"); stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity");
rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity"); rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity");
@@ -1054,6 +1303,15 @@ function this.init_module()
players = require("MHR_Overlay.Damage_Meter.players"); players = require("MHR_Overlay.Damage_Meter.players");
time = require("MHR_Overlay.Game_Handler.time"); time = require("MHR_Overlay.Game_Handler.time");
ailment_buildup = require("MHR_Overlay.Monsters.ailment_buildup"); ailment_buildup = require("MHR_Overlay.Monsters.ailment_buildup");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
sdk.hook(receive_quest_hunter_info_method, function(args)
this.request_health_update();
end, function(retval)
return retval;
end);
end end
return this; return this;

View File

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

View File

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

View File

@@ -14,6 +14,7 @@ local keyboard;
local customization_menu; local customization_menu;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -255,7 +256,7 @@ function this.draw(cached_config)
return config_changed; return config_changed;
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -271,6 +272,10 @@ function this.init_module()
label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -14,6 +14,7 @@ local keyboard;
local customization_menu; local customization_menu;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -386,7 +387,7 @@ function this.draw(cached_config)
return config_changed; return config_changed;
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -401,6 +402,10 @@ function this.init_module()
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -13,6 +13,7 @@ local time_UI;
local keyboard; local keyboard;
local customization_menu; local customization_menu;
local line_customization; local line_customization;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -149,15 +150,13 @@ function this.draw(bar_name, bar)
bar.outline.offset, 0.1, -screen.height, screen.height, "%.1f"); bar.outline.offset, 0.1, -screen.height, screen.height, "%.1f");
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
changed, index = imgui.combo(cached_language.style, changed, index = imgui.combo(cached_language.style,
utils.table.find_index(this.outline_styles, utils.table.find_index(outline_styles, bar.outline.style),
bar.outline.style), displayed_outline_styles);
this.displayed_outline_styles);
bar_changed = bar_changed or changed; bar_changed = bar_changed or changed;
if changed then if changed then
bar.outline.style = this.outline_styles[index]; bar.outline.style = outline_styles[index];
end end
imgui.tree_pop(); imgui.tree_pop();
@@ -243,7 +242,7 @@ function this.draw(bar_name, bar)
return bar_changed; return bar_changed;
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -257,6 +256,10 @@ function this.init_module()
keyboard = require("MHR_Overlay.Game_Handler.keyboard"); keyboard = require("MHR_Overlay.Game_Handler.keyboard");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
line_customization = require("MHR_Overlay.UI.Customizations.line_customization"); line_customization = require("MHR_Overlay.UI.Customizations.line_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -14,6 +14,7 @@ local keyboard;
local customization_menu; local customization_menu;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -511,7 +512,7 @@ function this.draw(cached_config)
return config_changed; return config_changed;
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -526,6 +527,10 @@ function this.init_module()
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

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

View File

@@ -11,6 +11,7 @@ local part_names;
local time_UI; local time_UI;
local keyboard; local keyboard;
local customization_menu; local customization_menu;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -61,6 +62,17 @@ function this.draw(label_name, label)
imgui.tree_pop(); imgui.tree_pop();
end end
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 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"); 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; label_changed = label_changed or changed;
@@ -79,8 +91,7 @@ function this.draw(label_name, label)
end end
if imgui.tree_node(cached_language.shadow) then if imgui.tree_node(cached_language.shadow) then
changed, label.shadow.visibility = imgui.checkbox(cached_language changed, label.shadow.visibility = imgui.checkbox(cached_language.visible, label.shadow.visibility);
.visible, label.shadow.visibility);
label_changed = label_changed or changed; label_changed = label_changed or changed;
if imgui.tree_node(cached_language.offset) then if imgui.tree_node(cached_language.offset) then
@@ -112,7 +123,7 @@ function this.draw(label_name, label)
return label_changed; return label_changed;
end end
function this.init_module() function this.init_dependencies()
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
screen = require("MHR_Overlay.Game_Handler.screen"); screen = require("MHR_Overlay.Game_Handler.screen");
@@ -124,6 +135,10 @@ function this.init_module()
time_UI = require("MHR_Overlay.UI.Modules.time_UI"); time_UI = require("MHR_Overlay.UI.Modules.time_UI");
keyboard = require("MHR_Overlay.Game_Handler.keyboard"); keyboard = require("MHR_Overlay.Game_Handler.keyboard");
customization_menu = require("MHR_Overlay.UI.customization_menu"); customization_menu = require("MHR_Overlay.UI.customization_menu");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,322 @@
local this = {};
local buff_UI_entity;
local config;
local buffs;
local consumables;
local melody_effects;
local endemic_life_buff;
local screen;
local utils;
local error_handler;
local skills;
local dangos;
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");
consumables = require("MHR_Overlay.Buffs.consumables");
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");
dangos = require("MHR_Overlay.Buffs.dangos");
abnormal_statuses = require("MHR_Overlay.Buffs.abnormal_statuses");
drawing = require("MHR_Overlay.UI.drawing");
player_info = require("MHR_Overlay.Misc.player_info");
language = require("MHR_Overlay.Misc.language");
end
function this.init_module()
this.init_UI();
end
return this;

View File

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

View File

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

View File

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

View File

@@ -3,6 +3,7 @@ local this = {};
local config; local config;
local utils; local utils;
local drawing; local drawing;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -302,10 +303,14 @@ function this.draw(part, part_UI, cached_config, position_on_screen, opacity_sca
end end
end end
function this.init_module() function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
drawing = require("MHR_Overlay.UI.drawing"); drawing = require("MHR_Overlay.UI.drawing");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -14,6 +14,9 @@ local keyboard;
local non_players; local non_players;
local quest_status; local quest_status;
local buffs; local buffs;
local error_handler;
local time;
local stats_UI;
local label_customization; local label_customization;
local bar_customization; local bar_customization;
@@ -61,10 +64,10 @@ local os = os;
local ValueType = ValueType; local ValueType = ValueType;
local package = package; local package = package;
this.is_opened = false;
this.font = nil; this.font = nil;
this.full_font_range = {0x1, 0xFFFF, 0}; this.full_font_range = {0x1, 0xFFFF, 0};
this.is_opened = false;
this.status = "OK";
this.window_position = Vector2f.new(480, 200); this.window_position = Vector2f.new(480, 200);
this.window_pivot = Vector2f.new(0, 0); this.window_pivot = Vector2f.new(0, 0);
@@ -325,21 +328,33 @@ function this.init()
end end
function this.draw() function this.draw()
imgui.set_next_window_pos(this.window_position, 1 << 3, this.window_pivot); if not this.is_opened then
imgui.set_next_window_size(this.window_size, 1 << 3); return;
end
local window_position = Vector2f.new(config.current_config.customization_menu.position.x, config.current_config.customization_menu.position.y);
local window_pivot = Vector2f.new(config.current_config.customization_menu.pivot.x, config.current_config.customization_menu.pivot.y);
local window_size = Vector2f.new(config.current_config.customization_menu.size.width, config.current_config.customization_menu.size.height);
imgui.set_next_window_pos(window_position, 1 << 3, window_pivot);
imgui.set_next_window_size(window_size, 1 << 3);
imgui.push_font(this.font); imgui.push_font(this.font);
this.is_opened = imgui.begin_window( this.is_opened = imgui.begin_window(
language.current_language.customization_menu.mod_name .. " v" .. config.current_config.version, this.is_opened, string.format("%s v%s", language.current_language.customization_menu.mod_name, config.current_config.version),
this.is_opened,
this.window_flags); this.window_flags);
if not this.is_opened then if not this.is_opened then
imgui.pop_font(); imgui.pop_font();
imgui.end_window(); imgui.end_window();
config.save_current();
return; return;
end end
local window_changed = false;
local config_changed = false; local config_changed = false;
local language_changed = false; local language_changed = false;
local modifiers_changed = false; local modifiers_changed = false;
@@ -353,11 +368,28 @@ function this.draw()
local damage_meter_UI_changed = false; local damage_meter_UI_changed = false;
local endemic_life_UI_changed = false; local endemic_life_UI_changed = false;
local buff_UI_changed = false; local buff_UI_changed = false;
local stats_UI_changed = false;
local debug_changed = false;
local apply_font_requested = false; local apply_font_requested = false;
local status_string = tostring(this.status); local new_window_position = imgui.get_window_pos();
if window_position.x ~= new_window_position.x or window_position.y ~= new_window_position.y then
window_changed = window_changed or true;
imgui.text(language.current_language.customization_menu.status .. ": " .. status_string); config.current_config.customization_menu.position.x = new_window_position.x;
config.current_config.customization_menu.position.y = new_window_position.y;
end
local new_window_size = imgui.get_window_size();
if window_size.x ~= new_window_size.x or window_size.y ~= new_window_size.y then
window_changed = window_changed or true;
config.current_config.customization_menu.size.width = new_window_size.x;
config.current_config.customization_menu.size.height = new_window_size.y;
end
local new_window_size = imgui.get_window_size();
window_changed = window_changed or new_window_size.x ~= window_size.x or new_window_size.y ~= window_size.y;
config_changed, apply_font_requested = this.draw_config(); config_changed, apply_font_requested = this.draw_config();
modules_changed = this.draw_modules(); modules_changed = this.draw_modules();
@@ -375,7 +407,11 @@ function this.draw()
time_UI_changed = this.draw_time_UI(); time_UI_changed = this.draw_time_UI();
damage_meter_UI_changed = this.draw_damage_meter_UI(); damage_meter_UI_changed = this.draw_damage_meter_UI();
endemic_life_UI_changed = this.draw_endemic_life_UI() endemic_life_UI_changed = this.draw_endemic_life_UI()
--buff_UI_changed = customization_menu.draw_buff_UI(); buff_UI_changed = this.draw_buff_UI();
stats_UI_changed = this.draw_stats_UI()
imgui.new_line();
debug_changed = this.draw_debug();
imgui.pop_font(); imgui.pop_font();
imgui.end_window(); imgui.end_window();
@@ -434,22 +470,28 @@ function this.draw()
end end
end end
--[[if buff_UI_changed or modifiers_changed or config_changed then if buff_UI_changed or modifiers_changed or config_changed then
for _, buff in pairs(buffs.list) do for _, buff in pairs(buffs.list) do
buffs.init_UI(buff); buffs.init_UI(buff);
end end
end]] end
if stats_UI_changed or modifiers_changed or config_changed then
stats_UI.init_UI();
end
if this.menu_font_changed and (apply_font_requested or config_changed) then if this.menu_font_changed and (apply_font_requested or config_changed) then
this.menu_font_changed = false; this.menu_font_changed = false;
this.reload_font(); this.reload_font();
end end
if modules_changed or global_settings_changed or small_monster_UI_changed or large_monster_dynamic_UI_changed or if window_changed or modules_changed or global_settings_changed or small_monster_UI_changed or large_monster_dynamic_UI_changed or
large_monster_static_UI_changed or large_monster_highlighted_UI_changed or time_UI_changed or damage_meter_UI_changed or large_monster_static_UI_changed or large_monster_highlighted_UI_changed or time_UI_changed or damage_meter_UI_changed or
endemic_life_UI_changed or buff_UI_changed or modifiers_changed or config_changed then endemic_life_UI_changed or buff_UI_changed or stats_UI_changed or modifiers_changed or config_changed or debug_changed then
config.save_current(); config.save_current();
end end
end end
function this.draw_config() function this.draw_config()
@@ -569,9 +611,9 @@ function this.draw_modules()
language.current_language.customization_menu.endemic_life_UI, config.current_config.endemic_life_UI.enabled); language.current_language.customization_menu.endemic_life_UI, config.current_config.endemic_life_UI.enabled);
config_changed = config_changed or changed; config_changed = config_changed or changed;
--[[changed, config.current_config.buff_UI.enabled = imgui.checkbox( changed, config.current_config.buff_UI.enabled = imgui.checkbox(
language.current_language.customization_menu.buff_UI, config.current_config.buff_UI.enabled); language.current_language.customization_menu.buff_UI, config.current_config.buff_UI.enabled);
config_changed = config_changed or changed;]] config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
@@ -970,6 +1012,17 @@ function this.draw_global_settings(apply_font_requested, language_changed)
if imgui.tree_node(language.current_language.customization_menu.module_visibility_based_on_game_state) then if imgui.tree_node(language.current_language.customization_menu.module_visibility_based_on_game_state) then
if imgui.tree_node(language.current_language.customization_menu.in_lobby) then
changed, cached_config.module_visibility.in_lobby.stats_UI = imgui.checkbox(
language.current_language.customization_menu.stats_UI,
cached_config.module_visibility.in_lobby.stats_UI);
config_changed = config_changed or changed;
imgui.tree_pop();
end
if imgui.tree_node(language.current_language.customization_menu.in_training_area) then if imgui.tree_node(language.current_language.customization_menu.in_training_area) then
changed, cached_config.module_visibility.in_training_area.large_monster_dynamic_UI = imgui.checkbox( changed, cached_config.module_visibility.in_training_area.large_monster_dynamic_UI = imgui.checkbox(
@@ -1002,11 +1055,17 @@ function this.draw_global_settings(apply_font_requested, language_changed)
config_changed = config_changed or changed; config_changed = config_changed or changed;
--[[changed, cached_config.module_visibility.in_training_area.buff_UI = imgui.checkbox( changed, cached_config.module_visibility.in_training_area.buff_UI = imgui.checkbox(
language.current_language.customization_menu.buff_UI, language.current_language.customization_menu.buff_UI,
cached_config.module_visibility.in_training_area.buff_UI); cached_config.module_visibility.in_training_area.buff_UI);
config_changed = config_changed or changed;]] config_changed = config_changed or changed;
changed, cached_config.module_visibility.in_training_area.stats_UI = imgui.checkbox(
language.current_language.customization_menu.stats_UI,
cached_config.module_visibility.in_training_area.stats_UI);
config_changed = config_changed or changed;
imgui.tree_pop(); imgui.tree_pop();
end end
@@ -2026,6 +2085,9 @@ function this.draw_damage_meter_UI()
changed = label_customization.draw(language.current_language.customization_menu.hunter_rank_label, cached_config.highlighted.hunter_rank_label); changed = label_customization.draw(language.current_language.customization_menu.hunter_rank_label, cached_config.highlighted.hunter_rank_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.cart_count_label, cached_config.highlighted.cart_count_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.dps_label, cached_config.highlighted.dps_label); changed = label_customization.draw(language.current_language.customization_menu.dps_label, cached_config.highlighted.dps_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
@@ -2042,12 +2104,7 @@ function this.draw_damage_meter_UI()
end end
if config_changed then if config_changed then
local is_on_quest = quest_status.flow_state ~= quest_status.flow_states.IN_LOBBY and quest_status.flow_state ~= quest_status.flow_states.IN_TRAINING_AREA; players.update_players();
players.display_list = {};
players.update_player_list(is_on_quest);
non_players.update_servant_list();
non_players.update_otomo_list(is_on_quest, quest_status.is_online);
end end
if damage_display_changed then if damage_display_changed then
@@ -2067,10 +2124,6 @@ function this.draw_damage_meter_UI()
players.update_dps(true); players.update_dps(true);
end end
if config_changed then
players.sort_players();
end
imgui.tree_pop(); imgui.tree_pop();
end end
@@ -2142,7 +2195,7 @@ function this.draw_endemic_life_UI()
end end
changed = label_customization.draw( changed = label_customization.draw(
language.current_language.customization_menu.creature_name_label, cached_config.creature_name_label.visibility); language.current_language.customization_menu.creature_name_label, cached_config.creature_name_label);
config_changed = config_changed or changed; config_changed = config_changed or changed;
@@ -2264,7 +2317,143 @@ function this.draw_buff_UI()
return config_changed; return config_changed;
end end
function this.init_module() function this.draw_stats_UI()
local changed = false;
local config_changed = false;
local index = 0;
if imgui.tree_node(language.current_language.customization_menu.stats_UI) then
local cached_config = config.current_config.stats_UI;
changed, cached_config.enabled = imgui.checkbox(
language.current_language.customization_menu.enabled, cached_config.enabled);
config_changed = config_changed or changed;
if imgui.tree_node(language.current_language.customization_menu.position) then
changed, cached_config.position.x = imgui.drag_float(
language.current_language.customization_menu.x, cached_config.position.x, 0.1, 0, screen.width, "%.1f");
config_changed = config_changed or changed;
changed, cached_config.position.y = imgui.drag_float(
language.current_language.customization_menu.y, cached_config.position.y, 0.1, 0, screen.height, "%.1f");
config_changed = config_changed or changed;
changed, index = imgui.combo(
language.current_language.customization_menu.anchor,
utils.table.find_index(this.anchor_types, cached_config.position.anchor),
this.displayed_anchor_types);
config_changed = config_changed or changed;
if changed then
cached_config.position.anchor = this.anchor_types[index];
end
imgui.tree_pop();
end
changed = label_customization.draw(language.current_language.customization_menu.health_label, cached_config.health_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.stamina_label, cached_config.stamina_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.attack_label, cached_config.attack_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.affinity_label, cached_config.affinity_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.defense_label, cached_config.defense_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.fire_resistance_label, cached_config.fire_resistance_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.water_resistance_label, cached_config.water_resistance_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.thunder_resistance_label, cached_config.thunder_resistance_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.ice_resistance_label, cached_config.ice_resistance_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.dragon_resistance_label, cached_config.dragon_resistance_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.element_label, cached_config.element_label);
config_changed = config_changed or changed;
changed = label_customization.draw(language.current_language.customization_menu.element_2_label, cached_config.element_2_label);
config_changed = config_changed or changed;
imgui.tree_pop();
end
return config_changed;
end
function this.draw_debug()
local cached_config = config.current_config.debug;
local changed = false;
local config_changed = false;
if imgui.tree_node(language.current_language.customization_menu.debug) then
imgui.text_colored(string.format("%s:", language.current_language.customization_menu.current_time), 0xFFAAAA66);
imgui.same_line();
imgui.text(string.format("%.3fs", time.total_elapsed_script_seconds));
if error_handler.is_empty then
imgui.text(language.current_language.customization_menu.everything_seems_to_be_ok);
else
for error_key, error in pairs(error_handler.list) do
imgui.button(string.format("%.3fs", error.time));
imgui.same_line();
imgui.text_colored(error_key, 0xFFAA66AA);
imgui.same_line();
imgui.text(error.message);
end
end
if imgui.tree_node(language.current_language.customization_menu.history) then
changed, cached_config.history_size = imgui.drag_int(
language.current_language.customization_menu.history_size, cached_config.history_size, 1, 0, 1024);
config_changed = config_changed or changed;
if changed then
error_handler.history = {};
end
for index, error in pairs(error_handler.history) do
imgui.text_colored(index, 0xFF66AA66);
imgui.same_line();
imgui.button(string.format("%.3fs", error.time));
imgui.same_line();
imgui.text_colored(error.key, 0xFFAA66AA);
imgui.same_line();
imgui.text(error.message);
end
imgui.tree_pop();
end
imgui.tree_pop();
end
return config_changed;
end
function this.init_dependencies()
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
language = require("MHR_Overlay.Misc.language"); language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
@@ -2279,6 +2468,9 @@ function this.init_module()
non_players = require("MHR_Overlay.Damage_Meter.non_players"); non_players = require("MHR_Overlay.Damage_Meter.non_players");
quest_status = require("MHR_Overlay.Game_Handler.quest_status"); quest_status = require("MHR_Overlay.Game_Handler.quest_status");
buffs = require("MHR_Overlay.Buffs.buffs"); buffs = require("MHR_Overlay.Buffs.buffs");
error_handler = require("MHR_Overlay.Misc.error_handler");
time = require("MHR_Overlay.Game_Handler.time");
stats_UI = require("MHR_Overlay.UI.Modules.stats_UI");
label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization");
bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization");
@@ -2291,7 +2483,9 @@ function this.init_module()
ailments_customization = require("MHR_Overlay.UI.Customizations.ailments_customization"); ailments_customization = require("MHR_Overlay.UI.Customizations.ailments_customization");
ailment_buildups_customization = require("MHR_Overlay.UI.Customizations.ailment_buildups_customization"); ailment_buildups_customization = require("MHR_Overlay.UI.Customizations.ailment_buildups_customization");
module_visibility_customization = require("MHR_Overlay.UI.Customizations.module_visibility_customization"); module_visibility_customization = require("MHR_Overlay.UI.Customizations.module_visibility_customization");
end
function this.init_module()
this.init(); this.init();
this.reload_font(); this.reload_font();
end end

View File

@@ -2,6 +2,7 @@ local this = {};
local config; local config;
local utils; local utils;
local error_handler;
local sdk = sdk; local sdk = sdk;
local tostring = tostring; local tostring = tostring;
@@ -82,7 +83,7 @@ function this.limit_text_size(text, size_limit)
limited_text = utils.unicode.sub(limited_text, 1, -5) .. "..."; limited_text = utils.unicode.sub(limited_text, 1, -5) .. "...";
if limited_text == old_limited_text then if limited_text == old_limited_text then
break break;
end end
end end
end end
@@ -199,7 +200,7 @@ function this.draw_bar(bar, position, opacity_scale, percentage)
local outline_offset = bar.outline.offset; local outline_offset = bar.outline.offset;
if outline_thickness == 0 then if utils.number.is_equal(outline_thickness, 0) then
outline_offset = 0; outline_offset = 0;
end end
local half_outline_offset = outline_offset / 2; local half_outline_offset = outline_offset / 2;
@@ -376,9 +377,13 @@ function this.draw_capture_line(health_UI, position, opacity_scale, percentage)
end end
end end
function this.init_module() function this.init_dependencies()
config = require("MHR_Overlay.Misc.config"); config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils"); utils = require("MHR_Overlay.Misc.utils");
error_handler = require("MHR_Overlay.Misc.error_handler");
end
function this.init_module()
end end
return this; return this;

View File

@@ -18,30 +18,65 @@
}, },
"ailments": { "ailments": {
"blast": "Blast", "blast": "Blast",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "Dung Bomb", "dung_bomb": "Dung Bomb",
"engulfed": "Engulfed",
"exhaust": "Exhaust", "exhaust": "Exhaust",
"fall_otomo_trap": "Fall Buddy Trap", "fall_otomo_trap": "Fall Buddy Trap",
"fall_trap": "Fall Trap", "fall_trap": "Fall Trap",
"fireblight": "Fireblight", "fireblight": "Fireblight",
"flash": "Flash", "flash": "Flash",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "Iceblight", "iceblight": "Iceblight",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "Paralysis", "paralysis": "Paralysis",
"poison": "Poison", "poison": "Poison",
"quick_sand": "Quick Sand", "quick_sand": "Quick Sand",
"resistance_down": "Resistance Down",
"ride": "Wyvern Riding", "ride": "Wyvern Riding",
"roar": "Roar",
"shock_otomo_trap": "Shock Buddy Trap", "shock_otomo_trap": "Shock Buddy Trap",
"shock_trap": "Shock Trap", "shock_trap": "Shock Trap",
"sleep": "Sleep", "sleep": "Sleep",
"steel_fang": "Steel Fang", "steel_fang": "Steel Fang",
"stench": "Stench",
"stun": "Stun", "stun": "Stun",
"thunderblight": "Thunderblight", "thunderblight": "Thunderblight",
"tranq_bomb": "Tranq Bomb", "tranq_bomb": "Tranq Bomb",
"waterblight": "Waterblight" "tremor": "Tremor",
"waterblight": "Waterblight",
"webbed": "Webbed"
},
"consumables": {
"adamant_seed": "Adamant Seed",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_powder": "Demon Powder",
"demondrug": "Demondrug",
"gourmet_fish": "Gourmet Fish",
"hardshell_powder": "Hardshell Powder",
"immunizer": "Immunizer",
"mega_armorskin": "Mega Armorskin",
"mega_demondrug": "Mega Demondrug",
"might_seed": "Might Seed"
}, },
"customization_menu": { "customization_menu": {
"UI_font": "UI Font", "UI_font": "UI Font",
"UI_font_notice": "Any changes to the font require script reload!", "UI_font_notice": "Any changes to the font require script reload!",
"activation_count": "Activation Count", "activation_count": "Activation Count",
"affinity_label": "Affinity Label",
"ailment_buildups": "Ailment Buildups", "ailment_buildups": "Ailment Buildups",
"ailment_name": "Ailment Name", "ailment_name": "Ailment Name",
"ailment_name_label": "Ailment Name Label", "ailment_name_label": "Ailment Name Label",
@@ -55,6 +90,7 @@
"anomaly_health_percentage": "Anomaly Core Health Percentage", "anomaly_health_percentage": "Anomaly Core Health Percentage",
"apply": "Apply", "apply": "Apply",
"assign_new_key": "Assign new key", "assign_new_key": "Assign new key",
"attack_label": "Attack Label",
"auto_highlight": "Auto-highlight", "auto_highlight": "Auto-highlight",
"background": "Background", "background": "Background",
"bar": "Bar", "bar": "Bar",
@@ -92,6 +128,7 @@
"crown": "Crown", "crown": "Crown",
"crown_thresholds": "Crown Thresholds", "crown_thresholds": "Crown Thresholds",
"current_state": "Current State", "current_state": "Current State",
"current_time": "Current Time",
"current_value": "Current Value", "current_value": "Current Value",
"cutscene": "Cutscene", "cutscene": "Cutscene",
"damage": "Damage", "damage": "Damage",
@@ -100,26 +137,33 @@
"damage_meter_UI": "Damage Meter UI", "damage_meter_UI": "Damage Meter UI",
"damage_percentage_label": "Damage Percentage Label", "damage_percentage_label": "Damage Percentage Label",
"damage_value_label": "Damage Value Label", "damage_value_label": "Damage Value Label",
"debug": "Debug",
"default_state": "Default State", "default_state": "Default State",
"defense_label": "Defense Label",
"delete": "Delete", "delete": "Delete",
"distance": "Distance", "distance": "Distance",
"dps": "DPS", "dps": "DPS",
"dps_label": "DPS Label", "dps_label": "DPS Label",
"dps_mode": "DPS Mode", "dps_mode": "DPS Mode",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "Duplicate", "duplicate": "Duplicate",
"duration": "Duration", "duration": "Duration",
"dynamic_positioning": "Dynamic Positioning", "dynamic_positioning": "Dynamic Positioning",
"dynamically_positioned": "Dynamically Positioned", "dynamically_positioned": "Dynamically Positioned",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "Enable for", "enable_for": "Enable for",
"enabled": "Enabled", "enabled": "Enabled",
"endemic_life": "Endemic Life", "endemic_life": "Endemic Life",
"endemic_life_UI": "Endemic Life UI", "endemic_life_UI": "Endemic Life UI",
"everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "Family", "family": "Family",
"farthest": "Farthest", "farthest": "Farthest",
"fight_time": "Fight Time", "fight_time": "Fight Time",
"fill_direction": "Fill Direction", "fill_direction": "Fill Direction",
"filter": "Filter", "filter": "Filter",
"filter_mode": "Filter Mode", "filter_mode": "Filter Mode",
"fire_resistance_label": "Fire Resistance Label",
"first": "First", "first": "First",
"first_hit": "First Hit", "first_hit": "First Hit",
"flinch_count": "Flinch Count", "flinch_count": "Flinch Count",
@@ -135,6 +179,7 @@
"health_break_sever_anomaly_filter": "Health + Break + Sever + Anomaly Core", "health_break_sever_anomaly_filter": "Health + Break + Sever + Anomaly Core",
"health_break_sever_filter": "Health + Break + Sever", "health_break_sever_filter": "Health + Break + Sever",
"health_filter": "Health", "health_filter": "Health",
"health_label": "Health Label",
"health_percentage": "Health Percentage", "health_percentage": "Health Percentage",
"health_sever_anomaly_filter": "Health + Sever + Anomaly Core", "health_sever_anomaly_filter": "Health + Sever + Anomaly Core",
"health_sever_filter": "Health + Sever", "health_sever_filter": "Health + Sever",
@@ -163,10 +208,13 @@
"highlighted_buildup_bar": "Highlighted Buildup Bar", "highlighted_buildup_bar": "Highlighted Buildup Bar",
"highlighted_damage_bar": "Highlighted Damage Bar", "highlighted_damage_bar": "Highlighted Damage Bar",
"highlighted_targeted": "Highlighted (targeted)", "highlighted_targeted": "Highlighted (targeted)",
"history": "History",
"history_size": "History Size",
"horizontal": "Horizontal", "horizontal": "Horizontal",
"hotkeys": "Hotkeys", "hotkeys": "Hotkeys",
"hunter_rank": "Hunter Rank", "hunter_rank": "Hunter Rank",
"hunter_rank_label": "Hunter Rank Label", "hunter_rank_label": "Hunter Rank Label",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID", "id": "ID",
"in_lobby": "In Lobby", "in_lobby": "In Lobby",
"in_training_area": "In Training Area", "in_training_area": "In Training Area",
@@ -274,16 +322,19 @@
"sorting": "Sorting", "sorting": "Sorting",
"spacing": "Spacing", "spacing": "Spacing",
"stamina": "Stamina", "stamina": "Stamina",
"stamina_label": "Stamina Label",
"static_orientation": "Static Orientation", "static_orientation": "Static Orientation",
"static_position": "Static Position", "static_position": "Static Position",
"static_sorting": "Static Sorting", "static_sorting": "Static Sorting",
"static_spacing": "Static Spacing", "static_spacing": "Static Spacing",
"statically_positioned": "Statically Positioned", "statically_positioned": "Statically Positioned",
"stats_UI": "Stats UI",
"status": "Status", "status": "Status",
"style": "Style", "style": "Style",
"summary_screen": "Summary Screen", "summary_screen": "Summary Screen",
"text_label": "Text Label", "text_label": "Text Label",
"thickness": "Thickness", "thickness": "Thickness",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "Time UI", "time_UI": "Time UI",
"time_label": "Time Label", "time_label": "Time Label",
"time_limit": "Time Limit (seconds)", "time_limit": "Time Limit (seconds)",
@@ -311,10 +362,12 @@
"tracked_monster_types": "Tracked Monster Types", "tracked_monster_types": "Tracked Monster Types",
"type": "Type", "type": "Type",
"use_d2d_if_available": "Use Direct2D if available", "use_d2d_if_available": "Use Direct2D if available",
"value": "Value",
"value_label": "Value Label", "value_label": "Value Label",
"vertical": "Vertical", "vertical": "Vertical",
"viewport_offset": "Viewport Offset", "viewport_offset": "Viewport Offset",
"visible": "Visible", "visible": "Visible",
"water_resistance_label": "Water Resistance Label",
"width": "Width", "width": "Width",
"world_offset": "World Offset", "world_offset": "World Offset",
"wyvern_riding": "Wyvern Riding", "wyvern_riding": "Wyvern Riding",
@@ -322,7 +375,87 @@
"y": "Y", "y": "Y",
"z": "Z" "z": "Z"
}, },
"dangos": {
"dango_adrenaline": "Dango Adrenaline",
"dango_bombardier": "Dango Bombardier",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_defender_hi": "Dango Defender (Hi)",
"dango_deflector": "Dango Deflector",
"dango_dragon_res": "Dango Dragon Res",
"dango_dragon_res_hi": "Dango Dragon Res (Hi)",
"dango_driver": "Dango Driver",
"dango_feet": "Dango Feet",
"dango_fighter": "Dango Fighter",
"dango_fire_res": "Dango Fire Res",
"dango_fire_res_hi": "Dango Fire Res (Hi)",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_guard": "Dango Guard",
"dango_hunter": "Dango Hunter",
"dango_hurler": "Dango Hurler",
"dango_ice_res": "Dango Ice Res",
"dango_ice_res_hi": "Dango Ice Res (Hi)",
"dango_immunizer": "Dango Immunizer",
"dango_insurance": "Dango Insurance",
"dango_marksman": "Dango Marksman",
"dango_medic": "Dango Medic",
"dango_medic_hi": "Dango Medic (Hi)",
"dango_moxie": "Dango Moxie",
"dango_polisher": "Dango Polisher",
"dango_pyro": "Dango Pyro",
"dango_reviver": "Dango Reviver",
"dango_rider": "Dango Rider",
"dango_shifter": "Dango Shifter",
"dango_slugger": "Dango Slugger",
"dango_specialist": "Dango Specialist",
"dango_temper": "Dango Temper",
"dango_thunder_res": "Dango Thunder Res ",
"dango_thunder_res_hi": "Dango Thunder Res (Hi)",
"dango_wall_runner": "Dango Wall Runner",
"dango_water_res": "Dango Water Res",
"dango_water_res_hi": "Dango Water Res (Hi)",
"dango_weakener": "Dango Weakener",
"super_recovery_dango": "Super Recovery Dango"
},
"font_name": "", "font_name": "",
"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"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar"
},
"parts": { "parts": {
"abdomen": "Abdomen", "abdomen": "Abdomen",
"amatsu_unknown": "?", "amatsu_unknown": "?",
@@ -392,6 +525,51 @@
"wingclaws": "Wingclaws", "wingclaws": "Wingclaws",
"wings": "Wings" "wings": "Wings"
}, },
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragonheart": "Dragonheart",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"intrepid_heart": "Intrepid Heart",
"kushala_daora_soul": "Kushala Daora Soul",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"peak_performance": "Peak Performance",
"protective_polish": "Protective Polish",
"resentment": "Resentment",
"resuscitate": "Resuscitate",
"status_trigger": "Status Trigger",
"wall_runner": "Wall Runner",
"wind_mantle": "Wind Mantle"
},
"stats": {
"affinity": "Affinity",
"attack": "Attack",
"defense": "Defense",
"dragon": "Dragon",
"dragon_resistance": "Dragon Res",
"fire": "Fire",
"fire_resistance": "Fire Res",
"ice": "Ice",
"ice_resistance": "Ice Res",
"stamina": "Stamina",
"thunder": "Thunder",
"thunder_resistance": "Thunder Res",
"water": "Water",
"water_resistance": "Water Res"
},
"unicode_glyph_ranges": [ "unicode_glyph_ranges": [
0 0
] ]

View File

@@ -18,30 +18,66 @@
}, },
"ailments": { "ailments": {
"blast": "爆破", "blast": "爆破",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"bubbleblight": "Bubbleblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "悪臭", "dung_bomb": "悪臭",
"engulfed": "Engulfed",
"exhaust": "疲労", "exhaust": "疲労",
"fall_otomo_trap": "オトモ落とし穴", "fall_otomo_trap": "オトモ落とし穴",
"fall_trap": "落とし穴", "fall_trap": "落とし穴",
"fireblight": "火属性やられ", "fireblight": "火属性やられ",
"flash": "目くらまし", "flash": "目くらまし",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "氷属性やられ", "iceblight": "氷属性やられ",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "麻痺", "paralysis": "麻痺",
"poison": "毒", "poison": "毒",
"quick_sand": "流砂", "quick_sand": "流砂",
"resistance_down": "Resistance Down",
"ride": "操竜", "ride": "操竜",
"roar": "Roar",
"shock_otomo_trap": "オトモしびれ罠", "shock_otomo_trap": "オトモしびれ罠",
"shock_trap": "しびれ罠", "shock_trap": "しびれ罠",
"sleep": "睡眠", "sleep": "睡眠",
"steel_fang": "ガルク噛み付き", "steel_fang": "ガルク噛み付き",
"stench": "Stench",
"stun": "スタン", "stun": "スタン",
"thunderblight": "雷属性やられ", "thunderblight": "雷属性やられ",
"tranq_bomb": "捕獲用麻酔玉", "tranq_bomb": "捕獲用麻酔玉",
"waterblight": "水属性やられ" "tremor": "Tremor",
"waterblight": "水属性やられ",
"webbed": "Webbed"
},
"consumables": {
"adamant_seed": "Adamant Seed",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_powder": "Demon Powder",
"demondrug": "Demondrug",
"gourmet_fish": "Gourmet Fish",
"hardshell_powder": "Hardshell Powder",
"immunizer": "Immunizer",
"mega_armorskin": "Mega Armorskin",
"mega_demondrug": "Mega Demondrug",
"might_seed": "Might Seed"
}, },
"customization_menu": { "customization_menu": {
"UI_font": "UI フォント", "UI_font": "UI フォント",
"UI_font_notice": "フォントの変更後はスクリプトリセットを行ってください。", "UI_font_notice": "フォントの変更後はスクリプトリセットを行ってください。",
"activation_count": "適用までのカウント", "activation_count": "適用までのカウント",
"affinity_label": "Affinity Label",
"ailment_buildups": "状態異常の蓄積値", "ailment_buildups": "状態異常の蓄積値",
"ailment_name": "状態異常表示", "ailment_name": "状態異常表示",
"ailment_name_label": "状態異常表示ラベル", "ailment_name_label": "状態異常表示ラベル",
@@ -55,6 +91,7 @@
"anomaly_health_percentage": "Anomaly Core Health Percentage", "anomaly_health_percentage": "Anomaly Core Health Percentage",
"apply": "適用", "apply": "適用",
"assign_new_key": "新規に割り当てるキーを入力", "assign_new_key": "新規に割り当てるキーを入力",
"attack_label": "Attack Label",
"auto_highlight": "Auto-highlight", "auto_highlight": "Auto-highlight",
"background": "背景色", "background": "背景色",
"bar": "バー", "bar": "バー",
@@ -92,6 +129,7 @@
"crown": "王冠", "crown": "王冠",
"crown_thresholds": "王冠の閾値", "crown_thresholds": "王冠の閾値",
"current_state": "Current State", "current_state": "Current State",
"current_time": "Current Time",
"current_value": "Current Value", "current_value": "Current Value",
"cutscene": "Cutscene", "cutscene": "Cutscene",
"damage": "ダメージ", "damage": "ダメージ",
@@ -100,26 +138,33 @@
"damage_meter_UI": "ダメージメーターUI", "damage_meter_UI": "ダメージメーターUI",
"damage_percentage_label": "ダメージ割合()ラベル", "damage_percentage_label": "ダメージ割合()ラベル",
"damage_value_label": "ダメージラベル", "damage_value_label": "ダメージラベル",
"debug": "Debug",
"default_state": "Default State", "default_state": "Default State",
"defense_label": "Defense Label",
"delete": "Delete", "delete": "Delete",
"distance": "距離", "distance": "距離",
"dps": "DPS", "dps": "DPS",
"dps_label": "DPSラベル", "dps_label": "DPSラベル",
"dps_mode": "DPS モード", "dps_mode": "DPS モード",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "Duplicate", "duplicate": "Duplicate",
"duration": "Duration", "duration": "Duration",
"dynamic_positioning": "動的な場所", "dynamic_positioning": "動的な場所",
"dynamically_positioned": "モンスターに追随して表示", "dynamically_positioned": "モンスターに追随して表示",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "有効にする", "enable_for": "有効にする",
"enabled": "有効", "enabled": "有効",
"endemic_life": "Endemic Life", "endemic_life": "Endemic Life",
"endemic_life_UI": "環境生物UI", "endemic_life_UI": "環境生物UI",
"everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "Family", "family": "Family",
"farthest": "Farthest", "farthest": "Farthest",
"fight_time": "戦闘時間", "fight_time": "戦闘時間",
"fill_direction": "Fill Direction", "fill_direction": "Fill Direction",
"filter": "フィルター", "filter": "フィルター",
"filter_mode": "Filter Mode", "filter_mode": "Filter Mode",
"fire_resistance_label": "Fire Resistance Label",
"first": "最初", "first": "最初",
"first_hit": "初撃", "first_hit": "初撃",
"flinch_count": "ひるみ回数", "flinch_count": "ひるみ回数",
@@ -135,6 +180,7 @@
"health_break_sever_anomaly_filter": "Health + Break + Sever + Anomaly Core", "health_break_sever_anomaly_filter": "Health + Break + Sever + Anomaly Core",
"health_break_sever_filter": "Health + Break + Sever", "health_break_sever_filter": "Health + Break + Sever",
"health_filter": "Health", "health_filter": "Health",
"health_label": "Health Label",
"health_percentage": "ダメージ割合()", "health_percentage": "ダメージ割合()",
"health_sever_anomaly_filter": "Health + Sever + Anomaly Core", "health_sever_anomaly_filter": "Health + Sever + Anomaly Core",
"health_sever_filter": "Health + Sever", "health_sever_filter": "Health + Sever",
@@ -163,10 +209,13 @@
"highlighted_buildup_bar": "ハイライトされた蓄積値バー", "highlighted_buildup_bar": "ハイライトされた蓄積値バー",
"highlighted_damage_bar": "ハイライトされたダメージバー", "highlighted_damage_bar": "ハイライトされたダメージバー",
"highlighted_targeted": "詳細表示 (ターゲット)", "highlighted_targeted": "詳細表示 (ターゲット)",
"history": "History",
"history_size": "History Size",
"horizontal": "水平", "horizontal": "水平",
"hotkeys": "ホットキー", "hotkeys": "ホットキー",
"hunter_rank": "ハンターランク", "hunter_rank": "ハンターランク",
"hunter_rank_label": "ハンターランクのラベル", "hunter_rank_label": "ハンターランクのラベル",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID", "id": "ID",
"in_lobby": "In Lobby", "in_lobby": "In Lobby",
"in_training_area": "In Training Area", "in_training_area": "In Training Area",
@@ -274,16 +323,19 @@
"sorting": "ソート", "sorting": "ソート",
"spacing": "間隔", "spacing": "間隔",
"stamina": "スタミナ", "stamina": "スタミナ",
"stamina_label": "Stamina Label",
"static_orientation": "モンスター情報の配置を修正", "static_orientation": "モンスター情報の配置を修正",
"static_position": "モンスター情報の場所を修正", "static_position": "モンスター情報の場所を修正",
"static_sorting": "モンスター情報の並べ替えを修正", "static_sorting": "モンスター情報の並べ替えを修正",
"static_spacing": "モンスター情報間の距離を修正", "static_spacing": "モンスター情報間の距離を修正",
"statically_positioned": "モンスター情報の一覧表示", "statically_positioned": "モンスター情報の一覧表示",
"stats_UI": "Stats UI",
"status": "ステータス", "status": "ステータス",
"style": "Style", "style": "Style",
"summary_screen": "Summary Screen", "summary_screen": "Summary Screen",
"text_label": "テキストラベル", "text_label": "テキストラベル",
"thickness": "Thickness", "thickness": "Thickness",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "タイムUI", "time_UI": "タイムUI",
"time_label": "タイムラベル", "time_label": "タイムラベル",
"time_limit": "タイムリミット(s.)", "time_limit": "タイムリミット(s.)",
@@ -311,10 +363,12 @@
"tracked_monster_types": "モンスタータイプでの追跡", "tracked_monster_types": "モンスタータイプでの追跡",
"type": "タイプ", "type": "タイプ",
"use_d2d_if_available": "Use Direct2D if available", "use_d2d_if_available": "Use Direct2D if available",
"value": "Value",
"value_label": "バリューラベル", "value_label": "バリューラベル",
"vertical": "縦", "vertical": "縦",
"viewport_offset": "表示領域からの位置", "viewport_offset": "表示領域からの位置",
"visible": "表示する", "visible": "表示する",
"water_resistance_label": "Water Resistance Label",
"width": "幅", "width": "幅",
"world_offset": "表示位置", "world_offset": "表示位置",
"wyvern_riding": "Wyvern Riding", "wyvern_riding": "Wyvern Riding",
@@ -322,7 +376,87 @@
"y": "Y", "y": "Y",
"z": "Z" "z": "Z"
}, },
"dangos": {
"dango_adrenaline": "Dango Adrenaline",
"dango_bombardier": "Dango Bombardier",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_defender_hi": "Dango Defender (Hi)",
"dango_deflector": "Dango Deflector",
"dango_dragon_res": "Dango Dragon Res",
"dango_dragon_res_hi": "Dango Dragon Res (Hi)",
"dango_driver": "Dango Driver",
"dango_feet": "Dango Feet",
"dango_fighter": "Dango Fighter",
"dango_fire_res": "Dango Fire Res",
"dango_fire_res_hi": "Dango Fire Res (Hi)",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_guard": "Dango Guard",
"dango_hunter": "Dango Hunter",
"dango_hurler": "Dango Hurler",
"dango_ice_res": "Dango Ice Res",
"dango_ice_res_hi": "Dango Ice Res (Hi)",
"dango_immunizer": "Dango Immunizer",
"dango_insurance": "Dango Insurance",
"dango_marksman": "Dango Marksman",
"dango_medic": "Dango Medic",
"dango_medic_hi": "Dango Medic (Hi)",
"dango_moxie": "Dango Moxie",
"dango_polisher": "Dango Polisher",
"dango_pyro": "Dango Pyro",
"dango_reviver": "Dango Reviver",
"dango_rider": "Dango Rider",
"dango_shifter": "Dango Shifter",
"dango_slugger": "Dango Slugger",
"dango_specialist": "Dango Specialist",
"dango_temper": "Dango Temper",
"dango_thunder_res": "Dango Thunder Res ",
"dango_thunder_res_hi": "Dango Thunder Res (Hi)",
"dango_wall_runner": "Dango Wall Runner",
"dango_water_res": "Dango Water Res",
"dango_water_res_hi": "Dango Water Res (Hi)",
"dango_weakener": "Dango Weakener",
"super_recovery_dango": "Super Recovery Dango"
},
"font_name": "NotoSansJP-Bold.otf", "font_name": "NotoSansJP-Bold.otf",
"melody_effects": {
"affinity_up": "Affinity Up",
"attack_and_affinity_up": "Attack and Affinity Up",
"attack_and_defense_up": "Attack and Defense Up",
"attack_up": "Attack Up",
"blight_negated": "Blight Negated",
"defense_up": "Defense Up",
"divine_protection": "Divine Protection",
"earplugs_l": "Earplugs (L)",
"earplugs_s": "Earplugs (S)",
"elemental_attack_boost": "Elemental Attack Boost",
"environment_damage_negated": "Environment Damage Negated",
"health_recovery_l": "Health Recovery (L)",
"health_recovery_s": "Health Recovery (S)",
"health_recovery_s_antidote": "Health Recovery (S) + Antidote",
"health_regeneration": "Health Regeneration",
"infernal_melody": "Infernal Melody",
"knockbacks_negated": "Knockbacks Negated",
"self_improvement": "Self-Improvement",
"sharpness_extension": "Sharpness Extension",
"sharpness_loss_reduced": "Sharpness Loss Reduced",
"sharpness_regeneration": "Sharpness Regeneration",
"sonic_barrier": "Sonic Barrier",
"sonic_wave": "Sonic Wave",
"stamina_recovery_up": "Stamina Recovery Up",
"stamina_use_reduced": "Stamina Use Reduced",
"stun_negated": "Stun Negated",
"tremors_negated": "Tremors Negated",
"wind_pressure_negated": "Wind Pressure Negated"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar"
},
"parts": { "parts": {
"abdomen": "腹部", "abdomen": "腹部",
"amatsu_unknown": "?", "amatsu_unknown": "?",
@@ -392,6 +526,51 @@
"wingclaws": "Wingclaws", "wingclaws": "Wingclaws",
"wings": "翼" "wings": "翼"
}, },
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragonheart": "Dragonheart",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"intrepid_heart": "Intrepid Heart",
"kushala_daora_soul": "Kushala Daora Soul",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"peak_performance": "Peak Performance",
"protective_polish": "Protective Polish",
"resentment": "Resentment",
"resuscitate": "Resuscitate",
"status_trigger": "Status Trigger",
"wall_runner": "Wall Runner",
"wind_mantle": "Wind Mantle"
},
"stats": {
"affinity": "Affinity",
"attack": "Attack",
"defense": "Defense",
"dragon": "Dragon",
"dragon_resistance": "Dragon Res",
"fire": "Fire",
"fire_resistance": "Fire Res",
"ice": "Ice",
"ice_resistance": "Ice Res",
"stamina": "Stamina",
"thunder": "Thunder",
"thunder_resistance": "Thunder Res",
"water": "Water",
"water_resistance": "Water Res"
},
"unicode_glyph_ranges": [ "unicode_glyph_ranges": [
32, 32,
255, 255,

View File

@@ -5,7 +5,7 @@
"gold": "금관", "gold": "금관",
"mini": "최소", "mini": "최소",
"otomo": "동반자", "otomo": "동반자",
"part_anomaly_core": "Anomaly Core", "part_anomaly_core": "괴이핵",
"part_break": "파괴", "part_break": "파괴",
"part_sever": "절단", "part_sever": "절단",
"player": "헌터", "player": "헌터",
@@ -18,30 +18,66 @@
}, },
"ailments": { "ailments": {
"blast": "폭파", "blast": "폭파",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"bubbleblight": "Bubbleblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "거름탄", "dung_bomb": "거름탄",
"engulfed": "Engulfed",
"exhaust": "탈진", "exhaust": "탈진",
"fall_otomo_trap": "동반자 구멍 함정", "fall_otomo_trap": "동반자 구멍 함정",
"fall_trap": "구멍 함정", "fall_trap": "구멍 함정",
"fireblight": "불바위구리", "fireblight": "불바위구리",
"flash": "섬광", "flash": "섬광",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "진흙구리", "iceblight": "진흙구리",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "마비", "paralysis": "마비",
"poison": "독", "poison": "독",
"quick_sand": "유사(모래함정)", "quick_sand": "유사(모래함정)",
"resistance_down": "Resistance Down",
"ride": "용조종", "ride": "용조종",
"roar": "Roar",
"shock_otomo_trap": "동반자 마비덫", "shock_otomo_trap": "동반자 마비덫",
"shock_trap": "마비덫", "shock_trap": "마비덫",
"sleep": "수면", "sleep": "수면",
"steel_fang": "강철아", "steel_fang": "강철아",
"stench": "Stench",
"stun": "기절", "stun": "기절",
"thunderblight": "번개털구리", "thunderblight": "번개털구리",
"tranq_bomb": "포획용마취옥", "tranq_bomb": "포획용마취옥",
"waterblight": "진흙구리" "tremor": "Tremor",
"waterblight": "진흙구리",
"webbed": "Webbed"
},
"consumables": {
"adamant_seed": "Adamant Seed",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_powder": "Demon Powder",
"demondrug": "Demondrug",
"gourmet_fish": "Gourmet Fish",
"hardshell_powder": "Hardshell Powder",
"immunizer": "Immunizer",
"mega_armorskin": "Mega Armorskin",
"mega_demondrug": "Mega Demondrug",
"might_seed": "Might Seed"
}, },
"customization_menu": { "customization_menu": {
"UI_font": "UI 글꼴", "UI_font": "UI 글꼴",
"UI_font_notice": "글꼴 변경시 스크립트를 리로드 해야합니다!", "UI_font_notice": "글꼴 변경시 스크립트를 리로드 해야합니다!",
"activation_count": "활성 횟수", "activation_count": "활성 횟수",
"affinity_label": "Affinity Label",
"ailment_buildups": "상태이상 누적치", "ailment_buildups": "상태이상 누적치",
"ailment_name": "상태이상 이름", "ailment_name": "상태이상 이름",
"ailment_name_label": "상태이상 이름 정보", "ailment_name_label": "상태이상 이름 정보",
@@ -49,29 +85,30 @@
"ailments": "상태이상", "ailments": "상태이상",
"all_UI": "모든 UI", "all_UI": "모든 UI",
"anchor": "기준", "anchor": "기준",
"anomaly_cores": "Anomaly Cores", "anomaly_cores": "괴이핵",
"anomaly_filter": "Anomaly Core", "anomaly_filter": "괴이핵",
"anomaly_health": "Anomaly Core Health", "anomaly_health": "괴이핵 체력",
"anomaly_health_percentage": "Anomaly Core Health Percentage", "anomaly_health_percentage": "괴이핵 체력 비율",
"apply": "적용", "apply": "적용",
"assign_new_key": "새 키를 할당", "assign_new_key": "새 키를 할당",
"attack_label": "Attack Label",
"auto_highlight": "자동 타겟 설정", "auto_highlight": "자동 타겟 설정",
"background": "배경색", "background": "배경색",
"bar": "막대", "bar": "막대",
"blast": "폭파", "blast": "폭파",
"body_parts": "부위", "body_parts": "부위",
"bold": "굵게", "bold": "굵게",
"bombs": "Bombs", "bombs": "폭탄",
"bottom_left": "좌하단", "bottom_left": "왼쪽 아래",
"bottom_right": "우하단", "bottom_right": "오른쪽 아래",
"bottom_to_top": "Bottom to Top", "bottom_to_top": "아래에서 위로",
"break_anomaly_filter": "Break + Anomaly Core", "break_anomaly_filter": "파괴 + 괴이핵",
"break_count": "파괴 횟수", "break_count": "파괴 횟수",
"break_filter": "파괴", "break_filter": "파괴",
"break_health": "파괴 수치", "break_health": "파괴 수치",
"break_health_percentage": "파괴 수치 비율", "break_health_percentage": "파괴 수치 비율",
"break_max_count": "최대 파괴 횟수", "break_max_count": "최대 파괴 횟수",
"break_sever_anomaly_filter": "Break + Sever + Anomaly Core", "break_sever_anomaly_filter": "파괴 + 절단 + 괴이핵",
"break_sever_filter": "파괴 + 절단", "break_sever_filter": "파괴 + 절단",
"buff_UI": "버프 UI", "buff_UI": "버프 UI",
"buildup": "누적치", "buildup": "누적치",
@@ -91,8 +128,9 @@
"creature_name_label": "환경생물 이름 정보", "creature_name_label": "환경생물 이름 정보",
"crown": "금관", "crown": "금관",
"crown_thresholds": "금관 판정값", "crown_thresholds": "금관 판정값",
"current_state": "Current State", "current_state": "현재 상태",
"current_value": "Current Value", "current_time": "Current Time",
"current_value": "현재 값",
"cutscene": "컷신", "cutscene": "컷신",
"damage": "대미지", "damage": "대미지",
"damage_bar": "대미지 막대", "damage_bar": "대미지 막대",
@@ -100,26 +138,34 @@
"damage_meter_UI": "대미지 미터 UI", "damage_meter_UI": "대미지 미터 UI",
"damage_percentage_label": "대미지 비율 정보", "damage_percentage_label": "대미지 비율 정보",
"damage_value_label": "대미지 값 정보", "damage_value_label": "대미지 값 정보",
"default_state": "Default State", "debug": "Debug",
"debug_errors": "Debug Errors",
"default_state": "기본 상태",
"defense_label": "Defense Label",
"delete": "삭제하기", "delete": "삭제하기",
"distance": "간격", "distance": "간격",
"dps": "DPS", "dps": "DPS",
"dps_label": "DPS 정보", "dps_label": "DPS 정보",
"dps_mode": "DPS 모드", "dps_mode": "DPS 모드",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "복제하기", "duplicate": "복제하기",
"duration": "지속시간", "duration": "지속시간",
"dynamic_positioning": "유동 위치", "dynamic_positioning": "유동 위치",
"dynamically_positioned": "유동 위치 UI", "dynamically_positioned": "유동 위치 UI",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "표시 대상", "enable_for": "표시 대상",
"enabled": "사용함", "enabled": "사용함",
"endemic_life": "Endemic Life", "endemic_life": "환경생물",
"endemic_life_UI": "환경생물 UI", "endemic_life_UI": "환경생물 UI",
"everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "글꼴", "family": "글꼴",
"farthest": "가장 멀리있는", "farthest": "가장 멀리있는",
"fight_time": "전투 시간", "fight_time": "전투 시간",
"fill_direction": "Fill Direction", "fill_direction": "채우는 방향",
"filter": "필터", "filter": "필터",
"filter_mode": "Filter Mode", "filter_mode": "필터 모드",
"fire_resistance_label": "Fire Resistance Label",
"first": "맨 앞", "first": "맨 앞",
"first_hit": "첫 공격", "first_hit": "첫 공격",
"flinch_count": "경직 횟수", "flinch_count": "경직 횟수",
@@ -129,14 +175,15 @@
"global_scale_modifier": "전역 크기 배율", "global_scale_modifier": "전역 크기 배율",
"global_settings": "전역 설정", "global_settings": "전역 설정",
"health": "체력", "health": "체력",
"health_anomaly_filter": "Health + Anomaly Core", "health_anomaly_filter": "체력 + 괴이핵",
"health_break_anomaly_filter": "Health + Break + Anomaly Core", "health_break_anomaly_filter": "체력 + 파괴 + 괴이핵",
"health_break_filter": "체력 + 파괴", "health_break_filter": "체력 + 파괴",
"health_break_sever_anomaly_filter": "Health + Break + Sever + Anomaly Core", "health_break_sever_anomaly_filter": "체력 + 파괴 + 절단 + 괴이핵",
"health_break_sever_filter": "체력 + 파괴 + 절단", "health_break_sever_filter": "체력 + 파괴 + 절단",
"health_filter": "체력", "health_filter": "체력",
"health_label": "Health Label",
"health_percentage": "체력 비율", "health_percentage": "체력 비율",
"health_sever_anomaly_filter": "Health + Sever + Anomaly Core", "health_sever_anomaly_filter": "체력 + 절단 + 괴이핵",
"health_sever_filter": "체력 + 절단", "health_sever_filter": "체력 + 절단",
"height": "높이", "height": "높이",
"hide_ailments_with_zero_buildup": "누적치가 0이면 상태이상 표시 안 함", "hide_ailments_with_zero_buildup": "누적치가 0이면 상태이상 표시 안 함",
@@ -163,20 +210,23 @@
"highlighted_buildup_bar": "주시대상 몬스터 누적치 막대", "highlighted_buildup_bar": "주시대상 몬스터 누적치 막대",
"highlighted_damage_bar": "주시대상 몬스터 대미지 막대", "highlighted_damage_bar": "주시대상 몬스터 대미지 막대",
"highlighted_targeted": "주시대상 몬스터 표시", "highlighted_targeted": "주시대상 몬스터 표시",
"history": "History",
"history_size": "History Size",
"horizontal": "가로", "horizontal": "가로",
"hotkeys": "단축키", "hotkeys": "단축키",
"hunter_rank": "헌터 랭크", "hunter_rank": "헌터 랭크",
"hunter_rank_label": "헌터 랭크 정보", "hunter_rank_label": "헌터 랭크 정보",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID", "id": "ID",
"in_lobby": "로비 내", "in_lobby": "로비 내",
"in_training_area": "훈련구역 내", "in_training_area": "훈련구역 내",
"include": "포함", "include": "포함",
"inside": "내부", "inside": "내부",
"installations": "Installations", "installations": "설치",
"italic": "기울임", "italic": "기울임",
"join_time": "참가 시간", "join_time": "참가 시간",
"killcam": "처치 영상", "killcam": "처치 영상",
"kunai": "Kunai", "kunai": "쿠나이",
"language": "언어", "language": "언어",
"large_monster_UI": "대형 몬스터 UI", "large_monster_UI": "대형 몬스터 UI",
"large_monster_dynamic_UI": "대형 몬스터 유동 UI", "large_monster_dynamic_UI": "대형 몬스터 유동 UI",
@@ -184,7 +234,7 @@
"large_monster_static_UI": "대형 몬스터 고정 UI", "large_monster_static_UI": "대형 몬스터 고정 UI",
"large_monsters": "대형 몬스터", "large_monsters": "대형 몬스터",
"last": "맨 뒤", "last": "맨 뒤",
"left_to_right": "Left to Right", "left_to_right": "왼쪽에서 오른쪽",
"level": "레벨", "level": "레벨",
"level_label": "레벨 정보", "level_label": "레벨 정보",
"loading_quest": "퀘스트 로딩 중", "loading_quest": "퀘스트 로딩 중",
@@ -195,7 +245,7 @@
"master_rank": "마스터 랭크", "master_rank": "마스터 랭크",
"max_distance": "최대 거리", "max_distance": "최대 거리",
"max_monster_updates_per_tick": "틱당 최대 몬스터 갱신 횟수", "max_monster_updates_per_tick": "틱당 최대 몬스터 갱신 횟수",
"max_value": "Max Value", "max_value": "최대값",
"me": "나", "me": "나",
"menu_font": "메뉴 글꼴", "menu_font": "메뉴 글꼴",
"menu_font_change_disclaimer": "언어 및 메뉴 글꼴 크기를 여러 번 변경하면 비정상 종료가 될 수 있습니다!", "menu_font_change_disclaimer": "언어 및 메뉴 글꼴 크기를 여러 번 변경하면 비정상 종료가 될 수 있습니다!",
@@ -203,28 +253,28 @@
"mode": "모드", "mode": "모드",
"modifiers": "설정 배율", "modifiers": "설정 배율",
"module_visibility_based_on_game_state": "게임 상태에 따라 모듈 표시", "module_visibility_based_on_game_state": "게임 상태에 따라 모듈 표시",
"modules": "UI", "modules": "모듈",
"monster_can_be_captured": "몬스터 포획 가능", "monster_can_be_captured": "몬스터 포획 가능",
"monster_id": "몬스터 ID", "monster_id": "몬스터 ID",
"monster_name": "몬스터명", "monster_name": "몬스터명",
"monster_name_label": "몬스터명 정보", "monster_name_label": "몬스터명 정보",
"monsters": "Monsters", "monsters": "몬스터",
"my_damage_bar_location": "내 대미지 막대 위치", "my_damage_bar_location": "내 대미지 막대 위치",
"my_otomos": "내 동반자", "my_otomos": "내 동반자",
"myself": "나", "myself": "나",
"name": "이름", "name": "이름",
"name_label": "이름 정보", "name_label": "이름 정보",
"new": "새", "new": "새로 만들기",
"none": "없음", "none": "없음",
"normal": "기본", "normal": "기본",
"offset": "오프셋", "offset": "오프셋",
"offset_is_relative_to_parts": "오프셋을 부위 기준으로", "offset_is_relative_to_parts": "오프셋을 부위 기준으로",
"opacity_falloff": "투명도 감소", "opacity_falloff": "투명도 감소",
"orientation": "방향", "orientation": "방향",
"other": "Other", "other": "기타",
"other_player_otomos": "다른 플레이어 동반자", "other_player_otomos": "다른 플레이어 동반자",
"other_players": "다른 헌터", "other_players": "다른 헌터",
"otomos": "Buddies", "otomos": "동반자",
"outline": "외곽선", "outline": "외곽선",
"outside": "외부", "outside": "외부",
"part_health": "부위 수치", "part_health": "부위 수치",
@@ -235,7 +285,7 @@
"player_name_label": "헌터명 정보", "player_name_label": "헌터명 정보",
"player_name_size_limit": "헌터명 크기 제한", "player_name_size_limit": "헌터명 크기 제한",
"player_spacing": "플레이어 간격", "player_spacing": "플레이어 간격",
"players": "Players", "players": "모든 플레이어",
"playing_quest": "퀘스트 중", "playing_quest": "퀘스트 중",
"poison": "독", "poison": "독",
"position": "위치", "position": "위치",
@@ -251,18 +301,18 @@
"relative_offset": "상대적 위치 오프셋", "relative_offset": "상대적 위치 오프셋",
"rename": "이름 변경", "rename": "이름 변경",
"render_highlighted_monster": "주시대상 몬스터 표시", "render_highlighted_monster": "주시대상 몬스터 표시",
"render_inactive_anomaly_cores": "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_alignment_shift": "우측정렬 이동",
"right_to_left": "Right to Left", "right_to_left": "오른쪽에서 왼쪽",
"servant_otomos": "맹우 동반자", "servant_otomos": "맹우 동반자",
"servants": "맹우", "servants": "맹우",
"settings": "설정", "settings": "설정",
"sever_anomaly_filter": "Sever + Anomaly Core", "sever_anomaly_filter": "절단 + 괴이핵",
"sever_filter": "절단", "sever_filter": "절단",
"shadow": "그림자", "shadow": "그림자",
"show_my_otomos_separately": "내 동반자를 따로", "show_my_otomos_separately": "내 동반자를 따로",
@@ -274,16 +324,19 @@
"sorting": "정렬방법", "sorting": "정렬방법",
"spacing": "간격", "spacing": "간격",
"stamina": "스태미나", "stamina": "스태미나",
"stamina_label": "Stamina Label",
"static_orientation": "고정 방향", "static_orientation": "고정 방향",
"static_position": "고정 위치", "static_position": "고정 위치",
"static_sorting": "고정 정렬방법", "static_sorting": "고정 정렬방법",
"static_spacing": "고정 간격", "static_spacing": "고정 간격",
"statically_positioned": "고정 위치 UI", "statically_positioned": "고정 위치 UI",
"stats_UI": "Stats UI",
"status": "상태", "status": "상태",
"style": "스타일", "style": "스타일",
"summary_screen": "결과 요약 화면", "summary_screen": "결과 요약 화면",
"text_label": "텍스트 정보", "text_label": "텍스트 정보",
"thickness": "두께", "thickness": "두께",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "시간 UI", "time_UI": "시간 UI",
"time_label": "시간 정보", "time_label": "시간 정보",
"time_limit": "시간 제한 (단위: 초)", "time_limit": "시간 제한 (단위: 초)",
@@ -292,9 +345,9 @@
"top_buildup": "총 누적치", "top_buildup": "총 누적치",
"top_damage": "최고 대미지", "top_damage": "최고 대미지",
"top_dps": "최고 DPS", "top_dps": "최고 DPS",
"top_left": "좌상단", "top_left": "왼쪽 위",
"top_right": "우상단", "top_right": "오른쪽 위",
"top_to_bottom": "Top to Bottom", "top_to_bottom": "위에서 아래",
"total": "전체", "total": "전체",
"total_buildup": "총 누적치", "total_buildup": "총 누적치",
"total_buildup_label": "총 누적치 정보", "total_buildup_label": "총 누적치 정보",
@@ -311,18 +364,100 @@
"tracked_monster_types": "추적할 몬스터 타입", "tracked_monster_types": "추적할 몬스터 타입",
"type": "종류", "type": "종류",
"use_d2d_if_available": "가능한 Direct2D를 사용함", "use_d2d_if_available": "가능한 Direct2D를 사용함",
"value": "Value",
"value_label": "값 정보", "value_label": "값 정보",
"vertical": "세로", "vertical": "세로",
"viewport_offset": "뷰포트 오프셋", "viewport_offset": "뷰포트 오프셋",
"visible": "표시함", "visible": "표시함",
"water_resistance_label": "Water Resistance Label",
"width": "너비", "width": "너비",
"world_offset": "전역 오프셋", "world_offset": "전역 오프셋",
"wyvern_riding": "Wyvern Riding", "wyvern_riding": "용조종",
"x": "X", "x": "X",
"y": "Y", "y": "Y",
"z": "Z" "z": "Z"
}, },
"dangos": {
"dango_adrenaline": "Dango Adrenaline",
"dango_bombardier": "Dango Bombardier",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_defender_hi": "Dango Defender (Hi)",
"dango_deflector": "Dango Deflector",
"dango_dragon_res": "Dango Dragon Res",
"dango_dragon_res_hi": "Dango Dragon Res (Hi)",
"dango_driver": "Dango Driver",
"dango_feet": "Dango Feet",
"dango_fighter": "Dango Fighter",
"dango_fire_res": "Dango Fire Res",
"dango_fire_res_hi": "Dango Fire Res (Hi)",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_guard": "Dango Guard",
"dango_hunter": "Dango Hunter",
"dango_hurler": "Dango Hurler",
"dango_ice_res": "Dango Ice Res",
"dango_ice_res_hi": "Dango Ice Res (Hi)",
"dango_immunizer": "Dango Immunizer",
"dango_insurance": "Dango Insurance",
"dango_marksman": "Dango Marksman",
"dango_medic": "Dango Medic",
"dango_medic_hi": "Dango Medic (Hi)",
"dango_moxie": "Dango Moxie",
"dango_polisher": "Dango Polisher",
"dango_pyro": "Dango Pyro",
"dango_reviver": "Dango Reviver",
"dango_rider": "Dango Rider",
"dango_shifter": "Dango Shifter",
"dango_slugger": "Dango Slugger",
"dango_specialist": "Dango Specialist",
"dango_temper": "Dango Temper",
"dango_thunder_res": "Dango Thunder Res ",
"dango_thunder_res_hi": "Dango Thunder Res (Hi)",
"dango_wall_runner": "Dango Wall Runner",
"dango_water_res": "Dango Water Res",
"dango_water_res_hi": "Dango Water Res (Hi)",
"dango_weakener": "Dango Weakener",
"super_recovery_dango": "Super Recovery Dango"
},
"font_name": "NotoSansKR-Bold.otf", "font_name": "NotoSansKR-Bold.otf",
"melody_effects": {
"affinity_up": "Affinity Up",
"attack_and_affinity_up": "Attack and Affinity Up",
"attack_and_defense_up": "Attack and Defense Up",
"attack_up": "Attack Up",
"blight_negated": "Blight Negated",
"defense_up": "Defense Up",
"divine_protection": "Divine Protection",
"earplugs_l": "Earplugs (L)",
"earplugs_s": "Earplugs (S)",
"elemental_attack_boost": "Elemental Attack Boost",
"environment_damage_negated": "Environment Damage Negated",
"health_recovery_l": "Health Recovery (L)",
"health_recovery_s": "Health Recovery (S)",
"health_recovery_s_antidote": "Health Recovery (S) + Antidote",
"health_regeneration": "Health Regeneration",
"infernal_melody": "Infernal Melody",
"knockbacks_negated": "Knockbacks Negated",
"self_improvement": "Self-Improvement",
"sharpness_extension": "Sharpness Extension",
"sharpness_loss_reduced": "Sharpness Loss Reduced",
"sharpness_regeneration": "Sharpness Regeneration",
"sonic_barrier": "Sonic Barrier",
"sonic_wave": "Sonic Wave",
"stamina_recovery_up": "Stamina Recovery Up",
"stamina_use_reduced": "Stamina Use Reduced",
"stun_negated": "Stun Negated",
"tremors_negated": "Tremors Negated",
"wind_pressure_negated": "Wind Pressure Negated"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar"
},
"parts": { "parts": {
"abdomen": "배", "abdomen": "배",
"amatsu_unknown": "?", "amatsu_unknown": "?",
@@ -392,6 +527,51 @@
"wingclaws": "날개발톱", "wingclaws": "날개발톱",
"wings": "날개" "wings": "날개"
}, },
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragonheart": "Dragonheart",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"intrepid_heart": "Intrepid Heart",
"kushala_daora_soul": "Kushala Daora Soul",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"peak_performance": "Peak Performance",
"protective_polish": "Protective Polish",
"resentment": "Resentment",
"resuscitate": "Resuscitate",
"status_trigger": "Status Trigger",
"wall_runner": "Wall Runner",
"wind_mantle": "Wind Mantle"
},
"stats": {
"affinity": "Affinity",
"attack": "Attack",
"defense": "Defense",
"dragon": "Dragon",
"dragon_resistance": "Dragon Res",
"fire": "Fire",
"fire_resistance": "Fire Res",
"ice": "Ice",
"ice_resistance": "Ice Res",
"stamina": "Stamina",
"thunder": "Thunder",
"thunder_resistance": "Thunder Res",
"water": "Water",
"water_resistance": "Water Res"
},
"unicode_glyph_ranges": [ "unicode_glyph_ranges": [
32, 32,
255, 255,

View File

@@ -18,30 +18,66 @@
}, },
"ailments": { "ailments": {
"blast": "Взрыв", "blast": "Взрыв",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"bubbleblight": "Bubbleblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "Навозная бомба", "dung_bomb": "Навозная бомба",
"engulfed": "Engulfed",
"exhaust": "Усталость", "exhaust": "Усталость",
"fall_otomo_trap": "Волчья яма спутника", "fall_otomo_trap": "Волчья яма спутника",
"fall_trap": "Волчья яма", "fall_trap": "Волчья яма",
"fireblight": "Огненная порча", "fireblight": "Огненная порча",
"flash": "Оглушение", "flash": "Оглушение",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "Ледяная порча", "iceblight": "Ледяная порча",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "Паралич", "paralysis": "Паралич",
"poison": "Отравление", "poison": "Отравление",
"quick_sand": "Зыбучий песок", "quick_sand": "Зыбучий песок",
"resistance_down": "Resistance Down",
"ride": "Езда на виверне", "ride": "Езда на виверне",
"roar": "Roar",
"shock_otomo_trap": "Шоковая ловушка спутника", "shock_otomo_trap": "Шоковая ловушка спутника",
"shock_trap": "Шоковая ловушка", "shock_trap": "Шоковая ловушка",
"sleep": "Сон", "sleep": "Сон",
"steel_fang": "Стальной клык", "steel_fang": "Стальной клык",
"stench": "Stench",
"stun": "Оглушение", "stun": "Оглушение",
"thunderblight": "Грозовая порча", "thunderblight": "Грозовая порча",
"tranq_bomb": "Снотворная порча", "tranq_bomb": "Снотворная порча",
"waterblight": "Водяная порча" "tremor": "Tremor",
"waterblight": "Водяная порча",
"webbed": "Webbed"
},
"consumables": {
"adamant_seed": "Adamant Seed",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_powder": "Demon Powder",
"demondrug": "Demondrug",
"gourmet_fish": "Gourmet Fish",
"hardshell_powder": "Hardshell Powder",
"immunizer": "Immunizer",
"mega_armorskin": "Mega Armorskin",
"mega_demondrug": "Mega Demondrug",
"might_seed": "Might Seed"
}, },
"customization_menu": { "customization_menu": {
"UI_font": "Шрифт интерфейса", "UI_font": "Шрифт интерфейса",
"UI_font_notice": "Любые изменения шрифта требуют перезагрузку скрипта!", "UI_font_notice": "Любые изменения шрифта требуют перезагрузку скрипта!",
"activation_count": "Кол-во активаций", "activation_count": "Кол-во активаций",
"affinity_label": "Affinity Label",
"ailment_buildups": "Накопление аномального статуса", "ailment_buildups": "Накопление аномального статуса",
"ailment_name": "Название аномального статуса", "ailment_name": "Название аномального статуса",
"ailment_name_label": "Метка названия аномального статуса", "ailment_name_label": "Метка названия аномального статуса",
@@ -55,6 +91,7 @@
"anomaly_health_percentage": "Здоровье ядра аномалии в процентах", "anomaly_health_percentage": "Здоровье ядра аномалии в процентах",
"apply": "Применить", "apply": "Применить",
"assign_new_key": "Привязать клавишу", "assign_new_key": "Привязать клавишу",
"attack_label": "Attack Label",
"auto_highlight": "Автофокус", "auto_highlight": "Автофокус",
"background": "Фон", "background": "Фон",
"bar": "Шкала", "bar": "Шкала",
@@ -92,6 +129,7 @@
"crown": "Корона", "crown": "Корона",
"crown_thresholds": "Лимиты корон", "crown_thresholds": "Лимиты корон",
"current_state": "Текущее состояние", "current_state": "Текущее состояние",
"current_time": "Current Time",
"current_value": "Текущее значение", "current_value": "Текущее значение",
"cutscene": "Катсцена", "cutscene": "Катсцена",
"damage": "Урон", "damage": "Урон",
@@ -100,26 +138,34 @@
"damage_meter_UI": "Интерфейс модуля урона", "damage_meter_UI": "Интерфейс модуля урона",
"damage_percentage_label": "Метка урона в процентах", "damage_percentage_label": "Метка урона в процентах",
"damage_value_label": "Метка значений урона", "damage_value_label": "Метка значений урона",
"debug": "Debug",
"debug_errors": "Debug Errors",
"default_state": "Состояние по умолчанию", "default_state": "Состояние по умолчанию",
"defense_label": "Defense Label",
"delete": "Удалить", "delete": "Удалить",
"distance": "Расстояние", "distance": "Расстояние",
"dps": "Урон в секунду", "dps": "Урон в секунду",
"dps_label": "Метка урона в секунду", "dps_label": "Метка урона в секунду",
"dps_mode": "Режим урона в секунду", "dps_mode": "Режим урона в секунду",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "Дублировать", "duplicate": "Дублировать",
"duration": "Продолжительность", "duration": "Продолжительность",
"dynamic_positioning": "Динамическое позиционирование", "dynamic_positioning": "Динамическое позиционирование",
"dynamically_positioned": "Рассположенный динамично", "dynamically_positioned": "Рассположенный динамично",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "Показывать для", "enable_for": "Показывать для",
"enabled": "Включить", "enabled": "Включить",
"endemic_life": "Местная живность", "endemic_life": "Местная живность",
"endemic_life_UI": "Интерфейс местной живности", "endemic_life_UI": "Интерфейс местной живности",
"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": "Кол-во вздрагиваний",
@@ -135,6 +181,7 @@
"health_break_sever_anomaly_filter": "Здоровье + Повреждение + Отсечение + Ядро аномалии", "health_break_sever_anomaly_filter": "Здоровье + Повреждение + Отсечение + Ядро аномалии",
"health_break_sever_filter": "Здоровье + Повреждение + Отсечение", "health_break_sever_filter": "Здоровье + Повреждение + Отсечение",
"health_filter": "Здоровье", "health_filter": "Здоровье",
"health_label": "Health Label",
"health_percentage": "Здоровье в процентах", "health_percentage": "Здоровье в процентах",
"health_sever_anomaly_filter": "Здоровье + Отсечение + Ядро аномалии", "health_sever_anomaly_filter": "Здоровье + Отсечение + Ядро аномалии",
"health_sever_filter": "Здоровье + Отсечение", "health_sever_filter": "Здоровье + Отсечение",
@@ -163,10 +210,13 @@
"highlighted_buildup_bar": "Помеченная шкала накопления", "highlighted_buildup_bar": "Помеченная шкала накопления",
"highlighted_damage_bar": "Помеченная шкала урона", "highlighted_damage_bar": "Помеченная шкала урона",
"highlighted_targeted": "Помеченный", "highlighted_targeted": "Помеченный",
"history": "History",
"history_size": "History Size",
"horizontal": "Горизонтально", "horizontal": "Горизонтально",
"hotkeys": "Горячие клавиши", "hotkeys": "Горячие клавиши",
"hunter_rank": "Ранг охотника", "hunter_rank": "Ранг охотника",
"hunter_rank_label": "Метка ранга охотника", "hunter_rank_label": "Метка ранга охотника",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID", "id": "ID",
"in_lobby": "В лобби", "in_lobby": "В лобби",
"in_training_area": "В тренировочной зоне", "in_training_area": "В тренировочной зоне",
@@ -274,16 +324,19 @@
"sorting": "Сортировка", "sorting": "Сортировка",
"spacing": "Расстояние между элементами", "spacing": "Расстояние между элементами",
"stamina": "Выносливость", "stamina": "Выносливость",
"stamina_label": "Stamina Label",
"static_orientation": "Статичная ориентация", "static_orientation": "Статичная ориентация",
"static_position": "Статичное расположение", "static_position": "Статичное расположение",
"static_sorting": "Статичная сортировка", "static_sorting": "Статичная сортировка",
"static_spacing": "Статичное расстояние между элементами", "static_spacing": "Статичное расстояние между элементами",
"statically_positioned": "Рассположенный статично", "statically_positioned": "Рассположенный статично",
"stats_UI": "Stats UI",
"status": "Статус", "status": "Статус",
"style": "Стиль", "style": "Стиль",
"summary_screen": "Экран Результатов", "summary_screen": "Экран Результатов",
"text_label": "Текстовая метка", "text_label": "Текстовая метка",
"thickness": "Толщина", "thickness": "Толщина",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "Интерфейс времени", "time_UI": "Интерфейс времени",
"time_label": "Метка времени", "time_label": "Метка времени",
"time_limit": "Ограничение по времени (cек.)", "time_limit": "Ограничение по времени (cек.)",
@@ -311,10 +364,12 @@
"tracked_monster_types": "Отслеживаемые типы монстров", "tracked_monster_types": "Отслеживаемые типы монстров",
"type": "Тип", "type": "Тип",
"use_d2d_if_available": "Использовать Direct2D, если доступен", "use_d2d_if_available": "Использовать Direct2D, если доступен",
"value": "Value",
"value_label": "Метка значений", "value_label": "Метка значений",
"vertical": "Вертикально", "vertical": "Вертикально",
"viewport_offset": "Сдвиг в экранном пространстве", "viewport_offset": "Сдвиг в экранном пространстве",
"visible": "Включить", "visible": "Включить",
"water_resistance_label": "Water Resistance Label",
"width": "Ширина", "width": "Ширина",
"world_offset": "Сдвиг в игровом пространстве", "world_offset": "Сдвиг в игровом пространстве",
"wyvern_riding": "Езда на виверне", "wyvern_riding": "Езда на виверне",
@@ -322,7 +377,87 @@
"y": "Y", "y": "Y",
"z": "Z" "z": "Z"
}, },
"dangos": {
"dango_adrenaline": "Dango Adrenaline",
"dango_bombardier": "Dango Bombardier",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_defender_hi": "Dango Defender (Hi)",
"dango_deflector": "Dango Deflector",
"dango_dragon_res": "Dango Dragon Res",
"dango_dragon_res_hi": "Dango Dragon Res (Hi)",
"dango_driver": "Dango Driver",
"dango_feet": "Dango Feet",
"dango_fighter": "Dango Fighter",
"dango_fire_res": "Dango Fire Res",
"dango_fire_res_hi": "Dango Fire Res (Hi)",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_guard": "Dango Guard",
"dango_hunter": "Dango Hunter",
"dango_hurler": "Dango Hurler",
"dango_ice_res": "Dango Ice Res",
"dango_ice_res_hi": "Dango Ice Res (Hi)",
"dango_immunizer": "Dango Immunizer",
"dango_insurance": "Dango Insurance",
"dango_marksman": "Dango Marksman",
"dango_medic": "Dango Medic",
"dango_medic_hi": "Dango Medic (Hi)",
"dango_moxie": "Dango Moxie",
"dango_polisher": "Dango Polisher",
"dango_pyro": "Dango Pyro",
"dango_reviver": "Dango Reviver",
"dango_rider": "Dango Rider",
"dango_shifter": "Dango Shifter",
"dango_slugger": "Dango Slugger",
"dango_specialist": "Dango Specialist",
"dango_temper": "Dango Temper",
"dango_thunder_res": "Dango Thunder Res ",
"dango_thunder_res_hi": "Dango Thunder Res (Hi)",
"dango_wall_runner": "Dango Wall Runner",
"dango_water_res": "Dango Water Res",
"dango_water_res_hi": "Dango Water Res (Hi)",
"dango_weakener": "Dango Weakener",
"super_recovery_dango": "Super Recovery Dango"
},
"font_name": "NotoSansKR-Bold.otf", "font_name": "NotoSansKR-Bold.otf",
"melody_effects": {
"affinity_up": "Affinity Up",
"attack_and_affinity_up": "Attack and Affinity Up",
"attack_and_defense_up": "Attack and Defense Up",
"attack_up": "Attack Up",
"blight_negated": "Blight Negated",
"defense_up": "Defense Up",
"divine_protection": "Divine Protection",
"earplugs_l": "Earplugs (L)",
"earplugs_s": "Earplugs (S)",
"elemental_attack_boost": "Elemental Attack Boost",
"environment_damage_negated": "Environment Damage Negated",
"health_recovery_l": "Health Recovery (L)",
"health_recovery_s": "Health Recovery (S)",
"health_recovery_s_antidote": "Health Recovery (S) + Antidote",
"health_regeneration": "Health Regeneration",
"infernal_melody": "Infernal Melody",
"knockbacks_negated": "Knockbacks Negated",
"self_improvement": "Self-Improvement",
"sharpness_extension": "Sharpness Extension",
"sharpness_loss_reduced": "Sharpness Loss Reduced",
"sharpness_regeneration": "Sharpness Regeneration",
"sonic_barrier": "Sonic Barrier",
"sonic_wave": "Sonic Wave",
"stamina_recovery_up": "Stamina Recovery Up",
"stamina_use_reduced": "Stamina Use Reduced",
"stun_negated": "Stun Negated",
"tremors_negated": "Tremors Negated",
"wind_pressure_negated": "Wind Pressure Negated"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar"
},
"parts": { "parts": {
"abdomen": "Брюхо", "abdomen": "Брюхо",
"amatsu_unknown": "?", "amatsu_unknown": "?",
@@ -392,6 +527,51 @@
"wingclaws": "Крыло-коготь", "wingclaws": "Крыло-коготь",
"wings": "Крылья" "wings": "Крылья"
}, },
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragonheart": "Dragonheart",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"intrepid_heart": "Intrepid Heart",
"kushala_daora_soul": "Kushala Daora Soul",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"peak_performance": "Peak Performance",
"protective_polish": "Protective Polish",
"resentment": "Resentment",
"resuscitate": "Resuscitate",
"status_trigger": "Status Trigger",
"wall_runner": "Wall Runner",
"wind_mantle": "Wind Mantle"
},
"stats": {
"affinity": "Affinity",
"attack": "Attack",
"defense": "Defense",
"dragon": "Dragon",
"dragon_resistance": "Dragon Res",
"fire": "Fire",
"fire_resistance": "Fire Res",
"ice": "Ice",
"ice_resistance": "Ice Res",
"stamina": "Stamina",
"thunder": "Thunder",
"thunder_resistance": "Thunder Res",
"water": "Water",
"water_resistance": "Water Res"
},
"unicode_glyph_ranges": [ "unicode_glyph_ranges": [
32, 32,
255, 255,

View File

@@ -5,7 +5,7 @@
"gold": "金冠", "gold": "金冠",
"mini": "小型", "mini": "小型",
"otomo": "随从", "otomo": "随从",
"part_anomaly_core": "Anomaly Core", "part_anomaly_core": "怪异核",
"part_break": "部位破坏", "part_break": "部位破坏",
"part_sever": "部位切断", "part_sever": "部位切断",
"player": "玩家", "player": "玩家",
@@ -18,30 +18,66 @@
}, },
"ailments": { "ailments": {
"blast": "爆破", "blast": "爆破",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"bubbleblight": "Bubbleblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "异臭球", "dung_bomb": "异臭球",
"engulfed": "Engulfed",
"exhaust": "减气", "exhaust": "减气",
"fall_otomo_trap": "随从落穴陷阱", "fall_otomo_trap": "随从落穴陷阱",
"fall_trap": "落穴陷阱", "fall_trap": "落穴陷阱",
"fireblight": "火异常状态", "fireblight": "火异常状态",
"flash": "闪光", "flash": "闪光",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "冰异常状态", "iceblight": "冰异常状态",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "麻痹", "paralysis": "麻痹",
"poison": "中毒", "poison": "中毒",
"quick_sand": "流沙", "quick_sand": "流沙",
"resistance_down": "Resistance Down",
"ride": "御龙", "ride": "御龙",
"roar": "Roar",
"shock_otomo_trap": "随从麻痹陷阱", "shock_otomo_trap": "随从麻痹陷阱",
"shock_trap": "麻痹陷阱", "shock_trap": "麻痹陷阱",
"sleep": "睡眠", "sleep": "睡眠",
"steel_fang": "双刃锁镰", "steel_fang": "双刃锁镰",
"stench": "Stench",
"stun": "昏厥", "stun": "昏厥",
"thunderblight": "雷异常状态", "thunderblight": "雷异常状态",
"tranq_bomb": "捕获用麻醉球", "tranq_bomb": "捕获用麻醉球",
"waterblight": "水异常状态" "tremor": "Tremor",
"waterblight": "水异常状态",
"webbed": "Webbed"
},
"consumables": {
"adamant_seed": "Adamant Seed",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_powder": "Demon Powder",
"demondrug": "Demondrug",
"gourmet_fish": "Gourmet Fish",
"hardshell_powder": "Hardshell Powder",
"immunizer": "Immunizer",
"mega_armorskin": "Mega Armorskin",
"mega_demondrug": "Mega Demondrug",
"might_seed": "Might Seed"
}, },
"customization_menu": { "customization_menu": {
"UI_font": "UI字体", "UI_font": "UI字体",
"UI_font_notice": "当更改字体时,请重新加载脚本!", "UI_font_notice": "当更改字体时,请重新加载脚本!",
"activation_count": "激活次数", "activation_count": "激活次数",
"affinity_label": "Affinity Label",
"ailment_buildups": "状态异常积累值", "ailment_buildups": "状态异常积累值",
"ailment_name": "状态异常名", "ailment_name": "状态异常名",
"ailment_name_label": "状态异常标签", "ailment_name_label": "状态异常标签",
@@ -49,29 +85,30 @@
"ailments": "状态异常", "ailments": "状态异常",
"all_UI": "所有UI", "all_UI": "所有UI",
"anchor": "锚点", "anchor": "锚点",
"anomaly_cores": "Anomaly Cores", "anomaly_cores": "怪异核",
"anomaly_filter": "Anomaly Core", "anomaly_filter": "怪异核",
"anomaly_health": "Anomaly Core Health", "anomaly_health": "怪异核破坏值",
"anomaly_health_percentage": "Anomaly Core Health Percentage", "anomaly_health_percentage": "怪异核破坏百分比",
"apply": "应用", "apply": "应用",
"assign_new_key": "指定新按键", "assign_new_key": "指定新按键",
"attack_label": "Attack Label",
"auto_highlight": "自动高亮", "auto_highlight": "自动高亮",
"background": "背景", "background": "背景",
"bar": "状态条", "bar": "状态条",
"blast": "爆破", "blast": "爆破",
"body_parts": "身体部位", "body_parts": "身体部位",
"bold": "粗体", "bold": "粗体",
"bombs": "Bombs", "bombs": "爆桶",
"bottom_left": "左下", "bottom_left": "左下",
"bottom_right": "右下", "bottom_right": "右下",
"bottom_to_top": "Bottom to Top", "bottom_to_top": "从下到上",
"break_anomaly_filter": "Break + Anomaly Core", "break_anomaly_filter": "破坏+怪异核",
"break_count": "破坏次数", "break_count": "破坏次数",
"break_filter": "破坏", "break_filter": "破坏",
"break_health": "破坏值", "break_health": "破坏值",
"break_health_percentage": "破坏值百分比", "break_health_percentage": "破坏值百分比",
"break_max_count": "最大破坏次数", "break_max_count": "最大破坏次数",
"break_sever_anomaly_filter": "Break + Sever + Anomaly Core", "break_sever_anomaly_filter": "破坏+切断+怪异核",
"break_sever_filter": "破坏+切断", "break_sever_filter": "破坏+切断",
"buff_UI": "Buff UI", "buff_UI": "Buff UI",
"buildup": "积累值", "buildup": "积累值",
@@ -92,6 +129,7 @@
"crown": "皇冠", "crown": "皇冠",
"crown_thresholds": "皇冠阈值", "crown_thresholds": "皇冠阈值",
"current_state": "当前阶段", "current_state": "当前阶段",
"current_time": "Current Time",
"current_value": "当前值", "current_value": "当前值",
"cutscene": "过场动画", "cutscene": "过场动画",
"damage": "伤害", "damage": "伤害",
@@ -100,26 +138,34 @@
"damage_meter_UI": "伤害统计UI", "damage_meter_UI": "伤害统计UI",
"damage_percentage_label": "伤害百分比标签", "damage_percentage_label": "伤害百分比标签",
"damage_value_label": "伤害量标签", "damage_value_label": "伤害量标签",
"debug": "Debug",
"debug_errors": "Debug Errors",
"default_state": "默认阶段", "default_state": "默认阶段",
"defense_label": "Defense Label",
"delete": "删除", "delete": "删除",
"distance": "距离", "distance": "距离",
"dps": "DPS", "dps": "DPS",
"dps_label": "DPS标签", "dps_label": "DPS标签",
"dps_mode": "DPS模式", "dps_mode": "DPS模式",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "复制", "duplicate": "复制",
"duration": "持续时间", "duration": "持续时间",
"dynamic_positioning": "动态位置", "dynamic_positioning": "动态位置",
"dynamically_positioned": "动态位置", "dynamically_positioned": "动态位置",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "开启", "enable_for": "开启",
"enabled": "开启", "enabled": "开启",
"endemic_life": "Endemic Life", "endemic_life": "环境生物",
"endemic_life_UI": "环境生物UI", "endemic_life_UI": "环境生物UI",
"everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "字体", "family": "字体",
"farthest": "最远", "farthest": "最远",
"fight_time": "战斗时间", "fight_time": "战斗时间",
"fill_direction": "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": "胆怯次数",
@@ -129,14 +175,15 @@
"global_scale_modifier": "全局比例更改", "global_scale_modifier": "全局比例更改",
"global_settings": "全局设定", "global_settings": "全局设定",
"health": "生命", "health": "生命",
"health_anomaly_filter": "Health + Anomaly Core", "health_anomaly_filter": "生命+怪异核",
"health_break_anomaly_filter": "Health + Break + Anomaly Core", "health_break_anomaly_filter": "生命+破坏+怪异核",
"health_break_filter": "生命+破坏", "health_break_filter": "生命+破坏",
"health_break_sever_anomaly_filter": "Health + Break + Sever + Anomaly Core", "health_break_sever_anomaly_filter": "生命+破坏+切断+怪异核",
"health_break_sever_filter": "生命+破坏+切断", "health_break_sever_filter": "生命+破坏+切断",
"health_filter": "生命", "health_filter": "生命",
"health_label": "Health Label",
"health_percentage": "生命百分比", "health_percentage": "生命百分比",
"health_sever_anomaly_filter": "Health + Sever + Anomaly Core", "health_sever_anomaly_filter": "生命+切断+怪异核",
"health_sever_filter": "生命+切断", "health_sever_filter": "生命+切断",
"height": "高度", "height": "高度",
"hide_ailments_with_zero_buildup": "当积累值为0时隐藏该状态异常", "hide_ailments_with_zero_buildup": "当积累值为0时隐藏该状态异常",
@@ -163,20 +210,23 @@
"highlighted_buildup_bar": "高亮积累值条", "highlighted_buildup_bar": "高亮积累值条",
"highlighted_damage_bar": "高亮伤害条", "highlighted_damage_bar": "高亮伤害条",
"highlighted_targeted": "高亮目标[锁定目标的UI]", "highlighted_targeted": "高亮目标[锁定目标的UI]",
"history": "History",
"history_size": "History Size",
"horizontal": "水平", "horizontal": "水平",
"hotkeys": "热键", "hotkeys": "热键",
"hunter_rank": "猎人等级", "hunter_rank": "猎人等级",
"hunter_rank_label": "猎人等级标签", "hunter_rank_label": "猎人等级标签",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID", "id": "ID",
"in_lobby": "在大厅", "in_lobby": "在大厅",
"in_training_area": "在修炼场", "in_training_area": "在修炼场",
"include": "包含", "include": "包含",
"inside": "里面", "inside": "里面",
"installations": "Installations", "installations": "狩猎设备",
"italic": "斜体", "italic": "斜体",
"join_time": "加入时间", "join_time": "加入时间",
"killcam": "击杀镜头", "killcam": "击杀镜头",
"kunai": "Kunai", "kunai": "苦无",
"language": "语言", "language": "语言",
"large_monster_UI": "大型怪物UI", "large_monster_UI": "大型怪物UI",
"large_monster_dynamic_UI": "大型怪物浮动UI", "large_monster_dynamic_UI": "大型怪物浮动UI",
@@ -184,7 +234,7 @@
"large_monster_static_UI": "大型怪物固定UI", "large_monster_static_UI": "大型怪物固定UI",
"large_monsters": "大型怪物群", "large_monsters": "大型怪物群",
"last": "最后", "last": "最后",
"left_to_right": "Left to Right", "left_to_right": "从左到右",
"level": "等级", "level": "等级",
"level_label": "等级标签", "level_label": "等级标签",
"loading_quest": "任务加载中", "loading_quest": "任务加载中",
@@ -208,7 +258,7 @@
"monster_id": "怪物ID", "monster_id": "怪物ID",
"monster_name": "怪物名", "monster_name": "怪物名",
"monster_name_label": "怪物名标签", "monster_name_label": "怪物名标签",
"monsters": "Monsters", "monsters": "怪物",
"my_damage_bar_location": "我的伤害条位置", "my_damage_bar_location": "我的伤害条位置",
"my_otomos": "我的随从", "my_otomos": "我的随从",
"myself": "我自己", "myself": "我自己",
@@ -221,10 +271,10 @@
"offset_is_relative_to_parts": "根据部位偏移", "offset_is_relative_to_parts": "根据部位偏移",
"opacity_falloff": "透明度增加", "opacity_falloff": "透明度增加",
"orientation": "方向", "orientation": "方向",
"other": "Other", "other": "其它",
"other_player_otomos": "其他玩家的随从", "other_player_otomos": "其他玩家的随从",
"other_players": "其他玩家", "other_players": "其他玩家",
"otomos": "Buddies", "otomos": "随从",
"outline": "轮廓", "outline": "轮廓",
"outside": "外面", "outside": "外面",
"part_health": "部位生命值", "part_health": "部位生命值",
@@ -235,7 +285,7 @@
"player_name_label": "玩家名标签", "player_name_label": "玩家名标签",
"player_name_size_limit": "玩家名长度限制", "player_name_size_limit": "玩家名长度限制",
"player_spacing": "玩家间距", "player_spacing": "玩家间距",
"players": "Players", "players": "玩家",
"playing_quest": "操作界面/正常游玩时", "playing_quest": "操作界面/正常游玩时",
"poison": "中毒", "poison": "中毒",
"position": "位置", "position": "位置",
@@ -251,18 +301,18 @@
"relative_offset": "相对偏移", "relative_offset": "相对偏移",
"rename": "重命名", "rename": "重命名",
"render_highlighted_monster": "渲染高亮怪物", "render_highlighted_monster": "渲染高亮怪物",
"render_inactive_anomaly_cores": "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_alignment_shift": "右对齐偏移距离",
"right_to_left": "Right to Left", "right_to_left": "从右到左",
"servant_otomos": "盟友随从", "servant_otomos": "盟友随从",
"servants": "盟友", "servants": "盟友",
"settings": "设定", "settings": "设定",
"sever_anomaly_filter": "Sever + Anomaly Core", "sever_anomaly_filter": "切断+怪异核",
"sever_filter": "切断", "sever_filter": "切断",
"shadow": "阴影", "shadow": "阴影",
"show_my_otomos_separately": "分开显示我的随从", "show_my_otomos_separately": "分开显示我的随从",
@@ -274,27 +324,30 @@
"sorting": "排序方式", "sorting": "排序方式",
"spacing": "间距", "spacing": "间距",
"stamina": "耐力", "stamina": "耐力",
"stamina_label": "Stamina Label",
"static_orientation": "固定方向", "static_orientation": "固定方向",
"static_position": "固定位置", "static_position": "固定位置",
"static_sorting": "固定排序", "static_sorting": "固定排序",
"static_spacing": "固定间距", "static_spacing": "固定间距",
"statically_positioned": "固定位置", "statically_positioned": "固定位置",
"stats_UI": "Stats UI",
"status": "状态", "status": "状态",
"style": "样式", "style": "样式",
"summary_screen": "总结界面", "summary_screen": "总结界面",
"text_label": "文字标签", "text_label": "文字标签",
"thickness": "粗细度", "thickness": "粗细度",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "时间UI", "time_UI": "时间UI",
"time_label": "时间标签", "time_label": "时间标签",
"time_limit": "时间限制(秒)", "time_limit": "时间限制(秒)",
"timer": "计时器", "timer": "计时器",
"timer_label": "计时器标签", "timer_label": "计时器标签",
"top_buildup": "最高积累值", "top_buildup": "最高积累值",
"top_damage": "Top Damage", "top_damage": "最高伤害",
"top_dps": "最高DPS", "top_dps": "最高DPS",
"top_left": "左上", "top_left": "左上",
"top_right": "右上", "top_right": "右上",
"top_to_bottom": "Top to Bottom", "top_to_bottom": "从上到下",
"total": "总计", "total": "总计",
"total_buildup": "总积累值", "total_buildup": "总积累值",
"total_buildup_label": "总积累值标签", "total_buildup_label": "总积累值标签",
@@ -311,18 +364,100 @@
"tracked_monster_types": "跟踪的怪物类型", "tracked_monster_types": "跟踪的怪物类型",
"type": "类型", "type": "类型",
"use_d2d_if_available": "可用时使用Direct2D", "use_d2d_if_available": "可用时使用Direct2D",
"value": "Value",
"value_label": "数字", "value_label": "数字",
"vertical": "垂直", "vertical": "垂直",
"viewport_offset": "窗口偏移", "viewport_offset": "窗口偏移",
"visible": "可见", "visible": "可见",
"water_resistance_label": "Water Resistance Label",
"width": "宽度", "width": "宽度",
"world_offset": "整体偏移", "world_offset": "整体偏移",
"wyvern_riding": "Wyvern Riding", "wyvern_riding": "御龙",
"x": "X轴", "x": "X轴",
"y": "Y轴", "y": "Y轴",
"z": "Z轴" "z": "Z轴"
}, },
"dangos": {
"dango_adrenaline": "Dango Adrenaline",
"dango_bombardier": "Dango Bombardier",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_defender_hi": "Dango Defender (Hi)",
"dango_deflector": "Dango Deflector",
"dango_dragon_res": "Dango Dragon Res",
"dango_dragon_res_hi": "Dango Dragon Res (Hi)",
"dango_driver": "Dango Driver",
"dango_feet": "Dango Feet",
"dango_fighter": "Dango Fighter",
"dango_fire_res": "Dango Fire Res",
"dango_fire_res_hi": "Dango Fire Res (Hi)",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_guard": "Dango Guard",
"dango_hunter": "Dango Hunter",
"dango_hurler": "Dango Hurler",
"dango_ice_res": "Dango Ice Res",
"dango_ice_res_hi": "Dango Ice Res (Hi)",
"dango_immunizer": "Dango Immunizer",
"dango_insurance": "Dango Insurance",
"dango_marksman": "Dango Marksman",
"dango_medic": "Dango Medic",
"dango_medic_hi": "Dango Medic (Hi)",
"dango_moxie": "Dango Moxie",
"dango_polisher": "Dango Polisher",
"dango_pyro": "Dango Pyro",
"dango_reviver": "Dango Reviver",
"dango_rider": "Dango Rider",
"dango_shifter": "Dango Shifter",
"dango_slugger": "Dango Slugger",
"dango_specialist": "Dango Specialist",
"dango_temper": "Dango Temper",
"dango_thunder_res": "Dango Thunder Res ",
"dango_thunder_res_hi": "Dango Thunder Res (Hi)",
"dango_wall_runner": "Dango Wall Runner",
"dango_water_res": "Dango Water Res",
"dango_water_res_hi": "Dango Water Res (Hi)",
"dango_weakener": "Dango Weakener",
"super_recovery_dango": "Super Recovery Dango"
},
"font_name": "NotoSansSC-Bold.otf", "font_name": "NotoSansSC-Bold.otf",
"melody_effects": {
"affinity_up": "Affinity Up",
"attack_and_affinity_up": "Attack and Affinity Up",
"attack_and_defense_up": "Attack and Defense Up",
"attack_up": "Attack Up",
"blight_negated": "Blight Negated",
"defense_up": "Defense Up",
"divine_protection": "Divine Protection",
"earplugs_l": "Earplugs (L)",
"earplugs_s": "Earplugs (S)",
"elemental_attack_boost": "Elemental Attack Boost",
"environment_damage_negated": "Environment Damage Negated",
"health_recovery_l": "Health Recovery (L)",
"health_recovery_s": "Health Recovery (S)",
"health_recovery_s_antidote": "Health Recovery (S) + Antidote",
"health_regeneration": "Health Regeneration",
"infernal_melody": "Infernal Melody",
"knockbacks_negated": "Knockbacks Negated",
"self_improvement": "Self-Improvement",
"sharpness_extension": "Sharpness Extension",
"sharpness_loss_reduced": "Sharpness Loss Reduced",
"sharpness_regeneration": "Sharpness Regeneration",
"sonic_barrier": "Sonic Barrier",
"sonic_wave": "Sonic Wave",
"stamina_recovery_up": "Stamina Recovery Up",
"stamina_use_reduced": "Stamina Use Reduced",
"stun_negated": "Stun Negated",
"tremors_negated": "Tremors Negated",
"wind_pressure_negated": "Wind Pressure Negated"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar"
},
"parts": { "parts": {
"abdomen": "腹部", "abdomen": "腹部",
"amatsu_unknown": "?", "amatsu_unknown": "?",
@@ -392,6 +527,51 @@
"wingclaws": "翼爪", "wingclaws": "翼爪",
"wings": "翼" "wings": "翼"
}, },
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragonheart": "Dragonheart",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"intrepid_heart": "Intrepid Heart",
"kushala_daora_soul": "Kushala Daora Soul",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"peak_performance": "Peak Performance",
"protective_polish": "Protective Polish",
"resentment": "Resentment",
"resuscitate": "Resuscitate",
"status_trigger": "Status Trigger",
"wall_runner": "Wall Runner",
"wind_mantle": "Wind Mantle"
},
"stats": {
"affinity": "Affinity",
"attack": "Attack",
"defense": "Defense",
"dragon": "Dragon",
"dragon_resistance": "Dragon Res",
"fire": "Fire",
"fire_resistance": "Fire Res",
"ice": "Ice",
"ice_resistance": "Ice Res",
"stamina": "Stamina",
"thunder": "Thunder",
"thunder_resistance": "Thunder Res",
"water": "Water",
"water_resistance": "Water Res"
},
"unicode_glyph_ranges": [ "unicode_glyph_ranges": [
32, 32,
255, 255,

View File

@@ -18,30 +18,66 @@
}, },
"ailments": { "ailments": {
"blast": "爆破", "blast": "爆破",
"blastblight": "Blastblight",
"bleeding": "Bleeding",
"bloodblight": "Bloodblight",
"bubbleblight": "Bubbleblight",
"deadly_poison": "Deadly Poison",
"defense_down": "Defense Down",
"dragonblight": "Dragonblight",
"dung_bomb": "異臭", "dung_bomb": "異臭",
"engulfed": "Engulfed",
"exhaust": "疲勞", "exhaust": "疲勞",
"fall_otomo_trap": "隨從地洞陷阱", "fall_otomo_trap": "隨從地洞陷阱",
"fall_trap": "地洞陷阱", "fall_trap": "地洞陷阱",
"fireblight": "火屬性異常", "fireblight": "火屬性異常",
"flash": "失明", "flash": "失明",
"frenzy": "Frenzy",
"frenzy_infection": "Frenzy Infection",
"frenzy_overcome": "Frenzy Overcome",
"frostblight": "Frostblight",
"hellfireblight": "Hellfireblight",
"iceblight": "冰屬性異常", "iceblight": "冰屬性異常",
"leeched": "Leeched",
"major_bubbleblight": "Major Bubbleblight",
"minor_bubbleblight": "Minor Bubbleblight",
"muck": "Muck",
"paralysis": "麻痺", "paralysis": "麻痺",
"poison": "毒", "poison": "毒",
"quick_sand": "流沙", "quick_sand": "流沙",
"resistance_down": "Resistance Down",
"ride": "操龍", "ride": "操龍",
"roar": "Roar",
"shock_otomo_trap": "隨從麻痺陷阱", "shock_otomo_trap": "隨從麻痺陷阱",
"shock_trap": "麻痺陷阱", "shock_trap": "麻痺陷阱",
"sleep": "睡眠", "sleep": "睡眠",
"steel_fang": "獵犬鋼牙", "steel_fang": "獵犬鋼牙",
"stench": "Stench",
"stun": "暈眩", "stun": "暈眩",
"thunderblight": "雷屬性異常", "thunderblight": "雷屬性異常",
"tranq_bomb": "麻醉", "tranq_bomb": "麻醉",
"waterblight": "水屬性異常" "tremor": "Tremor",
"waterblight": "水屬性異常",
"webbed": "Webbed"
},
"consumables": {
"adamant_seed": "Adamant Seed",
"armorskin": "Armorskin",
"dash_juice": "Dash Juice",
"demon_powder": "Demon Powder",
"demondrug": "Demondrug",
"gourmet_fish": "Gourmet Fish",
"hardshell_powder": "Hardshell Powder",
"immunizer": "Immunizer",
"mega_armorskin": "Mega Armorskin",
"mega_demondrug": "Mega Demondrug",
"might_seed": "Might Seed"
}, },
"customization_menu": { "customization_menu": {
"UI_font": "UI 字型", "UI_font": "UI 字型",
"UI_font_notice": "當更改文字時,請重新載入", "UI_font_notice": "當更改文字時,請重新載入",
"activation_count": "觸發次數", "activation_count": "觸發次數",
"affinity_label": "Affinity Label",
"ailment_buildups": "異常狀態累積值", "ailment_buildups": "異常狀態累積值",
"ailment_name": "異常狀態", "ailment_name": "異常狀態",
"ailment_name_label": "異常狀態名稱", "ailment_name_label": "異常狀態名稱",
@@ -55,6 +91,7 @@
"anomaly_health_percentage": "Anomaly Core Health Percentage", "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": "圖形化顯示條",
@@ -92,6 +129,7 @@
"crown": "皇冠", "crown": "皇冠",
"crown_thresholds": "皇冠的大小判定範圍", "crown_thresholds": "皇冠的大小判定範圍",
"current_state": "Current State", "current_state": "Current State",
"current_time": "Current Time",
"current_value": "Current Value", "current_value": "Current Value",
"cutscene": "Cutscene", "cutscene": "Cutscene",
"damage": "傷害", "damage": "傷害",
@@ -100,26 +138,34 @@
"damage_meter_UI": "傷害量計算 UI", "damage_meter_UI": "傷害量計算 UI",
"damage_percentage_label": "傷害量百分比", "damage_percentage_label": "傷害量百分比",
"damage_value_label": "傷害量", "damage_value_label": "傷害量",
"debug": "Debug",
"debug_errors": "Debug Errors",
"default_state": "Default State", "default_state": "Default State",
"defense_label": "Defense Label",
"delete": "Delete", "delete": "Delete",
"distance": "距離", "distance": "距離",
"dps": "DPS", "dps": "DPS",
"dps_label": "DPS文字", "dps_label": "DPS文字",
"dps_mode": "DPS模式", "dps_mode": "DPS模式",
"dragon_resistance_label": "Dragon Resistance Label",
"duplicate": "Duplicate", "duplicate": "Duplicate",
"duration": "Duration", "duration": "Duration",
"dynamic_positioning": "浮動的資訊位置", "dynamic_positioning": "浮動的資訊位置",
"dynamically_positioned": "浮動的魔物資訊", "dynamically_positioned": "浮動的魔物資訊",
"element_2_label": "Element 2 Label",
"element_label": "Element Label",
"enable_for": "啟用對象", "enable_for": "啟用對象",
"enabled": "啟用", "enabled": "啟用",
"endemic_life": "Endemic Life", "endemic_life": "Endemic Life",
"endemic_life_UI": "環境生物 UI", "endemic_life_UI": "環境生物 UI",
"everything_seems_to_be_ok": "Everything seems to be OK!",
"family": "字體", "family": "字體",
"farthest": "最遠的", "farthest": "最遠的",
"fight_time": "戰鬥時間", "fight_time": "戰鬥時間",
"fill_direction": "Fill Direction", "fill_direction": "Fill Direction",
"filter": "篩選器", "filter": "篩選器",
"filter_mode": "Filter Mode", "filter_mode": "Filter Mode",
"fire_resistance_label": "Fire Resistance Label",
"first": "第一", "first": "第一",
"first_hit": "第一擊", "first_hit": "第一擊",
"flinch_count": "膽怯次數", "flinch_count": "膽怯次數",
@@ -135,6 +181,7 @@
"health_break_sever_anomaly_filter": "Health + Break + Sever + Anomaly Core", "health_break_sever_anomaly_filter": "Health + Break + Sever + Anomaly Core",
"health_break_sever_filter": "Health + Break + Sever", "health_break_sever_filter": "Health + Break + Sever",
"health_filter": "Health", "health_filter": "Health",
"health_label": "Health Label",
"health_percentage": "血量百分比", "health_percentage": "血量百分比",
"health_sever_anomaly_filter": "Health + Sever + Anomaly Core", "health_sever_anomaly_filter": "Health + Sever + Anomaly Core",
"health_sever_filter": "Health + Sever", "health_sever_filter": "Health + Sever",
@@ -163,10 +210,13 @@
"highlighted_buildup_bar": "重點累積條", "highlighted_buildup_bar": "重點累積條",
"highlighted_damage_bar": "重點傷害條", "highlighted_damage_bar": "重點傷害條",
"highlighted_targeted": "鎖定的魔物資訊(目標)", "highlighted_targeted": "鎖定的魔物資訊(目標)",
"history": "History",
"history_size": "History Size",
"horizontal": "水平", "horizontal": "水平",
"hotkeys": "快捷鍵", "hotkeys": "快捷鍵",
"hunter_rank": "獵人等級", "hunter_rank": "獵人等級",
"hunter_rank_label": "獵人等級", "hunter_rank_label": "獵人等級",
"ice_resistance_label": "Ice Resistance Label",
"id": "ID", "id": "ID",
"in_lobby": "In Lobby", "in_lobby": "In Lobby",
"in_training_area": "In Training Area", "in_training_area": "In Training Area",
@@ -274,16 +324,19 @@
"sorting": "排序方式", "sorting": "排序方式",
"spacing": "間距", "spacing": "間距",
"stamina": "耐力", "stamina": "耐力",
"stamina_label": "Stamina Label",
"static_orientation": "固定魔物資訊的對齊方式", "static_orientation": "固定魔物資訊的對齊方式",
"static_position": "固定魔物資訊的位置", "static_position": "固定魔物資訊的位置",
"static_sorting": "固定魔物資訊的排序", "static_sorting": "固定魔物資訊的排序",
"static_spacing": "固定魔物資訊的間距", "static_spacing": "固定魔物資訊的間距",
"statically_positioned": "固定的魔物資訊", "statically_positioned": "固定的魔物資訊",
"stats_UI": "Stats UI",
"status": "狀態", "status": "狀態",
"style": "樣式", "style": "樣式",
"summary_screen": "Summary Screen", "summary_screen": "Summary Screen",
"text_label": "文字", "text_label": "文字",
"thickness": "粗細", "thickness": "粗細",
"thunder_resistance_label": "Thunder Resistance Label",
"time_UI": "時間 UI", "time_UI": "時間 UI",
"time_label": "時間", "time_label": "時間",
"time_limit": "時限 (秒)", "time_limit": "時限 (秒)",
@@ -311,10 +364,12 @@
"tracked_monster_types": "追蹤的魔物類型", "tracked_monster_types": "追蹤的魔物類型",
"type": "類型", "type": "類型",
"use_d2d_if_available": "Use Direct2D if available", "use_d2d_if_available": "Use Direct2D if available",
"value": "Value",
"value_label": "數字", "value_label": "數字",
"vertical": "垂直", "vertical": "垂直",
"viewport_offset": "視窗的位置", "viewport_offset": "視窗的位置",
"visible": "可見", "visible": "可見",
"water_resistance_label": "Water Resistance Label",
"width": "寬度", "width": "寬度",
"world_offset": "地圖中的位置", "world_offset": "地圖中的位置",
"wyvern_riding": "Wyvern Riding", "wyvern_riding": "Wyvern Riding",
@@ -322,7 +377,87 @@
"y": "Y軸", "y": "Y軸",
"z": "Z軸" "z": "Z軸"
}, },
"dangos": {
"dango_adrenaline": "Dango Adrenaline",
"dango_bombardier": "Dango Bombardier",
"dango_booster": "Dango Booster",
"dango_bulker": "Dango Bulker",
"dango_connector": "Dango Connector",
"dango_defender": "Dango Defender",
"dango_defender_hi": "Dango Defender (Hi)",
"dango_deflector": "Dango Deflector",
"dango_dragon_res": "Dango Dragon Res",
"dango_dragon_res_hi": "Dango Dragon Res (Hi)",
"dango_driver": "Dango Driver",
"dango_feet": "Dango Feet",
"dango_fighter": "Dango Fighter",
"dango_fire_res": "Dango Fire Res",
"dango_fire_res_hi": "Dango Fire Res (Hi)",
"dango_flyer": "Dango Flyer",
"dango_glutton": "Dango Glutton",
"dango_guard": "Dango Guard",
"dango_hunter": "Dango Hunter",
"dango_hurler": "Dango Hurler",
"dango_ice_res": "Dango Ice Res",
"dango_ice_res_hi": "Dango Ice Res (Hi)",
"dango_immunizer": "Dango Immunizer",
"dango_insurance": "Dango Insurance",
"dango_marksman": "Dango Marksman",
"dango_medic": "Dango Medic",
"dango_medic_hi": "Dango Medic (Hi)",
"dango_moxie": "Dango Moxie",
"dango_polisher": "Dango Polisher",
"dango_pyro": "Dango Pyro",
"dango_reviver": "Dango Reviver",
"dango_rider": "Dango Rider",
"dango_shifter": "Dango Shifter",
"dango_slugger": "Dango Slugger",
"dango_specialist": "Dango Specialist",
"dango_temper": "Dango Temper",
"dango_thunder_res": "Dango Thunder Res ",
"dango_thunder_res_hi": "Dango Thunder Res (Hi)",
"dango_wall_runner": "Dango Wall Runner",
"dango_water_res": "Dango Water Res",
"dango_water_res_hi": "Dango Water Res (Hi)",
"dango_weakener": "Dango Weakener",
"super_recovery_dango": "Super Recovery Dango"
},
"font_name": "NotoSansTC-Bold.otf", "font_name": "NotoSansTC-Bold.otf",
"melody_effects": {
"affinity_up": "Affinity Up",
"attack_and_affinity_up": "Attack and Affinity Up",
"attack_and_defense_up": "Attack and Defense Up",
"attack_up": "Attack Up",
"blight_negated": "Blight Negated",
"defense_up": "Defense Up",
"divine_protection": "Divine Protection",
"earplugs_l": "Earplugs (L)",
"earplugs_s": "Earplugs (S)",
"elemental_attack_boost": "Elemental Attack Boost",
"environment_damage_negated": "Environment Damage Negated",
"health_recovery_l": "Health Recovery (L)",
"health_recovery_s": "Health Recovery (S)",
"health_recovery_s_antidote": "Health Recovery (S) + Antidote",
"health_regeneration": "Health Regeneration",
"infernal_melody": "Infernal Melody",
"knockbacks_negated": "Knockbacks Negated",
"self_improvement": "Self-Improvement",
"sharpness_extension": "Sharpness Extension",
"sharpness_loss_reduced": "Sharpness Loss Reduced",
"sharpness_regeneration": "Sharpness Regeneration",
"sonic_barrier": "Sonic Barrier",
"sonic_wave": "Sonic Wave",
"stamina_recovery_up": "Stamina Recovery Up",
"stamina_use_reduced": "Stamina Use Reduced",
"stun_negated": "Stun Negated",
"tremors_negated": "Tremors Negated",
"wind_pressure_negated": "Wind Pressure Negated"
},
"otomo_moves": {
"go_fight_win": "Go, Fight, Win",
"power_drum": "Power Drum",
"rousing_roar": "Rousing Roar"
},
"parts": { "parts": {
"abdomen": "腹部", "abdomen": "腹部",
"amatsu_unknown": "?", "amatsu_unknown": "?",
@@ -392,6 +527,51 @@
"wingclaws": "翼爪", "wingclaws": "翼爪",
"wings": "翅膀" "wings": "翅膀"
}, },
"skills": {
"adrenaline_rush": "Adrenaline Rush",
"affinity_sliding": "Affinity Sliding",
"agitator": "Agitator",
"bloodlust": "Bloodlust",
"burst": "Burst",
"coalescence": "Coalescence",
"counterstrike": "Counterstrike",
"dereliction": "Dereliction",
"dragonheart": "Dragonheart",
"frenzied_bloodlust": "Frenzied Bloodlust",
"furious": "Furious",
"grinder_s": "Grinder (S)",
"heaven_sent": "Heaven-Sent",
"hellfire_cloak": "Hellfire Cloak",
"heroics": "Heroics",
"intrepid_heart": "Intrepid Heart",
"kushala_daora_soul": "Kushala Daora Soul",
"latent_power": "Latent Power",
"maximum_might": "Maximum Might",
"offensive_guard": "Offensive Guard",
"peak_performance": "Peak Performance",
"protective_polish": "Protective Polish",
"resentment": "Resentment",
"resuscitate": "Resuscitate",
"status_trigger": "Status Trigger",
"wall_runner": "Wall Runner",
"wind_mantle": "Wind Mantle"
},
"stats": {
"affinity": "Affinity",
"attack": "Attack",
"defense": "Defense",
"dragon": "Dragon",
"dragon_resistance": "Dragon Res",
"fire": "Fire",
"fire_resistance": "Fire Res",
"ice": "Ice",
"ice_resistance": "Ice Res",
"stamina": "Stamina",
"thunder": "Thunder",
"thunder_resistance": "Thunder Res",
"water": "Water",
"water_resistance": "Water Res"
},
"unicode_glyph_ranges": [ "unicode_glyph_ranges": [
32, 32,
255, 255,