Advertisement
Guest User

Untitled

a guest
Feb 6th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.03 KB | None | 0 0
  1. -- GLOBAL DATA
  2.  
  3. local Net = _G.LuaNetworking
  4. _G.AchievementHunter = _G.AchievementHunter or {}
  5. AchievementHunter._list_data = ModPath .. "list.dat"
  6. AchievementHunter._data_path = ModPath .. "config.dat"
  7. AchievementHunter._data = {}
  8.  
  9. -- CONSTANTS -- DONT TOUCH!
  10.  
  11. local main_mod_name = "menu_achihunter_id"
  12. local main_mod_title = "menu_achihunter_title"
  13. local main_mod_desc = "menu_achihunter_desc"
  14. local main_mod_clbk = "menu_achihunter_callback"
  15.  
  16. local submenu_filter_name = "submenu_achihunter_filter_id"
  17. local submenu_filter_title = "submenu_achihunter_filter_title"
  18. local submenu_filter_desc = "submenu_achihunter_filter_desc"
  19.  
  20. local submenu_awarded_name = "submenu_achihunter_awarded_id"
  21. local submenu_awarded_title = "submenu_achihunter_awarded_title"
  22. local submenu_awarded_desc = "submenu_achihunter_awarded_desc"
  23.  
  24. local submenu_list_name = "submenu_achihunter_list_id"
  25. local submenu_list_title = "submenu_achihunter_list_title"
  26. local submenu_list_desc = "submenu_achihunter_list_desc"
  27.  
  28. local submenu_reset_name = "submenu_achihunter_reset_id"
  29. local submenu_reset_title = "submenu_achihunter_reset_title"
  30. local submenu_reset_desc = "submenu_achihunter_reset_desc"
  31.  
  32. local subitem_name = "subitem_%s_achihunter_id"
  33.  
  34. local menu_generic_clbk = "menu_achihunter_generic_callback"
  35. local submenu_generic_clbk = "submenu_achihunter_generic_callback"
  36.  
  37. local text_main_mod_title = "Change tipper settings"
  38. local text_main_mod_desc = "This mod allows you to change lobby tip."
  39.  
  40. local text_submenu_filter_title = "Tip filter"
  41. local text_submenu_filter_desc = "Categorize or filter tips by certain criteria."
  42.  
  43. --local text_submenu_awarded_title = "Skip awarded achievements"
  44. --local text_submenu_awarded_desc = "Does not list any achievements you already have."
  45.  
  46. local text_submenu_list_title = "Select tip"
  47. local text_submenu_list_desc = "Select tip from list (filtered by default)."
  48.  
  49. local text_submenu_reset_title = "Reset"
  50. local text_submenu_reset_desc = "Reset tip."
  51.  
  52. local text_subcat_loot_title = subitem_name:format( "loot" )
  53. local text_subcat_masks_title = subitem_name:format( "masks" )
  54. local text_subcat_stealth_title = subitem_name:format( "stealth" )
  55. local text_subcat_filtered_title = subitem_name:format( "filtered" )
  56. local text_subcat_speedrun_title = subitem_name:format( "speedrun" )
  57. local text_subcat_disabled_title = subitem_name:format( "disabled" )
  58. local text_subcat_special_title = subitem_name:format( "special" )
  59. local text_subcat_escape_title = subitem_name:format( "escape" )
  60. local text_subcat_prize_title = subitem_name:format( "prize" )
  61.  
  62. local text_notify_new_peer = "Hello!"
  63. --local text_notify_status_change = "Lobby objective was changed by host."
  64. --local text_notify_objective = "We're trying to get \"%s\" achievement."
  65. local text_notify_objective = "\%s\."
  66.  
  67. -- COMMON FUNCTIONS
  68.  
  69. function trim( line )
  70. return line:gsub( "^%s*(.-)%s*$", "%1" )
  71. end
  72.  
  73. function split( s, delimiter )
  74. result = {}
  75. for m in ( s .. delimiter ):gmatch( "(.-)" .. delimiter ) do
  76. table.insert( result, m )
  77. end
  78. return result
  79. end
  80.  
  81. function to_number( expr )
  82. expr = tostring( expr )
  83. if expr:find( "^%d+$" ) then
  84. return tonumber( expr )
  85. end
  86. return expr
  87. end
  88.  
  89. -- FILE I/O
  90.  
  91. function AchievementHunter:Save()
  92. local f = io.open( self._data_path, "w+" )
  93. if f ~= nil then
  94. f:write( Net:TableToString( self._data ) )
  95. f:close()
  96. end
  97. end
  98.  
  99. function AchievementHunter:Load()
  100. local f = io.open( self._data_path, "r" )
  101. if f ~= nil then
  102. self._data = Net:StringToTable( f:read( "*all" ) )
  103. for k, v in pairs( self._data ) do
  104. self._data[k] = to_number( v )
  105. end
  106. f:close()
  107. end
  108. end
  109.  
  110. -- MOD FUNCTIONS
  111.  
  112. function AchievementHunter:GetFilterKeys( index )
  113. local list, filters = {}, {
  114. { text_subcat_filtered_title, ".+" }, -- All filtered achievements
  115. { text_subcat_loot_title, "loot" }, -- Loot related achievements (secure X amount of loot or specific loot)
  116. { text_subcat_masks_title, "masks" }, -- Mask related achievements (each of your crew members wearing X mask)
  117. { text_subcat_stealth_title, "stealth" }, -- Complete a mission without raising an alarm
  118. { text_subcat_speedrun_title, "speedrun" }, -- Do something within XX:XX amount of time
  119. { text_subcat_special_title, "special" }, -- Wear masks, certain weapons, no skills etc.
  120. { text_subcat_escape_title, "escape" }, -- Escape related achievements
  121. { text_subcat_prize_title, "prize" }, -- Achievements that reward you with "Safe and Drill" (or used to)
  122. { text_subcat_disabled_title, ".*" } -- All achievements (no filtering)
  123. }
  124.  
  125. index = index or 1
  126. for i in ipairs( filters ) do
  127. list[i] = filters[i][index]
  128. end
  129.  
  130. return list
  131. end
  132.  
  133. function GetFilter( expr )
  134. expr = expr or ""
  135. local self = AchievementHunter
  136. local filter = self._data.filter or 1
  137. local keys = self:GetFilterKeys( 2 )
  138.  
  139. if expr:find( keys[filter] ) then
  140. return true
  141. end
  142. return false
  143. end
  144.  
  145. function AchievementHunter:GetAchievements( index, key_match, filter )
  146. local list = {}
  147. key_match = key_match or nil
  148. filter = filter or function( v ) return true end
  149. index = index or 1
  150.  
  151. for _, v in ipairs( self:FileAchievementsList() ) do
  152. if key_match then
  153. if filter( v[3] ) and key_match == v[1] then
  154. return v[index]
  155. end
  156. end
  157.  
  158. if filter( v[3] ) then
  159. if type( index ) == "table" then
  160. list[v[index[1]]] = v[index[2]]
  161. else
  162. list[#list+1] = v[index]
  163. end
  164. end
  165. end
  166.  
  167. if key_match then
  168. list = false
  169. end
  170. return list
  171. end
  172.  
  173. function AchievementHunter:FileAchievementsList()
  174. local list = {}
  175. local f = io.open( self._list_data, "r" )
  176. if f ~= nil then
  177. while true do
  178. local line = f:read()
  179. if line == nil then break end
  180.  
  181. list[#list+1] = split( trim( line ), "|" )
  182. end
  183. f:close()
  184. end
  185. return list
  186. end
  187.  
  188. function AchievementHunter:Send( id, message )
  189. if managers.network and managers.network:session() then
  190. if not id or id == 0 then
  191. id = Net:LocalPeerID()
  192. for _, peer in ipairs( Net:GetPeers() ) do
  193. self:Send( peer:id(), message )
  194. end
  195. end
  196.  
  197. local peer = managers.network:session():peer( id )
  198. if peer then
  199. if id == Net:LocalPeerID() then
  200. managers.chat:receive_message_by_peer( ChatManager.GAME, peer, message )
  201. else
  202. peer:send( "send_chat_message", ChatManager.GAME, message )
  203. end
  204. end
  205. end
  206. end
  207.  
  208. -- MODIFIED VERSION OF MenuHelper:AddToggle(...)
  209.  
  210. function AchievementHunter:AddToggle( menu, index, title )
  211. menu = menu or MenuHelper:GetMenu( menu )
  212. index = index or #menu._items
  213. local item = menu:create_item(
  214. {
  215. type = "CoreMenuItemToggle.ItemToggle",
  216. {
  217. _meta = "option",
  218. icon = "guis/textures/menu_tickbox",
  219. value = "on",
  220. x = 24,
  221. y = 0,
  222. w = 24,
  223. h = 24,
  224. s_icon = "guis/textures/menu_tickbox",
  225. s_x = 24,
  226. s_y = 24,
  227. s_w = 24,
  228. s_h = 24
  229. },
  230. {
  231. _meta = "option",
  232. icon = "guis/textures/menu_tickbox",
  233. value = "off",
  234. x = 0,
  235. y = 0,
  236. w = 24,
  237. h = 24,
  238. s_icon = "guis/textures/menu_tickbox",
  239. s_x = 0,
  240. s_y = 24,
  241. s_w = 24,
  242. s_h = 24
  243. }
  244. },
  245. {
  246. help_id = nil,
  247. text_id = title,
  248. callback = submenu_generic_clbk,
  249. name = subitem_name:format( index ),
  250. disabled_color = Color( 0.25, 1, 1, 1 ),
  251. icon_by_text = false
  252. }
  253. )
  254.  
  255. item.selected = 2
  256. item._priority = ( 1000 - index )
  257. menu:add_item( item )
  258. end
  259.  
  260. -- HOOKS
  261.  
  262. Hooks:Add( "NetworkManagerOnPeerAdded", "NetworkManagerOnPeerAdded_AchiHunter", function( peer, peer_id )
  263. if Network:is_server() then
  264. DelayedCalls:Add( "DelayedCallNotifyPeer" .. peer_id, 1, function()
  265. local value = AchievementHunter._data.selected
  266. if type( value ) == "string" then
  267. AchievementHunter:Send( peer_id, text_notify_new_peer )
  268. local name = AchievementHunter:GetAchievements( 2, value )
  269. AchievementHunter:Send( peer_id, text_notify_objective:format( name ) )
  270. end
  271. end)
  272. end
  273. end)
  274.  
  275. Hooks:Add( "LocalizationManagerPostInit", "LocalizationManagerPostInit_AchiHunter", function( loc )
  276. local list = AchievementHunter:GetAchievements( { 1, 2 } )
  277.  
  278. list[main_mod_title] = text_main_mod_title
  279. list[main_mod_desc] = text_main_mod_desc
  280.  
  281. list[submenu_filter_title] = text_submenu_filter_title
  282. list[submenu_filter_desc] = text_submenu_filter_desc
  283.  
  284. --list[submenu_awarded_title] = text_submenu_awarded_title
  285. --list[submenu_awarded_desc] = text_submenu_awarded_desc
  286.  
  287. list[submenu_list_title] = text_submenu_list_title
  288. list[submenu_list_desc] = text_submenu_list_desc
  289.  
  290. list[submenu_reset_title] = text_submenu_reset_title
  291. list[submenu_reset_desc] = text_submenu_reset_desc
  292.  
  293. list[text_subcat_loot_title] = "Loot only"
  294. list[text_subcat_masks_title] = "Mask only"
  295. list[text_subcat_filtered_title] = "Filtered only"
  296. list[text_subcat_stealth_title] = "Stealth only"
  297. list[text_subcat_speedrun_title] = "Speedrun only"
  298. list[text_subcat_disabled_title] = "Filtering disabled"
  299. list[text_subcat_special_title] = "Special only"
  300. list[text_subcat_escape_title] = "Escape only"
  301. list[text_subcat_prize_title] = "Prize only"
  302.  
  303. loc:add_localized_strings( list )
  304. end)
  305.  
  306. Hooks:Add( "MenuManagerInitialize", "MenuManagerInitialize_AchiHunter", function( menu_manager )
  307. local temp_list_value = AchievementHunter._data.selected
  308. MenuCallbackHandler[menu_generic_clbk] = function( self, item )
  309. local data = MenuHelper:GetMenu( submenu_list_name )
  310. if data then
  311. temp_list_value = nil
  312. if item:parameters().name == submenu_filter_name then
  313. data:clean_items()
  314. AchievementHunter._data.filter = item:value()
  315. for i, v in ipairs( AchievementHunter:GetAchievements( 1, nil, GetFilter ) ) do
  316. --//LIST ONLY IF AWARDED (SETTING)
  317. if not AchievementHunter._data.skip_awarded or not managers.achievment.handler:has_achievement( v ) then
  318. AchievementHunter:AddToggle( data, i, v )
  319. end
  320. end
  321. MenuManager:add_back_button( data )
  322. elseif item:parameters().name == submenu_awarded_name then
  323. AchievementHunter._data.skip_awarded = nil
  324. if Utils:ToggleItemToBoolean( item ) then
  325. AchievementHunter._data.skip_awarded = nil
  326. end
  327. data = MenuHelper:GetMenu( main_mod_name )
  328. if data and data.item then
  329. data:item( submenu_filter_name ):trigger()
  330. end
  331. else
  332. for k in ipairs( data._items ) do
  333. data._items[k].selected = 2
  334. data._items[k]:set_enabled( true )
  335. end
  336. end
  337. end
  338. end
  339. MenuCallbackHandler[submenu_generic_clbk] = function( self, item )
  340. local value = Utils:ToggleItemToBoolean( item )
  341. local data = MenuHelper:GetMenu( submenu_list_name )
  342. if data then
  343. temp_list_value = nil
  344. for k, v in ipairs( data._items ) do
  345. data._items[k]:set_enabled( not value )
  346. if value and item:parameters().name == v:parameters().name then
  347. temp_list_value = v:parameters().text_id
  348. data._items[k]:set_enabled( true )
  349. end
  350. end
  351. end
  352. end
  353. MenuCallbackHandler[main_mod_clbk] = function( self, item )
  354. --if AchievementHunter._data.selected ~= temp_list_value then
  355. --AchievementHunter:Send( 0, text_notify_status_change )
  356.  
  357. if temp_list_value ~= nil then
  358. local achievement_name = AchievementHunter:GetAchievements( 2, temp_list_value )
  359. AchievementHunter:Send( 0, text_notify_objective:format( achievement_name ) )
  360. end
  361. --end
  362. AchievementHunter._data.selected = temp_list_value
  363. AchievementHunter:Save()
  364. end
  365. AchievementHunter:Load()
  366. end)
  367.  
  368. AchievementHunter:Load()
  369.  
  370. Hooks:Add( "MenuManagerSetupCustomMenus", "MenuManagerSetupCustomMenus_AchiHunter", function( menu_manager, nodes )
  371. MenuHelper:NewMenu( main_mod_name )
  372. MenuHelper:NewMenu( submenu_list_name )
  373. end)
  374.  
  375. Hooks:Add( "MenuManagerPopulateCustomMenus", "MenuManagerPopulateCustomMenus_AchiHunter", function( menu_manager, nodes )
  376. for i, v in ipairs( AchievementHunter:GetAchievements( 1, nil, GetFilter ) ) do
  377. --Skip awarded setting
  378. if not AchievementHunter._data.skip_awarded or not managers.achievment.handler:has_achievement( v ) then
  379. MenuHelper:AddToggle(
  380. {
  381. title = v,
  382. priority = ( 1000 - i ),
  383. menu_id = submenu_list_name,
  384. id = subitem_name:format( i ),
  385. callback = submenu_generic_clbk,
  386. value = ( v == AchievementHunter._data.selected )
  387. }
  388. )
  389. end
  390. end
  391.  
  392. MenuHelper:AddMultipleChoice(
  393. {
  394. priority = 4,
  395. id = submenu_filter_name,
  396. title = submenu_filter_title,
  397. desc = submenu_filter_desc,
  398. callback = menu_generic_clbk,
  399. items = AchievementHunter:GetFilterKeys(),
  400. value = AchievementHunter._data.filter or 1,
  401. menu_id = main_mod_name
  402. }
  403. )
  404.  
  405. -- MenuHelper:AddToggle(
  406. -- {
  407. -- priority = 3,
  408. -- id = submenu_awarded_name,
  409. -- title = submenu_awarded_title,
  410. -- desc = submenu_awarded_desc,
  411. -- callback = menu_generic_clbk,
  412. -- value = AchievementHunter._data.skip_awarded or false,
  413. -- menu_id = main_mod_name
  414. -- }
  415. -- )
  416.  
  417. MenuHelper:AddDivider(
  418. {
  419. size = 8,
  420. priority = 2,
  421. id = subitem_name:format( "divider" ),
  422. menu_id = main_mod_name,
  423. }
  424. )
  425.  
  426. MenuHelper:AddButton(
  427. {
  428. priority = 1,
  429. id = submenu_reset_name,
  430. title = submenu_reset_title,
  431. desc = submenu_reset_desc,
  432. callback = menu_generic_clbk,
  433. menu_id = main_mod_name
  434. }
  435. )
  436. end)
  437.  
  438. Hooks:Add( "MenuManagerBuildCustomMenus", "MenuManagerBuildCustomMenus_AchiHunter", function( menu_manager, nodes )
  439. nodes[main_mod_name] = MenuHelper:BuildMenu( main_mod_name, { back_callback = main_mod_clbk } )
  440. MenuHelper:AddMenuItem( nodes.edit_game_settings, main_mod_name, main_mod_title, main_mod_desc, 1 )
  441.  
  442. nodes[submenu_list_name] = MenuHelper:BuildMenu( submenu_list_name )
  443. MenuHelper:AddMenuItem( nodes[main_mod_name], submenu_list_name, submenu_list_title, submenu_list_desc, 3 )
  444. --nodes[main_mod_name]:parameters().align_line_proportions = 0.6
  445.  
  446. if type( AchievementHunter._data.selected ) == "number" then
  447. if AchievementHunter._data.selected > #nodes[submenu_list_name]._items then
  448. AchievementHunter._data.selected = nil
  449. end
  450. end
  451.  
  452. if AchievementHunter._data.selected then
  453. for k, v in ipairs( nodes[submenu_list_name]._items ) do
  454. nodes[submenu_list_name]._items[k]:set_enabled( v.selected == 1 )
  455. end
  456. end
  457. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement