2013-01-03 19:31:49 -08:00
|
|
|
--Normal Mode
|
2013-01-07 18:04:39 -08:00
|
|
|
|
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
|
2013-01-09 19:31:45 -08:00
|
|
|
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
|
|
|
|
|
2013-01-09 19:31:45 -08:00
|
|
|
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
|
2013-01-09 19:31:45 -08:00
|
|
|
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)
|
|
|
|
|
2013-01-04 17:55:15 -08:00
|
|
|
minetest.register_on_joinplayer(function(obj)
|
2013-01-06 19:40:14 -08:00
|
|
|
if adventures.started then return end
|
2013-01-08 19:13:36 -08:00
|
|
|
for pos,data in pairs(adventures.sourceData) do
|
2013-01-17 17:25:43 -08:00
|
|
|
if(data[1] == "adventures:unbreakable_source") then
|
2013-01-09 19:31:45 -08:00
|
|
|
storeUnbreakableNodes(data)
|
2013-01-04 17:55:15 -08:00
|
|
|
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
|
2013-01-04 17:55:15 -08:00
|
|
|
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)
|
|
|
|
|
2013-01-07 18:04:39 -08:00
|
|
|
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)
|
2013-01-07 18:04:39 -08:00
|
|
|
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-07 18:04:39 -08:00
|
|
|
})
|
|
|
|
|
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
|
2013-01-17 18:08:38 -08:00
|
|
|
return adventures.requestSpawnPosition(obj)
|
2013-01-17 17:25:43 -08:00
|
|
|
else
|
2013-01-17 18:08:38 -08:00
|
|
|
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)
|