Merge remote-tracking branch 'upstream/master'

This commit is contained in:
sys4-fr 2017-05-03 21:49:34 +02:00
commit 51d447e17c
15 changed files with 526 additions and 358 deletions

View File

@ -249,6 +249,7 @@ armor.set_player_armor = function(self, player)
player:set_armor_groups(armor_groups) player:set_armor_groups(armor_groups)
--player:set_physics_override(physics_o) --player:set_physics_override(physics_o)
player_physics.set_stats(player, "3d_armor", {speed=physics_o.speed-1, jump=physics_o.jump-1, gravity=physics_o.gravity-1}) player_physics.set_stats(player, "3d_armor", {speed=physics_o.speed-1, jump=physics_o.jump-1, gravity=physics_o.gravity-1})
pclasses.api.util.on_update(name)
self.textures[name].armor = armor_texture self.textures[name].armor = armor_texture
self.textures[name].preview = preview self.textures[name].preview = preview
self.def[name].state = state self.def[name].state = state

View File

@ -14,6 +14,9 @@ pclasses.api.register_class("admin", {
end, end,
on_unassigned = function(pname) on_unassigned = function(pname)
end, end,
on_update = function(pname)
-- No specific armor changes, no code
end,
switch_params = { switch_params = {
color = {r = 255, g = 00, b = 224}, color = {r = 255, g = 00, b = 224},
holo_item = "maptools:pick_admin" holo_item = "maptools:pick_admin"

View File

@ -6,22 +6,37 @@
-- See https://github.com/Ombridride/minetest-minetestforfun-server/issues/114 -- See https://github.com/Ombridride/minetest-minetestforfun-server/issues/114
-- --
local tmp = {}
pclasses.api.register_class("hunter", { pclasses.api.register_class("hunter", {
on_assigned = function(pname, inform) on_assigned = function(pname, inform)
if inform then if inform then
minetest.chat_send_player(pname, "You are now a hunter") minetest.chat_send_player(pname, "You are now a hunter")
minetest.sound_play("pclasses_full_hunter", {to_player=pname, gain=1}) minetest.sound_play("pclasses_full_hunter", {to_player=pname, gain=1})
end end
local reinforced = pclasses.api.util.does_wear_full_armor(pname, "reinforcedleather", true) sprint.increase_maxstamina(pname, 20)
if reinforced then
sprint.increase_maxstamina(pname, 40)
else
sprint.increase_maxstamina(pname, 30)
end
minetest.log("action", "[PClasses] Player " .. pname .. " become a hunter") minetest.log("action", "[PClasses] Player " .. pname .. " become a hunter")
end, end,
on_unassigned = function(pname) on_unassigned = function(pname)
sprint.set_default_maxstamina(pname) sprint.decrease_maxstamina(pname, 20)
if tmp[pname] then
sprint.decrease_maxstamina(pname, 10)
tmp[pname] = nil
end
end,
on_update = function(pname)
local reinforced = pclasses.api.util.does_wear_full_armor(pname, "reinforcedleather", true)
if reinforced then
if not tmp[pname] then
tmp[pname] = true
sprint.increase_maxstamina(pname, 10) -- 10 more
end
else
if tmp[pname] then
tmp[pname] = false
sprint.decrease_maxstamina(pname, 10)
end
end
end, end,
switch_params = { switch_params = {
color = {r = 30, g = 170, b = 00}, color = {r = 30, g = 170, b = 00},
@ -43,6 +58,9 @@ pclasses.api.register_class("hunter", {
"you need to fight a super strong mob, but it's just details...)") .. "image[2.4,5.6;6,4;pclasses_showcase_hunter.png]" "you need to fight a super strong mob, but it's just details...)") .. "image[2.4,5.6;6,4;pclasses_showcase_hunter.png]"
}) })
minetest.register_on_leaveplayer(function(player)
tmp[player:get_player_name()] = false
end)
pclasses.api.reserve_item("hunter", "throwing:bow_minotaur_horn") pclasses.api.reserve_item("hunter", "throwing:bow_minotaur_horn")
pclasses.api.reserve_item("hunter", "throwing:bow_minotaur_horn_loaded") pclasses.api.reserve_item("hunter", "throwing:bow_minotaur_horn_loaded")

View File

@ -12,11 +12,14 @@ pclasses.api.register_class("warrior", {
minetest.sound_play("pclasses_full_warrior", {to_player=pname, gain=1}) minetest.sound_play("pclasses_full_warrior", {to_player=pname, gain=1})
minetest.chat_send_player(pname, "You are now a warrior") minetest.chat_send_player(pname, "You are now a warrior")
end end
sprint.set_maxstamina(pname, 20) sprint.increase_maxstamina(pname, 10)
minetest.log("action", "[PClasses] Player " .. pname .. " becomes a warrior") minetest.log("action", "[PClasses] Player " .. pname .. " becomes a warrior")
end, end,
on_unassigned = function(pname) on_unassigned = function(pname)
sprint.set_default_maxstamina(pname) sprint.decrease_maxstamina(pname, 10)
end,
on_update = function(pname)
-- No specific armor changes, no code
end, end,
switch_params = { switch_params = {
color = {r = 06, g = 06, b = 30}, color = {r = 06, g = 06, b = 30},

View File

@ -14,10 +14,15 @@ pclasses.api.register_class("wizard", {
end end
-- Add specs here -- Add specs here
mana.setmax(pname, mana.getmax(pname)+100) mana.setmax(pname, mana.getmax(pname)+100)
sprint.increase_maxstamina(pname, 10)
minetest.log("action", "[PClasses] Player " .. pname .. " becomes a wizard") minetest.log("action", "[PClasses] Player " .. pname .. " becomes a wizard")
end, end,
on_unassigned = function(pname) on_unassigned = function(pname)
mana.setmax(pname, mana.getmax(pname)-100) mana.setmax(pname, mana.getmax(pname)-100)
sprint.decrease_maxstamina(pname, 10)
end,
on_update = function(pname)
-- No armor, no update needed
end, end,
switch_params = { switch_params = {
color = {r = 230, g = 230, b = 0}, color = {r = 230, g = 230, b = 0},

View File

@ -42,6 +42,7 @@ Yet another class mod for Minetest.
- Def is a definition table that can contain many functions/values : - Def is a definition table that can contain many functions/values :
- `on_assigned` which is a function, receiving as argument the player name - `on_assigned` which is a function, receiving as argument the player name
- `on_unassigned` which is a function, receiving as argument the player name - `on_unassigned` which is a function, receiving as argument the player name
- `on_update` which is a function, receiving as argument the player name
- `switch_params`, which is a table, containing parameters for the switch pedestal : - `switch_params`, which is a table, containing parameters for the switch pedestal :
- `holo_item` is mandatory. It's the itemstring of the item to be put over the pedestal - `holo_item` is mandatory. It's the itemstring of the item to be put over the pedestal
- `color` is optional. Default is white. It's a RGB table. - `color` is optional. Default is white. It's a RGB table.
@ -78,6 +79,10 @@ Yet another class mod for Minetest.
- Arguments : pname, itemname - Arguments : pname, itemname
- Returns true if player `pname` can have items `itemstring` in his main inventory, according to his class - Returns true if player `pname` can have items `itemstring` in his main inventory, according to his class
### pclasses.api.util.on_update
- Arguments : pname
- Update player's stats
### pclasses.api.reserve_item ### pclasses.api.reserve_item
- Arguments : cname, itemstring - Arguments : cname, itemstring
- Adds an entry in the reserved items' table. Players will need to belong to class `cname` in order to have items `itemstring` in their main inventory - Adds an entry in the reserved items' table. Players will need to belong to class `cname` in order to have items `itemstring` in their main inventory

View File

@ -15,6 +15,8 @@ pclasses.api.register_class("adventurer", {
end, end,
on_unassigned = function(pname) on_unassigned = function(pname)
end, end,
on_update = function(pname)
end,
informations = pclasses.api.textify("Adventurer, the casual players, or hardcore players. Whatever end of the spectrum\n" .. informations = pclasses.api.textify("Adventurer, the casual players, or hardcore players. Whatever end of the spectrum\n" ..
"you're in, adventurer will bring you what you want : no advantages, no help. Maybe you\n" .. "you're in, adventurer will bring you what you want : no advantages, no help. Maybe you\n" ..
"don't want that if you just began playing. If that's the case.. just pick another tab and\n" .. "don't want that if you just began playing. If that's the case.. just pick another tab and\n" ..

View File

@ -55,10 +55,18 @@ end
function pclasses.api.set_player_class(pname, cname, inform) function pclasses.api.set_player_class(pname, cname, inform)
if pclasses.api.get_class_by_name(cname) then if pclasses.api.get_class_by_name(cname) then
if pclasses.api.get_player_class(pname) then if pclasses.api.get_player_class(pname) then
pclasses.api.get_class_by_name(pclasses.api.get_player_class(pname)).on_unassigned(pname) pclasses.api.get_class_by_name(pclasses.api.get_player_class(pname)).on_update(pname)
pclasses.api.get_class_by_name(pclasses.api.get_player_class(pname)).on_unassigned(pname)
end end
pclasses.data.players[pname] = cname pclasses.data.players[pname] = cname
pclasses.api.get_class_by_name(cname).on_assigned(pname, inform) local newclass = pclasses.api.get_class_by_name(cname)
newclass.on_assigned(pname, inform)
-- Implicit call to on_update because we don't wanna repeat it
if newclass.on_update then
newclass.on_update(pname)
else
newclass.on_update = function(pname) end -- So that it won't annoy us later
end
local ref = minetest.get_player_by_name(pname) local ref = minetest.get_player_by_name(pname)
local armor_inv = minetest.get_inventory({type = "detached", name = pname .. "_armor"}) local armor_inv = minetest.get_inventory({type = "detached", name = pname .. "_armor"})
@ -100,6 +108,13 @@ function pclasses.api.util.can_have_item(pname, itemname)
return false return false
end end
function pclasses.api.util.on_update(pname)
local cname = pclasses.api.get_player_class(pname)
if cname ~= nil and pclasses.api.get_class_by_name(cname) and pclasses.api.get_class_by_name(cname).on_update then
pclasses.api.get_class_by_name(cname).on_update(pname)
end
end
-- TEMPORARY CLASS SHIFT SYSTEM -- TEMPORARY CLASS SHIFT SYSTEM
-- Used to test on local servers -- Used to test on local servers
-- --

View File

@ -61,21 +61,34 @@ minetest.register_node("runes:black_magic_block", {
}) })
-- Globalstep checking for the amulets -- Globalstep checking for the amulets
minetest.register_globalstep(function(dtime) tmpdata = {}
loop = function()
for _, player in pairs(minetest.get_connected_players()) do for _, player in pairs(minetest.get_connected_players()) do
local inv = player:get_inventory() local inv = player:get_inventory()
local basemana = mana.settings.default_max local pname = player:get_player_name()
local basemana = mana.getmax(pname) - (tmpdata[pname] or 0) -- Baseline mana, without any amulets
local addons = 0
for index, item in pairs(inv:get_list("main")) do for index, item in pairs(inv:get_list("main")) do
local itemname = item:get_name() local itemname = item:get_name()
local itemcount = item:get_count() local itemcount = item:get_count()
for name, manadiff in pairs(runes.datas.amulets) do for name, manadiff in pairs(runes.datas.amulets) do
if itemname == "runes:" .. name .. "_amulet" then if itemname == "runes:" .. name .. "_amulet" then
basemana = basemana + (manadiff * itemcount) addons = addons + (manadiff * itemcount)
--print("Detected " .. name)
end end
end end
end end
if basemana ~= mana.settings.default_max then mana.setmax(pname, basemana + addons)
mana.setmax(player:get_player_name(), basemana) tmpdata[pname] = addons
end
end end
minetest.after(1, loop)
end
minetest.after(0, loop)
minetest.register_on_leaveplayer(function(player)
local pname = player:get_player_name()
mana.setmax(pname, mana.getmax(pname) - tmpdata[pname]) -- Reset
tmpdata[pname] = nil
mana.save_to_file(pname) -- Double class since we aren't sure mana hasn't already saved (it probably did)
end) end)

View File

@ -1,5 +1,6 @@
default default
mobs mobs
maptools
farming? farming?
treasurer? treasurer?
watershed? watershed?

View File

@ -1,4 +1,5 @@
pyramids = {} pyramids = {}
pyramids.max_time = 30*60
dofile(minetest.get_modpath("tsm_pyramids").."/mummy.lua") dofile(minetest.get_modpath("tsm_pyramids").."/mummy.lua")
dofile(minetest.get_modpath("tsm_pyramids").."/nodes.lua") dofile(minetest.get_modpath("tsm_pyramids").."/nodes.lua")
@ -16,37 +17,34 @@ local chest_stuff = {
} }
function pyramids.fill_chest(pos) function pyramids.fill_chest(pos)
minetest.after(2, function() local n = minetest.get_node_or_nil(pos)
local n = minetest.get_node(pos) if n and n.name and n.name == "tsm_pyramids:chest" then
if n and n.name and n.name == "maptools:chest" then local meta = minetest.get_meta(pos)
local meta = minetest.get_meta(pos) local inv = meta:get_inventory()
local inv = meta:get_inventory() inv:set_size("main", 8*4)
inv:set_size("main", 8*4) inv:set_list("main",
inv:set_list("main", {
{ [1] = "",
[1] = "", [32] = ""
[32] = "" }
} )
) if math.random(1,10) < 7 then return end
if math.random(1,10) < 7 then return end local stacks = {}
local stacks = {} if minetest.get_modpath("treasurer") ~= nil then
if minetest.get_modpath("treasurer") ~= nil then stacks = treasurer.select_random_treasures()
stacks = treasurer.select_random_treasures() else
else for i=0,2,1 do
for i=0,2,1 do local stuff = chest_stuff[math.random(1,#chest_stuff)]
local stuff = chest_stuff[math.random(1,#chest_stuff)] if stuff.name == "farming:bread" and not minetest.get_modpath("farming") then stuff = chest_stuff[1] end
if stuff.name == "farming:bread" and not minetest.get_modpath("farming") then stuff = chest_stuff[1] end table.insert(stacks, {name=stuff.name, count = math.random(1,stuff.max)})
table.insert(stacks, {name=stuff.name, count = math.random(1,stuff.max)})
end
end end
for s=1,#stacks do
if not inv:contains_item("main", stacks[s]) then
inv:set_stack("main", math.random(1,32), stacks[s])
end
end
end end
end) for s=1,#stacks do
if not inv:contains_item("main", stacks[s]) then
inv:set_stack("main", math.random(1,32), stacks[s])
end
end
end
end end
local function add_spawner(pos) local function add_spawner(pos)
@ -73,45 +71,45 @@ local function underground(pos)
while can_replace(p2)==true do while can_replace(p2)==true do
cnt = cnt+1 cnt = cnt+1
if cnt > 25 then break end if cnt > 25 then break end
if cnt>math.random(2,4) then mat = "desert_stone"end if cnt>math.random(2,4) then mat = "desert_stone" end
minetest.set_node(p2, {name="default:"..mat}) minetest.set_node(p2, {name="default:"..mat})
p2.y = p2.y-1 p2.y = p2.y-1
end end
end end
local function make_entrance(pos) local function make_entrance(pos)
local gang = {x=pos.x+10,y=pos.y, z=pos.z} local gang = {x=pos.x+10,y=pos.y, z=pos.z}
for iy=2,3,1 do for iy=2,3,1 do
for iz=0,6,1 do for iz=0,6,1 do
minetest.remove_node({x=gang.x+1,y=gang.y+iy,z=gang.z+iz}) minetest.remove_node({x=gang.x+1,y=gang.y+iy,z=gang.z+iz})
if iz >=3 and iy == 3 then if iz >=3 and iy == 3 then
minetest.set_node({x=gang.x,y=gang.y+iy+1,z=gang.z+iz}, {name="maptools:sandstone_brick"}) minetest.set_node({x=gang.x,y=gang.y+iy+1,z=gang.z+iz}, {name="maptools:sandstone_brick"})
minetest.set_node({x=gang.x+1,y=gang.y+iy+1,z=gang.z+iz}, {name="maptools:sandstone_brick"}) minetest.set_node({x=gang.x+1,y=gang.y+iy+1,z=gang.z+iz}, {name="maptools:sandstone_brick"})
minetest.set_node({x=gang.x+2,y=gang.y+iy+1,z=gang.z+iz}, {name="maptools:sandstone_brick"}) minetest.set_node({x=gang.x+2,y=gang.y+iy+1,z=gang.z+iz}, {name="maptools:sandstone_brick"})
end
end end
end end
end
end end
local function make(pos) function pyramids.make(pos)
minetest.log("action", "Created pyramid at ("..pos.x..","..pos.y..","..pos.z..")") minetest.log("action", "Created pyramid at ("..pos.x..","..pos.y..","..pos.z..")")
for iy=0,10,1 do for iy=0,10,1 do
for ix=iy,22-iy,1 do for ix=iy,22-iy,1 do
for iz=iy,22-iy,1 do for iz=iy,22-iy,1 do
if iy <1 then underground({x=pos.x+ix,y=pos.y,z=pos.z+iz}) end if iy <1 then underground({x=pos.x+ix,y=pos.y,z=pos.z+iz}) end
minetest.set_node({x=pos.x+ix,y=pos.y+iy,z=pos.z+iz}, {name="maptools:sandstone_brick"}) minetest.set_node({x=pos.x+ix,y=pos.y+iy,z=pos.z+iz}, {name="maptools:sandstone_brick"})
for yy=1,10-iy,1 do for yy=1,10-iy,1 do
local n = minetest.get_node({x=pos.x+ix,y=pos.y+iy+yy,z=pos.z+iz}) local n = minetest.get_node({x=pos.x+ix,y=pos.y+iy+yy,z=pos.z+iz})
if n and n.name and n.name == "default:desert_stone" then minetest.set_node({x=pos.x+ix,y=pos.y+iy+yy,z=pos.z+iz},{name="default:desert_sand"}) end if n and n.name and n.name == "default:desert_stone" then minetest.set_node({x=pos.x+ix,y=pos.y+iy+yy,z=pos.z+iz},{name="default:desert_sand"}) end
end end
end
end end
end end
end
pyramids.make_room(pos) pyramids.make_room(pos)
minetest.after(2, pyramids.make_traps, pos) minetest.after(2, pyramids.make_traps, pos)
add_spawner({x=pos.x+11,y=pos.y+2, z=pos.z+17}) add_spawner({x=pos.x+11,y=pos.y+2, z=pos.z+17})
make_entrance({x=pos.x,y=pos.y, z=pos.z}) make_entrance({x=pos.x,y=pos.y, z=pos.z})
end end
local perl1 = {SEED1 = 9130, OCTA1 = 3, PERS1 = 0.5, SCAL1 = 250} -- Values should match minetest mapgen V6 desert noise. local perl1 = {SEED1 = 9130, OCTA1 = 3, PERS1 = 0.5, SCAL1 = 250} -- Values should match minetest mapgen V6 desert noise.
@ -124,6 +122,7 @@ local function hlp_fnct(pos, name)
return false return false
end end
end end
local function ground(pos, old) local function ground(pos, old)
local p2 = pos local p2 = pos
while hlp_fnct(p2, "air") do while hlp_fnct(p2, "air") do
@ -140,48 +139,49 @@ end
minetest.register_on_generated(function(minp, maxp, seed) minetest.register_on_generated(function(minp, maxp, seed)
minetest.after(3, function(minp, maxp, seed) minetest.after(3, function(minp, maxp, seed)
if maxp.y < 0 then return end if maxp.y < 0 then return end
math.randomseed(seed) math.randomseed(seed)
local cnt = 0 local cnt = 0
local perlin1 = minetest.get_perlin(perl1.SEED1, perl1.OCTA1, perl1.PERS1, perl1.SCAL1) local perlin1 = minetest.get_perlin(perl1.SEED1, perl1.OCTA1, perl1.PERS1, perl1.SCAL1)
local noise1 = perlin1:get2d({x=minp.x,y=minp.y})--,z=minp.z}) local noise1 = perlin1:get2d({x=minp.x,y=minp.y})--,z=minp.z})
if noise1 > 0.25 or noise1 < -0.26 and math.random(1,100) % 2 == 0 then -- Coward attempt to divide per 2 the spawn rate if noise1 > 0.25 or noise1 < -0.26 and math.random(1,100) % 2 == 0 then -- Coward attempt to divide per 2 the spawn rate
local mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)} local mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)}
local p2 = minetest.find_node_near(mpos, 25, {"default:desert_sand"}) local p2 = minetest.find_node_near(mpos, 25, {"default:desert_sand"})
while p2 == nil and cnt < 5 do while p2 == nil and cnt < 5 do
cnt = cnt+1 cnt = cnt+1
mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)} mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)}
p2 = minetest.find_node_near(mpos, 25, {"default:desert_sand"}) p2 = minetest.find_node_near(mpos, 25, {"default:desert_sand"})
end
if p2 == nil then return end
if p2.y < 0 then return end
local off = 0
local opos1 = {x=p2.x+22,y=p2.y-1,z=p2.z+22}
local opos2 = {x=p2.x+22,y=p2.y-1,z=p2.z}
local opos3 = {x=p2.x,y=p2.y-1,z=p2.z+22}
local opos1_n = minetest.get_node_or_nil(opos1)
local opos2_n = minetest.get_node_or_nil(opos2)
local opos3_n = minetest.get_node_or_nil(opos3)
if opos1_n and opos1_n.name and opos1_n.name == "air" then
p2 = ground(opos1, p2)
end
if opos2_n and opos2_n.name and opos2_n.name == "air" then
p2 = ground(opos2, p2)
end
if opos3_n and opos3_n.name and opos3_n.name == "air" then
p2 = ground(opos3, p2)
end
p2.y = p2.y - 3
if p2.y < 0 then p2.y = 0 end
if minetest.find_node_near(p2, 25, {"default:water_source"}) ~= nil
or minetest.find_node_near(p2, 22, {"default:dirt_with_grass"}) ~= nil
or minetest.find_node_near(p2, 52, {"maptools:sandstone_brick"}) ~= nil then return end
if math.random(0,10) > 7 then return end
pyramids.make(p2)
end end
if p2 == nil then return end
if p2.y < 0 then return end
local off = 0
local opos1 = {x=p2.x+22,y=p2.y-1,z=p2.z+22}
local opos2 = {x=p2.x+22,y=p2.y-1,z=p2.z}
local opos3 = {x=p2.x,y=p2.y-1,z=p2.z+22}
local opos1_n = minetest.get_node_or_nil(opos1)
local opos2_n = minetest.get_node_or_nil(opos2)
local opos3_n = minetest.get_node_or_nil(opos3)
if opos1_n and opos1_n.name and opos1_n.name == "air" then
p2 = ground(opos1, p2)
end
if opos2_n and opos2_n.name and opos2_n.name == "air" then
p2 = ground(opos2, p2)
end
if opos3_n and opos3_n.name and opos3_n.name == "air" then
p2 = ground(opos3, p2)
end
p2.y = p2.y - 3
if p2.y < 0 then p2.y = 0 end
if minetest.find_node_near(p2, 25, {"default:water_source"}) ~= nil or minetest.find_node_near(p2, 22, {"default:dirt_with_grass"}) ~= nil or minetest.find_node_near(p2, 52, {"maptools:sandstone_brick"}) ~= nil then return end
if math.random(0,10) > 7 then return end
make(p2)
end
end, minp, maxp, seed) end, minp, maxp, seed)
end) end)

View File

@ -52,10 +52,31 @@ mobs:register_mob("tsm_pyramids:mummy", {
sit_start = 81, sit_end = 160, sit_start = 81, sit_end = 160,
lay_start = 162, lay_end = 166, lay_start = 162, lay_end = 166,
mine_start = 74, mine_end = 105, mine_start = 74, mine_end = 105,
walk_mine_start = 74, walk_mine_end = 105, walk_mine_start = 74, walk_mine_end = 105,
}, },
}) })
--MFF ABM to replace old maptools:chest
minetest.register_abm({
nodenames = {"tsm_pyramids:spawner_mummy"},
interval = 10.0,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local chests = minetest.find_nodes_in_area(
{x=pos.x-4, y=pos.y-3, z=pos.z-10},
{x=pos.x+4, y=pos.y, z=pos.z},
"maptools:chest"
)
for _, cpos in ipairs(chests) do
local p2 = 0
local n = minetest.get_node_or_nil(cpos)
if n and n.param2 then
p2 = n.param2
end
minetest.set_node(cpos, {name="tsm_pyramids:chest", param2=p2})
end
end
})
-- spawner (spawn in pyramids, near the spawner) -- spawner (spawn in pyramids, near the spawner)
if not minetest.setting_getbool("only_peaceful_mobs") then if not minetest.setting_getbool("only_peaceful_mobs") then
minetest.register_abm({ minetest.register_abm({
@ -101,10 +122,10 @@ minetest.register_node("tsm_pyramids:spawner_mummy", {
drop = "", drop = "",
on_construct = function(pos) on_construct = function(pos)
pos.y = pos.y - 0.28 pos.y = pos.y - 0.28
minetest.env:add_entity(pos,"tsm_pyramids:mummy_spawner") minetest.add_entity(pos,"tsm_pyramids:mummy_spawner")
end, end,
on_destruct = function(pos) on_destruct = function(pos)
for _,obj in ipairs(minetest.env:get_objects_inside_radius(pos, 1)) do for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do
if not obj:is_player() then if not obj:is_player() then
if obj ~= nil and obj:get_luaentity().m_name == "dummy" then if obj ~= nil and obj:get_luaentity().m_name == "dummy" then
obj:remove() obj:remove()
@ -122,7 +143,7 @@ minetest.register_craftitem("tsm_pyramids:spawn_egg", {
stack_max = 99, stack_max = 99,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
if pointed_thing.type == "node" then if pointed_thing.type == "node" then
minetest.env:add_entity(pointed_thing.above,"tsm_pyramids:mummy") minetest.add_entity(pointed_thing.above,"tsm_pyramids:mummy")
if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end
return itemstack return itemstack
end end

View File

@ -4,14 +4,14 @@ for i=1,3 do
minetest.register_node("tsm_pyramids:deco_stone"..i, { minetest.register_node("tsm_pyramids:deco_stone"..i, {
description = "Sandstone with "..img[i], description = "Sandstone with "..img[i],
tiles = {"default_sandstone.png^tsm_pyramids_"..img[i]..".png"}, tiles = {"default_sandstone.png^tsm_pyramids_"..img[i]..".png"},
is_ground_content = true, is_ground_content = false,
groups = {unbreakable=1}, groups = {unbreakable=1},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
}) })
end end
trap_on_timer = function (pos, elapsed) local trap_on_timer = function (pos, elapsed)
local objs = minetest.env:get_objects_inside_radius(pos, 2) local objs = minetest.get_objects_inside_radius(pos, 2)
for i, obj in pairs(objs) do for i, obj in pairs(objs) do
if obj:is_player() then if obj:is_player() then
local n = minetest.get_node(pos) local n = minetest.get_node(pos)
@ -27,11 +27,11 @@ end
minetest.register_node("tsm_pyramids:trap", { minetest.register_node("tsm_pyramids:trap", {
description = "Cracked sandstone brick", description = "Cracked sandstone brick",
tiles = {"default_sandstone_brick.png^tsm_pyramids_crack.png"}, tiles = {"default_sandstone_brick.png^tsm_pyramids_crack.png"},
is_ground_content = true, is_ground_content = false,
groups = {crumbly=2,cracky=3}, groups = {crumbly=2,cracky=3},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
on_construct = function(pos) on_construct = function(pos)
minetest.env:get_node_timer(pos):start(0.1) minetest.get_node_timer(pos):start(0.1)
end, end,
crack = 1, crack = 1,
on_timer = trap_on_timer, on_timer = trap_on_timer,
@ -41,8 +41,31 @@ minetest.register_node("tsm_pyramids:trap", {
minetest.register_node("tsm_pyramids:trap_2", { minetest.register_node("tsm_pyramids:trap_2", {
description = "trapstone", description = "trapstone",
tiles = {"default_sandstone_brick.png^tsm_pyramids_crack.png^[transformR90"}, tiles = {"default_sandstone_brick.png^tsm_pyramids_crack.png^[transformR90"},
is_ground_content = true, is_ground_content = false,
groups = {crumbly=2,cracky=3,falling_node=1,not_in_creative_inventory=1}, groups = {crumbly=2,cracky=3,falling_node=1,not_in_creative_inventory=1},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
drop = "", drop = "",
}) })
local chestdef = minetest.registered_nodes["default:chest"]
minetest.register_node("tsm_pyramids:chest",{
description = "tsm_pyramids Chest auto refilled",
tiles = chestdef.tiles,
stack_max = 1000,
paramtype2 = "facedir",
is_ground_content = false,
on_construct = function(pos)
chestdef.on_construct(pos)
minetest.get_node_timer(pos):start(pyramids.max_time)
pyramids.fill_chest(pos)
end,
on_metadata_inventory_move = chestdef.on_metadata_inventory_move,
on_metadata_inventory_put = chestdef.on_metadata_inventory_put,
on_metadata_inventory_take = chestdef.on_metadata_inventory_take,
groups = {unbreakable = 1, not_in_creative_inventory = 1},
on_timer = function (pos, elapsed)
pyramids.fill_chest(pos)
return true
end,
})

View File

@ -1,6 +1,3 @@
pyramids.saved_chests = {}
pyramids.max_time = 30*60
local room = {"a","a","a","a","a","a","a","a","a", local room = {"a","a","a","a","a","a","a","a","a",
"a","c","a","c","a","c","a","c","a", "a","c","a","c","a","c","a","c","a",
@ -33,56 +30,14 @@ code["a"] = "air"
code["l"] = "lava_source" code["l"] = "lava_source"
code["t"] = "trap" code["t"] = "trap"
function loadchests()
local file = io.open(minetest.get_worldpath().."/pyramids_chests.txt","r")
if file then
local saved_chests = minetest.deserialize(file:read())
io.close(file)
if saved_chests and type(saved_chests) == "table" then
minetest.log("action","[tsm_pyramids] Chest loaded")
return saved_chests
else
minetest.log("error","[tsm_pyramids] Loading Chest failed")
end
end
return {}
end
function savechests()
local file = io.open(minetest.get_worldpath().."/pyramids_chests.txt","w")
if not file then return end -- should not happen
file:write(minetest.serialize(pyramids.saved_chests))
io.close(file)
minetest.log("action","[tsm_pyramids] Chests saved")
end
pyramids.saved_chests = loadchests()
minetest.register_on_shutdown(function()
savechests()
end)
local function chests_reload()
-- It might happen that chests are not loaded
if pyramids.saved_chests then
for _,k in ipairs(pyramids.saved_chests) do
pyramids.fill_chest(k)
end
else
pyramids.saved_chests = loadchests() or {}
end
minetest.log("action","[tsm_pyramids] Chests reloaded")
minetest.after(pyramids.max_time, chests_reload)
end
minetest.after(0, chests_reload)
local function replace(str,iy) local function replace(str,iy)
local out = "default:" local out = "default:"
if iy < 4 and str == "c" then str = "a" end if iy < 4 and str == "c" then str = "a" end
if iy == 0 and str == "s" then out = "tsm_pyramids:" str = "sun" end if iy == 0 and str == "s" then out = "tsm_pyramids:" str = "sun" end
if iy == 3 and str == "s" then out = "tsm_pyramids:" str = "men" end if iy == 3 and str == "s" then out = "tsm_pyramids:" str = "men" end
if str == "a" then out = "" end if str == "a" then out = "" end
if str == "c" or str == "s" or str == "b" then out = "maptools:" end if str == "c" then out = "tsm_pyramids:" end --MFF newchest
if str == "s" or str == "b" then out = "maptools:" end
return out..code[str] return out..code[str]
end end
@ -96,35 +51,30 @@ local function replace2(str,iy)
end end
function pyramids.make_room(pos) function pyramids.make_room(pos)
local loch = {x=pos.x+7,y=pos.y+5, z=pos.z+7} local loch = {x=pos.x+7,y=pos.y+5, z=pos.z+7}
for iy=0,4,1 do for iy=0,4,1 do
for ix=0,8,1 do for ix=0,8,1 do
for iz=0,8,1 do for iz=0,8,1 do
local n_str = room[tonumber(ix*9+iz+1)] local n_str = room[tonumber(ix*9+iz+1)]
local p2 = 0 local p2 = 0
if n_str == "c" then if n_str == "c" then
if ix < 3 then p2 = 1 else p2 = 3 end if ix < 3 then p2 = 1 else p2 = 3 end
pyramids.fill_chest({x=loch.x+ix,y=loch.y-iy,z=loch.z+iz}) end
end minetest.set_node({x=loch.x+ix,y=loch.y-iy,z=loch.z+iz}, {name=replace(n_str,iy), param2=p2})
local node_name = replace(n_str,iy)
minetest.set_node({x=loch.x+ix,y=loch.y-iy,z=loch.z+iz}, {name=node_name, param2=p2})
if node_name == "maptools:chest" then
table.insert(pyramids.saved_chests,1,{x=loch.x+ix,y=loch.y-iy,z=loch.z+iz})
end end
end end
end end
end
end end
function pyramids.make_traps(pos) function pyramids.make_traps(pos)
local loch = {x=pos.x+7,y=pos.y, z=pos.z+7} local loch = {x=pos.x+7,y=pos.y, z=pos.z+7}
for iy=0,4,1 do for iy=0,4,1 do
for ix=0,8,1 do for ix=0,8,1 do
for iz=0,8,1 do for iz=0,8,1 do
local n_str = trap[tonumber(ix*9+iz+1)] local n_str = trap[tonumber(ix*9+iz+1)]
local p2 = 0 local p2 = 0
minetest.set_node({x=loch.x+ix,y=loch.y-iy,z=loch.z+iz}, {name=replace2(n_str,iy), param2=p2}) minetest.set_node({x=loch.x+ix,y=loch.y-iy,z=loch.z+iz}, {name=replace2(n_str,iy), param2=p2})
end
end end
end end
end
end end

File diff suppressed because it is too large Load Diff