adventures/standard.lua

202 lines
6.2 KiB
Lua
Raw Normal View History

2013-01-03 19:31:49 -08:00
--Normal Mode
2013-01-06 19:40:14 -08:00
local old_node_dig = minetest.node_dig
function minetest.node_dig(pos, node, digger)
2013-01-17 17:25:43 -08:00
if (not adventures.canBreak) then return end
if adventures.unbreakable[adventures.positionToString(pos)] ~= true then
2013-01-06 19:40:14 -08:00
old_node_dig(pos, node, digger)
else
return
end
end
2013-01-10 18:43:47 -08:00
local old_node_place = minetest.item_place
function minetest.item_place(itemstack, placer, pointed_thing)
2013-01-17 17:25:43 -08:00
if (not adventures.canBuild) then return end
2013-01-10 18:43:47 -08:00
if adventures.unbuildable[adventures.positionToString(pointed_thing.above)] ~= true then
2013-01-17 17:25:43 -08:00
old_node_place(itemstack, placer, pointed_thing)
2013-01-10 18:43:47 -08:00
else
return
end
end
local function storeUnbreakableNodes(data)
--local pos = {x=data[2],y=data[3],z=data[4]}
--local offset = {x=data[5],y=data[6],z=data[7]}
--local size = {width=data[8],length=data[9],height=data[10]}
local start = {x=data[2]+data[5]-math.floor(data[8]/2),
y=data[3]+data[6]-math.floor(data[10]/2),
z=data[4]+data[7]-math.floor(data[8]/2)}
for y=0,data[10]-1,1 do
for z=0,data[8]-1,1 do
for x=0,data[8]-1,1 do
adventures.unbreakable[adventures.positionToString({x=start.x+x,y=start.y+y,z=start.z+z})] = true
2013-01-06 19:40:14 -08:00
end
end
end
end
local function storeUnbuildableNodes(data)
local start = {x=data[2]+data[5]-math.floor(data[8]/2),
y=data[3]+data[6]-math.floor(data[10]/2),
z=data[4]+data[7]-math.floor(data[8]/2)}
for y=0,data[10]-1,1 do
for z=0,data[8]-1,1 do
for x=0,data[8]-1,1 do
adventures.unbuildable[adventures.positionToString({x=start.x+x,y=start.y+y,z=start.z+z})] = true
end
end
end
end
local function storeFullyProtectedNodes(data)
local start = {x=data[2]+data[5]-math.floor(data[8]/2),
y=data[3]+data[6]-math.floor(data[10]/2),
z=data[4]+data[7]-math.floor(data[8]/2)}
for y=0,data[10]-1,1 do
for z=0,data[8]-1,1 do
for x=0,data[8]-1,1 do
adventures.unbuildable[adventures.positionToString({x=start.x+x,y=start.y+y,z=start.z+z})] = true
adventures.unbreakable[adventures.positionToString({x=start.x+x,y=start.y+y,z=start.z+z})] = true
2013-01-06 19:40:14 -08:00
end
end
end
end
2013-01-17 17:25:43 -08:00
local function storeSpawnPositions(data)
local start = {x=data[2]+data[5]-math.floor(data[8]/2),
y=data[3]+data[6]-math.floor(data[10]/2),
z=data[4]+data[7]-math.floor(data[8]/2)}
for y=0,data[10]-1,1 do
for z=0,data[8]-1,1 do
for x=0,data[8]-1,1 do
table.insert(adventures.spawnPoints, {x=start.x+x,y=start.y+y,z=start.z+z})
adventures.unbuildable[adventures.positionToString({x=start.x+x,y=start.y+y,z=start.z+z})] = true
end
end
end
end
local function storeRespawnPositions(data)
local start = {x=data[2]+data[5]-math.floor(data[8]/2),
y=data[3]+data[6]-math.floor(data[10]/2),
z=data[4]+data[7]-math.floor(data[8]/2)}
local points = {}
for y=0,data[10]-1,1 do
for z=0,data[8]-1,1 do
for x=0,data[8]-1,1 do
table.insert(points, {x=start.x+x,y=start.y+y,z=start.z+z})
adventures.unbuildable[adventures.positionToString({x=start.x+x,y=start.y+y,z=start.z+z})] = true
end
end
end
adventures.respawnPoints[data[11]] = points
end
local function storeCheckpointPositions(data)
local start = {x=data[2]+data[5]-math.floor(data[8]/2),
y=data[3]+data[6]-math.floor(data[10]/2),
z=data[4]+data[7]-math.floor(data[8]/2)}
for y=0,data[10]-1,1 do
for z=0,data[8]-1,1 do
for x=0,data[8]-1,1 do
adventures.checkPoints[adventures.positionToString({x=start.x+x,y=start.y+y,z=start.z+z})] = data[11]
end
end
end
end
minetest.register_on_newplayer(function(obj)
adventures.playerCheckPoints[obj:get_player_name()] = 0
adventures.requestSpawnPosition(obj)
end)
minetest.register_on_joinplayer(function(obj)
2013-01-06 19:40:14 -08:00
if adventures.started then return end
for pos,data in pairs(adventures.sourceData) do
2013-01-17 17:25:43 -08:00
if(data[1] == "adventures:unbreakable_source") then
storeUnbreakableNodes(data)
end
2013-01-17 17:25:43 -08:00
if(data[1] == "adventures:unbuildable_source") then
storeUnbuildableNodes(data)
end
if(data[1] == "adventures:fullprotect_source") then
storeFullyProtectedNodes(data)
end
if(data[1] == "adventures:spawn_source") then
storeSpawnPositions(data)
end
if(data[1] == "adventures:respawn_source") then
storeRespawnPositions(data)
end
if(data[1] == "adventures:checkpoint_source") then
storeCheckpointPositions(data)
end
end
2013-01-06 19:40:14 -08:00
local file = io.open(minetest.get_worldpath().."/adventures_previousmode", "w")
file:write(adventures.normal)
file:close()
adventures.started = true
end)
minetest.register_abm({
2013-01-17 17:25:43 -08:00
nodenames = {"adventures:unbreakable_source",
"adventures:unbuildable_source",
"adventures:fullprotect_source",
"adventures:spawn_source",
"adventures:respawn_source",
"adventures:checkpoint_source"},
2013-01-06 19:40:14 -08:00
interval = 0.5,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local area = adventures.findArea(minetest.env:get_meta(pos), pos, {x=0,y=0,z=0})
if area ~= nil then
area:remove()
end
2013-01-06 19:40:14 -08:00
minetest.env:remove_node(pos)
end
})
2013-01-17 17:25:43 -08:00
minetest.register_entity("adventures:unbreakable_area" ,{})
minetest.register_entity("adventures:unbuildable_area" ,{})
minetest.register_entity("adventures:fullprotect_area" ,{})
minetest.register_entity("adventures:spawn_area" ,{})
minetest.register_entity("adventures:respawn_area" ,{})
minetest.register_entity("adventures:checkpoint_area" ,{})
minetest.register_on_respawnplayer(function(obj)
local id = adventures.playerCheckPoints[obj:get_player_name()]
if id == 0 then
return adventures.requestSpawnPosition(obj)
2013-01-17 17:25:43 -08:00
else
return adventures.requestRespawnPosition(obj)
2013-01-17 17:25:43 -08:00
end
end)
local function savePlayerID()
local file = io.open(minetest.get_worldpath().."/adventures_checkpoints", "w")
local str = ""
for player, id in pairs(adventures.playerCheckPoints) do
str = str..player..","..id.."\n"
end
file:write(str)
file:close()
end
minetest.register_globalstep(function(dtime)
for _,player in pairs(minetest.get_connected_players()) do
local id = adventures.checkPoints[adventures.positionToString(adventures.snapPlayerPosition(player:getpos()))]
if(id ~= nil) then
adventures.playerCheckPoints[player:get_player_name()] = id
end
end
if(not adventures.autoSave) then return end
if(adventures.currentTime >= adventures.saveTime) then
savePlayerID()
end
adventures.currentTime = adventures.currentTime+dtime
end)
minetest.register_on_shutdown(function()
savePlayerID()
end)