minigame_manager.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. local movement_timeout = sumo.movement_timeout --for how long players may run (and jump a little extra too)
  2. local function send_message(arena,num_str)
  3. arena_lib.HUD_send_msg_all("title", arena, num_str, 1,nil,0xFF0000)
  4. --arena_lib.HUD_send_msg_all(HUD_type, arena, msg, <duration>, <sound>, <color>)
  5. end
  6. arena_lib.on_load("sumo", function(arena)
  7. --send controls statement
  8. for pl_name, stats in pairs(arena.players) do
  9. ---minetest.log('First: '..dump(pl_name).. " is "..type(pl_name))
  10. sumo.invincible[pl_name] = true
  11. local message = 'Controls: '
  12. minetest.chat_send_player(pl_name,message)
  13. message = minetest.colorize('Red', '[Punch]: ')..minetest.colorize('Green', 'Push other players ').. " Timeout: 0.3 sec"
  14. minetest.chat_send_player(pl_name,message)
  15. message = minetest.colorize('Red', '[Punch]+[Sneak]: ')..minetest.colorize('Green', 'Exchange places ').. " Timeout: 0.3 sec"
  16. minetest.chat_send_player(pl_name,message)
  17. message = minetest.colorize('Red', '[Place]: ')..minetest.colorize('Green', 'Vault ').. " Timeout: 1 sec"
  18. minetest.chat_send_player(pl_name,message)
  19. message = minetest.colorize('Red', '[Aux (e)]: ')..minetest.colorize('Green', 'Run! ').. " Timeout: 5 sec"
  20. minetest.chat_send_player(pl_name,message)
  21. arena.players[pl_name].lives = arena.lives
  22. local player = minetest.get_player_by_name(pl_name)
  23. local pos = player:get_pos()
  24. --minetest.log('Second: '..dump(pl_name).. " is "..type(pl_name))
  25. minetest.after(.2,function(pl_name,pos)
  26. --minetest.log('Third: '..dump(pl_name).. " is "..type(pl_name))
  27. local player = minetest.get_player_by_name(pl_name)
  28. if player and arena_lib.is_player_in_arena(pl_name, 'sumo') then
  29. player:move_to(pos)
  30. end
  31. end,pl_name,pos)
  32. end
  33. --countdown timer, give item at appropriate time
  34. send_message(arena,'3')
  35. minetest.after(1, function(arena)
  36. send_message(arena,'2')
  37. minetest.after(1, function(arena)
  38. send_message(arena,'1')
  39. minetest.after(1, function(arena)
  40. arena_lib.HUD_send_msg_all("title", arena, "Fight!", 1,nil,0x00FF00)
  41. local item = ItemStack("sumo:pushstick")
  42. for pl_name, stats in pairs(arena.players) do
  43. sumo.invincible[pl_name] = false
  44. local player = minetest.get_player_by_name(pl_name)
  45. player:get_inventory():set_stack("main", 1, item)
  46. end
  47. end, arena)
  48. end, arena)
  49. end, arena)
  50. end)
  51. --this is necessary beacuse it is required by arena_lib for timed games
  52. arena_lib.on_time_tick('sumo', function(arena)
  53. --handle speed boosts
  54. for pl_name, stats in pairs(arena.players) do
  55. local player = minetest.get_player_by_name(pl_name)
  56. local keys = player:get_player_control()
  57. local set_run_speed = false -- a marker to tell whether to set to the run speed or not
  58. if stats.run_timeout > 0 then
  59. arena.players[pl_name].run_timeout = arena.players[pl_name].run_timeout - 1
  60. end
  61. if keys.aux1 and stats.run_timeout <= 0 then
  62. set_run_speed = true
  63. if stats.running == false then
  64. arena.players[pl_name].running = true
  65. arena.players[pl_name].run_start_time = minetest.get_gametime()
  66. end
  67. local start_run_time = arena.players[pl_name].run_start_time
  68. local current_time = minetest.get_gametime()
  69. if current_time - start_run_time > movement_timeout then
  70. set_run_speed = false
  71. arena.players[pl_name].running = false
  72. arena.players[pl_name].run_timeout = 5
  73. end
  74. end
  75. if set_run_speed == true and not sumo.invincible[pl_name] then
  76. player:set_physics_override({
  77. speed = arena.speed * 1.4,
  78. jump = arena.jump * 1.3,
  79. })
  80. else
  81. player:set_physics_override({
  82. speed = arena.speed,
  83. jump = arena.jump,
  84. })
  85. arena.players[pl_name].running = false
  86. end
  87. --handle messages
  88. if arena.in_game and not arena.in_celebration then
  89. local c = 0x00FF00
  90. if arena.current_time < 60 then
  91. c = 0xFFFF00
  92. end
  93. if arena.current_time < 10 then
  94. c = 0xFF0000
  95. end
  96. local message = " Time Left: "..arena.current_time
  97. if arena.players[pl_name].run_timeout > 0 then
  98. message = 'Run Timeout: '..arena.players[pl_name].run_timeout..message
  99. end
  100. if arena.players[pl_name].running == true then
  101. message = 'Running... '..message
  102. end
  103. message = message.." Lives:"..arena.players[pl_name].lives
  104. if sumo.invincible[pl_name] == true then
  105. message = "Invincible"
  106. c = 0xFF0000
  107. end
  108. if arena.current_time < arena.initial_time - 1 then
  109. arena_lib.HUD_send_msg('hotbar', pl_name, message, 1,nil,c)
  110. end
  111. end
  112. end
  113. end)
  114. minetest.register_on_player_hpchange(function(player, hp_change,reason)
  115. local pl_name = player:get_player_name()
  116. if arena_lib.is_player_in_arena(pl_name, 'sumo') then
  117. local arena = arena_lib.get_arena_by_player(pl_name)
  118. local hp = player:get_hp()
  119. --exclude some unwanted possibilities
  120. if arena.in_celebration then --protect winners from damage
  121. return 0
  122. end
  123. if reason.type ~= "node_damage" then return 0 end
  124. if type(arena_lib.is_player_spectating) == "function" and arena_lib.is_player_spectating(pl_name) then return 0 end -- dont let spectators die, or get the pushstick, only run this if spectate mode is available.
  125. if sumo.invincible[pl_name] then return 0 end --protects players from dying twice in a row
  126. if hp + hp_change <= 0 then --dont ever kill players, but if a damage *would* kill them, then eliminate them, and set their health back to normal
  127. sumo.invincible[pl_name] = true
  128. local player = minetest.get_player_by_name(pl_name)
  129. local inv = player:get_inventory()
  130. local taken = inv:remove_item("main", ItemStack("sumo:pushstick"))
  131. arena.players[pl_name].lives = arena.players[pl_name].lives - 1
  132. if arena.players[pl_name].lives == 0 then
  133. local player = minetest.get_player_by_name(pl_name)
  134. if player then
  135. arena_lib.remove_player_from_arena(pl_name, 1)
  136. arena_lib.HUD_hide('hotbar', pl_name)
  137. end
  138. else
  139. arena_lib.HUD_send_msg("title", pl_name,'You Died! Lives: '.. arena.players[pl_name].lives , 2,nil,0xFF1100)
  140. minetest.after(2,function(pl_name)
  141. --sumo.invincible[pl_name] = false
  142. if arena_lib.is_player_in_arena(pl_name, 'sumo') then
  143. local arena = arena_lib.get_arena_by_player(pl_name)
  144. if arena.in_game == true then
  145. arena_lib.HUD_send_msg("title", pl_name,'Fight!', 2,nil,0x00FF00)
  146. local player = minetest.get_player_by_name(pl_name)
  147. local sp_pos = arena_lib.get_random_spawner(arena)
  148. if player then
  149. player:move_to(sp_pos, false)
  150. player:get_inventory():set_stack("main", 1, ItemStack("sumo:pushstick"))
  151. minetest.after(3,function(pl_name)
  152. sumo.invincible[pl_name] = false
  153. end,pl_name)
  154. end
  155. end
  156. end
  157. end,pl_name)
  158. minetest.sound_play('sumo_elim', {
  159. to_player = pl_name,
  160. gain = 2.0,
  161. })
  162. player:move_to(arena.jail_pos, false)
  163. end
  164. player:set_hp(20)
  165. return 0
  166. else
  167. return hp_change --if it would not kill players then apply damage as normal
  168. end
  169. else
  170. return hp_change
  171. end
  172. end, true)
  173. --if the game times out
  174. arena_lib.on_timeout('sumo', function(arena)
  175. local winner_names = {}
  176. for p_name, p_stats in pairs(arena.players) do
  177. table.insert(winner_names, p_name)
  178. end
  179. --arena_lib.load_celebration('sumo', arena, winner_names)
  180. arena_lib.force_arena_ending('sumo', arena,'timeout')
  181. end)
  182. arena_lib.on_death('sumo', function(arena, p_name, reason)
  183. arena.players[p_name].lives = arena.players[p_name].lives - 1
  184. if arena.players[p_name].lives == 0 then
  185. local player = minetest.get_player_by_name(p_name)
  186. if player then
  187. arena_lib.remove_player_from_arena(p_name, 1)
  188. arena_lib.HUD_hide('hotbar', p_name)
  189. end
  190. else
  191. arena_lib.HUD_send_msg("title", p_name,'You Died! Lives: '.. arena.players[p_name].lives , 2,nil,0xFF1100)
  192. local sp_pos = arena_lib.get_random_spawner(arena)
  193. local player = minetest.get_player_by_name(p_name)
  194. minetest.sound_play('sumo_elim', {
  195. to_player = p_name,
  196. gain = 2.0,
  197. })
  198. if player then
  199. player:move_to(sp_pos, false)
  200. end
  201. end
  202. end)
  203. arena_lib.on_celebration('sumo', function(arena, winner_name)
  204. arena_lib.HUD_hide('hotbar', arena)
  205. end)
  206. arena_lib.on_quit('sumo', function(arena, pl_name, is_forced)
  207. local player = minetest.get_player_by_name(pl_name)
  208. if player then
  209. arena_lib.HUD_hide('hotbar', pl_name)
  210. end
  211. end)
  212. arena_lib.on_eliminate('sumo', function(arena, p_name)
  213. minetest.sound_play('sumo_lose', {
  214. to_player = p_name,
  215. gain = 2.0,
  216. })
  217. --minetest.chat_send_all(dump(arena))
  218. local count = 0
  219. local sound = 'sumo_elim'
  220. for p_name,data in pairs(arena.players) do
  221. count = count + 1
  222. end
  223. if count == 1 then
  224. sound = 'sumo_win'
  225. end
  226. for p_name, stats in pairs(arena.players) do
  227. minetest.sound_play(sound, {
  228. to_player = p_name,
  229. gain = 2.0,
  230. })
  231. end
  232. end)
  233. --remove stick if in inv when joinplayer
  234. minetest.register_on_joinplayer(function(player)
  235. local inv = player:get_inventory()
  236. local stack = ItemStack("sumo:pushstick")
  237. local taken = inv:remove_item("main", stack)
  238. end)