Advertisement
llVIU

RPG System 0.18.46 modification by Honktown

Oct 5th, 2020
291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 47.53 KB | None | 0 0
  1. require "mod-gui"
  2. require "util"
  3. local format_number = util.format_number
  4. --[[
  5. ** RPG SYSTEM **
  6. by MFerrari
  7. ]]
  8.  
  9. function Log(what)
  10. game.write_file("myrpg.log", serpent.block(what), true)
  11. end
  12.  
  13.  
  14. local colors = {
  15. white = {r = 1, g = 1, b = 1},
  16. black = {r = 0, g = 0, b = 0},
  17. darkgrey = {r = 0.25, g = 0.25, b = 0.25},
  18. grey = {r = 0.5, g = 0.5, b = 0.5},
  19. lightgrey = {r = 0.75, g = 0.75, b = 0.75},
  20.  
  21. red = {r = 1, g = 0, b = 0},
  22. darkred = {r = 0.5, g = 0, b = 0},
  23. lightred = {r = 1, g = 0.5, b = 0.5},
  24. green = {r = 0, g = 1, b = 0},
  25. darkgreen = {r = 0, g = 0.5, b = 0},
  26. lightgreen = {r = 0.5, g = 1, b = 0.5},
  27. blue = {r = 0, g = 0, b = 1},
  28. darkblue = {r = 0, g = 0, b = 0.5},
  29. lightblue = {r = 0.5, g = 0.5, b = 1},
  30.  
  31. orange = {r = 1, g = 0.55, b = 0.1},
  32. yellow = {r = 1, g = 1, b = 0},
  33. pink = {r = 1, g = 0, b = 1},
  34. purple = {r = 0.6, g = 0.1, b = 0.6},
  35. brown = {r = 0.6, g = 0.4, b = 0.1},
  36. }
  37.  
  38. local stats = {
  39. ["character_crafting_speed_modifier"] = {name = 'LV_Craft_Speed', mod = 100},
  40. ["character_mining_speed_modifier"] = {name = 'LV_Mining_Speed', mod = 100},
  41. ["character_running_speed_modifier"] = {name = 'LV_Run_Speed', mod = 100},
  42. ["character_build_distance_bonus"] = {name = 'LV_Reach_Dist', mod = 1},
  43. ["character_reach_distance_bonus"] = {name = 'LV_Reach_Dist', mod = 1},
  44. ["character_item_drop_distance_bonus"] = {name = 'LV_Reach_Dist', mod = 1},
  45. ["character_resource_reach_distance_bonus"] = {name = 'LV_Reach_Dist', mod = 1},
  46. ["character_inventory_slots_bonus"] = {name = 'LV_Inv_Bonus', mod = 1},
  47. ["character_health_bonus"] = {name = 'LV_Health_Bonus', mod = 1},
  48. ["character_loot_pickup_distance_bonus"] = {name = 'LV_Reach_Dist', mod = 1}
  49. }
  50.  
  51. local function apply_bonus_relatively(player, modifier, internal)
  52. if player.valid and player.character.valid then
  53. player.character[modifier] = player.character[modifier] + global.personalxp[internal.name][player.name] * global.RPG_Bonus[internal.name] / internal.mod
  54. end
  55. end
  56.  
  57. local function apply_one_bonus(player, modifier, internal)
  58. if player.valid and player.character.valid then
  59. player[modifier] = player[modifier] + 1 * global.RPG_Bonus[internal.name] / internal.mod
  60. end
  61. end
  62.  
  63.  
  64. -- CUSTOM EVENT HANDLING --
  65. --(remote interface is lower in the file, there I describe how to subscribe to my events)
  66. -- if your mod alters the character bonus settings, then you should get_on_player_updated_status to make required adjusts to your mod, if necessary
  67. local on_player_updated_status = script.generate_event_name() --uint
  68. local on_player_level_up = script.generate_event_name() --uint
  69.  
  70.  
  71.  
  72. function printXP(player,XP)
  73. if player and player.valid then
  74. if settings.get_player_settings(player)["charxpmod_print_xp_user"].value then
  75. player.surface.create_entity{name = "flying-text", position = player.position, text = "+" .. format_number(XP) ..' XP', color = colors.yellow}
  76. end
  77. end
  78. end
  79.  
  80.  
  81. function ResetXPTables()
  82. local xp = settings.startup["charxpmod_xpinilevel"].value
  83. global.xp_table = {[1] = xp}
  84. local mp = settings.startup["charxpmod_xpmult"].value
  85. local red = settings.startup["charxpmod_xp_mp_reductor"].value
  86.  
  87. local m
  88. for k=2,100 do
  89. m = mp - k*(red-red*k/100) -- (Multiplier - Level * (reductor-reductor*Level/100))
  90. xp = math.ceil(xp * m)
  91.  
  92. if (xp / global.xp_table[k-1]) < 1.02 then
  93. xp = global.xp_table[k-1] * 1.02
  94. end
  95.  
  96. global.xp_table[k] = xp
  97. end
  98. global.max_xp = xp
  99. end
  100.  
  101.  
  102. function SetForceValues(name)
  103. global.kills_spawner[name] = 0
  104. global.kills_units[name] = 0
  105. global.kills_worms[name] = 0
  106. global.XP[name] = 0
  107. global.XP_GANHO[name] = 0
  108. global.XP_TECH[name] = 0
  109. global.XP_LEVEL[name] = 1
  110. global.XP_LEVEL_MIN[name] = 0
  111. global.XP_KILL_HP[name] = 0
  112. global.XP_MAX_PLAYTIME[name] = 0
  113. global.XP_AVG_PLAYTIME[name] = 0
  114. end
  115.  
  116.  
  117.  
  118. function CheckAddPlayerStatus(name)
  119. if global.personalxp[name] == nil then
  120. global.personalxp[name] = {}
  121. for _, player in pairs(game.players) do
  122. global.personalxp[name][player.name] = 0
  123. end
  124. end
  125. end
  126.  
  127.  
  128. function VersionChange()
  129.  
  130. if global.personalxp.opt_Pick_Extender == nil then
  131. global.personalxp.opt_Pick_Extender = {}
  132. for _, player in pairs(game.players) do
  133. global.personalxp.opt_Pick_Extender[player.name] = false
  134. end
  135. end
  136.  
  137. if global.XP_MAX_PLAYTIME == nil then
  138. global.XP_MAX_PLAYTIME={}
  139. for name, force in pairs (game.forces) do
  140. if name~='neutral' and name~='enemy' then
  141. global.XP_MAX_PLAYTIME[name] = 0
  142. end
  143. end
  144. end
  145.  
  146. if global.XP_AVG_PLAYTIME == nil then
  147. global.XP_AVG_PLAYTIME={}
  148. for name, force in pairs (game.forces) do
  149. if name~='neutral' and name~='enemy' then
  150. global.XP_AVG_PLAYTIME[name] = 0
  151. end
  152. end
  153. end
  154.  
  155.  
  156. CheckAddPlayerStatus('rocketsXP_count')
  157. CheckAddPlayerStatus('LV_Damage_Bonus')
  158. CheckAddPlayerStatus('LV_Damage_Critical')
  159. CheckAddPlayerStatus('LV_Armor_Bonus')
  160. end
  161.  
  162.  
  163. function SetupPlayer(player,ResetXP)
  164. local name= player.name
  165.  
  166. if ResetXP then
  167. global.personalxp.XP[name] = 0
  168. global.personalxp.Death[name] = 0
  169. global.personal_kill_units[name] = 0
  170. global.personal_kill_spawner[name] = 0
  171. global.personal_kill_turrets[name] = 0
  172. end
  173.  
  174. global.personalxp.Level[name] = 1
  175.  
  176. for k=1,#global.Player_Attributes do
  177. --we should subtract any previous change with a function
  178. local attrib = global.Player_Attributes[k]
  179. global.personalxp[attrib][name]= 0
  180. end
  181.  
  182. global.personalxp.opt_Pick_Extender[name] = false
  183.  
  184. UpdatePlayerLvStats(player) --breaks changes with other mods
  185. end
  186.  
  187. function CheckPlayers()
  188. for _, player in pairs(game.players) do
  189. if not (global.personalxp.Level[player.name]) then
  190. SetupPlayer(player,true)
  191. end
  192.  
  193. if not global.personal_kill_units[player.name] then
  194. global.personal_kill_units[player.name] = 0
  195. global.personal_kill_spawner[player.name] = 0
  196. global.personal_kill_turrets[player.name] = 0
  197. end
  198.  
  199. InitPlayerGui(player)
  200. end
  201. end
  202.  
  203. function CheckPlayer(player)
  204. if not (global.personalxp.Level[player.name]) then
  205. SetupPlayer(player,true)
  206. end
  207. end
  208.  
  209.  
  210.  
  211.  
  212. function ReadRunTimeSettings(event)
  213. global.setting_print_critical = settings.global["charxpmod_print_critical"].value
  214. global.setting_afk_time = settings.global["charxpmod_afk"].value
  215. global.setting_time_ratio_xp = settings.global["charxpmod_time_ratio_xp"].value
  216. global.setting_death_penal = settings.global["charxpmod_death_penal"].value
  217.  
  218. if event and event.setting_type=='runtime-per-user' and event.setting=='charxpmod_hide_xp_panel' then
  219. local player = game.players[event.player_index]
  220. player.gui.top.chartopframe.visible = not settings.get_player_settings(player)["charxpmod_hide_xp_panel"].value
  221. end
  222. end
  223.  
  224.  
  225.  
  226.  
  227. function XPModSetup()
  228.  
  229. global.Player_Attributes = {
  230. "LV_Health_Bonus",
  231. "LV_Armor_Bonus",
  232. "LV_Damage_Bonus",
  233. "LV_Damage_Critical",
  234. "LV_Run_Speed",
  235. "LV_Craft_Speed",
  236. "LV_Mining_Speed",
  237. "LV_Reach_Dist",
  238. "LV_Inv_Bonus",
  239. -- "LV_InvLog_Bonus",
  240. "LV_InvTrash_Bonus",
  241. "LV_Robot_Bonus",
  242. }
  243.  
  244. global.setting_allow_xp_by_tech = settings.startup["charxpmod_allow_xp_by_tech"].value
  245. global.setting_allow_xp_by_kill = settings.startup["charxpmod_allow_xp_by_kill"].value
  246. global.setting_allow_xp_by_rocket = settings.startup["charxpmod_allow_xp_by_rocket"].value
  247. global.setting_allow_xp_by_mining = settings.startup["charxpmod_allow_xp_by_mining"].value
  248. global.XP_Mult = settings.startup["charxpmod_xp_multiplier_bonus"].value
  249. global.setting_allow_damage_attribs = settings.startup["charxpmod_enable_damage_attribs"].value
  250.  
  251. ReadRunTimeSettings()
  252.  
  253.  
  254. if global.CharXPMOD == nil then
  255. global.CharXPMOD = 1
  256. global.kills_spawner={}
  257. global.kills_units={}
  258. global.kills_worms={}
  259. global.XP={}
  260. global.XP_GANHO={}
  261. global.XP_KILL_HP={}
  262. global.XP_TECH={}
  263. global.XP_LEVEL={}
  264. global.XP_LEVEL_MIN={}
  265. global.XP_MAX_PLAYTIME={}
  266. global.XP_AVG_PLAYTIME={}
  267.  
  268. global.personalxp = {}
  269. global.personalxp.Level = {}
  270. global.personalxp.XP = {}
  271. global.personalxp.Death = {}
  272.  
  273.  
  274.  
  275. for k=1,#global.Player_Attributes do
  276. global.personalxp[global.Player_Attributes[k]]= {}
  277. end
  278.  
  279. global.personalxp.opt_Pick_Extender = {}
  280.  
  281. for name, force in pairs (game.forces) do
  282. if name~='neutral' and name~='enemy' then
  283. SetForceValues(name)
  284. end
  285. end
  286.  
  287.  
  288. ResetXPTables()
  289. end
  290.  
  291.  
  292.  
  293. global.RPG_Bonus = {}
  294. for k=1,#global.Player_Attributes do
  295. local attrib = global.Player_Attributes[k]
  296. global.RPG_Bonus[attrib]= settings.startup["charxpmod_"..attrib].value
  297. end
  298.  
  299. global.personal_kill_units = global.personal_kill_units or {}
  300. global.personal_kill_spawner = global.personal_kill_spawner or {}
  301. global.personal_kill_turrets = global.personal_kill_turrets or {}
  302.  
  303. VersionChange()
  304. CheckPlayers()
  305. end
  306.  
  307.  
  308. function ResetAll()
  309. ResetXPTables()
  310. for name, force in pairs (game.forces) do
  311. if name~='neutral' and name~='enemy' then
  312. SetForceValues(name)
  313. end
  314. end
  315. for _, player in pairs(game.players) do
  316. SetupPlayer(player,true)
  317. UpdatePanel(player)
  318. end
  319. end
  320.  
  321.  
  322. function ResetPointSpent()
  323. ResetXPTables()
  324.  
  325. for _, player in pairs(game.players) do
  326. SetupPlayer(player,false)
  327. end
  328. end
  329.  
  330.  
  331.  
  332. function InitPlayerGui(player)
  333.  
  334. local nome = player.name
  335.  
  336. -- close main panel
  337. if player.gui.center["char-panel"] then
  338. player.gui.center["char-panel"].destroy() end
  339.  
  340. -- remove previous versions
  341. if (mod_gui.get_button_flow(player).chartopframe) then
  342. mod_gui.get_button_flow(player).chartopframe.destroy() end
  343. if (mod_gui.get_button_flow(player).btcharxp) then
  344. mod_gui.get_button_flow(player).btcharxp.destroy() end
  345. if player.gui.top.chartopframe then player.gui.top.chartopframe.destroy() end
  346. if player.gui.top.btcharxp then player.gui.top.btcharxp.destroy() end
  347.  
  348. -- create new ones
  349. local Topframe = player.gui.top.add{name="chartopframe", direction = "horizontal", type="frame", style=mod_gui.frame_style}
  350. Topframe.style.minimal_height = 30
  351. -- Topframe.style.maximal_height = 37
  352. Topframe.style.minimal_width = 200
  353. -- Topframe.style.maximal_width = 250
  354.  
  355. Topframe.add{name="btcharxp", type="sprite-button", sprite = "entity/character", tooltip = {"panel-title"}, style = mod_gui.top_button_style} -- "mod_gui_button"}
  356.  
  357. local tabFrame = Topframe.add{type = "table", name = "tabtopframexp", column_count = 1}
  358. Level = global.personalxp.Level[nome]
  359. local pnivel = tabFrame.add{type="label", name='chartoplvtxt', caption={'actual_lv',Level}}
  360. pnivel.style.font="charxpmod_font_17b"
  361. local TopXPbar = tabFrame.add{type = "progressbar", name = "TopXPbar"}
  362. TopXPbar.style.width=150
  363. UpdatePanel(player)
  364. end
  365.  
  366.  
  367. ----------------------------------------------------------------------------------------------------------
  368. ----------------------------------------------------------------------------------------------------------
  369. ----------------------------------------------------------------------------------------------------------
  370.  
  371.  
  372. function RatioXP(player)
  373. local ratioXP = 1
  374. if global.setting_time_ratio_xp and global.XP_AVG_PLAYTIME[player.force.name]>0 then
  375. ratioXP = player.online_time/global.XP_AVG_PLAYTIME[player.force.name]
  376. if ratioXP >= 1.10 then ratioXP = 1.10
  377. elseif ratioXP < 0.05 then ratioXP = 0.05 end
  378. end
  379. return ratioXP
  380. end
  381.  
  382.  
  383. function XP_Player_upd()
  384.  
  385. for name, force in pairs (game.forces) do
  386. if name~='neutral' and name~='enemy' then
  387.  
  388. local cp = #force.connected_players
  389. local afk = global.setting_afk_time
  390. if cp>0 then
  391. local XP = global.XP[name] --math.ceil(global.XP[name] / cp)
  392.  
  393. if XP>0 then
  394. for p, PL in pairs (force.connected_players) do
  395. if afk==0 or PL.afk_time<afk*3600 then
  396. local ratioXP = RatioXP(PL)
  397. XP = math.ceil(XP*ratioXP)
  398. global.personalxp.XP[PL.name] = global.personalxp.XP[PL.name] + XP
  399. printXP(PL,XP)
  400. UpdatePanel(PL)
  401. end
  402. end
  403. end
  404. global.XP[name]=0
  405. end
  406. end
  407. end
  408. end
  409.  
  410.  
  411. function XP_PlayerLv_upd()
  412.  
  413. for _, player in pairs(game.players) do
  414. if player.connected then
  415. local name = player.name
  416. local Lv = global.personalxp.Level[name]
  417. if global.personalxp.XP[name]>global.max_xp then
  418. global.personalxp.Level[name]=100
  419. else
  420.  
  421. for L=Lv, #global.xp_table do
  422. if global.personalxp.XP[name]< global.xp_table[L] then
  423. global.personalxp.Level[name]=L
  424. break
  425. end
  426. end end
  427.  
  428. if global.personalxp.Level[name] > Lv then
  429. player.print({'player_lv_up',global.personalxp.Level[name]})
  430. player.play_sound{path = 'player_level_up'}
  431. script.raise_event(on_player_level_up, {player_index = player.index, player_level = global.personalxp.Level[name]})
  432. end
  433. UpdatePanel(player)
  434. end
  435. end
  436. end
  437.  
  438.  
  439. function XP_Time_upd()
  440. for name, force in pairs (game.forces) do
  441. if name~='neutral' and name~='enemy' then
  442. local PT
  443. local TT=0
  444. local QP=0
  445.  
  446. for p, PL in pairs (force.players) do
  447. PT = PL.online_time
  448. if PT > global.XP_AVG_PLAYTIME[name]/20 then -- a player time count for avg if he has at least 5% of the avg time
  449. TT = TT + PT
  450. QP = QP + 1
  451. end
  452.  
  453. if global.XP_MAX_PLAYTIME[name] < PT then
  454. global.XP_MAX_PLAYTIME[name] = PT
  455. end
  456. end
  457. if QP>0 then global.XP_AVG_PLAYTIME[name] = TT/QP end
  458. end
  459. end
  460. end
  461.  
  462.  
  463. function XP_UPDATE_tick()
  464.  
  465. XP_Time_upd()
  466. XP_Player_upd()
  467. XP_PlayerLv_upd()
  468.  
  469.  
  470. end
  471.  
  472.  
  473.  
  474.  
  475.  
  476. function SumPointSpent(name)
  477. local sum = 0
  478. for k=1,#global.Player_Attributes do
  479. local attrib = global.Player_Attributes[k]
  480. sum = sum + global.personalxp[attrib][name]
  481. end
  482. return sum
  483. end
  484.  
  485.  
  486. function update_char_panel(player)
  487. XP_Time_upd()
  488.  
  489. local force = player.force.name
  490. local painel = player.gui.center["char-panel"]
  491. local frame = painel.tabcharScroll
  492. local nome = player.name
  493. local Level = global.personalxp.Level[nome]
  494.  
  495.  
  496. local ptime = player.online_time
  497. local txtPTime = {"time-played" ,string.format("%d:%02d:%02d", math.floor(ptime / 216000), math.floor(ptime / 3600) % 60, math.floor(ptime / 60) % 60)}
  498.  
  499. local PontosXP = Level - 1 - SumPointSpent(nome)
  500. if PontosXP<0 then PontosXP=0 end
  501.  
  502. local tabChar = frame.add{type = "table", name = "tab_tbchar", column_count = 2}
  503. tabChar.add{type = "sprite", sprite = "charxpmod_space_suit"}
  504.  
  505. local tabScroll = tabChar.add{type = "scroll-pane", name= "tabScroll2", vertical_scroll_policy="auto", horizontal_scroll_policy="auto"}
  506. tabScroll.style.minimal_height = 150
  507. tabScroll.style.minimal_width = 320
  508. tabScroll.style.maximal_width = 350
  509.  
  510. local tabPName = tabScroll.add{type = "table", name = "tab_pname", column_count = 3}
  511. local pname = tabPName.add{type="label", name='ocharname', caption=nome}
  512. pname.style.font="charxpmod_font_30b"
  513. pname.style.font_color=player.color
  514. tabPName.add{type="label", name='blanklab1', caption=' - '}
  515. local pnivel = tabPName.add{type="label", name='ocharlevel', caption={'actual_lv',Level}}
  516. pnivel.style.font="charxpmod_font_30"
  517. pnivel.style.font_color=player.color
  518.  
  519.  
  520. local tabPStat = tabScroll.add{type = "table", name = "tab_PStat", column_count = 2}
  521. tabPStat.add{type="label", name='STT1', caption= txtPTime}.style.font="charxpmod_font_17"
  522. tabPStat.add{type="label", name='STT2', caption={'xp_deaths',global.personalxp.Death[nome]}}.style.font="charxpmod_font_17"
  523.  
  524. tabScroll.add{type="label", name='blankL1', caption=' '}
  525.  
  526. -- stats
  527. local wd =170
  528.  
  529. local tabStats = tabScroll.add{type = "table", name = "tabStats", column_count = 2}
  530.  
  531. --[[ tabStats.add{type="label", name='STT3', caption={'xp_spawnk',global.kills_spawner[force]}}.style.width = wd
  532. tabStats.add{type="label", name='STT4', caption={'xp_techs',global.XP_TECH[force]}}.style.width = wd
  533. tabStats.add{type="label", name='STT5', caption={'xp_wormk',global.kills_worms[force]}}.style.width = wd
  534. tabStats.add{type="label", name='STT6', caption={'xp_unitk',global.kills_units[force]}}.style.width = wd ]]
  535.  
  536.  
  537. tabStats.add{type="label", name='STT3', caption={'xp_spawnk',format_number( global.personal_kill_spawner[nome])}}.style.width = wd
  538. tabStats.add{type="label", name='STT4', caption={'xp_techs',format_number(global.XP_TECH[force])}}.style.width = wd
  539. tabStats.add{type="label", name='STT5', caption={'xp_wormk',format_number(global.personal_kill_turrets[nome])}}.style.width = wd
  540. tabStats.add{type="label", name='STT6', caption={'xp_unitk',format_number(global.personal_kill_units[nome])}}.style.width = wd
  541.  
  542.  
  543.  
  544. local pbvalue = CalculateXP_PB(player.name)
  545. --local pbvalue = player.gui.top.chartopframe.TopXPbar.value
  546. local XP = global.personalxp.XP[nome]
  547. local NextLevel = global.xp_table[Level]
  548.  
  549. local NextLtxt = format_number( NextLevel)
  550. if XP >= global.max_xp then NextLtxt = 'MAX' end
  551.  
  552. local tabXP = frame.add{type = "table", name = "tab_XP", column_count = 2}
  553.  
  554. local tabBar = tabXP.add{type = "table", column_count = 1}
  555. tabBar.style.vertical_spacing = 1
  556. tabBar.add{type="label", name='lbxpatual', caption='XP: ' .. format_number( XP ) }.style.font="charxpmod_font_17"
  557. local bar = tabBar.add{type = "progressbar", value = pbvalue, name = "tab_XPbar"}
  558. bar.style.width = 320
  559.  
  560. local tabNextLv = tabXP.add{type = "table", column_count = 1}
  561. tabNextLv.style.vertical_spacing = 1
  562. tabNextLv.add{type="label", caption=' '}
  563. tabNextLv.add{type="label", caption={'next_lv'}} --.style.font="charxpmod_font_17"
  564. tabNextLv.add{type="label", caption=NextLtxt} --.style.font="charxpmod_font_17"
  565.  
  566.  
  567. -- XP RATIO
  568. local ratioXP = RatioXP(player)
  569. ratioXP = math.floor(ratioXP*100)
  570. frame.add{type="label", name='lbxratioxp', caption={'xp_ratio', ratioXP}}
  571.  
  572. frame.add{type="label", name='blankL3', caption=' '}
  573. frame.add{type="label", name='lbxPAGastar', caption={'xp_points',PontosXP}}.style.font="charxpmod_font_20"
  574.  
  575. -- LEVELS / UPGRADES
  576. local tabUpgrades = frame.add{type = "table", name = "tabUpgrades", column_count = 2}
  577. tabUpgrades.style.horizontal_spacing = 20
  578. tabUpgrades.style.vertical_spacing = 8
  579. -- tabUpgrades.draw_horizontal_lines = true
  580. -- tabUpgrades.draw_vertical_lines = true
  581. -- tabUpgrades.draw_horizontal_line_after_headers = true
  582.  
  583.  
  584.  
  585. local Max = 20
  586. local custo = 1
  587. local vchar
  588. local at_level
  589. local attrib
  590. local bonus
  591.  
  592. for A=1,#global.Player_Attributes do
  593. attrib = global.Player_Attributes[A]
  594. local enabled = true
  595. if (attrib=="LV_Armor_Bonus" or attrib=="LV_Damage_Bonus" or attrib=="LV_Damage_Critical")
  596. and (not global.setting_allow_damage_attribs) then enabled = false end
  597. if enabled then
  598.  
  599. vchar = 'global.personalxp.'..attrib
  600. at_level = global.personalxp[attrib][nome]
  601. bonus = global.RPG_Bonus[attrib]
  602.  
  603. local tabAttrib = tabUpgrades.add{type = "table", column_count = 2}
  604.  
  605. local btAttribute = tabAttrib.add{type="button", caption={vchar}, name='btLVU_'..vchar, style = 'rounded_button', tooltip={'xp_hint_'..vchar,bonus}}
  606. local txtAttLv = tabAttrib.add{type="label", caption=at_level}
  607. txtAttLv.style.font="charxpmod_font_20"
  608. txtAttLv.style.width = 30
  609. btAttribute.style.font= "default-bold"
  610. btAttribute.style.width = 190
  611. btAttribute.enabled = PontosXP>=custo and at_level<Max
  612. end
  613. end
  614.  
  615.  
  616. local pickbutton = frame.add{type = "checkbox", name = "cb_pick_extender", caption={'xp_opt_Pick_Extender'}, state = global.personalxp.opt_Pick_Extender[nome]}
  617.  
  618. frame.add{type="label", name='blankL4', caption=' '}
  619.  
  620. --TAG
  621. local frametag = frame.add{type="frame", name="char_frametag", direction = "horizontal", style=mod_gui.frame_style}
  622. frametag.style.minimal_width = 455
  623. frametag.style.maximal_width = 455
  624.  
  625. local tabtag = frametag.add{type = "table", name = "tabchartag", column_count = 4}
  626. tabtag.add{type="label", name="lab_ctag", caption="Tag "}
  627. tabtag.add{type="textfield", name="ctag_field", text=player.tag}
  628. local btTagOK= tabtag.add{name="btTagCharOK", type="button", style = mod_gui.button_style, caption='OK'}
  629. --local btColors= tabtag.add{name="btColorsChar", type="button", style = 'confirm_double_arrow_button', caption={'panel-colors-title'}}
  630. end
  631.  
  632.  
  633. function ListAll(player)
  634. expand_char_gui(player)
  635. expand_char_gui(player)
  636.  
  637. local force = player.force
  638. local painel = player.gui.center["char-panel"]
  639. local frame = painel.tabcharScroll
  640.  
  641.  
  642. frame.add{type="label", name='lbxplayerlst', caption=Players}.style.font="charxpmod_font_20"
  643. local tabpllst = frame.add{type = "table", name = "tabpllst", column_count = 3}
  644. for p,PL in pairs (force.players) do
  645.  
  646. local ptime = PL.online_time
  647. local txtPTime = string.format("%d:%02d", math.floor(ptime / 216000), math.floor(ptime / 3600) % 60)
  648. local ratioXP = math.floor(RatioXP(PL) * 100)
  649. tabpllst.add{type="label", name='pllstname'..p, caption=PL.name .. ' '..global.personalxp.Level[PL.name] .. ' (' ..txtPTime.. ' '..ratioXP..'%)'}
  650. end
  651. end
  652.  
  653.  
  654. function ListXPTable(player)
  655. player.print('XP Level Table:')
  656. for k=1,20 do
  657. player.print('Level '.. k .. ' - ' .. global.xp_table[k] )
  658. end
  659. end
  660.  
  661.  
  662. function CalculateXP_PB(plname)
  663. local Level = global.personalxp.Level[plname]
  664. local XP = global.personalxp.XP[plname]
  665. if XP > global.max_xp then XP = global.max_xp end
  666. local NextLevel = global.xp_table[Level]
  667. local XP_ant
  668. if Level==1 then XP_ant = 0 else XP_ant = global.xp_table[Level-1] end
  669. local Interval_XP = NextLevel - XP_ant
  670. local pbvalue = (XP-XP_ant)/Interval_XP
  671. return pbvalue
  672. end
  673.  
  674.  
  675. function CalculateXP_GAIN_LV(playername)
  676.  
  677. local pbvalue = CalculateXP_PB(playername)
  678. local Level = global.personalxp.Level[playername]
  679. local NextLevel = global.xp_table[Level]
  680. local XP = global.personalxp.XP[playername]
  681.  
  682. local ThisLevel = NextLevel - XP + 1
  683. local PartialXP = 0
  684.  
  685. if Level<100 then
  686. PartialXP = math.ceil((global.xp_table[Level+1] - ThisLevel) * pbvalue)
  687. end
  688.  
  689. return ThisLevel + PartialXP
  690. end
  691.  
  692.  
  693.  
  694. function UpdatePanel(player)
  695. -- BARRA DE XP tabtopframexp
  696. local TopXPbar = player.gui.top.chartopframe.tabtopframexp.TopXPbar
  697. local txtlv = player.gui.top.chartopframe.tabtopframexp.chartoplvtxt
  698.  
  699. local Level = global.personalxp.Level[player.name]
  700. local pbvalue = CalculateXP_PB(player.name)
  701.  
  702. txtlv.caption={'actual_lv',Level}
  703. TopXPbar.value=pbvalue
  704.  
  705. local color_frame = player.gui.center["rpg-char-color-panel"]
  706. if color_frame then return end
  707.  
  708. local frame = player.gui.center["char-panel"]
  709. if frame then
  710. local textImput = player.gui.center["char-panel"].tabcharScroll.char_frametag.tabchartag.ctag_field.text
  711. if player.tag~=textImput then return end
  712. expand_char_gui(player)
  713. expand_char_gui(player)
  714. end
  715.  
  716. end
  717.  
  718. function expand_char_gui(player)
  719. local color_frame = player.gui.center["rpg-char-color-panel"]
  720. if color_frame then color_frame.destroy() end
  721.  
  722. local frame = player.gui.center["char-panel"]
  723. if frame then
  724. frame.destroy()
  725. else
  726. local wid = 530
  727. frame = player.gui.center.add{type="frame", name="char-panel", direction = "vertical", style=mod_gui.frame_style, caption={"panel-title"}}
  728. frame.style.minimal_height = 430
  729. --frame.style.maximal_height = 430
  730. frame.style.minimal_width = wid
  731. frame.style.maximal_width = 485
  732. local tabcharScroll = frame.add{type = "scroll-pane", name= "tabcharScroll", vertical_scroll_policy="auto", horizontal_scroll_policy="auto"}
  733. tabcharScroll.style.minimal_height = 400
  734. --tabcharScroll.style.maximal_height = 1000
  735. tabcharScroll.style.minimal_width = wid - 15
  736. tabcharScroll.style.maximal_width = wid - 15
  737. update_char_panel(player)
  738. end
  739. end
  740.  
  741.  
  742.  
  743. --[[
  744. function expand_char_color_gui(player)
  745. local frame = player.gui.center["rpg-char-color-panel"]
  746. if frame then
  747. frame.destroy()
  748. else
  749. frame = player.gui.center.add{type="frame", name="rpg-char-color-panel", direction = "vertical", style=mod_gui.frame_style, caption={"panel-colors-title"}}
  750.  
  751. local tabBars = frame.add{type = "table", name='table_char_colors', column_count = 2}
  752. tabBars.add{type = "label", caption='R'}.style.font_color=colors.lightred
  753. local sliderR = tabBars.add{type = "slider", name='slider_color_R', value = player.color.r,minimum_value=0,maximum_value=1}
  754.  
  755. tabBars.add{type = "label", caption='G'}.style.font_color=colors.lightgreen
  756. local sliderG = tabBars.add{type = "slider", name='slider_color_G', value = player.color.g,minimum_value=0,maximum_value=1}
  757.  
  758. tabBars.add{type = "label", caption='B'}.style.font_color=colors.lightblue
  759. local sliderB = tabBars.add{type = "slider", name='slider_color_B', value = player.color.b,minimum_value=0,maximum_value=1}
  760.  
  761. local tabBarsBt = frame.add{type = "table", column_count = 2}
  762. local btCancel= tabBarsBt.add{name="btColorsCharCancel", type="button", style = "back_button", caption={'cancel'}}
  763. local btApply = tabBarsBt.add{name="btColorsCharApply", type="button", style = "confirm_button", caption={'apply'}}
  764. end
  765.  
  766. end
  767. ]]
  768.  
  769. function apply_char_color(player)
  770. local frame = player.gui.center["rpg-char-color-panel"]
  771. if frame then
  772.  
  773. local sliderR = frame.table_char_colors.slider_color_R
  774. local sliderG = frame.table_char_colors.slider_color_G
  775. local sliderB = frame.table_char_colors.slider_color_B
  776.  
  777. player.color = {r=sliderR.slider_value,g=sliderG.slider_value,b=sliderB.slider_value}
  778. frame.destroy()
  779. end
  780.  
  781. local frame = player.gui.center["char-panel"]
  782. if frame then frame.destroy() end
  783.  
  784.  
  785. end
  786.  
  787.  
  788.  
  789. function UpdatePlayerLvStats(player)
  790. local name=player.name
  791.  
  792. if player.character ~= nil then
  793.  
  794. player.character.character_crafting_speed_modifier = global.personalxp.LV_Craft_Speed[name] * global.RPG_Bonus['LV_Craft_Speed']/100
  795. player.character.character_mining_speed_modifier = global.personalxp.LV_Mining_Speed[name] * global.RPG_Bonus['LV_Mining_Speed']/100
  796. player.character.character_running_speed_modifier = global.personalxp.LV_Run_Speed[name] * global.RPG_Bonus['LV_Run_Speed']/100
  797.  
  798. player.character.character_build_distance_bonus = global.personalxp.LV_Reach_Dist[name] * global.RPG_Bonus['LV_Reach_Dist']
  799. player.character.character_reach_distance_bonus = global.personalxp.LV_Reach_Dist[name] * global.RPG_Bonus['LV_Reach_Dist']
  800. player.character.character_item_drop_distance_bonus = global.personalxp.LV_Reach_Dist[name] * global.RPG_Bonus['LV_Reach_Dist']
  801. player.character.character_resource_reach_distance_bonus = global.personalxp.LV_Reach_Dist[name] * global.RPG_Bonus['LV_Reach_Dist']
  802.  
  803. player.character.character_inventory_slots_bonus = global.personalxp.LV_Inv_Bonus[name] * global.RPG_Bonus['LV_Inv_Bonus']
  804. -- player.character.character_logistic_slot_count_bonus = global.personalxp.LV_InvLog_Bonus[name] * global.RPG_Bonus['LV_InvLog_Bonus']
  805. player.character.character_trash_slot_count_bonus = global.personalxp.LV_InvTrash_Bonus[name] * global.RPG_Bonus['LV_InvTrash_Bonus']
  806. player.character.character_maximum_following_robot_count_bonus = global.personalxp.LV_Robot_Bonus[name] * global.RPG_Bonus['LV_Robot_Bonus']
  807. player.character.character_health_bonus = global.personalxp.LV_Health_Bonus[name] * global.RPG_Bonus['LV_Health_Bonus']
  808.  
  809. if global.personalxp.opt_Pick_Extender[name] then
  810. player.character.character_item_pickup_distance_bonus = player.character.character_reach_distance_bonus
  811. player.character.character_loot_pickup_distance_bonus = player.character.character_reach_distance_bonus
  812. else
  813. player.character.character_item_pickup_distance_bonus = 0
  814. player.character.character_loot_pickup_distance_bonus = 0
  815. end
  816.  
  817. end
  818. end
  819.  
  820.  
  821. local p_attribs = { 'character_crafting_speed_modifier',
  822. 'character_mining_speed_modifier',
  823. 'character_running_speed_modifier',
  824. 'character_reach_distance_bonus',
  825. 'character_item_drop_distance_bonus',
  826. 'character_resource_reach_distance_bonus',
  827. 'character_inventory_slots_bonus',
  828. -- 'character_logistic_slot_count_bonus',
  829. 'character_trash_slot_count_bonus',
  830. 'character_maximum_following_robot_count_bonus',
  831. 'character_health_bonus',
  832. 'character_item_pickup_distance_bonus'}
  833.  
  834. function CopyPlayerStats(name)
  835. local player = game.players[name]
  836. if player and player.valid then
  837. local character_attribs = {}
  838.  
  839. if player.character and player.character.valid then
  840. for a=1,#p_attribs do
  841. table.insert(character_attribs,player.character[p_attribs[a]]) end
  842. end
  843.  
  844. local rpg_stats = {global.personalxp.Level[name],
  845. global.personalxp.XP[name],
  846. global.personalxp.Death[name],
  847. global.personalxp.opt_Pick_Extender[name],
  848. global.personal_kill_units[name],
  849. global.personal_kill_spawner[name],
  850. global.personal_kill_turrets[name],
  851. }
  852. for k=1,#global.Player_Attributes do
  853. local attrib = global.Player_Attributes[k]
  854. table.insert (rpg_stats, global.personalxp[attrib][name] )
  855. end
  856. return {character_attribs=character_attribs, rpg_stats=rpg_stats}
  857. end
  858. end
  859.  
  860.  
  861. function PastePlayerStats(name,status)
  862. local player = game.players[name]
  863. if player and player.valid and status then
  864. local character_attribs = status.character_attribs
  865.  
  866. if player.character and player.character.valid then
  867. for a=1,#p_attribs do player.character[p_attribs[a]]=character_attribs[a] end
  868. end
  869.  
  870. local rpg_stats = status.rpg_stats
  871. global.personalxp.Level[name] = rpg_stats[1]
  872. global.personalxp.XP[name] = rpg_stats[2]
  873. global.personalxp.Death[name] = rpg_stats[3]
  874. global.personalxp.opt_Pick_Extender[name] = rpg_stats[4]
  875. global.personal_kill_units[name] = rpg_stats[5]
  876. global.personal_kill_spawner[name] = rpg_stats[6]
  877. global.personal_kill_turrets[name] = rpg_stats[7]
  878.  
  879. for k=1,#global.Player_Attributes do
  880. local attrib = global.Player_Attributes[k]
  881. global.personalxp[attrib][name] = rpg_stats[k+7]
  882. end
  883. UpdatePanel(player)
  884. end
  885. end
  886.  
  887.  
  888. -- this will calculate the stat using sum, instead of replacing the value
  889. -- used for compatibility with other mods
  890. function AdjustPlayerStat(player,stat)
  891. local name=player.name
  892.  
  893. if player.character ~= nil then
  894. apply_bonus_relatively(player, stat, stats[stat])
  895. end
  896. end
  897.  
  898. function LevelUPPlayer(player,btname)
  899. local name=player.name
  900. local attribute = string.match(btname, "([^.]-)$")
  901. if attribute == nil then
  902. game.print("no attribute found in btname: "..btname)
  903. return
  904. end
  905. global.personalxp[attribute][player.name] = global.personalxp[attribute][player.name] + 1
  906.  
  907. for mod, internal in pairs(stats) do
  908. if internal.name == attribute then
  909. apply_one_bonus(player, mod, internal)
  910. --script.raise_event(on_player_updated_status, {player_index = player.index, player_level = global.personalxp.Level[name], attribute=attrib}) --old event pasted here
  911. end
  912. end
  913. end
  914.  
  915.  
  916.  
  917. if global.personalxp.opt_Pick_Extender[name] then
  918. player.character.character_item_pickup_distance_bonus = player.character.character_reach_distance_bonus
  919. player.character.character_loot_pickup_distance_bonus = player.character.character_reach_distance_bonus
  920. else
  921. player.character.character_item_pickup_distance_bonus = 0
  922. player.character.character_loot_pickup_distance_bonus = 0
  923. end
  924.  
  925.  
  926. end
  927.  
  928.  
  929.  
  930. script.on_nth_tick(60 * 6,function (event)
  931. XP_UPDATE_tick()
  932. end)
  933.  
  934.  
  935. function Cria_Player(event)
  936. local player = game.players[event.player_index]
  937. SetupPlayer(player,true)
  938. end
  939.  
  940.  
  941. function on_force_created(event)
  942. local name = event.force.name
  943. SetForceValues(name)
  944. end
  945.  
  946.  
  947. function onPlayerJoin(event)
  948. local player = game.players[event.player_index]
  949. CheckPlayer(player)
  950. InitPlayerGui(player)
  951. end
  952.  
  953.  
  954. function On_Init()
  955. XPModSetup()
  956. end
  957.  
  958.  
  959. function on_configuration_changed(data)
  960. XPModSetup()
  961. end
  962.  
  963. script.on_event(defines.events.on_player_created, Cria_Player)
  964. script.on_event(defines.events.on_player_joined_game, onPlayerJoin)
  965. script.on_event(defines.events.on_runtime_mod_setting_changed, ReadRunTimeSettings)
  966.  
  967. --script.on_event(defines.events.on_tick, on_tick )
  968. script.on_event(defines.events.on_force_created,on_force_created)
  969. script.on_configuration_changed(on_configuration_changed)
  970. script.on_init(On_Init)
  971. script.on_event("key-I", function(event) expand_char_gui(game.players[event.player_index]) end)
  972.  
  973.  
  974. -- closes panel when player open inventory E
  975. script.on_event(defines.events.on_gui_opened, function(event)
  976. if event.gui_type and event.gui_type ==defines.gui_type.controller then
  977. local player = game.players[event.player_index]
  978. local frame = player.gui.center["char-panel"]
  979. if frame then frame.destroy() end
  980. end
  981. end)
  982.  
  983.  
  984.  
  985.  
  986.  
  987.  
  988. local function on_gui_click(event)
  989.  
  990. local player = game.players[event.element.player_index]
  991. local name = event.element.name
  992.  
  993. if (name == "btcharxp") then
  994. expand_char_gui(player)
  995. elseif (name == "btTagCharOK")then
  996. local textImput = player.gui.center["char-panel"].tabcharScroll.char_frametag.tabchartag.ctag_field.text
  997.  
  998. if textImput == "{reset-points}" then
  999. if player.admin then
  1000. expand_char_gui(player)
  1001. ResetPointSpent()
  1002. game.print({'xp_reset_altert'})
  1003. end
  1004. return
  1005. elseif textImput == "{reset-all}" then
  1006. if player.admin then
  1007. expand_char_gui(player)
  1008. ResetAll()
  1009. game.print({'xp_reset_altert'})
  1010. end
  1011. return
  1012. elseif textImput == "{list}" then
  1013. ListAll(player)
  1014. player.gui.center["char-panel"].tabcharScroll.char_frametag.tabchartag.ctag_field.text = "{list}"
  1015. return
  1016. elseif textImput == "{listXPTable}" then
  1017. ListXPTable(player)
  1018. return
  1019. end
  1020.  
  1021.  
  1022.  
  1023. player.tag = textImput
  1024. expand_char_gui(player)
  1025.  
  1026. elseif string.sub(name,1,6)=='btLVU_' then
  1027. if player.character and player.character.valid then
  1028. LevelUPPlayer(player,name)
  1029. expand_char_gui(player)
  1030. expand_char_gui(player)
  1031. end
  1032.  
  1033. elseif name == "cb_pick_extender" then
  1034. if player.character == nil then
  1035. player.gui.center["char-panel"].tabcharScroll.cb_pick_extender.state = global.personalxp.opt_Pick_Extender[player.name]
  1036. return
  1037. end
  1038. local cb_pick_extender = player.gui.center["char-panel"].tabcharScroll.cb_pick_extender.state
  1039. global.personalxp.opt_Pick_Extender[player.name] = cb_pick_extender
  1040.  
  1041. if cb_pick_extender then
  1042. player.character.character_item_pickup_distance_bonus = player.character.character_reach_distance_bonus
  1043. player.character.character_loot_pickup_distance_bonus = player.character.character_reach_distance_bonus
  1044. else
  1045. player.character.character_item_pickup_distance_bonus = 0
  1046. player.character.character_loot_pickup_distance_bonus = 0
  1047. end
  1048.  
  1049. --[[ elseif name == "btColorsChar" or name == "btColorsCharCancel" then
  1050. expand_char_color_gui(player)
  1051. elseif name == "btColorsCharApply" then
  1052. apply_char_color(player)]]
  1053. end
  1054.  
  1055. end
  1056. script.on_event(defines.events.on_gui_click, on_gui_click)
  1057.  
  1058.  
  1059. -- ANTI RESPAWN EVENT DEPENDENCY
  1060. script.on_nth_tick(60*21, function (event)
  1061. for p, PL in pairs (game.connected_players) do
  1062. if PL.valid and PL.character and PL.character.valid then
  1063. local name = PL.name
  1064. if (PL.character.character_crafting_speed_modifier==0 and global.personalxp.LV_Craft_Speed[name]>0) or
  1065. (PL.character.character_running_speed_modifier==0 and global.personalxp.LV_Mining_Speed[name]>0) then
  1066. UpdatePlayerLvStats(PL) end
  1067. end
  1068. end
  1069. end)
  1070.  
  1071.  
  1072. script.on_event(defines.events.on_player_respawned, function(event)
  1073. local player = game.players[event.player_index]
  1074. UpdatePlayerLvStats(player)
  1075. end)
  1076.  
  1077.  
  1078. script.on_event(defines.events.on_pre_player_died, function(event)
  1079. local player = game.players[event.player_index]
  1080. local name = player.name
  1081. local XP = global.personalxp.XP[name]
  1082. local Level = global.personalxp.Level[name]
  1083. local NextLevel = global.xp_table[Level]
  1084. local XP_ant
  1085. if Level==1 then XP_ant = 0 else XP_ant = global.xp_table[Level-1] end
  1086. local Interval_XP = NextLevel - XP_ant
  1087. local Penal = math.floor((XP-XP_ant)*global.setting_death_penal/100)
  1088. global.personalxp.Death[name] = global.personalxp.Death[name]+1
  1089.  
  1090. if Penal>0 then
  1091. global.personalxp.XP[name] = global.personalxp.XP[name]-Penal
  1092. player.print({"", {'xp_lost'}, format_number(Penal)},colors.lightred)
  1093. end
  1094.  
  1095. end)
  1096.  
  1097.  
  1098.  
  1099.  
  1100. function GetXPByKill(entity,killer,force)
  1101. if force then
  1102. if global.setting_allow_xp_by_kill then
  1103. if not global.last_overkill or (global.last_overkill and global.last_overkill~=entity) then
  1104.  
  1105.  
  1106. if entity and entity.valid then
  1107. local XP = entity.prototype.max_health
  1108. local player , plname
  1109.  
  1110. if killer and killer.valid then
  1111. if killer.type == 'character' then
  1112. player=killer.player
  1113. if player then
  1114. plname=player.name
  1115. end
  1116. force=killer.force
  1117. end
  1118. end
  1119.  
  1120. local nforce=force.name
  1121.  
  1122. if (not force.get_friend(entity.force)) then
  1123.  
  1124. if entity.type == 'character' then XP = XP * 100 end
  1125.  
  1126. if entity.type == 'unit' then
  1127. global.kills_units[nforce] = global.kills_units[nforce] + 1
  1128. if player then global.personal_kill_units[plname]=global.personal_kill_units[plname]+1 end
  1129. elseif entity.type == 'unit-spawner' then
  1130. XP = XP * 5
  1131. global.kills_spawner[nforce] = global.kills_spawner[nforce] +1
  1132. if player then global.personal_kill_spawner[plname]=global.personal_kill_spawner[plname]+1 end
  1133. elseif entity.type == 'turret' then
  1134. global.kills_worms[nforce] = global.kills_worms[nforce] +1
  1135. if player then global.personal_kill_turrets[plname]=global.personal_kill_turrets[plname]+1 end
  1136. XP = XP * 3
  1137. end
  1138.  
  1139.  
  1140.  
  1141. -- if XP > 999999 then XP=999999 end
  1142. XP = math.ceil((1+force.evolution_factor) * global.XP_Mult * XP/2)
  1143. if XP<1 then XP=1 end
  1144.  
  1145. local teamxp = true
  1146. if plname then
  1147. if global.personalxp.XP[plname] then
  1148. global.personalxp.XP[plname] = global.personalxp.XP[plname] + XP
  1149. printXP(player,XP)
  1150. teamxp = false
  1151. end
  1152. end
  1153.  
  1154. if teamxp and global.XP_KILL_HP[nforce] then
  1155. XP=math.ceil(XP/2)
  1156. global.XP_KILL_HP[nforce] = global.XP_KILL_HP[nforce] +XP
  1157. global.XP[nforce] = global.XP[nforce] + XP
  1158. end
  1159.  
  1160. end
  1161. end
  1162. end
  1163. end
  1164. global.last_overkill=nil
  1165. end
  1166. end
  1167.  
  1168. --- XP FOR KILL
  1169. script.on_event(defines.events.on_entity_died, function(event)
  1170. if not event.force then return end
  1171.  
  1172.  
  1173. local force=event.force -- force that kill
  1174. local killer=event.cause
  1175.  
  1176.  
  1177. --if event.entity.force.name == 'enemy' and force~='neutral' and force~='enemy' then --aliens
  1178. if killer and killer.valid and global.kills_units[force.name] and event.entity.force~=game.forces.neutral then
  1179. if event.entity.prototype and event.entity.prototype.max_health and (not force.get_friend(event.entity.force)) then
  1180.  
  1181. if killer.type=='car' then
  1182. if killer.get_driver() and killer.get_driver().valid then
  1183. killer = killer.get_driver()
  1184. elseif killer.get_passenger() and killer.get_passenger().valid then
  1185. killer = killer.get_passenger()
  1186. end
  1187. end
  1188.  
  1189. GetXPByKill(event.entity,killer,force)
  1190.  
  1191. end
  1192. end
  1193.  
  1194.  
  1195. if not killer then
  1196. if global.kills_units[force.name] and event.entity.force~=game.forces.neutral then
  1197. GetXPByKill(event.entity,killer,force)
  1198. end end
  1199.  
  1200. end)
  1201.  
  1202.  
  1203.  
  1204. if settings.startup["charxpmod_enable_damage_attribs"].value then
  1205. -- damage bonus, criticals , natural armor
  1206. script.on_event(defines.events.on_entity_damaged, function(event)
  1207. local entity = event.entity
  1208. local damage_type = event.damage_type
  1209. local original_damage_amount = event.original_damage_amount
  1210. local cause = event.cause
  1211.  
  1212.  
  1213. if cause and cause.valid and entity and entity.valid and entity.health>0 and damage_type and original_damage_amount then
  1214.  
  1215. -- NATURAL ARMOR
  1216. if event.final_damage_amount>0 and entity.type == 'character' then
  1217. local player = entity.player
  1218. if player and player.valid then
  1219. local armor_lv = global.personalxp.LV_Armor_Bonus[player.name]
  1220. if armor_lv>0 then
  1221. local bonus = (global.RPG_Bonus.LV_Armor_Bonus * armor_lv)
  1222. local recover = event.final_damage_amount*bonus/100
  1223. entity.health = entity.health + recover
  1224. end
  1225. end
  1226. end
  1227.  
  1228. -- DAMAGE BONUS
  1229. if cause.type == 'character' and damage_type.name~='poison' then
  1230. local player = cause.player
  1231. if player and player.valid then
  1232. local dmg_lv = global.personalxp.LV_Damage_Bonus[player.name]
  1233. local critical_lv = global.personalxp.LV_Damage_Critical[player.name]
  1234. local new_damage = original_damage_amount
  1235. if dmg_lv>0 then
  1236. local bonus = 1+ (global.RPG_Bonus.LV_Damage_Bonus * dmg_lv/100)
  1237. new_damage = original_damage_amount * bonus
  1238. end
  1239.  
  1240. -- CRITICAL HITS
  1241. if critical_lv>0 and (entity.type=='unit' or entity.type=='unit-spawner' or entity.type=='turret' or entity.type=='character') then
  1242. if math.random(1,200)<=critical_lv then
  1243. new_damage = math.ceil(new_damage * (5 + critical_lv/2))
  1244. if global.setting_print_critical then
  1245. local txt = '[img=fluid.heavy-oil]' -- .. new_damage
  1246. entity.surface.create_entity{name = "flying-text", position = entity.position, text = txt, color = colors.lightred}
  1247. end
  1248. end
  1249. end
  1250.  
  1251. if new_damage > original_damage_amount then
  1252. local dif = new_damage - original_damage_amount
  1253. if entity.health < dif then -- give kill xp to player because the extra damage will kill entity
  1254. GetXPByKill(entity,cause,cause.force)
  1255. global.last_overkill = event.entity
  1256. end
  1257. entity.health = entity.health + event.final_damage_amount
  1258. entity.damage(new_damage,player.force,damage_type.name) -- this fires the event again
  1259. end
  1260. end
  1261. end
  1262.  
  1263. end
  1264.  
  1265.  
  1266. end, {{filter = "type", type = "unit"}, {filter = "type", type = "unit-spawner"},
  1267. {filter = "type", type = "wall"}, {filter = "type", type = "gate"},
  1268. {filter = "type", type = "electric-turret"}, {filter = "type", type = "gun-turret"}, {filter = "type", type = "turret"},
  1269. {filter = "type", type = "character"}}) -- event filters for on_built_entity
  1270. end
  1271.  
  1272.  
  1273.  
  1274. -- XP by research
  1275. script.on_event(defines.events.on_research_finished, function(event)
  1276. if global.setting_allow_xp_by_tech and game.tick > 3600 * 2 then
  1277.  
  1278. if event.research.force ~= nil then
  1279. local force = event.research.force.name
  1280. if force~='neutral' and force~='enemy' then
  1281. if global.XP_TECH[force] then
  1282. local techXP = event.research.research_unit_count * #event.research.research_unit_ingredients
  1283. techXP = math.ceil(global.XP_Mult * techXP * (1+ (6*game.forces["enemy"].evolution_factor)))
  1284. global.XP_TECH[force] = global.XP_TECH[force] +techXP
  1285. global.XP[force] = global.XP[force] +techXP
  1286. end
  1287. end
  1288. end
  1289. end
  1290. end)
  1291.  
  1292.  
  1293.  
  1294. -- XP by Rocket
  1295. script.on_event(defines.events.on_rocket_launched, function(event)
  1296. if global.setting_allow_xp_by_rocket then
  1297. local rocket = event.rocket
  1298. local force = rocket.force
  1299. local XP
  1300.  
  1301. for p, PL in pairs (force.connected_players) do
  1302. local r_count = global.personalxp.rocketsXP_count[PL.name]
  1303. if r_count == nil then r_count=0 end
  1304. XP = math.ceil(global.XP_Mult * global.personalxp.XP[PL.name]/(5+(r_count*2))) --20% inicial
  1305. global.personalxp.XP[PL.name] = global.personalxp.XP[PL.name] + XP
  1306. printXP(PL,XP)
  1307. global.personalxp.rocketsXP_count[PL.name] = r_count+1
  1308. end
  1309. end
  1310. end)
  1311.  
  1312.  
  1313. --- XP FOR Mining rocks, trees
  1314. function XPByMiningRT(player,ent)
  1315. local XP = 0
  1316.  
  1317.  
  1318. if ent.prototype.max_health then
  1319. XP=ent.prototype.max_health
  1320. if ent.type=='tree' then XP=XP/100 else XP=XP/400 end
  1321. end
  1322.  
  1323.  
  1324. if XP>0 then
  1325. local plname = player.name
  1326. XP = math.ceil(XP * global.personalxp.Level[plname] * global.XP_Mult)
  1327. global.personalxp.XP[plname] = global.personalxp.XP[plname] + XP
  1328. printXP(player,XP)
  1329. end
  1330.  
  1331. end
  1332.  
  1333.  
  1334. script.on_event(defines.events.on_player_mined_entity, function(event)
  1335. if global.setting_allow_xp_by_mining then
  1336. local player = game.players[event.player_index]
  1337. if not player.valid then return end
  1338.  
  1339. local ent = event.entity
  1340. local name= ent.name
  1341.  
  1342. if ent.type=='tree' or (ent.type=='simple-entity' and name:find('rock')) then
  1343. XPByMiningRT(player,ent)
  1344. end
  1345. end
  1346. end)
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352. -- Potions
  1353. script.on_event(defines.events.on_player_used_capsule, function(event)
  1354. local player = game.players[event.player_index]
  1355. local item = event.item
  1356.  
  1357.  
  1358. if item.name=='rpg_small_xp_potion' then
  1359. remote.call("RPG","PlayerXPPerc",player.name,15)
  1360. player.print("You feel better now...", colors.yellow)
  1361.  
  1362. elseif item.name=='rpg_big_xp_potion' then
  1363. remote.call("RPG","PlayerXPPerc",player.name,25)
  1364. player.print("You feel better now...", colors.yellow)
  1365.  
  1366. elseif item.name=='rpg_level_up_potion' then
  1367. remote.call("RPG","PlayerGainLevel",player.name)
  1368. player.print("You feel much better now.. yeah!", colors.yellow)
  1369. elseif item.name=='rpg_amnesia_potion' then
  1370.  
  1371. local XP = math.ceil(global.personalxp.XP[player.name] * 0.7)
  1372. SetupPlayer(player)
  1373. global.personalxp.XP[player.name] = XP
  1374. XP_UPDATE_tick()
  1375. player.print("You feel strange... you don't even know where you are... What is it you just drunk?", colors.lightgreen)
  1376. end
  1377.  
  1378. end)
  1379.  
  1380.  
  1381.  
  1382.  
  1383.  
  1384.  
  1385.  
  1386. -- INTERFACE --
  1387. --------------------------------------------------------------------------------------
  1388. -- /c remote.call("RPG","TeamXP","player",150)
  1389. local interface = {}
  1390.  
  1391. -- Give XP to Team (may be negative)
  1392. function interface.TeamXP(forcename,XP)
  1393. global.XP[forcename] = global.XP[forcename] + XP
  1394. XP_UPDATE_tick()
  1395. end
  1396.  
  1397. -- Give XP to a player (may be negative)
  1398. function interface.PlayerXP(playername,XP)
  1399. global.personalxp.XP[playername] = global.personalxp.XP[playername] + XP
  1400. printXP(game.players[playername],XP)
  1401. XP_UPDATE_tick()
  1402. end
  1403.  
  1404. -- Give a fixed XP multiplyed by player level (may be negative)
  1405. function interface.PlayerXPPerLevel(playername,XP)
  1406. global.personalxp.XP[playername] = global.personalxp.XP[playername] + (XP * global.personalxp.Level[playername])
  1407. XP_UPDATE_tick()
  1408. end
  1409.  
  1410. -- Player gain one level
  1411. function interface.PlayerGainLevel(playername)
  1412. if global.personalxp.XP[playername] then
  1413. local XP = CalculateXP_GAIN_LV(playername)
  1414. global.personalxp.XP[playername] = global.personalxp.XP[playername] + XP
  1415. XP_UPDATE_tick()
  1416. end
  1417. end
  1418.  
  1419.  
  1420. -- Give player XP % of his own XP
  1421. function interface.PlayerXPPerc(playername,Perc)
  1422. local XP = math.ceil(global.personalxp.XP[playername]*Perc/100)
  1423. global.personalxp.XP[playername] = global.personalxp.XP[playername] + XP
  1424. printXP(game.players[playername],XP)
  1425. XP_UPDATE_tick()
  1426. end
  1427.  
  1428. -- Penalty XP for a % of his own XP
  1429. function interface.PlayerXPPenalPerc(playername,Perc)
  1430. global.personalxp.XP[playername] = global.personalxp.XP[playername] - math.ceil(global.personalxp.XP[playername]*Perc/100)
  1431. XP_UPDATE_tick()
  1432. end
  1433.  
  1434.  
  1435. -- Give all force players a XP% of his own XP
  1436. function interface.TeamXPPerc(forcename,Perc)
  1437. local XP
  1438. for p, PL in pairs (game.forces[forcename].connected_players) do
  1439. XP = math.ceil(global.personalxp.XP[PL.name]*Perc/100)
  1440. global.personalxp.XP[PL.name] = global.personalxp.XP[PL.name] + XP
  1441. printXP(PL,XP)
  1442. end
  1443. XP_UPDATE_tick()
  1444. end
  1445.  
  1446. -- Used only for compatibility with other mods
  1447. function interface.OtherEventsByPlayer(player,event_name,parameter)
  1448. if event_name=='mine_rock' then
  1449. XPByMiningRT(player.name,parameter)
  1450. end
  1451. if event_name=='adjust_player_stats' then
  1452. AdjustPlayerStat(player,parameter)
  1453. end
  1454. end
  1455.  
  1456.  
  1457. function interface.ResetAll()
  1458. ResetAll()
  1459. end
  1460.  
  1461.  
  1462. interface.CopyPlayerStats = CopyPlayerStats
  1463. function interface.PastePlayerStats(playername,stats)
  1464. PastePlayerStats(playername,stats)
  1465. end
  1466.  
  1467.  
  1468. --[[ HOW TO subscribe to my 2 events below:
  1469. script.on_event(remote.call("RPG", "get_on_player_updated_status"), function(event)
  1470. --do your stuff
  1471. end)
  1472. WARNING: this has to be done within on_init and on_load, otherwise the game will error about the remote.call
  1473.  
  1474. if your dependency on my mod is optional, remember to check if the remote interface exists before calling it:
  1475. if remote.interfaces["RPG"] then
  1476. --interface exists
  1477. end]]
  1478.  
  1479. function interface.get_on_player_updated_status()
  1480. return on_player_updated_status
  1481. end
  1482. -- Returns :
  1483. -- event.player_index = Index of the player that upgraded an attribute
  1484. -- event.level = Player current XP Level
  1485. -- event.attribute = The attribute that was upgraded
  1486.  
  1487. function interface.get_on_player_level_up()
  1488. return on_player_level_up
  1489. end
  1490. -- Returns :
  1491. -- event.player_index = Index of the player that has just leveled up
  1492. -- event.level = Player current XP Level
  1493.  
  1494.  
  1495. remote.add_interface("RPG", interface )
  1496.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement