Advertisement
Guest User

Untitled

a guest
Aug 19th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.36 KB | None | 0 0
  1. module("game_manager", package.seeall)
  2.  
  3. player_plugin = {
  4.     properties = {
  5.         team = state_variables.state_string()
  6.     },
  7.  
  8.     init = function(self)
  9.         self.team = '' -- empty until set
  10.     end,
  11.  
  12.     activate = function(self)
  13.         get_singleton():pick_team(self)
  14.  
  15.         self:connect("pre_deactivate", function(self)
  16.             get_singleton():leave_team(self)
  17.         end)
  18.  
  19.         self:respawn()
  20.     end,
  21.  
  22.     client_activate = function(self)
  23.         self:connect("client_respawn", function(self)
  24.             get_singleton():place_player(self)
  25.         end)
  26.     end
  27. }
  28.  
  29. function setup(plugins)
  30.     plugins = plugins or {}
  31.  
  32.     entity_classes.reg(
  33.         plugins.bake(
  34.             entity.logent,
  35.             table.mergedicts(
  36.                 {
  37.                     _class     = "game_manager",
  38.                     properties = {
  39.                         team_data = state_variables.state_json(),
  40.                         victory_sound = state_variables.state_string()
  41.                     },
  42.  
  43.                     activate = function(self)
  44.                         self:add_tag("game_manager")
  45.                         self.teams = {}
  46.                         self.victory_sound = ""
  47.                     end,
  48.  
  49.                     get_players = function(self)
  50.                         local players = {}
  51.                         for i, team in pairs(table.values(self.teams)) do
  52.                             table.mergearrays(players, team.player_list)
  53.                         end
  54.                         return players
  55.                     end,
  56.  
  57.                     start_game = function(self)
  58.                         local players = self:get_players()
  59.  
  60.                         -- clear teams
  61.                         for i, team in pairs(table.values(self.teams)) do
  62.                             team.score = 0
  63.                             team.player_list = {}
  64.                         end
  65.  
  66.                         -- place players randomly
  67.                         while #players > 0 do
  68.                             local player = table.pop(players, math.floor(math.random() * #players))[1]
  69.                             self:pick_team(player, false) -- pick teams with no syncing until the end
  70.                         end
  71.  
  72.                         self:sync_team_data()
  73.  
  74.                         for i, player in pairs(self:get_players()) do
  75.                             player:respawn()
  76.                         end
  77.  
  78.                         self:emit("start_game")
  79.                         self.game_running = true
  80.                     end,
  81.  
  82.                     end_game = function(self)
  83.                         self.game_running = false
  84.                         -- usually you want to connect something here to run
  85.                         -- self.start_game, but see intermission plugin
  86.                         self:emit("end_game")
  87.                     end,
  88.  
  89.                     register_teams = function(self, data)
  90.                         for i, team in pairs(data) do
  91.                             self.teams[team._name] = {
  92.                                 _name = team._name,
  93.                                 player_list = {},
  94.                                 player_setup = team.setup,
  95.                                 score = 0,
  96.                                 flag_model_name = team.flag_model_name or '',
  97.                                 kwargs = team.kwargs or {}
  98.                             }
  99.                         end
  100.  
  101.                         self:emit('post_register_teams')
  102.                         self:start_game()
  103.                     end,
  104.  
  105.                     sync_team_data = function(self)
  106.                         -- we are called during deactivation process, as players leave
  107.                         if not self.deactivated then
  108.                             self.team_data = self.teams
  109.                         end
  110.                         self:emit("team_data_modified")
  111.                     end,
  112.  
  113.                     pick_team = function(self, player, sync)
  114.                         sync = sync or true
  115.                         local smallest = ""
  116.                         for name, team in pairs(self.teams) do
  117.                             if smallest == "" or #team.player_list < #self.teams[smallest].player_list then
  118.                                 smallest = name
  119.                             end
  120.                         end
  121.                         self.set_player_team(player, smallest, sync)
  122.                     end,
  123.  
  124.                     set_player_team = function(self, player, team, sync)
  125.                         if player.team then
  126.                             self:leave_team(player, sync)
  127.                         end
  128.  
  129.                         player.team = team
  130.                         team = self.teams[team]
  131.                         table.insert(team.player_list, player)
  132.                         team:player_setup(player)
  133.                         player:respawn()
  134.  
  135.                         if sync then
  136.                             self:sync_team_data()
  137.                         end
  138.                     end,
  139.  
  140.                     leave_team = function(self, player, sync)
  141.                         sync = sync or true
  142.  
  143.                         local player_list = self.teams[player.team].player_list
  144.                         local index = table.find(player_list, player)
  145.                         if index and index >= 0 then
  146.                             table.pop(player_list, index)
  147.                             if sync then
  148.                                 self:sync_team_data()
  149.                             end
  150.                         end
  151.                     end,
  152.  
  153.                     place_player = function(self, player)
  154.                         local start_tag = "start_" .. player.team
  155.                         local possibles = entity_store.get_all_bytag(start_tag)
  156.                         if possibles and #possibles > 0 then
  157.                             local start = possibles[math.floor(math.random() * #possibles)]
  158.                             if start then
  159.                                 start:place_entity(player)
  160.                                 return nil
  161.                             end
  162.                         end
  163.                         logging.log(logging.WARNING, "player start not found (\"%(1)s\"), placing player elsewhere .." % { start_tag })
  164.                         player.position = { 512, 512, 571 }
  165.                     end,
  166.  
  167.                     adjust_score = function(self, team_name, diff)
  168.                         self.teams[team_name].score = self.teams[team_name].score + diff
  169.                         self:sync_team_data()
  170.                     end,
  171.  
  172.                     get_scoreboard_text = function()
  173.                         local data = {}
  174.                         for team_name, team in pairs(self.team_data) do
  175.                             table.insert(data, { -1, " << " .. team_name .. " >> " .. team.score .. " points" })
  176.                             for idx, player in pairs(team.player_list) do
  177.                                 table.insert(data, { player.uid, player._name .. " -" })
  178.                             end
  179.                         end
  180.                         return data
  181.                     end,
  182.  
  183.                     client_activate = function(self)
  184.                         self:connect(state_variables.get_onmodify_prefix() .. "team_data", function(self, value)
  185.                             if self.team_data and value and entity_store.get_plyent() then
  186.                                 local player_team = entity_store.get_plyent().team
  187.                                 if value[player_team].score > self.team_data[player_team].score and
  188.                                    self.victory_sound and
  189.                                    self.victory_sound ~= "" then sound.play(self.victory_sound)
  190.                                 end
  191.                             end
  192.                         end)
  193.                     end,
  194.  
  195.                     set_localanim = function(self) end -- just so it can fake being animated by actions
  196.                 },
  197.                 plugins
  198.             )
  199.         )
  200.     )
  201.  
  202.     if SERVER then
  203.         entity_store.new("game_manager")
  204.     end
  205. end
  206.  
  207. function get_singleton()
  208.     if not singleton then
  209.         singleton = entity_store.get_all_byclass("game_manager")[1]
  210.     end
  211.     return singleton
  212. end
  213.  
  214. function get_scoreboard_text()
  215.     return get_singleton().get_scoreboard_text()
  216. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement