Advertisement
llVIU

RPG System 0.18.44 modification by Honktown

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