Advertisement
Guest User

Untitled

a guest
Aug 7th, 2016
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.12 KB | None | 0 0
  1. -------------------------------------------------------------------------------
  2. -- factions Mod by Sapier
  3. --
  4. -- License WTFPL
  5. --
  6. --! @file factions.lua
  7. --! @brief factions core file containing datastorage
  8. --! @copyright Sapier
  9. --! @author Sapier
  10. --! @date 2013-05-08
  11. --
  12. -- Contact sapier a t gmx net
  13. -------------------------------------------------------------------------------
  14.  
  15. --read some basic information
  16. local factions_worldid = minetest.get_worldpath()
  17.  
  18. --! @class factions
  19. --! @brief main class for factions
  20. factions = {}
  21.  
  22. --! @brief runtime data
  23. factions.factions = {}
  24. factions.chunks = {}
  25. factions.players = {}
  26.  
  27. factions.print = function(text)
  28.     print("factions: " .. dump(text))
  29. end
  30.  
  31. factions.dbg_lvl1 = function() end --factions.print  -- errors
  32. factions.dbg_lvl2 = function() end --factions.print  -- non cyclic trace
  33. factions.dbg_lvl3 = function() end --factions.print  -- cyclic trace
  34.  
  35. factions.factions = {}
  36. --- settings
  37. factions.lower_laimable_height = -512
  38.  
  39. ---------------------
  40. --! @brief returns whether a faction can be created or not (allows for implementation of blacklists and the like)
  41. factions.can_create_faction = function(name)
  42.     if factions.factions[name] then
  43.         return false
  44.     else
  45.         return true
  46.     end
  47. end
  48.  
  49.  
  50. factions.Faction = {
  51.     power = 0.,
  52.     players = {},
  53.     ranks = {["leader"] = {"disband", "claim", "playerlist", "build", "edit", "ranks"},
  54.              ["member"] = {"build"}
  55.             },
  56.     leader = nil,
  57.     default_rank = "member",
  58.     default_leader_rank = "leader",
  59.     description = "Default faction description.",
  60.     invited_players = {},
  61.     land = {},
  62.     allies = {},
  63.     enemies = {},
  64.     join_free = false,
  65.     spawn = nil,
  66. }
  67.  
  68. factions.Faction.__index = factions.Faction
  69.  
  70. function factions.Faction:new(faction)
  71.     faction = {} or faction
  72.     setmetatable(faction, self)
  73.     return faction
  74. end
  75.  
  76.  
  77. factions.new_faction = function(name)
  78.     local faction =  factions.Faction:new(nil)
  79.     faction.name = name
  80.     factions.factions[name] = faction
  81.     factions.save()
  82.     return faction
  83. end
  84.  
  85. function factions.Faction.increase_power(self, power)
  86.     self.power = self.power + power
  87.     factions.save()
  88. end
  89.  
  90. function factions.Faction.decrease_power(self, power)
  91.     self.power = self.power - power
  92.     factions.save()
  93. end
  94.  
  95. function factions.Faction.add_player(self, player, rank)
  96.     self.players[player] = rank or self.default_rank
  97.     factions.players[player] = self.name
  98.     self:on_player_join(player)
  99.     self.invited_players[player] = nil
  100.     factions.save()
  101. end
  102.  
  103. function factions.Faction.remove_player(self, player)
  104.     self.players[player] = nil
  105.     factions.players[player] = nil
  106.     self:on_player_leave(player)
  107.     factions.save()
  108. end
  109.  
  110. function factions.Faction.claim_chunk(self, chunkpos)
  111.     factions.chunks[chunkpos] = self.name
  112.     self.land[chunkpos] = true
  113.     self:on_claim_chunk(chunkpos)
  114.     factions.save()
  115. end
  116. function factions.Faction.unclaim_chunk(self, chunkpos)
  117.     factions.chunks[chunkpos] = nil
  118.     self.land[chunkpos] = nil
  119.     self:on_unclaim_chunk(chunkpos)
  120.     factions.save()
  121. end
  122. function factions.Faction.disband(self)
  123.     for i in ipairs(self.players) do -- remove players affiliation
  124.         factions.players[self.players[i]] = nil
  125.     end
  126.     for k, v in pairs(self.land) do -- remove chunk claims
  127.         factions.chunks[v] = nil
  128.     end
  129.     self:on_disband()
  130.     factions.factions[self.name] = nil
  131.     factions.save()
  132. end
  133. function factions.Faction.set_leader(self, player)
  134.     self.leader = player
  135.     self.players[player] = self.default_leader_rank
  136.     self:on_new_leader()
  137.     factions.save()
  138. end
  139. function factions.Faction.has_permission(self, player, permission)
  140.     local p = self.players[player]
  141.     if not p then
  142.         return false
  143.     end
  144.     local perms = self.ranks[p]
  145.     for i in ipairs(perms) do
  146.         if perms[i] == permission then
  147.             return true
  148.         end
  149.     end
  150.     return false
  151. end
  152. function factions.Faction.set_description(self, new)
  153.     self.description = new
  154.     self:on_change_description()
  155.     factions.save()
  156. end
  157. function factions.Faction.invite_player(self, player)
  158.     self.invited_players[player] = true
  159.     self:on_player_invited(player)
  160.     factions.save()
  161. end
  162. function factions.Faction.revoke_invite(self, player)
  163.     self.invited_players[player] = nil
  164.     self:on_revoke_invite(player)
  165.     factions.save()
  166. end
  167. function factions.Faction.is_invited(self, player)
  168.     return table.contains(self.invited_players, player)
  169. end
  170. function factions.Faction.toggle_join_free(self, bool)
  171.     self.join_free = bool
  172.     self:on_toggle_join_free()
  173.     factions.save()
  174. end
  175. function factions.Faction.can_join(self, player)
  176.     return self.join_free or self.invited_players[player]
  177. end
  178. function factions.Faction.new_alliance(self, faction)
  179.     self.allies[faction] = true
  180.     self:on_new_alliance(faction)
  181.     if self.enemies[faction] then
  182.         self:end_enemy(faction)
  183.     end
  184.     factions.save()
  185. end
  186. function factions.Faction.end_alliance(self, faction)
  187.     self.allies[faction] = nil
  188.     self:on_end_alliance(faction)
  189.     factions.save()
  190. end
  191. function factions.Faction.new_enemy(self, faction)
  192.     self.enemies[faction] = true
  193.     self:on_new_enemy(faction)
  194.     if self.allies[faction] then
  195.         self:end_alliance(faction)
  196.     end
  197.     factions.save()
  198. end
  199. function factions.Faction.end_enemy(self, faction)
  200.     self.enemies[faction] = nil
  201.     self:on_end_enemy(faction)
  202.     factions.save()
  203. end
  204. function factions.Faction.set_spawn(self, pos)
  205.     self.spawn = pos
  206.     self:on_set_spawn()
  207.     factions.save()
  208. end
  209. function factions.Faction.add_rank(self, rank, perms)
  210.     self.ranks[rank] = perms
  211.     self:on_new_rank(rank)
  212.     factions.save()
  213. end
  214. function factions.Faction.delete_rank(self, rank, newrank)
  215.     for player, r in pairs(self.players) do
  216.         if r == rank then
  217.             self.players[player] = newrank
  218.         end
  219.     end
  220.     self.ranks[rank] = nil
  221.     self:on_delete_rank(rank, newrank)
  222.     factions.save()
  223. end
  224.  
  225. --------------------------
  226. -- callbacks for events --
  227. function factions.Faction.on_create(self)  --! @brief called when the faction is added to the global faction list
  228.     --TODO: implement
  229. end
  230. function factions.Faction.on_player_leave(self, player)
  231.     --TODO: implement
  232. end
  233. function factions.Faction.on_player_join(self, player)
  234.     --TODO: implement
  235. end
  236. function factions.Faction.on_claim_chunk(self, pos)
  237.     --TODO: implement
  238. end
  239. function factions.Faction.on_unclaim_chunk(self, pos)
  240.     --TODO: implement
  241. end
  242. function factions.Faction.on_disband(self, pos)
  243.     --TODO: implement
  244. end
  245. function factions.Faction.on_new_leader(self)
  246.     --TODO: implement
  247. end
  248. function factions.Faction.on_change_description(self)
  249.     --TODO: implement
  250. end
  251. function factions.Faction.on_player_invited(self, player)
  252.     --TODO: implement
  253. end
  254. function factions.Faction.on_toggle_join_free(self, player)
  255.     --TODO: implement
  256. end
  257. function factions.Faction.on_new_alliance(self, faction)
  258.     --TODO: implement
  259. end
  260. function factions.Faction.on_end_alliance(self, faction)
  261.     --TODO: implement
  262. end
  263. function factions.Faction.on_set_spawn(self)
  264.     --TODO: implement
  265. end
  266. function factions.Faction.on_add_rank(self, rank)
  267.     --TODO: implement
  268. end
  269. function factions.Faction.on_delete_rank(self, rank, newrank)
  270.     --TODO: implement
  271. end
  272.  
  273. --??????????????
  274. function factions.fix_powercap(name)
  275.     factions.data.factions[name].powercap = #factions.dynamic_data.membertable[name] + 10
  276. end
  277. --??????????????
  278.  
  279. function factions.get_chunk(pos)
  280.     return factions.chunks[factions.get_chunkpos(pos)]
  281. end
  282.  
  283. function factions.get_chunk_pos(pos)
  284.     return math.floor(pos.x / 16.)..","..math.floor(pos.z / 16.)
  285. end
  286.  
  287.  
  288. -------------------------------------------------------------------------------
  289. -- name: add_faction(name)
  290. --
  291. --! @brief add a faction
  292. --! @memberof factions
  293. --! @public
  294. --
  295. --! @param name of faction to add
  296. --!
  297. --! @return faction object/false (succesfully added faction or not)
  298. -------------------------------------------------------------------------------
  299. function factions.add_faction(name)
  300.     if factions.can_create_faction(name) then
  301.         local fac = factions.new_faction(name)
  302.         fac:on_create()
  303.         return fac
  304.     else
  305.         return nil
  306.     end
  307. end
  308.  
  309. -------------------------------------------------------------------------------
  310. -- name: get_faction_list()
  311. --
  312. --! @brief get list of factions
  313. --! @memberof factions
  314. --! @public
  315. --!
  316. --! @return list of factions
  317. -------------------------------------------------------------------------------
  318. function factions.get_faction_list()
  319.  
  320.     local retval = {}
  321.    
  322.     for key,value in pairs(factions.factions) do
  323.         table.insert(retval,key)
  324.     end
  325.    
  326.     return retval
  327. end
  328.  
  329. -------------------------------------------------------------------------------
  330. -- name: save()
  331. --
  332. --! @brief save data to file
  333. --! @memberof factions
  334. --! @private
  335. -------------------------------------------------------------------------------
  336. function factions.save()
  337.  
  338.     --saving is done much more often than reading data to avoid delay
  339.     --due to figuring out which data to save and which is temporary only
  340.     --all data is saved here
  341.     --this implies data needs to be cleant up on load
  342.    
  343.     local file,error = io.open(factions_worldid .. "/" .. "factions.conf","w")
  344.    
  345.     if file ~= nil then
  346.         file:write(minetest.serialize(factions.factions))
  347.         file:close()
  348.     else
  349.         minetest.log("error","MOD factions: unable to save factions world specific data!: " .. error)
  350.     end
  351.    
  352. end
  353.  
  354. -------------------------------------------------------------------------------
  355. -- name: load()
  356. --
  357. --! @brief load data from file
  358. --! @memberof factions
  359. --! @private
  360. --
  361. --! @return true/false
  362. -------------------------------------------------------------------------------
  363. function factions.load()
  364.     local file,error = io.open(factions_worldid .. "/" .. "factions.conf","r")
  365.    
  366.     if file ~= nil then
  367.         local raw_data = file:read("*a")
  368.         factions.factions = minetest.deserialize(raw_data)
  369.         for facname, faction in pairs(factions.factions) do
  370.             minetest.log("action", facname..","..faction.name)
  371.             for player, rank in pairs(faction.players) do
  372.                 minetest.log("action", player..","..rank)
  373.                 factions.players[player] = facname
  374.             end
  375.             for chunkpos, val in pairs(faction.land) do
  376.                 factions.chunks[chunkpos] = facname
  377.             end
  378.         end
  379.         file:close()
  380.     end
  381. end
  382.            
  383. minetest.register_on_dieplayer(
  384.     function(player)
  385.     end
  386. )
  387.  
  388. minetest.register_globalstep(
  389.     function(dtime)
  390.     end
  391. )
  392. minetest.register_on_joinplayer(
  393.     function(player)
  394.     end
  395. )
  396.  
  397.  
  398. local default_is_protected = minetest.is_protected
  399. minetest.is_protected = function(pos, player)
  400.     local chunkpos = factions.get_chunk_pos(pos)
  401.     local faction = factions.chunks[chunkpos]
  402.     if not faction then
  403.         return default_is_protected(pos, player)
  404.     else
  405.         faction = factions.factions[faction]
  406.         return not faction:has_permission(player, "build")
  407.     end
  408. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement