Advertisement
Guest User

Factorio Stamina control.lua patch

a guest
Mar 3rd, 2019
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.75 KB | None | 0 0
  1. -- redone by featherwinglove 190301
  2.  
  3. local TICKS = 3
  4. --local DEBUG = true
  5.  
  6. -- local ref_max, ref_regen = {},{}
  7. local pop = {index=1,count=1}
  8.  
  9. local run_penalty, mining_rate, drain_rate
  10.  
  11. local function maketables()
  12. if not global.ref_max then
  13. global.ref_max = {}
  14. end
  15. if not global.ref_regen then
  16. global.ref_regen = {}
  17. end
  18. for _,e in pairs(game.entity_prototypes) do
  19. if e.type=="player" then
  20. global.ref_max[e.name] = e.max_health
  21. global.ref_regen[e.name] = e.healing_per_tick * TICKS
  22. end
  23. end
  24. run_penalty = settings.global["stamina-run-penalty"].value
  25. mining_rate = settings.global["stamina-mine-rate"].value
  26. drain_rate = 1/settings.startup["stamina-craft-effective-rate"].value - 1
  27. end
  28.  
  29. local function load_settings()
  30. run_penalty = settings.global["stamina-run-penalty"].value
  31. mining_rate = settings.global["stamina-mine-rate"].value
  32. drain_rate = 1/settings.startup["stamina-craft-effective-rate"].value - 1
  33. end
  34.  
  35. script.on_init(maketables)
  36. script.on_load(load_settings)
  37.  
  38. script.on_event(defines.events.on_runtime_mod_setting_changed, load_settings)
  39.  
  40. script.on_nth_tick(TICKS, function(event)
  41. local mans, drain, my_max, my_regen
  42.  
  43. for _,p in pairs(game.players) do
  44. mans = p.character
  45. if mans then
  46.  
  47. my_max = global.ref_max[mans.name] + p.character_health_bonus + p.force.character_health_bonus
  48. my_regen = global.ref_regen[mans.name]
  49.  
  50. drain = p.mining_state.mining and mining_rate*my_regen or 0
  51. if p.crafting_queue_size > 0 then drain = drain + my_regen end
  52.  
  53. if drain > 0 then
  54. drain = p.in_combat and drain*drain_rate or drain*drain_rate + my_regen
  55.  
  56. -- if DEBUG then p.print(string.format("%f/%f (%f-%f)",mans.health,my_max,global.ref_regen[mans.name],drain)) end
  57. if mans.health < drain then
  58. mans.die()
  59. -- if p.mod_settings["stamina-alert-level"].value>0 then p.zoom = 1 end
  60. else
  61. mans.health = mans.health - drain
  62. drain = mans.health/ (my_max* (p.mod_settings["stamina-alert-level"].value))
  63. if drain<1 then
  64. if p.crafting_queue_size > 0 and p.mod_settings["stamina-alert-level-cancel"].value then
  65. mans.cancel_crafting(pop)
  66. p.print{"stamina-text.canceled-craft"}
  67. -- p.play_sound{path="utility/cannot_build",volume_modifier=1}
  68. else
  69. p.print{"stamina-text.stamina-danger"}
  70. if event.tick%18==0 then p.play_sound{path="utility/alert_damage",volume_modifier=1-drain*drain/2} end
  71. end
  72. --[[
  73. p.play_sound{path="utility/alert_damage",volume_modifier=1-drain*drain/2}
  74. p.zoom = 1/(drain*.9921875+.0078125)
  75. --]]
  76. end
  77. end
  78. else
  79. if mans.health<my_max and p.walking_state.walking and not p.in_combat then mans.health = mans.health - my_regen * run_penalty end
  80. end
  81. end
  82. end
  83.  
  84. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement