Quest Flow Tracking Rework

This commit is contained in:
GreenComfyTea
2022-11-22 15:58:33 +02:00
parent cc93a617f1
commit 8f3ff25fd6
15 changed files with 752 additions and 289 deletions

View File

@@ -1,4 +1,5 @@
local quest_status = {};
local singletons;
local customization_menu;
local player;
@@ -8,35 +9,235 @@ local damage_meter_UI;
local time;
local env_creature;
quest_status.flow_states = {
NONE = 0,
IN_LOBBY = 1,
IN_TRAINING_AREA = 2,
CUTSCENE = 4,
LOADING_QUEST = 8,
QUEST_START_ANIMATION = 16,
PLAYING_QUEST = 32,
PLAYER_DEATH_ANIMATION = 64,
PLAYER_CART_ANIMATION = 128,
FAST_TRAVEL_ANIMATION = 256,
WYVERN_RIDING_START_ANIMATION = 512,
KILLCAM = 1024,
QUEST_END_TIMER = 2048,
QUEST_END_ANIMATION = 4096,
QUEST_END_SCREEN = 8192,
REWARD_SCREEN = 16384,
SUMMARY_SCREEN = 32768,
};
quest_status.previous_flow_state = quest_status.flow_states.NONE;
quest_status.flow_state = quest_status.flow_states.NONE;
quest_status.index = 0;
quest_status.is_online = false;
quest_status.is_host = false;
quest_status.is_training_area = false;
quest_status.is_result_screen = false;
quest_status.is_quest_clear = false;
quest_status.is_quest_host = false;
local quest_manager_type_definition = sdk.find_type_definition("snow.QuestManager");
local on_changed_game_status = quest_manager_type_definition:get_method("onChangedGameStatus");
local get_status_method = quest_manager_type_definition:get_method("getStatus");
local is_result_demo_play_start_method = quest_manager_type_definition:get_method("isResultDemoPlayStart");
local quest_manager_type_def = sdk.find_type_definition("snow.QuestManager");
local on_changed_game_status_method = quest_manager_type_def:get_method("onChangedGameStatus");
local is_result_demo_play_start_method = quest_manager_type_def:get_method("isResultDemoPlayStart");
local set_quest_clear_method = quest_manager_type_def:get_method("setQuestClear");
local set_quest_clear_sub_method = quest_manager_type_def:get_method("setQuestClearSub");
local set_quest_clear_sub_hyakurui_method = quest_manager_type_def:get_method("setQuestClearSubHyakuryu");
local set_quest_fail_method = quest_manager_type_def:get_method("setQuestFail");
local set_quest_clear_method = quest_manager_type_definition:get_method("setQuestClear");
local set_quest_clear_sub_method = quest_manager_type_definition:get_method("setQuestClearSub");
local set_quest_clear_sub_hyakurui_method = quest_manager_type_definition:get_method("setQuestClearSubHyakuryu");
local game_manager_type_def = sdk.find_type_definition("snow.SnowGameManager");
local get_status_method = game_manager_type_def:get_method("getStatus");
local village_area_manager_type_def = sdk.find_type_definition("snow.VillageAreaManager");
local check_current_area_training_area_method = village_area_manager_type_def:get_method("checkCurrentArea_TrainingArea");
local fast_travel_method = village_area_manager_type_def:get_method("fastTravel");
local lobby_manager_type_definition = sdk.find_type_definition("snow.LobbyManager");
local is_quest_online_method = lobby_manager_type_definition:get_method("IsQuestOnline");
local is_quest_host_method = lobby_manager_type_definition:get_method("isQuestHost");
local is_play_quest_method = quest_manager_type_def:get_method("isPlayQuest");
local is_end_wait_method = quest_manager_type_def:get_method("isEndWait");
local demo_camera_type_def = sdk.find_type_definition("snow.camera.DemoCamera");
local demo_request_activation_method = demo_camera_type_def:get_method("RequestActivation");
local demo_end_method = demo_camera_type_def:get_method("DemoEnd");
local gui_quest_end_base_type_def = sdk.find_type_definition("snow.gui.GuiQuestEndBase");
local quest_end_set_state_method = gui_quest_end_base_type_def:get_method("setState");
local gui_result_reward_type_def = sdk.find_type_definition("snow.gui.GuiResultReward");
local gui_result_reward_do_open_method = gui_result_reward_type_def:get_method("doOpen");
local gui_result_pay_off_type_def = sdk.find_type_definition("snow.gui.GuiResultPayOff");
local gui_result_pay_off_do_open_method = gui_result_pay_off_type_def:get_method("doOpen");
local unique_event_manager_type_def = sdk.find_type_definition("snow.eventcut.UniqueEventManager");
local play_event_common_method = unique_event_manager_type_def:get_method("playEventCommon");
local event_manager_dispose_method = unique_event_manager_type_def:get_method("dispose");
function quest_status.get_flow_state(flow_state, new_line)
for key, value in pairs(quest_status.flow_states) do
if value == flow_state then
if new_line then
return "\n" .. tostring(key);
else
return tostring(key);
end
end
end
end
--type 2 = quest start
--type 3 = monster killcam
--type 5 = end screen
function quest_status.on_demo_request_activation(request_data_base)
if request_data_base == nil then
return;
end
if quest_status.index ~= 2 then
return;
end
local request_data_type = request_data_base:call("get_Type");
if request_data_type == nil then
return;
end
-- QUEST_START_ANIMATION
if request_data_type == 2 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.QUEST_START_ANIMATION;
-- KILLCAM
elseif request_data_type == 3 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.KILLCAM;
-- QUEST_END_ANIMATION
elseif request_data_type == 5 or request_data_type == 6 or request_data_type == 7 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.QUEST_END_ANIMATION;
-- PLAYER_DEATH_ANIMATION
elseif request_data_type == 8 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.PLAYER_DEATH_ANIMATION;
-- PLAYER_CART_ANIMATION
elseif request_data_type == 9 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.PLAYER_CART_ANIMATION;
-- FAST_TRAVEL_ANIMATION
elseif request_data_type == 10 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.FAST_TRAVEL_ANIMATION;
-- WYVERN_RIDING_START_ANIMATION
elseif request_data_type == 11 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.WYVERN_RIDING_START_ANIMATION;
end
end
function quest_status.on_demo_end()
if quest_status.index == 2 then
if quest_status.flow_state == quest_status.flow_states.PLAYER_DEATH_ANIMATION
or quest_status.flow_state == quest_status.flow_states.PLAYER_CART_ANIMATION
or quest_status.flow_state == quest_status.flow_states.FAST_TRAVEL_ANIMATION
or quest_status.flow_state == quest_status.flow_states.WYVERN_RIDING_START_ANIMATION then
local next_flow_state = quest_status.previous_flow_state;
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = next_flow_state;
elseif quest_status.flow_state == quest_status.flow_states.QUEST_START_ANIMATION then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.PLAYING_QUEST;
elseif quest_status.flow_state == quest_status.flow_states.KILLCAM then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.QUEST_END_TIMER;
end
end
end
function quest_status.on_set_quest_clear()
if quest_status.index == 2 and quest_status.flow_state ~= quest_status.flow_states.KILLCAM then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.QUEST_END_TIMER;
end
end
function quest_status.on_quest_end_set_state()
if quest_status.index == 2 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.QUEST_END_SCREEN;
end
end
function quest_status.on_gui_result_reward_do_open()
if quest_status.index == 3 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.REWARD_SCREEN;
end
end
function quest_status.on_gui_result_pay_off_do_open()
if quest_status.index == 3 then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.SUMMARY_SCREEN;
end
end
function quest_status.on_play_event_common()
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.CUTSCENE;
end
function quest_status.on_event_manager_dispose()
if quest_status.flow_state == quest_status.flow_states.CUTSCENE then
local next_flow_state = quest_status.previous_flow_state;
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = next_flow_state;
end
end
function quest_status.on_set_quest_fail()
if quest_status.flow_state == quest_status.flow_states.PLAYER_DEATH_ANIMATION or
quest_status.flow_state == quest_status.flow_states.PLAYER_CART_ANIMATION or
quest_status.flow_state == quest_status.flow_states.FAST_TRAVEL_ANIMATION or
quest_status.flow_state == quest_status.flow_states.WYVERN_RIDING_START_ANIMATION then
quest_status.previous_flow_state = quest_status.flow_state;
quest_status.flow_state = quest_status.flow_states.QUEST_END_ANIMATION;
end
end
function quest_status.on_village_fast_travel(area)
if area == nil then
return;
end
quest_status.previous_flow_state = quest_status.flow_state;
if area == 7 then
quest_status.flow_state = quest_status.flow_states.IN_TRAINING_AREA;
else
quest_status.flow_state = quest_status.flow_states.IN_LOBBY;
end
end
function quest_status.on_changed_game_status(new_quest_status)
if (quest_status.index < 2 and new_quest_status == 2)
or new_quest_status < 2 then
quest_status.index = new_quest_status;
if quest_status.index < 3 then
player.init();
small_monster.init_list();
large_monster.init_list();
@@ -47,11 +248,15 @@ function quest_status.on_changed_game_status(new_quest_status)
damage_meter_UI.last_displayed_players = {};
end
quest_status.index = new_quest_status;
end
function quest_status.on_set_quest_clear()
quest_status.is_quest_clear = true;
if quest_status.index == 0 then
quest_status.flow_state = quest_status.flow_states.NONE;
elseif quest_status.index == 1 then
quest_status.flow_state = quest_status.flow_states.IN_LOBBY;
elseif quest_status.index == 2 then
quest_status.flow_state = quest_status.flow_states.LOADING_QUEST;
elseif quest_status.index == 3 then
quest_status.flow_state = quest_status.flow_states.SUMMARY_SCREEN;
end
end
function quest_status.init()
@@ -59,16 +264,26 @@ function quest_status.init()
return;
end
local new_quest_status = get_status_method:call(singletons.quest_manager);
local new_quest_status = get_status_method:call(singletons.game_manager);
if new_quest_status == nil then
customization_menu.status = "No quest status";
return;
end
quest_status.index = new_quest_status;
if quest_status.index == 0 then
quest_status.flow_state = quest_status.flow_states.NONE;
elseif quest_status.index == 1 then
quest_status.flow_state = quest_status.flow_states.IN_LOBBY;
elseif quest_status.index == 2 then
quest_status.flow_state = quest_status.flow_states.PLAYING_QUEST;
elseif quest_status.index == 3 then
quest_status.flow_state = quest_status.flow_states.SUMMARY_SCREEN;
end
quest_status.update_is_online();
quest_status.update_is_training_area();
quest_status.update_is_result_screen();
end
function quest_status.update_is_online()
@@ -88,17 +303,17 @@ function quest_status.update_is_online()
quest_status.is_online = is_quest_online;
end
function quest_status.update_is_host()
function quest_status.update_is_quest_host()
if singletons.lobby_manager == nil then
return;
end
local is_host = is_quest_host_method:call(singletons.lobby_manager, true);
if is_host == nil then
local is_quest_host = is_quest_host_method:call(singletons.lobby_manager, true);
if is_quest_host == nil then
return;
end
quest_status.is_host = is_host;
quest_status.is_quest_host = is_quest_host;
end
function quest_status.update_is_training_area()
@@ -112,25 +327,9 @@ function quest_status.update_is_training_area()
return;
end
if quest_status.is_training_area == true and _is_training_area == false then
player.init();
if _is_training_area then
quest_status.flow_state = quest_status.flow_states.IN_TRAINING_AREA;
end
quest_status.is_training_area = _is_training_area;
end
function quest_status.update_is_result_screen()
if singletons.quest_manager == nil then
customization_menu.status = "No quest manager";
return;
end
local is_result_demo_play_start = is_result_demo_play_start_method:call(singletons.quest_manager);
if is_result_demo_play_start == nil then
return;
end
quest_status.is_result_screen = is_result_demo_play_start;
end
function quest_status.init_module()
@@ -145,7 +344,7 @@ function quest_status.init_module()
quest_status.init();
sdk.hook(on_changed_game_status, function(args)
sdk.hook(on_changed_game_status_method, function(args)
quest_status.on_changed_game_status(sdk.to_int64(args[3]));
end, function(retval) return retval; end);
@@ -160,6 +359,46 @@ function quest_status.init_module()
sdk.hook(set_quest_clear_sub_hyakurui_method, function(args)
quest_status.on_set_quest_clear();
end, function(retval) return retval; end);
sdk.hook(demo_request_activation_method, function(args)
quest_status.on_demo_request_activation(sdk.to_managed_object(args[3]));
end, function(retval) return retval; end);
sdk.hook(demo_end_method, function(args)
quest_status.on_demo_end();
end, function(retval) return retval; end);
sdk.hook(set_quest_clear_method, function(args)
quest_status.on_set_quest_clear();
end, function(retval) return retval; end);
sdk.hook(quest_end_set_state_method, function(args)
quest_status.on_quest_end_set_state();
end, function(retval) return retval; end);
sdk.hook(gui_result_reward_do_open_method, function(args)
quest_status.on_gui_result_reward_do_open();
end, function(retval) return retval; end);
sdk.hook(gui_result_pay_off_do_open_method, function(args)
quest_status.on_gui_result_pay_off_do_open();
end, function(retval) return retval; end);
sdk.hook(play_event_common_method, function(args)
quest_status.on_play_event_common();
end, function(retval) return retval; end);
sdk.hook(event_manager_dispose_method, function(args)
quest_status.on_event_manager_dispose();
end, function(retval) return retval; end);
sdk.hook(set_quest_fail_method, function(args)
quest_status.on_set_quest_fail();
end, function(retval) return retval; end);
sdk.hook(fast_travel_method, function(args)
quest_status.on_village_fast_travel(sdk.to_int64(args[3]));
end, function(retval) return retval; end);
end
return quest_status;

View File

@@ -10,6 +10,7 @@ singletons.village_area_manager = nil;
singletons.gui_manager = nil;
singletons.game_keyboard = nil;
singletons.scene_manager = nil;
singletons.game_manager = nil;
function singletons.init()
singletons.init_message_manager();
@@ -22,6 +23,7 @@ function singletons.init()
singletons.init_gui_manager();
singletons.init_game_keyboard();
singletons.init_scene_manager();
singletons.init_game_manager();
end
function singletons.init_message_manager()
@@ -156,6 +158,19 @@ function singletons.init_scene_manager()
return singletons.scene_manager;
end
function singletons.init_game_manager()
if singletons.game_manager ~= nil then
return;
end
singletons.game_manager = sdk.get_managed_singleton("snow.SnowGameManager");
if singletons.game_manager == nil then
--log.error("[MHR Overlay] No enemy manager");
end
return singletons.game_manager;
end
function singletons.init_module()
singletons.init();
end