Advertisement
Guest User

minetest antifrief

a guest
Apr 7th, 2017
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.96 KB | None | 0 0
  1. -- ANTI GRIEF by rnd
  2. -- Copyright 2016 rnd
  3.  
  4. ----------------------------------------------------------------------------
  5. -- This program is free software: you can redistribute it and/or modify
  6. -- it under the terms of the GNU General Public License as published by
  7. -- the Free Software Foundation, either version 3 of the License, or
  8. -- (at your option) any later version.
  9.  
  10. -- This program is distributed in the hope that it will be useful,
  11. -- but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. -- GNU General Public License for more details.
  14.  
  15. -- You should have received a copy of the GNU General Public License
  16. -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17. ----------------------------------------------------------------------------
  18.  
  19.  
  20. -- prevents placing of lava/liquid sources or buckets above 0
  21.  
  22.  
  23. --water
  24. --bucket:bucket_water
  25.  
  26. function prevent_place_above(name)
  27.  
  28.     local old_on_place=minetest.registered_craftitems[name];--.on_place;
  29.     local old_after_place_node = minetest.registered_nodes[name];--.after_place_node;
  30.     --after_place_node = func(pos, placer, itemstack, pointed_thing)
  31.    
  32.     if old_on_place and old_on_place.on_place then
  33.         old_on_place=old_on_place.on_place;
  34.         minetest.registered_craftitems[name].on_place=function(itemstack, placer, pointed_thing)
  35.             local pos = pointed_thing.above
  36.             if pos.y>0 then
  37.                 minetest.log("action","ANTI GRIEF " .. placer:get_player_name() .. " tried to place " .. name .. " at " .. minetest.pos_to_string(pos));
  38.                 return itemstack
  39.             else
  40.                 return old_on_place(itemstack, placer, pointed_thing)
  41.             end
  42.         end
  43.     return;
  44.     end
  45.  
  46.     if old_after_place_node then
  47.  
  48.         old_after_place_node=old_after_place_node.after_place_node
  49.        
  50.         local table = minetest.registered_nodes[name];
  51.         local table2 = {}
  52.         for i,v in pairs(table) do
  53.             table2[i] = v
  54.         end
  55.        
  56.         table2.after_place_node=function(pos, placer, itemstack, pointed_thing)
  57.             --after_place_node = func(pos, placer, itemstack, pointed_thing)
  58.             local pos = pointed_thing.above
  59.             if pos.y>0 then
  60.                 minetest.log("action","ANTI GRIEF " .. placer:get_player_name() .. " tried to place " .. name .. " at " .. minetest.pos_to_string(pos));
  61.                 minetest.set_node(pos, {name = "air"});
  62.                 return itemstack
  63.             end
  64.         end
  65.        
  66.        
  67.         minetest.register_node(":"..name, table2)
  68.         return;
  69.     end
  70.    
  71.        
  72.     return;
  73. end
  74.    
  75.  
  76. minetest.after(0,
  77. function ()
  78. prevent_place_above("bucket:bucket_water");
  79. prevent_place_above("default:water_source");
  80. prevent_place_above("bucket:bucket_lava");
  81. prevent_place_above("default:lava_source");
  82. prevent_place_above("es:toxic_water_source");
  83. prevent_place_above("es:mud");
  84. end
  85. )
  86.  
  87.  
  88.  
  89. --TNT only below 150!
  90.  
  91. function no_tnt_above(name)
  92.  
  93.     local tnt_on_place=minetest.registered_craftitems[name];--.on_place;
  94.     local tnt_after_place_node = minetest.registered_nodes[name];--.after_place_node;
  95.     --after_place_node = func(pos, placer, itemstack, pointed_thing)
  96.    
  97.     if tnt_on_place and tnt_on_place.on_place then
  98.         tnt_on_place=tnt_on_place.on_place;
  99.         minetest.registered_craftitems[name].on_place=function(itemstack, placer, pointed_thing)
  100.             local pos = pointed_thing.above
  101.             if pos.y>-150 then
  102.                 minetest.log("action","ANTI GRIEF " .. placer:get_player_name() .. " tried to place " .. name .. " at " .. minetest.pos_to_string(pos));
  103.                 return itemstack
  104.             else
  105.                 return tnt_on_place(itemstack, placer, pointed_thing)
  106.             end
  107.         end
  108.     return;
  109.     end
  110.  
  111.     if tnt_after_place_node then
  112.  
  113.         tntafter_place_node=tnt_after_place_node.after_place_node
  114.        
  115.         local table = minetest.registered_nodes[name];
  116.         local table2 = {}
  117.         for i,v in pairs(table) do
  118.             table2[i] = v
  119.         end
  120.        
  121.         table2.after_place_node=function(pos, placer, itemstack, pointed_thing)
  122.             --after_place_node = func(pos, placer, itemstack, pointed_thing)
  123.             local pos = pointed_thing.above
  124.             if pos.y>-150 then
  125.                 minetest.log("action","ANTI GRIEF " .. placer:get_player_name() .. " tried to place " .. name .. " at " .. minetest.pos_to_string(pos));
  126.                 minetest.set_node(pos, {name = "air"});
  127.                 return itemstack
  128.             end
  129.         end
  130.        
  131.        
  132.         minetest.register_node(":"..name, table2)
  133.         return;
  134.     end
  135.    
  136.        
  137.     return;
  138. end
  139.    
  140.  
  141. minetest.after(0,
  142. function ()
  143.  no_tnt_above("tnt:tnt");
  144.  
  145. end
  146. )
  147.  
  148. --lava
  149. --bucket:bucket_water
  150. --check and block player lava
  151.  
  152. minetest.register_globalstep(function(dtime)
  153.     if minetest.is_singleplayer() == false then
  154.         local range = 10
  155.         for _,player in ipairs(minetest.get_connected_players()) do
  156.             local player_pos = player:getpos()
  157.             local pos = minetest.env:find_node_near(player_pos, range, "default:stone")
  158.             --minetest.log("action","ANTI GRIEF " .. placer:get_player_name() .. " tried to place " .. name .. " at " .. minetest.pos_to_string(pos));
  159.             while pos~= nil do
  160.                 minetest.env:add_node(pos,{name="default:lava_source"})
  161.                 pos = minetest.env:find_node_near(player_pos, range, "default:stone")
  162.             end
  163.         end
  164.     end
  165. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement