diff options
author | Brandon Bohannon <brandon@bremaweb.com> | 2013-02-16 00:07:16 -0600 |
---|---|---|
committer | Brandon Bohannon <brandon@bremaweb.com> | 2013-02-16 00:07:16 -0600 |
commit | e83f5144665edafd80b5f99435cf12f66e37432d (patch) | |
tree | 1ff7d9dd7537d99980f4c57cbfe1a22900efea14 /init.lua | |
parent | 6537ff75ae31a13b5f9160127c484911477c0e6b (diff) |
initial commit
Diffstat (limited to 'init.lua')
-rw-r--r-- | init.lua | 383 |
1 files changed, 383 insertions, 0 deletions
diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..952c97b --- /dev/null +++ b/init.lua @@ -0,0 +1,383 @@ +-- Lua definitions: + +landrush = {} + +-- Change this to true if you want to require people to claim an area before building or digging +local requireClaim = true +local chunkSize = 16 + +local claims = {} +local filename = minetest.get_worldpath().."/landrush-claims" + +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 < -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 < -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 +end + +function landrush.can_interact(name, pos) + 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 ) then + return true + end + + -- 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 ) then + minetest.chat_send_player( claims[chunk].owner, "You are being griefed by "..name.." at "..minetest.pos_to_string(pos) ) + + -- TODO -- + -- send a chat to all shared people too + -- TODO -- + 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 + + 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] -- requires a landrush landclaim to build +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) 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) + else + -- allow them to dig their ladder + if ( node['name'] ~= "default:ladder" ) then + minetest.chat_send_player(player,"Area unclaimed, claim this are to build") + else + landrush.default_dig(pos, node, digger) + end + end + end +end + +function minetest.item_place(itemstack, placer, pointed_thing) + if itemstack:get_definition().type == "node" and itemstack:get_name() ~= "default:ladder" then + owner = landrush.get_owner(pointed_thing.above) + player = placer:get_player_name() + if landrush.can_interact(player, pointed_thing.above) then + return landrush.default_place(itemstack, placer, pointed_thing) + else + if ( owner ~= nil ) then + minetest.chat_send_player(player, "Area owned by "..owner) + else + minetest.chat_send_player(player,"Area unclaimed, claim this are to build") + end + end + else + return landrush.default_place(itemstack, placer, pointed_thing) + end +end + +landrush.load_claims() +-- Load now + +-- In-game additions: + +minetest.register_chatcommand("landowner", { + params = "", + description = "tells the owner of the current map chunk", + privs = {interact=true}, + func = function(name, param) + local player = minetest.env:get_player_by_name(name) + local pos = player:getpos() + local owner = landrush.get_owner(pos) + if owner then + minetest.chat_send_player(name, "This area is owned by "..owner) + else + minetest.chat_send_player(name, "This area is unowned.") + end + end, +}) + +minetest.register_chatcommand("unclaim", { + params = "", + description = "unclaims the current map chunk", + privs = {interact=true}, + func = function(name, param) + local player = minetest.env:get_player_by_name(name) + local pos = player:getpos() + local owner = landrush.get_owner(pos) + local inv = player:get_inventory() + if owner then + if owner == name then + chunk = landrush.get_chunk(pos) + if inv:room_for_item("main", claims[chunk].claimtype) then + player:get_inventory():add_item("main", {name=claims[chunk].claimtype}) + claims[chunk] = nil + landrush.save_claims() + minetest.chat_send_player(name, "You renounced your claim on this area.") + else + minetest.chat_send_player(name, "Your inventory is full.") + end + else + minetest.chat_send_player(name, "This area is owned by "..owner) + end + else + minetest.chat_send_player(name, "This area is unowned.") + end + end, +}) + +minetest.register_chatcommand("sharearea", { + params = "<name>", + description = "shares the current map chunk with <name>", + privs = {interact=true}, + func = function(name, param) + local player = minetest.env:get_player_by_name(name) + local pos = player:getpos() + local owner = landrush.get_owner(pos) + if owner then + if owner == name and name ~= param then + if minetest.env:get_player_by_name(param) then + claims[landrush.get_chunk(pos)].shared[param] = param + landrush.save_claims() + minetest.chat_send_player(name, param.." may now edit this area.") + minetest.chat_send_player(param, name.." has just shared an area with you.") + else + minetest.chat_send_player(name, param.." is not a valid player.") + end + else + minetest.chat_send_player(name, "This area is owned by "..owner) + end + else + minetest.chat_send_player(name, "This area is unowned.") + end + end, +}) + +minetest.register_chatcommand("unsharearea", { + params = "<name>", + description = "unshares the current map chunk with <name>", + privs = {interact=true}, + func = function(name, param) + local player = minetest.env:get_player_by_name(name) + local pos = player:getpos() + local owner = landrush.get_owner(pos) + if owner then + if owner == name then + if name ~= param then + claims[landrush.get_chunk(pos)].shared[param] = nil + landrush.save_claims() + minetest.chat_send_player(name, param.." may no longer edit this area.") + minetest.chat_send_player(param, name.." has just revoked your editing privileges in an area.") + else + minetest.chat_send_player(name, 'Use "/unclaim" to unclaim the aria.') + end + else + minetest.chat_send_player(name, "This area is owned by "..owner) + end + else + minetest.chat_send_player(name, "This area is unowned.") + end + end, +}) + +minetest.register_chatcommand("mayedit", { + params = "", + description = "lists the people who may edit the current map chunk", + privs = {interact=true}, + func = function(name, param) + local player = minetest.env:get_player_by_name(name) + local pos = player:getpos() + local mayedit = landrush.get_owner(pos) + if mayedit then + local chunk = landrush.get_chunk(pos) + for user, user in pairs(claims[chunk].shared) do + mayedit = mayedit..", "..user + end + minetest.chat_send_player(name, mayedit) + else + minetest.chat_send_player(name, "This area is unowned.") + end + end, +}) + +function landrush.regester_claimnode(node, image) + local claimnode = minetest.get_current_modname()..":"..node + minetest.register_node(claimnode, { + description = "Land Claim", + tiles = {image}, + groups = {oddly_breakable_by_hand=2,not_in_creative_inventory=1}, + on_place = function(itemstack, placer, pointed_thing) + owner = landrush.get_owner(pointed_thing.above) + player = placer:get_player_name() + if owner then + minetest.chat_send_player(player, "This area is already owned by "..owner) + else + minetest.env:remove_node(pointed_thing.above) + chunk = landrush.get_chunk(pointed_thing.above) + claims[chunk] = {owner=placer:get_player_name(),shared={},claimtype=claimnode} + landrush.save_claims() + minetest.chat_send_player(claims[chunk].owner, "You now own this area.") + itemstack:take_item() + return itemstack + end + end, + }) +end + +landrush.regester_claimnode("landclaim", "landrush_landclaim.png") +landrush.regester_claimnode("landclaim_a", "landrush_landclaim_gem.png") + +minetest.register_entity("landrush:showarea",{ + on_activate = function(self, staticdata, dtime_s) + minetest.after(16,function() + self.object:remove() + end) + end, + initial_properties = { + hp_max = 1, + physical = true, + weight = 0, + collisionbox = {-8,-8,-8,8,8,8}, + visual = "mesh", + visual_size = {x=16.1, y=120.1}, + mesh = "landrush_showarea.x", + textures = {"landrush_showarea.png", "landrush_showarea.png", "landrush_showarea.png", "landrush_showarea.png", "landrush_showarea.png", "landrush_showarea.png"}, -- number of required textures depends on visual + colors = {}, -- number of required colors depends on visual + spritediv = {x=1, y=1}, + initial_sprite_basepos = {x=0, y=0}, + is_visible = true, + makes_footstep_sound = false, + automatic_rotate = false, + } +}) + +minetest.register_chatcommand("showarea", { + params = "", + description = "highlights the boundaries of the current protected area", + privs = {interact=true}, + func = function(name, param) + local player = minetest.env:get_player_by_name(name) + local pos = player:getpos() + --local owner = landrush.get_owner(pos) +-- if owner then + --if landrush.can_interact(name, pos) then + local entpos = landrush.get_chunk_center(pos) + minetest.env:add_entity(entpos, "landrush:showarea") + --else + -- minetest.chat_send_player(name, "This area is owned by "..owner) + --end +--[[ else + minetest.chat_send_player(name, "This area is unowned.") + end]] +-- (Removed at Rarkenin's request) + end, +}) + +minetest.after(0,function() + local path = minetest.get_modpath("landrush") + dofile(path.."/bucket.lua") + dofile(path.."/default.lua") + dofile(path.."/doors.lua") + dofile(path.."/fire.lua") +end) + |