Advertisement
Guest User

init.lua

a guest
Apr 28th, 2013
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.45 KB | None | 0 0
  1. local path = minetest.get_modpath(minetest.get_current_modname())
  2. dofile(path.."/config.txt")
  3. dofile(path.."/api.lua")
  4.  
  5. local filepath = minetest.get_worldpath()
  6.  
  7. local function save_player_data()
  8.     local file = io.open(filepath .. "/playerdata.txt", "w")
  9.     file:write(minetest.serialize(playerdata))
  10.     file:close()
  11. end
  12.  
  13. function load_player_data()
  14.     local file = io.open(filepath .. "/playerdata.txt", "r")
  15.     if file then
  16.         local table = minetest.deserialize(file:read("*all"))
  17.         if type(table) == "table" then
  18.             return table
  19.            
  20.         end
  21.     end
  22.     return {}
  23. end
  24.  
  25. local creative_inventory = {}
  26. creative_inventory.creative_inventory_size = 0
  27. playerdata = load_player_data()
  28.  
  29. minetest.register_on_joinplayer(function(player)
  30.     pname = player:get_player_name()
  31.     playerdata = load_player_data()
  32.     if not playerdata[pname] then
  33.         playerdata[pname] = {}
  34.         playerdata[pname]['gamemode'] = Default_Mode
  35.         save_player_data()
  36.     end
  37.     if not playerdata[pname]['gamemode'] then
  38.         playerdata[pname]['gamemode'] = Default_Mode
  39.         save_player_data()
  40.         playerdata = load_player_data()
  41.         minetest.after(0.3, function() updategamemode(pname, "0") end)
  42.     else
  43.         minetest.after(0.3, function() updategamemode(pname, "0") end)
  44.     end
  45. end)
  46.  
  47. --Ensure that all mods are loaded before editing inventory.
  48. minetest.after(0.2, function()
  49. local trash = minetest.create_detached_inventory("creative_trash", {
  50.         -- Allow the stack to be placed and remove it in on_put()
  51.         -- This allows the creative inventory to restore the stack
  52.         allow_put = function(inv, listname, index, stack, player)
  53.                 return stack:get_count()
  54.         end,
  55.         on_put = function(inv, listname, index, stack, player)
  56.             inv:set_stack(listname, index, "")
  57.         end,
  58. })
  59. trash:set_size("main", 1)
  60.  
  61.  
  62. creative_list = {}
  63. for name,def in pairs(minetest.registered_items) do
  64.         if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0)
  65.                 and def.description and def.description ~= "" then
  66.             table.insert(creative_list, name)
  67.         end
  68.  
  69. end
  70.  
  71.  
  72. local inv = minetest.create_detached_inventory("creative", {
  73.         allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
  74.                 return count
  75.         end,
  76.         allow_put = function(inv, listname, index, stack, player)
  77.             return 0
  78.         end,
  79.         allow_take = function(inv, listname, index, stack, player)
  80.                 return -1
  81.         end,
  82.         on_move = function(inv, from_list, from_index, to_list, to_index, count, player)
  83.         end,
  84.         on_put = function(inv, listname, index, stack, player)
  85.         end,
  86.         on_take = function(inv, listname, index, stack, player)
  87.             print(player:get_player_name().." takes item from creative inventory; listname="..dump(listname)..", index="..dump(index)..", stack="..dump(stack))
  88.             if stack then
  89.                 print("stack:get_name()="..dump(stack:get_name())..", stack:get_count()="..dump(stack:get_count()))
  90.             end
  91.         end,
  92.     })
  93.    
  94. table.sort(creative_list)
  95.  
  96. inv:set_size("main", #creative_list)
  97.  
  98. for _,itemstring in ipairs(creative_list) do
  99.     inv:add_item("main", ItemStack(itemstring))
  100. end
  101.     creative_inventory.creative_inventory_size = #creative_list
  102.  
  103. end)   
  104.  
  105. -- Create detached creative inventory after loading all mods
  106. function updategamemode(pname, status)
  107.     playerdata = load_player_data()
  108.     if not status then
  109.     print(pname.." has switched to "..playerdata[pname]['gamemode'].." Mode.")
  110.     minetest.chat_send_all(pname.." has switched to "..playerdata[pname]['gamemode'].." Mode.")
  111.     end
  112.     if playerdata[pname]['gamemode'] == "Creative" then
  113.     local player = minetest.env:get_player_by_name(pname)
  114.    
  115.     creative_inventory.set_creative_formspec(player, 1, 1)
  116.     else
  117.    
  118.     local player = minetest.env:get_player_by_name(pname)
  119.     creative_inventory.set_creative_formspec(player, 1, 1)
  120.  
  121.     end
  122. end
  123. creative_inventory.set_creative_formspec = function(player, start_i, pagenum)
  124. playerdata = load_player_data()
  125.     if playerdata[player:get_player_name()]['gamemode'] == "Creative" then
  126.         inven.creative_inv(player)
  127.     elseif playerdata[player:get_player_name()]['gamemode'] == "Survival" then
  128.         inven.survival_inv(player)
  129.     end
  130. end
  131. minetest.register_on_player_receive_fields(function(player, formname, fields)
  132.     if not playerdata[pname]['gamemode'] == "Creative" then
  133.         return
  134.     end
  135.     -- Figure out current page from formspec
  136.     local current_page = 0
  137.     local formspec = player:get_inventory_formspec()
  138.     local start_i = string.match(formspec, "list%[detached:creative;main;[%d.]+,[%d.]+;[%d.]+,[%d.]+;(%d+)%]")
  139.     start_i = tonumber(start_i) or 0
  140.  
  141.     if fields.clear_inventory then
  142.         local inventory = {}
  143.         player:get_inventory():set_list("main", inventory)
  144.     end
  145.    
  146.     if fields.creative_search then
  147.         inven.creative_searchitems(player)
  148.     end
  149.    
  150.     if fields.creative_survival then
  151.         inven.creative_inv(player)
  152.     end
  153.    
  154.     if fields.creative_prev then
  155.         start_i = start_i - 4*6
  156.     end
  157.     if fields.creative_next then
  158.         start_i = start_i + 4*6
  159.     end
  160.  
  161.     if start_i < 0 then
  162.         start_i = start_i + 4*6
  163.     end
  164.     if start_i >= creative_inventory.creative_inventory_size then
  165.         start_i = start_i - 4*6
  166.     end
  167.        
  168.     if start_i < 0 or start_i >= creative_inventory.creative_inventory_size then
  169.         start_i = 0
  170.     end
  171.  
  172.     creative_inventory.set_creative_formspec(player, start_i, start_i / (6*4) + 1)
  173. end)
  174.  
  175. minetest.register_chatcommand('gamemode',{
  176.     params = "1 | 0",
  177.     description = 'Switch your gamemode',
  178.     privs = {gamemode = true},
  179.     func = function(name, param)
  180.         if param == "1" then
  181.             playerdata[name]['gamemode'] = "Creative"
  182.             save_player_data()
  183.             minetest.chat_send_player(name, 'Your gamemode is now: '..playerdata[name]['gamemode'])
  184.             updategamemode(name)
  185.         elseif param == "0" then
  186.             playerdata[name]['gamemode'] = "Survival"
  187.             save_player_data()
  188.             minetest.chat_send_player(name, 'Your gamemode is now: '..playerdata[name]['gamemode'])
  189.             updategamemode(name)
  190.         else
  191.             minetest.chat_send_player(name, "Error: That player does not exist!")
  192.             return false
  193.         end
  194.     end
  195. })
  196.  
  197.  
  198. --[[minetest.register_on_punchnode(function(pos, node, puncher)
  199.     local pos = pos
  200.     local pname = puncher:get_player_name()
  201.     if playerdata[pname]['gamemode'] == "Creative" then
  202.     minetest.after(0.1, function()
  203.     minetest.env:remove_node(pos)
  204.     end)
  205.     end
  206. end)]]
  207.  
  208. minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
  209.     local pname = placer:get_player_name()
  210.     if playerdata[pname]['gamemode'] == "Creative" then
  211.     return true
  212.     end
  213. end)
  214.  
  215. minetest.register_privilege("gamemode", "Permission to use /gamemode.")
  216.  
  217. -- Load Crafting Table
  218. dofile(path.."/workbench.lua")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement