Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- GLOBAL DATA
- local Net = _G.LuaNetworking
- _G.AchievementHunter = _G.AchievementHunter or {}
- AchievementHunter._list_data = ModPath .. "list.dat"
- AchievementHunter._data_path = ModPath .. "config.dat"
- AchievementHunter._data = {}
- -- CONSTANTS -- DONT TOUCH!
- local main_mod_name = "menu_achihunter_id"
- local main_mod_title = "menu_achihunter_title"
- local main_mod_desc = "menu_achihunter_desc"
- local main_mod_clbk = "menu_achihunter_callback"
- local submenu_filter_name = "submenu_achihunter_filter_id"
- local submenu_filter_title = "submenu_achihunter_filter_title"
- local submenu_filter_desc = "submenu_achihunter_filter_desc"
- local submenu_awarded_name = "submenu_achihunter_awarded_id"
- local submenu_awarded_title = "submenu_achihunter_awarded_title"
- local submenu_awarded_desc = "submenu_achihunter_awarded_desc"
- local submenu_list_name = "submenu_achihunter_list_id"
- local submenu_list_title = "submenu_achihunter_list_title"
- local submenu_list_desc = "submenu_achihunter_list_desc"
- local submenu_reset_name = "submenu_achihunter_reset_id"
- local submenu_reset_title = "submenu_achihunter_reset_title"
- local submenu_reset_desc = "submenu_achihunter_reset_desc"
- local subitem_name = "subitem_%s_achihunter_id"
- local menu_generic_clbk = "menu_achihunter_generic_callback"
- local submenu_generic_clbk = "submenu_achihunter_generic_callback"
- local text_main_mod_title = "Change tipper settings"
- local text_main_mod_desc = "This mod allows you to change lobby tip."
- local text_submenu_filter_title = "Tip filter"
- local text_submenu_filter_desc = "Categorize or filter tips by certain criteria."
- --local text_submenu_awarded_title = "Skip awarded achievements"
- --local text_submenu_awarded_desc = "Does not list any achievements you already have."
- local text_submenu_list_title = "Select tip"
- local text_submenu_list_desc = "Select tip from list (filtered by default)."
- local text_submenu_reset_title = "Reset"
- local text_submenu_reset_desc = "Reset tip."
- local text_subcat_loot_title = subitem_name:format( "loot" )
- local text_subcat_masks_title = subitem_name:format( "masks" )
- local text_subcat_stealth_title = subitem_name:format( "stealth" )
- local text_subcat_filtered_title = subitem_name:format( "filtered" )
- local text_subcat_speedrun_title = subitem_name:format( "speedrun" )
- local text_subcat_disabled_title = subitem_name:format( "disabled" )
- local text_subcat_special_title = subitem_name:format( "special" )
- local text_subcat_escape_title = subitem_name:format( "escape" )
- local text_subcat_prize_title = subitem_name:format( "prize" )
- local text_notify_new_peer = "Hello!"
- --local text_notify_status_change = "Lobby objective was changed by host."
- --local text_notify_objective = "We're trying to get \"%s\" achievement."
- local text_notify_objective = "\%s\."
- -- COMMON FUNCTIONS
- function trim( line )
- return line:gsub( "^%s*(.-)%s*$", "%1" )
- end
- function split( s, delimiter )
- result = {}
- for m in ( s .. delimiter ):gmatch( "(.-)" .. delimiter ) do
- table.insert( result, m )
- end
- return result
- end
- function to_number( expr )
- expr = tostring( expr )
- if expr:find( "^%d+$" ) then
- return tonumber( expr )
- end
- return expr
- end
- -- FILE I/O
- function AchievementHunter:Save()
- local f = io.open( self._data_path, "w+" )
- if f ~= nil then
- f:write( Net:TableToString( self._data ) )
- f:close()
- end
- end
- function AchievementHunter:Load()
- local f = io.open( self._data_path, "r" )
- if f ~= nil then
- self._data = Net:StringToTable( f:read( "*all" ) )
- for k, v in pairs( self._data ) do
- self._data[k] = to_number( v )
- end
- f:close()
- end
- end
- -- MOD FUNCTIONS
- function AchievementHunter:GetFilterKeys( index )
- local list, filters = {}, {
- { text_subcat_filtered_title, ".+" }, -- All filtered achievements
- { text_subcat_loot_title, "loot" }, -- Loot related achievements (secure X amount of loot or specific loot)
- { text_subcat_masks_title, "masks" }, -- Mask related achievements (each of your crew members wearing X mask)
- { text_subcat_stealth_title, "stealth" }, -- Complete a mission without raising an alarm
- { text_subcat_speedrun_title, "speedrun" }, -- Do something within XX:XX amount of time
- { text_subcat_special_title, "special" }, -- Wear masks, certain weapons, no skills etc.
- { text_subcat_escape_title, "escape" }, -- Escape related achievements
- { text_subcat_prize_title, "prize" }, -- Achievements that reward you with "Safe and Drill" (or used to)
- { text_subcat_disabled_title, ".*" } -- All achievements (no filtering)
- }
- index = index or 1
- for i in ipairs( filters ) do
- list[i] = filters[i][index]
- end
- return list
- end
- function GetFilter( expr )
- expr = expr or ""
- local self = AchievementHunter
- local filter = self._data.filter or 1
- local keys = self:GetFilterKeys( 2 )
- if expr:find( keys[filter] ) then
- return true
- end
- return false
- end
- function AchievementHunter:GetAchievements( index, key_match, filter )
- local list = {}
- key_match = key_match or nil
- filter = filter or function( v ) return true end
- index = index or 1
- for _, v in ipairs( self:FileAchievementsList() ) do
- if key_match then
- if filter( v[3] ) and key_match == v[1] then
- return v[index]
- end
- end
- if filter( v[3] ) then
- if type( index ) == "table" then
- list[v[index[1]]] = v[index[2]]
- else
- list[#list+1] = v[index]
- end
- end
- end
- if key_match then
- list = false
- end
- return list
- end
- function AchievementHunter:FileAchievementsList()
- local list = {}
- local f = io.open( self._list_data, "r" )
- if f ~= nil then
- while true do
- local line = f:read()
- if line == nil then break end
- list[#list+1] = split( trim( line ), "|" )
- end
- f:close()
- end
- return list
- end
- function AchievementHunter:Send( id, message )
- if managers.network and managers.network:session() then
- if not id or id == 0 then
- id = Net:LocalPeerID()
- for _, peer in ipairs( Net:GetPeers() ) do
- self:Send( peer:id(), message )
- end
- end
- local peer = managers.network:session():peer( id )
- if peer then
- if id == Net:LocalPeerID() then
- managers.chat:receive_message_by_peer( ChatManager.GAME, peer, message )
- else
- peer:send( "send_chat_message", ChatManager.GAME, message )
- end
- end
- end
- end
- -- MODIFIED VERSION OF MenuHelper:AddToggle(...)
- function AchievementHunter:AddToggle( menu, index, title )
- menu = menu or MenuHelper:GetMenu( menu )
- index = index or #menu._items
- local item = menu:create_item(
- {
- type = "CoreMenuItemToggle.ItemToggle",
- {
- _meta = "option",
- icon = "guis/textures/menu_tickbox",
- value = "on",
- x = 24,
- y = 0,
- w = 24,
- h = 24,
- s_icon = "guis/textures/menu_tickbox",
- s_x = 24,
- s_y = 24,
- s_w = 24,
- s_h = 24
- },
- {
- _meta = "option",
- icon = "guis/textures/menu_tickbox",
- value = "off",
- x = 0,
- y = 0,
- w = 24,
- h = 24,
- s_icon = "guis/textures/menu_tickbox",
- s_x = 0,
- s_y = 24,
- s_w = 24,
- s_h = 24
- }
- },
- {
- help_id = nil,
- text_id = title,
- callback = submenu_generic_clbk,
- name = subitem_name:format( index ),
- disabled_color = Color( 0.25, 1, 1, 1 ),
- icon_by_text = false
- }
- )
- item.selected = 2
- item._priority = ( 1000 - index )
- menu:add_item( item )
- end
- -- HOOKS
- Hooks:Add( "NetworkManagerOnPeerAdded", "NetworkManagerOnPeerAdded_AchiHunter", function( peer, peer_id )
- if Network:is_server() then
- DelayedCalls:Add( "DelayedCallNotifyPeer" .. peer_id, 1, function()
- local value = AchievementHunter._data.selected
- if type( value ) == "string" then
- AchievementHunter:Send( peer_id, text_notify_new_peer )
- local name = AchievementHunter:GetAchievements( 2, value )
- AchievementHunter:Send( peer_id, text_notify_objective:format( name ) )
- end
- end)
- end
- end)
- Hooks:Add( "LocalizationManagerPostInit", "LocalizationManagerPostInit_AchiHunter", function( loc )
- local list = AchievementHunter:GetAchievements( { 1, 2 } )
- list[main_mod_title] = text_main_mod_title
- list[main_mod_desc] = text_main_mod_desc
- list[submenu_filter_title] = text_submenu_filter_title
- list[submenu_filter_desc] = text_submenu_filter_desc
- --list[submenu_awarded_title] = text_submenu_awarded_title
- --list[submenu_awarded_desc] = text_submenu_awarded_desc
- list[submenu_list_title] = text_submenu_list_title
- list[submenu_list_desc] = text_submenu_list_desc
- list[submenu_reset_title] = text_submenu_reset_title
- list[submenu_reset_desc] = text_submenu_reset_desc
- list[text_subcat_loot_title] = "Loot only"
- list[text_subcat_masks_title] = "Mask only"
- list[text_subcat_filtered_title] = "Filtered only"
- list[text_subcat_stealth_title] = "Stealth only"
- list[text_subcat_speedrun_title] = "Speedrun only"
- list[text_subcat_disabled_title] = "Filtering disabled"
- list[text_subcat_special_title] = "Special only"
- list[text_subcat_escape_title] = "Escape only"
- list[text_subcat_prize_title] = "Prize only"
- loc:add_localized_strings( list )
- end)
- Hooks:Add( "MenuManagerInitialize", "MenuManagerInitialize_AchiHunter", function( menu_manager )
- local temp_list_value = AchievementHunter._data.selected
- MenuCallbackHandler[menu_generic_clbk] = function( self, item )
- local data = MenuHelper:GetMenu( submenu_list_name )
- if data then
- temp_list_value = nil
- if item:parameters().name == submenu_filter_name then
- data:clean_items()
- AchievementHunter._data.filter = item:value()
- for i, v in ipairs( AchievementHunter:GetAchievements( 1, nil, GetFilter ) ) do
- --//LIST ONLY IF AWARDED (SETTING)
- if not AchievementHunter._data.skip_awarded or not managers.achievment.handler:has_achievement( v ) then
- AchievementHunter:AddToggle( data, i, v )
- end
- end
- MenuManager:add_back_button( data )
- elseif item:parameters().name == submenu_awarded_name then
- AchievementHunter._data.skip_awarded = nil
- if Utils:ToggleItemToBoolean( item ) then
- AchievementHunter._data.skip_awarded = nil
- end
- data = MenuHelper:GetMenu( main_mod_name )
- if data and data.item then
- data:item( submenu_filter_name ):trigger()
- end
- else
- for k in ipairs( data._items ) do
- data._items[k].selected = 2
- data._items[k]:set_enabled( true )
- end
- end
- end
- end
- MenuCallbackHandler[submenu_generic_clbk] = function( self, item )
- local value = Utils:ToggleItemToBoolean( item )
- local data = MenuHelper:GetMenu( submenu_list_name )
- if data then
- temp_list_value = nil
- for k, v in ipairs( data._items ) do
- data._items[k]:set_enabled( not value )
- if value and item:parameters().name == v:parameters().name then
- temp_list_value = v:parameters().text_id
- data._items[k]:set_enabled( true )
- end
- end
- end
- end
- MenuCallbackHandler[main_mod_clbk] = function( self, item )
- --if AchievementHunter._data.selected ~= temp_list_value then
- --AchievementHunter:Send( 0, text_notify_status_change )
- if temp_list_value ~= nil then
- local achievement_name = AchievementHunter:GetAchievements( 2, temp_list_value )
- AchievementHunter:Send( 0, text_notify_objective:format( achievement_name ) )
- end
- --end
- AchievementHunter._data.selected = temp_list_value
- AchievementHunter:Save()
- end
- AchievementHunter:Load()
- end)
- AchievementHunter:Load()
- Hooks:Add( "MenuManagerSetupCustomMenus", "MenuManagerSetupCustomMenus_AchiHunter", function( menu_manager, nodes )
- MenuHelper:NewMenu( main_mod_name )
- MenuHelper:NewMenu( submenu_list_name )
- end)
- Hooks:Add( "MenuManagerPopulateCustomMenus", "MenuManagerPopulateCustomMenus_AchiHunter", function( menu_manager, nodes )
- for i, v in ipairs( AchievementHunter:GetAchievements( 1, nil, GetFilter ) ) do
- --Skip awarded setting
- if not AchievementHunter._data.skip_awarded or not managers.achievment.handler:has_achievement( v ) then
- MenuHelper:AddToggle(
- {
- title = v,
- priority = ( 1000 - i ),
- menu_id = submenu_list_name,
- id = subitem_name:format( i ),
- callback = submenu_generic_clbk,
- value = ( v == AchievementHunter._data.selected )
- }
- )
- end
- end
- MenuHelper:AddMultipleChoice(
- {
- priority = 4,
- id = submenu_filter_name,
- title = submenu_filter_title,
- desc = submenu_filter_desc,
- callback = menu_generic_clbk,
- items = AchievementHunter:GetFilterKeys(),
- value = AchievementHunter._data.filter or 1,
- menu_id = main_mod_name
- }
- )
- -- MenuHelper:AddToggle(
- -- {
- -- priority = 3,
- -- id = submenu_awarded_name,
- -- title = submenu_awarded_title,
- -- desc = submenu_awarded_desc,
- -- callback = menu_generic_clbk,
- -- value = AchievementHunter._data.skip_awarded or false,
- -- menu_id = main_mod_name
- -- }
- -- )
- MenuHelper:AddDivider(
- {
- size = 8,
- priority = 2,
- id = subitem_name:format( "divider" ),
- menu_id = main_mod_name,
- }
- )
- MenuHelper:AddButton(
- {
- priority = 1,
- id = submenu_reset_name,
- title = submenu_reset_title,
- desc = submenu_reset_desc,
- callback = menu_generic_clbk,
- menu_id = main_mod_name
- }
- )
- end)
- Hooks:Add( "MenuManagerBuildCustomMenus", "MenuManagerBuildCustomMenus_AchiHunter", function( menu_manager, nodes )
- nodes[main_mod_name] = MenuHelper:BuildMenu( main_mod_name, { back_callback = main_mod_clbk } )
- MenuHelper:AddMenuItem( nodes.edit_game_settings, main_mod_name, main_mod_title, main_mod_desc, 1 )
- nodes[submenu_list_name] = MenuHelper:BuildMenu( submenu_list_name )
- MenuHelper:AddMenuItem( nodes[main_mod_name], submenu_list_name, submenu_list_title, submenu_list_desc, 3 )
- --nodes[main_mod_name]:parameters().align_line_proportions = 0.6
- if type( AchievementHunter._data.selected ) == "number" then
- if AchievementHunter._data.selected > #nodes[submenu_list_name]._items then
- AchievementHunter._data.selected = nil
- end
- end
- if AchievementHunter._data.selected then
- for k, v in ipairs( nodes[submenu_list_name]._items ) do
- nodes[submenu_list_name]._items[k]:set_enabled( v.selected == 1 )
- end
- end
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement