summaryrefslogtreecommitdiff
path: root/init.lua
diff options
context:
space:
mode:
Diffstat (limited to 'init.lua')
-rw-r--r--init.lua467
1 files changed, 17 insertions, 450 deletions
diff --git a/init.lua b/init.lua
index 2aed384..b78dc12 100644
--- a/init.lua
+++ b/init.lua
@@ -1,303 +1,29 @@
minetest.log('action','Loading Land Rush Land Claim')
-landrush = {}
-
-local requireClaim = false -- Change this to true if you want to require people to claim an area before building or digging
-local onlineProtection = true -- false turns protection off when the claim owner is online
-
-local offenseDamage = 4 -- how much damage is dealt to the player when they dig in protected areas
-
-local autoBan = false -- users who attempt to dig and build in claimed areas can be auto banned
-local banLevel = 40 -- the offense level they must exceed to get banned, 40 is roughly 5 nodes dug in the same area
-local banWarning = 25 -- the offense level they start getting ban warnings
-local offenseReset = 1440 -- after this number of minutes all offenses will be forgiven
-local adminUser = nil -- this user will be messaged if chat plus is installed when a player is autobanned
-
-chunkSize = 16 -- don't change this value after you start using landrush
-claims = {}
-local offense = {}
-
-gstepCount = 0
-playerHudItems = {}
-
-local path = minetest.get_modpath("landrush")
-
--- These are items that can be dug in unclaimed areas when requireClaim is true
-local global_dig_list = {["default:ladder"]=true,["default:leaves"]=true,["default:tree"]=true,["default:grass"]=true,["default:grass_1"]=true,["default:grass_2"]=true,["default:grass_3"]=true,["default:grass_4"]=true}
-
-local filename = minetest.get_worldpath().."/landrush-claims"
-
-minetest.register_privilege("landrush", "Allows player to dig and build anywhere, and use the landrush chat commands.")
-
-function landrush.load_claims()
- local file = io.open(filename, "r")
- if file then
- for line in file:lines() do
- if line ~= "" then
- local area = line:split(" ")
- local shared = {}
- if area[3] and area[3] ~= "*" then
- for k,v in ipairs(area[3]:split(",")) do
- shared[v] = v
- end
- end
- local claimtype
- if area[4] then
- claimtype = area[4]
- else
- claimtype = "landrush:landclaim"
- end
- claims[area[1]] = {owner=area[2], shared=shared, claimtype=claimtype}
- end
- end
- file:close()
- end
-end
-
-function landrush.save_claims()
- local file = io.open(filename, "w")
- for key,value in pairs(claims) do
- local sharedata = ""
- for k,v in pairs(value.shared) do
- sharedata = sharedata..v..","
- end
- local sharestring
- if sharedata == "" then
- sharestring = "*"
- else
- sharestring = sharedata:sub(1,-2)
- end
- file:write(key.." "..value.owner.." "..sharestring.." "..value.claimtype.."\n")
- end
- file:close()
-end
-
-function landrush.get_chunk(pos)
- local x = math.floor(pos.x/chunkSize)
- -- 3 levels of vertical protection
- local y = 0
-
- if ( pos.y < -200 ) then
- y = - 32000
- elseif ( pos.y < -60 ) then
- y = -200
- elseif ( pos.y < 140 ) then
- y = -30
- else
- y = 90
- end
-
-
- local z = math.floor(pos.z/chunkSize)
- return x..","..y..","..z
-end
-
-function landrush.get_chunk_center(pos)
- local x = math.floor(pos.x/chunkSize)*chunkSize+7.5
- local y = 0
-
- if ( pos.y < -200 ) then
- y = - 32000
- elseif ( pos.y < -60 ) then
- y = -200
- elseif ( pos.y < 120 ) then
- y = -30
- else
- y = 120
- end
-
- local z = math.floor(pos.z/chunkSize)*chunkSize+7.5
- return {x=x,y=y,z=z}
-end
-
-function landrush.get_owner(pos)
- local chunk = landrush.get_chunk(pos)
- if claims[chunk] then
- return claims[chunk].owner
- end
+-- Freeminer Compatibility
+if freeminer then
+ minetest = freeminer
end
-function landrush.can_interact(name, pos)
-
- if ( pos.y < -200 ) then
- return true
- end
-
- if ( minetest.check_player_privs(name, {landrush=true}) ) then
- return true
- end
-
- local chunk = landrush.get_chunk(pos)
- -- return claims[chunk] == nil or claims[chunk].owner == name or claims[chunk].shared[name]
- if ( claims[chunk] == nil ) then
- if ( requireClaim == true ) then
- return false
- else
- return true
- end
- end
-
- -- if it's the owner or it's shared
- if ( claims[chunk].shared[name] or claims[chunk].owner == name or claims[chunk].shared['*all'] ) then
- return true
- end
+landrush = {}
- -- see if the owner is offline, and area is not shared then it's off limits
- if ( minetest.env:get_player_by_name(claims[chunk].owner) == nil ) then
- if ( claims[chunk].shared[name] ) then
- return true
- else
- return nil
- end
- else
- if ( claims[chunk].owner ~= name and onlineProtection == false ) then
- minetest.chat_send_player( claims[chunk].owner, "You are being griefed by "..name.." at "..minetest.pos_to_string(pos) )
+local path = minetest.get_modpath("landrush")
- for u,u in pairs(claims[chunk].shared) do
- minetest.chat_send_player( u, name.." is griefing your shared claim at "..minetest.pos_to_string(pos) )
- end
+dofile(path.."/config.lua")
+dofile(path.."/functions.lua")
+dofile(path.."/claims.lua")
+dofile(path.."/protection.lua")
+dofile(path.."/shared_door.lua")
+dofile(path.."/chest.lua")
+dofile(path.."/sign.lua")
- minetest.chat_send_player( name, "You are griefing "..claims[chunk].owner )
- return true
- end
- end
- return claims[chunk].owner == name or claims[chunk].shared[name]
+if ( landrush.config:get_bool("enableHud") ) then
+ dofile(path.."/hud.lua")
end
-landrush.default_place = minetest.item_place
-landrush.default_dig = minetest.node_dig
-
--- Redefined Lua:
-function minetest.node_dig(pos, node, digger)
- local player = digger:get_player_name()
- if landrush.can_interact(player, pos) or player == "" then
- landrush.default_dig(pos, node, digger)
- else
- local owner = landrush.get_owner(pos)
- if ( owner ~= nil ) then
- minetest.chat_send_player(player, "Area owned by "..owner.." stop trying to dig here!")
- digger:set_hp( digger:get_hp() - offenseDamage )
- --[[ **********************************************
- START THE AUTOBAN SECTION!!
- ***********************************************]]
- if ( autoBan == true ) then
- if ( offense[player] == nil ) then
- offense[player] = {count=0,lastpos=nil,lasttime=os.time(),bancount=0}
- end
-
- local timediff = (os.time() - offense[player].lasttime)/60
- local distance = landrush.get_distance(offense[player].lastpos,pos)
-
- -- reset offenses after a given time period
- if timediff > offenseReset then
- offense[player].count=0
- end
-
- -- offense amount starts at 10 and is decreased based on the length of time between offenses
- -- and the distance from the last offense. This weighted system tries to make it fair for people who aren't
- -- intentionally griefing
- offenseAmount = ( 10 - ( timediff / 10 ) ) - ( ( distance / chunkSize ) * 0.5 )
-
- offense[player].count=offense[player].count + offenseAmount
- minetest.log("action",player.." greifing attempt")
-
- if ( offense[player].count > banLevel ) then
- offense[player].bancount = offense[player].bancount + 1
-
- local banlength = offense[player].bancount * 10
-
- if ( offense[player].bancount < 4 ) then
- minetest.chat_send_player(player, "You have been banned for "..tostring(banlength).." minutes!")
- else
- minetest.chat_send_player(player, "You have been banned!")
- end
-
- minetest.log("action",player.." has been banned for griefing attempts")
- minetest.chat_send_all(player.." has been banned for griefing attempts")
-
- if ( chatplus and adminUser ~= nil) then
- table.insert(chatplus.players[adminUser].messages,"mail from <LandRush>: "..player.." banned for "..tostring(banlength).." minutes for attempted griefing")
- end
- minetest.ban_player(player)
-
- offense[player].count = 0
- offense[player].lastpos = nil
-
- if ( offense[player].bancount < 4 ) then
- minetest.after( (banlength * 60), minetest.unban_player_or_ip,player )
- end
-
- return
- end
-
- if ( offense[player].count > banWarning ) then
- minetest.chat_send_player(player, "Stop trying to dig in claimed areas or you will be banned!")
- minetest.chat_send_player(player, "Use /showarea and /landowner to see the protected area and who owns it.")
- minetest.sound_play("landrush_ban_warning", {to_player=player,gain = 10.0})
- end
-
- offense[player].lasttime = os.time()
- offense[player].lastpos = pos
-
- end
- --[[ **********************************************
- END THE AUTOBAN SECTION!!
- ***********************************************]]
- else
- -- allow them to dig the global dig list
- if ( global_dig_list[node['name']] ~= true ) then
- minetest.chat_send_player(player,"Area unclaimed, claim this area to build")
- else
- landrush.default_dig(pos, node, digger)
- end
- end
- end
-end
-
-function minetest.item_place(itemstack, placer, pointed_thing)
- owner = landrush.get_owner(pointed_thing.above)
- player = placer:get_player_name()
- if landrush.can_interact(player, pointed_thing.above) or itemstack:get_name() == "" then
- -- add a workaround for TNT, since overwriting the registered node seems not to work
- if itemstack:get_name() == "tnt:tnt" or itemstack:get_name() == "tnt:tnt_burning" then
- local pos = pointed_thing.above
- local temp_pos = pos
- temp_pos.x = pos.x + 2
- if player ~= landrush.get_owner( temp_pos ) then
- minetest.chat_send_player( player, "Do not place TNT near claimed areas..." )
- return itemstack
- end
- temp_pos.x = pos.x - 2
- if player ~= landrush.get_owner( temp_pos ) then
- minetest.chat_send_player( player, "Do not place TNT near claimed areas..." )
- return itemstack
- end
- temp_pos.z = pos.z + 2
- if player ~= landrush.get_owner( temp_pos ) then
- minetest.chat_send_player( player, "Do not place TNT near claimed areas..." )
- return itemstack
- end
- temp_pos.z = pos.z - 2
- if player ~= landrush.get_owner( temp_pos ) then
- minetest.chat_send_player( player, "Do not place TNT near claimed areas..." )
- return itemstack
- end
- end
- -- end of the workaround
- return landrush.default_place(itemstack, placer, pointed_thing)
- else
- if ( owner ~= nil ) then
- minetest.chat_send_player(player, "Area owned by "..owner)
- return itemstack
- else
- minetest.chat_send_player(player,"Area unclaimed, claim this area to build")
- return itemstack
- end
- end
-end
+minetest.register_privilege("landrush", "Allows player to dig and build anywhere, and use the landrush chat commands.")
landrush.load_claims()
--- Load now
minetest.register_node("landrush:landclaim", {
description = "Land Rush Land Claim",
@@ -317,9 +43,9 @@ landrush.load_claims()
else
minetest.env:remove_node(pointed_thing.above)
chunk = landrush.get_chunk(pointed_thing.above)
- claims[chunk] = {owner=placer:get_player_name(),shared={},claimtype="landclaim"}
+ landrush.claims[chunk] = {owner=placer:get_player_name(),shared={},claimtype="landclaim"}
landrush.save_claims()
- minetest.chat_send_player(claims[chunk].owner, "You now own this area.")
+ minetest.chat_send_player(landrush.claims[chunk].owner, "You now own this area.")
itemstack:take_item()
return itemstack
end
@@ -337,115 +63,6 @@ minetest.register_craft({
minetest.register_alias("landclaim", "landrush:landclaim")
minetest.register_alias("landrush:landclaim_b","landrush:landclaim")
-doors:register_door("landrush:shared_door", {
- description = "Shared Door",
- inventory_image = "shared_door_inv.png",
- groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1},
- tiles_bottom = {"shared_door_b.png", "door_blue.png"},
- tiles_top = {"shared_door_a.png", "door_blue.png"},
-})
-
-minetest.register_craft({
- output = 'landrush:shared_door',
- recipe = {
- {'default:steel_ingot','default:steel_ingot',''},
- {'default:steel_ingot','landrush:landclaim',''},
- {'default:steel_ingot','default:steel_ingot',''}
- }
-})
-
-function landrush.on_rightclick(pos, dir, check_name, replace, replace_dir, params)
- pos.y = pos.y+dir
- if not minetest.get_node(pos).name == check_name then
- return
- end
- local p2 = minetest.get_node(pos).param2
- p2 = params[p2+1]
-
- local meta = minetest.get_meta(pos):to_table()
- minetest.set_node(pos, {name=replace_dir, param2=p2})
- minetest.get_meta(pos):from_table(meta)
-
- pos.y = pos.y-dir
- meta = minetest.get_meta(pos):to_table()
- minetest.set_node(pos, {name=replace, param2=p2})
- minetest.get_meta(pos):from_table(meta)
- end
-
-minetest.registered_nodes['landrush:shared_door_b_1'].on_rightclick = function(pos, node, clicker)
-if ( landrush.can_interact(clicker:get_player_name(),pos) ) then
- landrush.on_rightclick(pos, 1, "landrush:shared_door_t_1", "landrush:shared_door_b_2", "landrush:shared_door_t_2", {1,2,3,0})
-end
-end
-
-minetest.registered_nodes['landrush:shared_door_t_1'].on_rightclick = function(pos, node, clicker)
-if ( landrush.can_interact(clicker:get_player_name(),pos) ) then
- landrush.on_rightclick(pos, -1, "landrush:shared_door_b_1", "landrush:shared_door_t_2", "landrush:shared_door_b_2", {1,2,3,0})
-end
-end
-
--- Fix for duplicating Bug!
--- Bug was caused, because the reverse order of the on_rightclick was not taken into account
-
-minetest.registered_nodes['landrush:shared_door_b_2'].on_rightclick = function(pos, node, clicker)
-if ( landrush.can_interact(clicker:get_player_name(),pos) ) then
- landrush.on_rightclick(pos, 1, "landrush:shared_door_t_2", "landrush:shared_door_b_1", "landrush:shared_door_t_1", {3,0,1,2})
-end
-end
-
-minetest.registered_nodes['landrush:shared_door_t_2'].on_rightclick = function(pos, node, clicker)
-if ( landrush.can_interact(clicker:get_player_name(),pos) ) then
- landrush.on_rightclick(pos, -1, "landrush:shared_door_b_2", "landrush:shared_door_t_1", "landrush:shared_door_b_1", {3,0,1,2})
-end
-end
-
--- End of fix
-
--- create a new type of sign that is not protected by landrush mod
-minetest.register_node("landrush:unlocked_sign", {
- description = "Unprotected Sign",
- drawtype = "signlike",
- tiles = {"default_sign_wall.png"},
- inventory_image = "default_sign_wall.png",
- wield_image = "default_sign_wall.png",
- paramtype = "light",
- paramtype2 = "wallmounted",
- sunlight_propagates = true,
- walkable = false,
- selection_box = {
- type = "wallmounted",
- --wall_top = <default>
- --wall_bottom = <default>
- --wall_side = <default>
- },
- groups = {choppy=2,dig_immediate=2,attached_node=1},
- legacy_wallmounted = true,
- sounds = default.node_sound_defaults(),
- on_construct = function(pos)
- --local n = minetest.get_node(pos)
- local meta = minetest.get_meta(pos)
- meta:set_string("formspec", "field[text;;${text}]")
- meta:set_string("infotext", "\"\"")
- end,
- on_receive_fields = function(pos, formname, fields, sender)
- local meta = minetest.get_meta(pos)
- fields.text = fields.text or ""
- print((sender:get_player_name() or "").." wrote \""..fields.text..
- "\" to sign at "..minetest.pos_to_string(pos))
- meta:set_string("text", fields.text)
- meta:set_string("infotext", '"'..fields.text..'"')
- end,
-})
-
-
-minetest.register_craft({
- output = 'landrush:unlocked_sign 6',
- recipe = {
- {'default:wood','default:wood','default:wood'},
- {'default:wood','default:wood','landrush:landclaim'},
- {'','default:stick',''}
- }
-})
minetest.register_entity("landrush:showarea",{
on_activate = function(self, staticdata, dtime_s)
@@ -471,61 +88,11 @@ minetest.register_entity("landrush:showarea",{
}
})
-minetest.register_globalstep(function(dtime)
- gstepCount = gstepCount + dtime
- if ( gstepCount > 2 ) then
- gstepCount=0
- local oplayers = minetest.get_connected_players()
- for _,player in ipairs(oplayers) do
- local name = player:get_player_name()
- local sameowner = false
- owner = landrush.get_owner(player:getpos())
-
- if ( playerHudItems[name] ~= nil ) then
- if ( playerHudItems[name].lastowner == owner ) then
- -- same owner as last time don't update the hud
- sameowner = true
- end
- end
-
- if ( playerHudItems[name] ~= nil and sameowner == false ) then
- player:hud_remove(playerHudItems[name].hud)
- playerHudItems[name] = nil
- end
-
- if ( owner ~= nil and sameowner == false ) then
- --minetest.log('action','Redraw hud for '..name)
- playerHudItems[name] = {hud = player:hud_add({
- hud_elem_type = "text",
- name = "LandOwner",
- number = 0xFFFFFF,
- position = {x=.2, y=.98},
- text="Land Owner: "..owner,
- scale = {x=200,y=25},
- alignment = {x=0, y=0},
- }), lastowner=owner}
- end
- end
- end
-end)
-
-function landrush.get_distance(pos1,pos2)
-
- if ( pos1 ~= nil and pos2 ~= nil ) then
- return math.abs(math.floor(math.sqrt( (pos1.x - pos2.x)^2 + (pos1.z - pos2.z)^2 )))
- else
- return 0
- end
-
-end
-
if ( minetest.get_modpath("money2") ) then
minetest.log('action','Loading Landrush Land Sale')
dofile(path.."/landsale.lua")
end
-dofile(path.."/chest.lua")
-
minetest.after(0, function ()
dofile(path.."/default.lua")