initial commit of LionsDen fork of LocaL_ALchemisT workers
@ -1,2 +0,0 @@
|
|||||||
# workers
|
|
||||||
Minetest Workers - LionsDen's fork of LocaL_ALchemisT's mod
|
|
666
abm.lua
Normal file
@ -0,0 +1,666 @@
|
|||||||
|
--[[
|
||||||
|
Workers Mod
|
||||||
|
By LocaL_ALchemisT (prof_awang@yahoo.com)
|
||||||
|
License: WTFPL
|
||||||
|
Version: 2.0
|
||||||
|
--]]
|
||||||
|
|
||||||
|
local STAT_LIM = 8
|
||||||
|
|
||||||
|
-- HARVEY THE HARVESTER
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
nodenames = {"workers:harvester"},
|
||||||
|
interval = 2,
|
||||||
|
chance = 1,
|
||||||
|
action = function(p, node, _, _)
|
||||||
|
local meta = minetest.env:get_meta(p)
|
||||||
|
local hasMaterial = false
|
||||||
|
if meta:get_int("start_work") == 0 then return end
|
||||||
|
if meta:get_int("quantity") >= 99 then
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
speak(meta:get_string("master"), "Harvey: I am at "..minetest.pos_to_string(p)..", Master. My inventory is full.")
|
||||||
|
end
|
||||||
|
|
||||||
|
for y = 0,1 do
|
||||||
|
for x = -1,1 do
|
||||||
|
for z = -1,1 do
|
||||||
|
local pp = {x=p.x+x,y=p.y+y,z=p.z+z}
|
||||||
|
if peek(pp,meta:get_string("material")) and meta:get_int("quantity") <= 99 then
|
||||||
|
minetest.env:remove_node(pp)
|
||||||
|
meta:set_int("quantity",meta:get_int("quantity")+1)
|
||||||
|
if hasMaterial == false then hasMaterial = true end
|
||||||
|
if meta:get_int("status") == 1 then speak(meta:get_string("master"), "Harvey: I am at "..minetest.pos_to_string(p)..", Master") end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if hasMaterial == false then
|
||||||
|
local where = faceTo(p,meta:get_int("previousdir"),0)
|
||||||
|
if where ~= nil then
|
||||||
|
local np = shouldFall(where.pos)
|
||||||
|
meta:set_int("previousdir",where.face)
|
||||||
|
minetest.env:add_node(np,{name="workers:harvester",param2=where.face})
|
||||||
|
local meta2 = minetest.env:get_meta(np)
|
||||||
|
meta2:from_table(meta:to_table())
|
||||||
|
minetest.env:remove_node(p)
|
||||||
|
if meta2:get_int("status") == STAT_LIM then
|
||||||
|
speak(meta:get_string("master"), "Harvey: I am at "..minetest.pos_to_string(p)..", Master")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if meta:get_int("status") == STAT_LIM then
|
||||||
|
speak(meta:get_string("master"), "Harvey: Sorry Master, I cannot move. I am at "..minetest.pos_to_string(p))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else print(meta:get_int("quantity").." "..meta:get_string("material").." gathered.") end
|
||||||
|
|
||||||
|
if meta:get_int("status") == STAT_LIM then meta:set_int("status",1)
|
||||||
|
else meta:set_int("status",meta:get_int("status")+1) end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- MORDEC THE MINER
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
nodenames = {"workers:miner"},
|
||||||
|
interval = 2,
|
||||||
|
chance = 1,
|
||||||
|
action = function(p, node, _, _)
|
||||||
|
local meta = minetest.env:get_meta(p)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
if meta:get_int("start_work") == 0 then return end
|
||||||
|
if inv:get_stack("wood",1):to_table() == nil then
|
||||||
|
meta:set_int("status",0)
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
speak(meta:get_string("master"), "Mordec: I am at "..minetest.pos_to_string(p)..", Master. I am out of wood.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local isFull = true
|
||||||
|
for i = 1,12 do
|
||||||
|
local orestack = inv:get_stack("ores",i)
|
||||||
|
if orestack:to_table() ~= nil then
|
||||||
|
local o = orestack:to_table().name
|
||||||
|
if o == "default:cobble" or o == "default:sand" or o == "default:dirt" or o == "default:desert_sand"
|
||||||
|
or o == "default:gravel" or o == "default:desert_stone" then
|
||||||
|
if orestack:to_table().count == 99 then
|
||||||
|
inv:remove_item("ores", orestack)
|
||||||
|
minetest.env:add_item({x = p.x + (math.random(1,3)-2), y = p.y, z = p.z + (math.random(1,3)-2)},''..o..' 99')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if orestack:get_free_space() > 0 then isFull = false end
|
||||||
|
end
|
||||||
|
if isFull == true then
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
speak(meta:get_string("master"), "Mordec: I am at "..minetest.pos_to_string(p)..", Master. My inventory is full.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Check for lava, water and air below the level I want to mine.
|
||||||
|
local y = -2
|
||||||
|
for x = -2, 2 do
|
||||||
|
for z = -2, 2 do
|
||||||
|
local pp = {x = p.x + x, y = p.y + y, z = p.z + z}
|
||||||
|
local node_name = minetest.env:get_node(pp).name
|
||||||
|
if node_name == "air" or node_name == "default:lava_source" or
|
||||||
|
node_name == "default:lava_flowing" or node.name == "default:water_source" or
|
||||||
|
node_name == "default:water_flowing" then
|
||||||
|
meta:set_int("start_work", 0)
|
||||||
|
speak(meta:get_string("master"), "Mordec: I am at "..minetest.pos_to_string(p)..
|
||||||
|
", Master. Something is below me.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local orelist = inv:get_list("ores")
|
||||||
|
for x = -1,1 do
|
||||||
|
for y = -1,0 do
|
||||||
|
for z = -1,1 do
|
||||||
|
local pp = {x=p.x+x,y=p.y+y,z=p.z+z}
|
||||||
|
if minetest.env:get_node(pp).name ~= "workers:miner"
|
||||||
|
and minetest.env:get_node(pp).name ~= "workers:hunter"
|
||||||
|
and minetest.env:get_node(pp).name ~= "default:ladder"
|
||||||
|
and minetest.env:get_node(pp).name ~= "air"
|
||||||
|
and minetest.env:get_node(pp).name ~= "default:water_source"
|
||||||
|
and minetest.env:get_node(pp).name ~= "default:water_flowing"
|
||||||
|
and minetest.env:get_node(pp).name ~= "default:lava_source"
|
||||||
|
and minetest.env:get_node(pp).name ~= "default:lava_flowing" then
|
||||||
|
local ore = get_ore(minetest.env:get_node(pp).name)
|
||||||
|
if ore ~= nil and ore ~= "air" then
|
||||||
|
inv:add_item("ores",ore)
|
||||||
|
end
|
||||||
|
minetest.env:remove_node(pp)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local np = shouldFall_miner(p)
|
||||||
|
minetest.env:add_node(np,{name="workers:miner",param2=minetest.env:get_node(p).param2})
|
||||||
|
local meta2 = minetest.env:get_meta(np)
|
||||||
|
meta2:from_table(meta:to_table())
|
||||||
|
meta2:get_inventory():remove_item("wood",'"default:wood" 1')
|
||||||
|
minetest.env:remove_node(p)
|
||||||
|
if meta2:get_int("status") == 0 then
|
||||||
|
minetest.sound_play("mordec_00", {pos = pos, gain = 1.0, max_hear_distance = 6,})
|
||||||
|
end
|
||||||
|
-- Set the torch after the first dig down. Also attach the torch
|
||||||
|
-- to a wall (hopefully).
|
||||||
|
if meta2:get_int("status") == 1 then
|
||||||
|
pp = {x = p.x + 1, y = p.y, z = p.z + 1}
|
||||||
|
minetest.env:add_node(pp,{name="default:torch", param2 = 2})
|
||||||
|
end
|
||||||
|
if meta2:get_int("status") == STAT_LIM then
|
||||||
|
speak(meta2:get_string("master"), "Mordec: I am at "..minetest.pos_to_string(p)..", Master")
|
||||||
|
end
|
||||||
|
|
||||||
|
if meta2:get_int("status") == STAT_LIM then
|
||||||
|
meta2:set_int("status",0)
|
||||||
|
else
|
||||||
|
meta2:set_int("status",meta2:get_int("status")+1)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- GARREN THE GARDENER
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
nodenames = {"workers:gardener"},
|
||||||
|
interval = 2,
|
||||||
|
chance = 1,
|
||||||
|
action = function(p, node, _, _)
|
||||||
|
local meta = minetest.env:get_meta(p)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local plant = inv:get_stack("plant",1):to_table()
|
||||||
|
local sapling = inv:get_stack("sapling",1):to_table()
|
||||||
|
|
||||||
|
if meta:get_int("start_work") == 0 then return end
|
||||||
|
|
||||||
|
if sapling == nil then
|
||||||
|
meta:set_int("status",0)
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
speak(meta:get_string("master"), "Garren: I am at "..minetest.pos_to_string(p)..", Master. I am out of sapling.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local where = nil
|
||||||
|
if meta:get_int("clockwise") == 0 then
|
||||||
|
where = anticlockwise(p,meta:get_int("previousdir"))
|
||||||
|
if where == nil then
|
||||||
|
where = clockwise(p,meta:get_int("previousdir"))
|
||||||
|
meta:set_int("clockwise",1)
|
||||||
|
end
|
||||||
|
elseif meta:get_int("clockwise") == 1 then
|
||||||
|
where = clockwise(p,meta:get_int("previousdir"))
|
||||||
|
if where == nil then
|
||||||
|
where = anticlockwise(p,meta:get_int("previousdir"))
|
||||||
|
meta:set_int("clockwise",0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if where == nil then where = faceTo(p,meta:get_int("previousdir"),0) end
|
||||||
|
|
||||||
|
if where ~= nil then
|
||||||
|
local np = shouldFall(where.pos)
|
||||||
|
meta:set_int("previousdir",where.face)
|
||||||
|
minetest.env:add_node(np,{name="workers:gardener",param2=where.face})
|
||||||
|
local meta2 = minetest.env:get_meta(np)
|
||||||
|
meta2:from_table(meta:to_table())
|
||||||
|
minetest.env:remove_node(p)
|
||||||
|
|
||||||
|
local inv2 = meta2:get_inventory()
|
||||||
|
-- jungletree
|
||||||
|
if plant.name == "default:jungletree" and sapling.count >= 9 then
|
||||||
|
for h = 0,3 do minetest.env:add_node({x = p.x,y = p.y+h,z = p.z},{name=plant.name}) end
|
||||||
|
for x = -1,1 do
|
||||||
|
for y = 2,4 do
|
||||||
|
for z = -1,1 do
|
||||||
|
local pt = {x = p.x+x,y = p.y+y,z = p.z+z}
|
||||||
|
if minetest.env:get_node(pt).name == "air" then
|
||||||
|
minetest.env:add_node(pt,{name="default:leaves"})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inv2:remove_item("sapling",'"default:sapling" 9')
|
||||||
|
-- appletree
|
||||||
|
elseif plant.name == "default:apple" and sapling.count >= 3 then
|
||||||
|
for h = 0,3 do minetest.env:add_node({x = p.x,y = p.y+h,z = p.z},{name="default:tree"}) end
|
||||||
|
for x = -1,1 do
|
||||||
|
for y = 2,4 do
|
||||||
|
for z = -1,1 do
|
||||||
|
local pt = {x = p.x+x,y = p.y+y,z = p.z+z}
|
||||||
|
if minetest.env:get_node(pt).name == "air" then
|
||||||
|
if math.random(1,2) == 1 then minetest.env:add_node(pt,{name="default:leaves"})
|
||||||
|
else minetest.env:add_node(pt,{name="default:apple"}) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inv2:remove_item("sapling",'"default:sapling" 3')
|
||||||
|
-- cactus or papyrus
|
||||||
|
elseif (plant.name == "default:cactus" or plant.name == "default:papyrus") and sapling.count >= 3 then
|
||||||
|
for h = 0,2 do minetest.env:add_node({x = p.x,y = p.y+h,z = p.z},{name=plant.name}) end
|
||||||
|
inv2:remove_item("sapling",'"default:sapling" 3')
|
||||||
|
-- junglegrass or dry shrub
|
||||||
|
elseif (plant.name == "default:junglegrass" or plant.name == "default:dry_shrub") then
|
||||||
|
minetest.env:add_node(p,{name=plant.name})
|
||||||
|
inv2:remove_item("sapling","default:sapling")
|
||||||
|
-- everything else
|
||||||
|
else
|
||||||
|
minetest.env:add_node(p,{name="default:sapling"})
|
||||||
|
inv2:remove_item("sapling","default:sapling")
|
||||||
|
end
|
||||||
|
|
||||||
|
if meta2:get_int("status") == STAT_LIM then
|
||||||
|
speak(meta:get_string("master"), "Garren: I am at "..minetest.pos_to_string(p)..", Master")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if meta:get_int("status") == STAT_LIM then
|
||||||
|
speak(meta:get_string("master"), "Garren: Sorry Master, I cannot move. I am at "..minetest.pos_to_string(p))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if meta:get_int("status") == STAT_LIM then meta:set_int("status",0)
|
||||||
|
else meta:set_int("status",meta:get_int("status")+1) end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- BENJO THE BUILDER
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
nodenames = {"workers:builder"},
|
||||||
|
interval = 2,
|
||||||
|
chance = 1,
|
||||||
|
action = function(p, node, _, _)
|
||||||
|
local meta = minetest.env:get_meta(p)
|
||||||
|
if meta:get_int("start_work") == 0 then return end
|
||||||
|
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local plan = inv:get_stack("plan",1):to_table().name
|
||||||
|
local material = inv:get_stack("material",1):to_table().name
|
||||||
|
print(material)
|
||||||
|
local allowed = {"default:stone","default:cobble","default:mossycobble","default:tree","default:jungletree","default:wood",
|
||||||
|
"default:brick","default:clay","default:desert_stone","default:glass","default:steelblock","default:cactus",
|
||||||
|
"default:dirt"}
|
||||||
|
local pass = false
|
||||||
|
for i = 1,13 do
|
||||||
|
if material == allowed[i] then pass = true end
|
||||||
|
end
|
||||||
|
if pass == false then
|
||||||
|
minetest.chat_send_player(master, "Benjo: I can't use this material, Master.")
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
return end
|
||||||
|
|
||||||
|
local bp = nil
|
||||||
|
-- house
|
||||||
|
if plan == "workers:plan_house" then
|
||||||
|
print("house")
|
||||||
|
for y = -1,3 do
|
||||||
|
for x = -2,2 do
|
||||||
|
for z = -3,3 do
|
||||||
|
bp = {x=p.x+x,y=p.y+y,z=p.z+z}
|
||||||
|
if x~=0 and y~=0 and z~=0 then minetest.env:remove_node(bp) end
|
||||||
|
if y == -1 or y == 3 then
|
||||||
|
minetest.env:add_node(bp,{name=material})
|
||||||
|
elseif x*x == 4 or z*z == 9 then
|
||||||
|
minetest.env:add_node(bp,{name=material})
|
||||||
|
if ((x==0 and z*z==9) or (x*x==4 and (z==0 or z*z==4))) and y==1 then minetest.env:remove_node(bp) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- hut
|
||||||
|
elseif plan == "workers:plan_hut" then
|
||||||
|
print("hut")
|
||||||
|
for y = -1,2 do
|
||||||
|
for x = -1,1 do
|
||||||
|
for z = -1,1 do
|
||||||
|
bp = {x=p.x+x,y=p.y+y,z=p.z+z}
|
||||||
|
if x~=0 and y~=0 and z~=0 then minetest.env:remove_node(bp) end
|
||||||
|
if y == -1 or y == 2 then
|
||||||
|
minetest.env:add_node(bp,{name=material})
|
||||||
|
elseif x*x == 1 or z*z == 1 then
|
||||||
|
minetest.env:add_node(bp,{name=material})
|
||||||
|
if ((x==0 and z*z==1) or (x*x==1 and z==0)) and y==1 then minetest.env:remove_node(bp) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
minetest.env:remove_node(dir[minetest.env:get_node(p).param2](p))
|
||||||
|
-- pool
|
||||||
|
elseif plan == "workers:plan_pool" or plan == "workers:plan_lavapool" then
|
||||||
|
print("pool")
|
||||||
|
for y = -4,-1 do
|
||||||
|
for x = -2,2 do
|
||||||
|
for z = -3,3 do
|
||||||
|
bp = {x=p.x+x,y=p.y+y,z=p.z+z}
|
||||||
|
minetest.env:remove_node(bp)
|
||||||
|
if y == -4 or (x*x >= 4 or z*z >= 9) then
|
||||||
|
minetest.env:add_node(bp,{name=material})
|
||||||
|
elseif y == -2 then
|
||||||
|
if plan == "workers:plan_pool" then minetest.env:add_node(bp,{name="default:water_source"})
|
||||||
|
else
|
||||||
|
minetest.env:add_node(bp,{name="default:lava_source"})
|
||||||
|
minetest.chat_send_player(master, "Benjo will be burnt!")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- moat
|
||||||
|
elseif plan == "workers:plan_moat" or plan == "workers:plan_lavamoat" then
|
||||||
|
print("moat")
|
||||||
|
for y = -3,-1 do
|
||||||
|
for x = -10,10 do
|
||||||
|
for z = -10,10 do
|
||||||
|
bp = {x=p.x+x,y=p.y+y,z=p.z+z}
|
||||||
|
if x*x >= 25 or z*z >= 25 then
|
||||||
|
minetest.env:remove_node(bp)
|
||||||
|
if y == -3 or (x*x <= 25 and z*z <= 25) or (x*x >= 100 or z*z >= 100) then
|
||||||
|
minetest.env:add_node(bp,{name=material})
|
||||||
|
elseif y == -2 then
|
||||||
|
if plan == "workers:plan_moat" then minetest.env:add_node(bp,{name="default:water_source"})
|
||||||
|
else minetest.env:add_node(bp,{name="default:lava_source"}) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- 9x9 wall
|
||||||
|
elseif plan == "workers:plan_wall" then
|
||||||
|
print("wall")
|
||||||
|
local fp = dir[minetest.env:get_node(p).param2](p)
|
||||||
|
for y = -4,4 do
|
||||||
|
for l = -4,4 do
|
||||||
|
if (fp.x-p.x) ~= 0 then bp = {x=fp.x,y=fp.y+y,z=fp.z+l}
|
||||||
|
elseif (fp.z-p.z) ~= 0 then bp = {x=fp.x+l,y=fp.y+y,z=fp.z} end
|
||||||
|
minetest.env:remove_node(bp)
|
||||||
|
minetest.env:add_node(bp,{name=material})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- underground bunker
|
||||||
|
elseif plan == "workers:plan_ubunker" then
|
||||||
|
print("underground bunker")
|
||||||
|
for y = -6,-2 do
|
||||||
|
for x = -2,2 do
|
||||||
|
for z = -3,3 do
|
||||||
|
bp = {x=p.x+x,y=p.y+y,z=p.z+z}
|
||||||
|
minetest.env:remove_node(bp)
|
||||||
|
if y == -6 or y == -2 then minetest.env:add_node(bp,{name=material})
|
||||||
|
elseif x*x == 4 or z*z == 9 then minetest.env:add_node(bp,{name=material}) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for y = -3,-1 do
|
||||||
|
bp = {x=p.x,y=p.y+y,z=p.z}
|
||||||
|
minetest.env:remove_node(bp)
|
||||||
|
end
|
||||||
|
local np = shouldFall_miner(p)
|
||||||
|
minetest.env:add_node(np,{name="workers:builder",param2=minetest.env:get_node(p).param2})
|
||||||
|
local meta2 = minetest.env:get_meta(np)
|
||||||
|
meta2:from_table(meta:to_table())
|
||||||
|
minetest.env:remove_node(p)
|
||||||
|
meta = minetest.env:get_meta(np)
|
||||||
|
inv = meta:get_inventory()
|
||||||
|
-- tower
|
||||||
|
elseif plan == "workers:plan_tower" then
|
||||||
|
print("tower")
|
||||||
|
local fp = dir[minetest.env:get_node(p).param2](p)
|
||||||
|
for y = -1,5 do
|
||||||
|
for x = -1,1 do
|
||||||
|
for z = -1,1 do
|
||||||
|
bp = {x=p.x+x,y=p.y+y,z=p.z+z}
|
||||||
|
if x~=0 and y~=0 and z~=0 then minetest.env:remove_node(bp) end
|
||||||
|
if y == -1 then minetest.env:add_node(bp,{name=material})
|
||||||
|
elseif x*x == 1 or z*z == 1 then minetest.env:add_node(bp,{name=material})
|
||||||
|
else if y~=0 then minetest.env:add_node(bp,{name="default:ladder",param2=3}) end end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for y = 0,1 do minetest.env:remove_node({x=fp.x,y=fp.y+y,z=fp.z}) end
|
||||||
|
for y = 5,6 do
|
||||||
|
for x = -2,2 do
|
||||||
|
for z = -2,2 do
|
||||||
|
bp = {x=p.x+x,y=p.y+y,z=p.z+z}
|
||||||
|
minetest.env:remove_node(bp)
|
||||||
|
if (x*x)+(z*z) > 2 then minetest.env:add_node(bp,{name=material}) end
|
||||||
|
if ((x*x==1 and z*z==4) or (x*x==4 and z*z==1)) and y==6 then minetest.env:remove_node(bp) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inv:remove_item("plan",plan)
|
||||||
|
inv:add_item("plan","default:paper")
|
||||||
|
minetest.chat_send_player(master, "Benjo: Done, Master.")
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- GREDO THE GUARD
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
nodenames = {"workers:guard"},
|
||||||
|
interval = 2,
|
||||||
|
chance = 1,
|
||||||
|
action = function(p, node, _, _)
|
||||||
|
local meta = minetest.env:get_meta(p)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
|
||||||
|
local isFull = true
|
||||||
|
for i = 1,8 do
|
||||||
|
local orestack = inv:get_stack("catch",i)
|
||||||
|
if orestack:get_free_space() > 0 then isFull = false end
|
||||||
|
end
|
||||||
|
if isFull == true then
|
||||||
|
if meta:get_int("status") == STAT_LIM then
|
||||||
|
speak(master, "Gredo: I am at "..minetest.pos_to_string(p)..", Boss. My inventory is full.")
|
||||||
|
meta:set_int("status",1)
|
||||||
|
else meta:set_int("status",meta:get_int("status")+1) end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local ep = minetest.env:find_node_near(p, 2, {"group:worker"})
|
||||||
|
if ep ~= nil then
|
||||||
|
local catch = minetest.env:get_node(ep).name
|
||||||
|
local cmaster = minetest.env:get_meta(ep):get_string("master")
|
||||||
|
minetest.env:remove_node(ep)
|
||||||
|
inv:add_item("catch", catch)
|
||||||
|
speak(master, "Gredo: I got "..cmaster.."'s "..catch.." at "..minetest.pos_to_string(ep)..", Boss.")
|
||||||
|
minetest.chat_send_player(cmaster, "Gredo: Got your "..catch.." in "..meta:get_string("master").."\'s property. Be careful when you let'em go next time.")
|
||||||
|
end
|
||||||
|
|
||||||
|
local objs = minetest.env:get_objects_inside_radius(p, 2)
|
||||||
|
for k, player in pairs(objs) do
|
||||||
|
if player:get_player_name() ~= "" and player:get_player_name() ~= master then
|
||||||
|
speak(master, "Gredo: I saw "..player:get_player_name().." at "..minetest.pos_to_string(ep)..", Boss.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if meta:get_int("status") == STAT_LIM then meta:set_int("status",1)
|
||||||
|
else meta:set_int("status",meta:get_int("status")+1) end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- ASVARD THE ASSASSIN
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
nodenames = {"workers:assassin"},
|
||||||
|
interval = 5,
|
||||||
|
chance = 1,
|
||||||
|
action = function(p, node, _, _)
|
||||||
|
local meta = minetest.env:get_meta(p)
|
||||||
|
local target = minetest.env:get_player_by_name(meta:get_string("target"))
|
||||||
|
|
||||||
|
if meta:get_int("start_work") == 0 then return end
|
||||||
|
if target == nil then return end
|
||||||
|
|
||||||
|
local tp = target:getpos()
|
||||||
|
local mp = {x = p.x + math.floor((tp.x-p.x)/2),y = p.y + math.floor((tp.y-p.y)/2),z = p.z + math.floor((tp.z-p.z)/2)}
|
||||||
|
if peek(mp,"air") or peek(mp,"default:water_source") or peek(mp,"default:water_flowing") then mp = shouldFall(mp)
|
||||||
|
else mp = shouldRise(mp) end
|
||||||
|
minetest.env:add_node(mp,{name="workers:assassin",param2=minetest.dir_to_facedir(
|
||||||
|
{x = math.floor(p.x-tp.x),y = math.floor(p.y-tp.y),z = math.floor(p.z-tp.z)})}
|
||||||
|
)
|
||||||
|
local gp = minetest.env:find_node_near(mp, 2, {"workers:guard"})
|
||||||
|
if gp ~= nil then minetest.env:remove_node(gp)
|
||||||
|
minetest.chat_send_player(meta:get_string("target"), "Asvard: No guard can stop me.") end
|
||||||
|
|
||||||
|
local meta2 = minetest.env:get_meta(mp)
|
||||||
|
meta2:from_table(meta:to_table())
|
||||||
|
minetest.env:remove_node(p)
|
||||||
|
|
||||||
|
local objs = minetest.env:get_objects_inside_radius(mp, 2.1213)
|
||||||
|
for k, target in pairs(objs) do target:set_hp(target:get_hp()-5) end
|
||||||
|
|
||||||
|
minetest.sound_play("asvard_01", {pos = pos, gain = 1.0, max_hear_distance = 5,})
|
||||||
|
if target:get_hp() <= 0 then
|
||||||
|
speak(meta2:get_string("master"), "Asvard: I am at "..minetest.pos_to_string(p)..", Boss. My job is done.")
|
||||||
|
minetest.env:remove_node(mp)
|
||||||
|
minetest.env:add_item(mp,"default:sword_steel")
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- TOCO THE THIEF
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
nodenames = {"workers:thief"},
|
||||||
|
interval = 2,
|
||||||
|
chance = 1,
|
||||||
|
action = function(p, node, _, _)
|
||||||
|
local meta = minetest.env:get_meta(p)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
|
||||||
|
local isFull = true
|
||||||
|
for i = 1,32 do
|
||||||
|
local orestack = inv:get_stack("loot",i)
|
||||||
|
if orestack:get_free_space() > 0 then isFull = false end
|
||||||
|
end
|
||||||
|
if isFull == true then
|
||||||
|
if meta:get_int("status") == STAT_LIM then
|
||||||
|
speak(master, "Toco: I am at "..minetest.pos_to_string(p)..", Boss. My inventory is full.")
|
||||||
|
meta:set_int("status",1)
|
||||||
|
else meta:set_int("status",meta:get_int("status")+1) end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local cp = minetest.env:find_node_near(p, 2, {"default:chest_locked"})
|
||||||
|
if cp ~= nil then
|
||||||
|
local chest = minetest.env:get_meta(cp)
|
||||||
|
if chest:get_string("owner") ~= master then
|
||||||
|
local cinv = chest:get_inventory()
|
||||||
|
if not cinv:is_empty("main") then
|
||||||
|
for i = 1,32 do
|
||||||
|
if inv:room_for_item("loot", cinv:get_stack("main", i)) then
|
||||||
|
inv:add_item("loot", cinv:get_stack("main", i))
|
||||||
|
cinv:set_stack("main", i, cinv:remove_item("main", i))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
minetest.chat_send_player(master, "Toco: I'm done with the locked chest, Boss.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local gp = minetest.env:find_node_near(p, 2, {"workers:guard"})
|
||||||
|
if gp ~= nil then
|
||||||
|
local guard = minetest.env:get_meta(gp)
|
||||||
|
if guard:get_string("master") ~= master then
|
||||||
|
local ginv = guard:get_inventory()
|
||||||
|
if not ginv:is_empty("main") then
|
||||||
|
for i = 1,8 do
|
||||||
|
if inv:room_for_item("loot", ginv:get_stack("catch", i)) then
|
||||||
|
inv:add_item("loot", ginv:get_stack("catch", i))
|
||||||
|
ginv:set_stack("main", i, ginv:remove_item("catch", i))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
minetest.chat_send_player(master, "Toco: I'm done with the guard, Boss.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local objs = minetest.env:get_objects_inside_radius(p, 3.5355)
|
||||||
|
for k, player in pairs(objs) do
|
||||||
|
if player ~= nil then
|
||||||
|
if player:get_player_name() ~= "" and player:get_player_name() ~= master then
|
||||||
|
local pinv = player:get_inventory()
|
||||||
|
if pinv ~= nil then
|
||||||
|
if not pinv:is_empty("main") then
|
||||||
|
for i = 1,32 do
|
||||||
|
if inv:room_for_item("loot", pinv:get_stack("main", i)) then
|
||||||
|
inv:add_item("loot", pinv:get_stack("main", i))
|
||||||
|
pinv:set_stack("main", i, pinv:remove_item("main", i))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
minetest.chat_send_player(master, "Toco: Got loot from "..player:get_player_name().."'s pocket, Boss.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if meta:get_int("status") == STAT_LIM then meta:set_int("status",1)
|
||||||
|
else meta:set_int("status",meta:get_int("status")+1) end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- CARDON THE COP
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
nodenames = {"workers:cop"},
|
||||||
|
interval = 1,
|
||||||
|
chance = 1,
|
||||||
|
action = function(p, node, _, _)
|
||||||
|
local meta = minetest.env:get_meta(p)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
|
||||||
|
local ap = minetest.env:find_node_near(p, 3, {"workers:assassin"})
|
||||||
|
if ap ~= nil then
|
||||||
|
local owner = minetest.env:get_meta(ap):get_string("master")
|
||||||
|
local target = minetest.env:get_meta(ap):get_string("target")
|
||||||
|
minetest.env:remove_node(ap)
|
||||||
|
if owner == master then minetest.chat_send_player(master, "Cardon: It's not nice for you to have an assassin, Boss.")
|
||||||
|
else minetest.chat_send_player(owner, "Cardon: You better not hiring any assassin again.") end
|
||||||
|
|
||||||
|
if target ~= "" then
|
||||||
|
if target == owner then minetest.chat_send_player(owner, "Cardon: Sorry, you're under arrest for attempting suicide.")
|
||||||
|
else minetest.chat_send_player(owner, "Cardon: Attempting murder, I see. You're under arrest.") end
|
||||||
|
local player = minetest.env:get_player_by_name(owner)
|
||||||
|
for y = -1,2 do
|
||||||
|
for x = -1,1 do
|
||||||
|
for z = -1,1 do
|
||||||
|
bp = {x=p.x+x,y=p.y+y+10,z=p.z+z}
|
||||||
|
minetest.env:remove_node(bp)
|
||||||
|
if y == -1 or y == 2 then minetest.env:add_node(bp,{name="default:glass"})
|
||||||
|
elseif x*x == 1 or z*z == 1 then minetest.env:add_node(bp,{name="default:glass"}) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
player:setpos({x=p.x,y=p.y+10,z=p.z})
|
||||||
|
np = dir[minetest.env:get_node(p).param2](dir[minetest.env:get_node(p).param2](p))
|
||||||
|
if peek(np,"air") or peek(np,"default:water_source") or peek(np,"default:water_flowing") then np = shouldFall(np)
|
||||||
|
else np = shouldRise(np) end
|
||||||
|
minetest.env:add_node(np,{name="workers:cop",param2=minetest.env:get_node(p).param2})
|
||||||
|
local meta2 = minetest.env:get_meta(np)
|
||||||
|
meta2:from_table(meta:to_table())
|
||||||
|
minetest.env:remove_node(p)
|
||||||
|
meta = minetest.env:get_meta(np)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local tp = minetest.env:find_node_near(p, 3, {"workers:thief"})
|
||||||
|
if tp ~= nil and meta:get_int("status") == STAT_LIM then
|
||||||
|
local owner = minetest.env:get_meta(tp):get_string("master")
|
||||||
|
if owner ~= master then speak(master, "Cardon: "..owner.."\'s thief is in this area.")
|
||||||
|
else speak(master, "Cardon: Your thief is nearby. Please take it away") end
|
||||||
|
end
|
||||||
|
|
||||||
|
if meta:get_int("status") == STAT_LIM then meta:set_int("status",1)
|
||||||
|
else meta:set_int("status",meta:get_int("status")+1) end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
161
craft.lua
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
--[[
|
||||||
|
Workers Mod
|
||||||
|
By LocaL_ALchemisT (prof_awang@yahoo.com)
|
||||||
|
License: WTFPL
|
||||||
|
Version: 2.0
|
||||||
|
--]]
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:harvester",
|
||||||
|
recipe = {
|
||||||
|
{"default:dirt","default:chest","default:dirt"},
|
||||||
|
{"default:dirt","default:mese","default:dirt"},
|
||||||
|
{"default:dirt","default:dirt","default:dirt"}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:gardener",
|
||||||
|
recipe = {
|
||||||
|
{"default:dirt","default:shovel_steel","default:dirt"},
|
||||||
|
{"default:dirt","default:mese","default:dirt"},
|
||||||
|
{"default:dirt","default:dirt","default:dirt"}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:miner",
|
||||||
|
recipe = {
|
||||||
|
{"default:dirt","default:pick_steel","default:dirt"},
|
||||||
|
{"default:dirt","default:mese","default:dirt"},
|
||||||
|
{"default:dirt","default:dirt","default:dirt"}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:builder",
|
||||||
|
recipe = {
|
||||||
|
{"default:dirt","default:brick","default:dirt"},
|
||||||
|
{"default:dirt","default:mese","default:dirt"},
|
||||||
|
{"default:dirt","default:dirt","default:dirt"}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:guard",
|
||||||
|
recipe = {
|
||||||
|
{"default:dirt","default:steelblock","default:dirt"},
|
||||||
|
{"default:dirt","default:mese","default:dirt"},
|
||||||
|
{"default:dirt","default:dirt","default:dirt"}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:assassin",
|
||||||
|
recipe = {
|
||||||
|
{"default:dirt","default:sword_steel","default:dirt"},
|
||||||
|
{"default:dirt","default:mese","default:dirt"},
|
||||||
|
{"default:dirt","default:dirt","default:dirt"}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:thief",
|
||||||
|
recipe = {
|
||||||
|
{"default:dirt","default:coal_lump","default:dirt"},
|
||||||
|
{"default:dirt","default:mese","default:dirt"},
|
||||||
|
{"default:dirt","default:dirt","default:dirt"}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:cop",
|
||||||
|
recipe = {
|
||||||
|
{"default:dirt","workers:guard","default:dirt"},
|
||||||
|
{"default:dirt","default:mese","default:dirt"},
|
||||||
|
{"default:dirt","default:dirt","default:dirt"}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
-- BENJO'S PLANS
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:plan_house",
|
||||||
|
recipe = {
|
||||||
|
{"default:clay_brick","default:clay_brick","default:clay_brick"},
|
||||||
|
{"default:clay_brick"," ","default:clay_brick"},
|
||||||
|
{" ","default:paper "," "}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:plan_hut",
|
||||||
|
recipe = {
|
||||||
|
{" ","default:clay_brick"," "},
|
||||||
|
{"default:clay_brick"," ","default:clay_brick"},
|
||||||
|
{" ","default:paper "," "}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:plan_pool",
|
||||||
|
recipe = {
|
||||||
|
{"default:clay_brick","bucket:bucket_water","default:clay_brick"},
|
||||||
|
{"default:clay_brick","default:clay_brick ","default:clay_brick"},
|
||||||
|
{" ","default:paper "," "}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:plan_moat",
|
||||||
|
recipe = {
|
||||||
|
{"bucket:bucket_water","default:clay_brick","bucket:bucket_water"},
|
||||||
|
{"default:clay_brick ","default:clay_brick","default:clay_brick "},
|
||||||
|
{" ","default:paper "," "}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:plan_tower",
|
||||||
|
recipe = {
|
||||||
|
{"default:clay_brick"," ","default:clay_brick"},
|
||||||
|
{"default:clay_brick"," ","default:clay_brick"},
|
||||||
|
{" ","default:paper "," "}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:plan_ubunker",
|
||||||
|
recipe = {
|
||||||
|
{"default:dirt ","default:dirt ","default:dirt "},
|
||||||
|
{"default:clay_brick ","default:clay_brick","default:clay_brick"},
|
||||||
|
{" ","default:paper "," "}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:plan_wall",
|
||||||
|
recipe = {
|
||||||
|
{"default:clay_brick","default:clay_brick","default:clay_brick"},
|
||||||
|
{"default:clay_brick","default:clay_brick","default:clay_brick"},
|
||||||
|
{" ","default:paper "," "}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:plan_lavapool",
|
||||||
|
recipe = {
|
||||||
|
{"default:clay_brick","bucket:bucket_lava","default:clay_brick"},
|
||||||
|
{"default:clay_brick","default:clay_brick","default:clay_brick"},
|
||||||
|
{" ","default:paper "," "}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "workers:plan_lavamoat",
|
||||||
|
recipe = {
|
||||||
|
{"bucket:bucket_lava","default:clay_brick","bucket:bucket_lava"},
|
||||||
|
{"default:clay_brick","default:clay_brick","default:clay_brick"},
|
||||||
|
{" ","default:paper "," "}
|
||||||
|
}
|
||||||
|
})
|
2
depends.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
default
|
||||||
|
bucket
|
110
fungsi.lua
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
--[[
|
||||||
|
Workers Mod
|
||||||
|
By LocaL_ALchemisT (prof_awang@yahoo.com)
|
||||||
|
License: WTFPL
|
||||||
|
Version: 2.0
|
||||||
|
--]]
|
||||||
|
|
||||||
|
worker_images = function(name)
|
||||||
|
return {name.."_body.png", name.."_body.png", name.."_left.png",name.."_right.png", name.."_back.png", name.."_front.png"}
|
||||||
|
end
|
||||||
|
|
||||||
|
dir = {
|
||||||
|
[0] = function(p) return {x=p.x,y=p.y,z=p.z-1} end, --back
|
||||||
|
[1] = function(p) return {x=p.x-1,y=p.y,z=p.z} end, --left
|
||||||
|
[2] = function(p) return {x=p.x,y=p.y,z=p.z+1} end, --front
|
||||||
|
[3] = function(p) return {x=p.x+1,y=p.y,z=p.z} end, --right
|
||||||
|
}
|
||||||
|
|
||||||
|
peek = function(p,name)
|
||||||
|
if minetest.env:get_node(p).name == name then return true
|
||||||
|
else return false end
|
||||||
|
end
|
||||||
|
|
||||||
|
faceTo = function(p,n,lim)
|
||||||
|
if peek(dir[n](p),"air") then return {pos = dir[n](p),face = n} end
|
||||||
|
n = n+1
|
||||||
|
lim = lim+1
|
||||||
|
if n > 3 then n = 0 end
|
||||||
|
if lim < 4 then return faceTo(p,n,lim)
|
||||||
|
else return nil end
|
||||||
|
end
|
||||||
|
|
||||||
|
anticlockwise = function(p,n)
|
||||||
|
local n2 = n-1
|
||||||
|
if n2 < 0 then n2 = 3 end
|
||||||
|
if peek(dir[n2](p),"air") then return {pos = dir[n2](p),face = n2}
|
||||||
|
else
|
||||||
|
if peek(dir[n](p),"air") then return {pos = dir[n](p),face = n2}
|
||||||
|
else return nil end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
clockwise = function(p,n)
|
||||||
|
local n2 = n+1
|
||||||
|
if n2 > 3 then n2 = 0 end
|
||||||
|
if peek(dir[n2](p),"air") then return {pos = dir[n2](p),face = n2}
|
||||||
|
else
|
||||||
|
if peek(dir[n](p),"air") then return {pos = dir[n](p),face = n2}
|
||||||
|
else return nil end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
shouldFall = function(p)
|
||||||
|
local np = {x=p.x,y=p.y-1,z=p.z}
|
||||||
|
if peek(np,"air") or peek(np,"default:water_source") or peek(np,"default:water_flowing") then return shouldFall(np)
|
||||||
|
else return p end
|
||||||
|
end
|
||||||
|
|
||||||
|
shouldFall_miner = function(p)
|
||||||
|
local np = {x=p.x,y=p.y-1,z=p.z}
|
||||||
|
if peek(np,"air") then
|
||||||
|
-- If placing a ladder, figure out where it goes. So it is always
|
||||||
|
-- on the side that the miner is facing.
|
||||||
|
-- Get the miners info.
|
||||||
|
local miner_info = minetest.env:get_node(p)
|
||||||
|
local np2 = {x = np.x - 1, y = np.y, z = np.z}
|
||||||
|
local ladder_facedir = 3
|
||||||
|
-- Figure out the ladder's placement
|
||||||
|
if miner_info.param2 == 0 then
|
||||||
|
np2 = {x = np.x, y = np.y, z = np.z - 1}
|
||||||
|
ladder_facedir = 5
|
||||||
|
elseif miner_info.param2 == 2 then
|
||||||
|
np2 = {x = np.x, y = np.y, z = np.z + 1}
|
||||||
|
ladder_facedir = 4
|
||||||
|
elseif miner_info.param2 == 3 then
|
||||||
|
np2 = {x = np.x + 1, y = np.y, z = np.z}
|
||||||
|
ladder_facedir = 2
|
||||||
|
end
|
||||||
|
if peek(np2,"air") then
|
||||||
|
minetest.env:add_node(np2,{name="default:ladder", param2 = ladder_facedir})
|
||||||
|
end
|
||||||
|
return shouldFall_miner(np)
|
||||||
|
elseif peek(np,"default:water_source") or peek(np,"default:water_flowing") then return shouldFall(np)
|
||||||
|
else return p end
|
||||||
|
end
|
||||||
|
|
||||||
|
shouldRise = function(p)
|
||||||
|
local np = {x=p.x,y=p.y+1,z=p.z}
|
||||||
|
if peek(np,"air") or peek(np,"default:water_source") or peek(np,"default:water_flowing") then return np
|
||||||
|
else return shouldRise(np) end
|
||||||
|
end
|
||||||
|
|
||||||
|
get_ore = function(node)
|
||||||
|
local drops = minetest.get_node_drops(node,"default:pick_mese")
|
||||||
|
local _, dropped_item
|
||||||
|
for _, dropped_item in ipairs(drops) do
|
||||||
|
return dropped_item
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defend = function(player,master,worker)
|
||||||
|
minetest.chat_send_player(player:get_player_name(), worker..": You are not "..master.."!")
|
||||||
|
minetest.chat_send_player(master, worker..": Master, "..player:get_player_name().." punched me!")
|
||||||
|
player:set_hp(player:get_hp()-6)
|
||||||
|
end
|
||||||
|
|
||||||
|
speak = function(player,text)
|
||||||
|
minetest.chat_send_player(player,text)
|
||||||
|
print(text)
|
||||||
|
end
|
577
init.lua
Normal file
@ -0,0 +1,577 @@
|
|||||||
|
--[[
|
||||||
|
Workers Mod
|
||||||
|
By LocaL_ALchemisT (prof_awang@yahoo.com)
|
||||||
|
License: WTFPL
|
||||||
|
Version: 2.0
|
||||||
|
--]]
|
||||||
|
|
||||||
|
dofile(minetest.get_modpath("workers").."/abm.lua")
|
||||||
|
dofile(minetest.get_modpath("workers").."/fungsi.lua")
|
||||||
|
dofile(minetest.get_modpath("workers").."/craft.lua")
|
||||||
|
|
||||||
|
-- HARVEY THE HARVESTER
|
||||||
|
|
||||||
|
minetest.register_node("workers:harvester", {
|
||||||
|
description = "Harvey The Harvester",
|
||||||
|
tile_images = worker_images("harvey"),
|
||||||
|
stack_max = 1,
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
groups = {oddly_breakable_by_hand=2,flammable=1,worker=1},
|
||||||
|
legacy_facedir_simple = true,
|
||||||
|
after_place_node = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
meta:set_string("formspec", "hack:sign_text_input")
|
||||||
|
meta:set_string("infotext", "What should I harvest, Master?")
|
||||||
|
meta:set_string("text","mod:node")
|
||||||
|
meta:set_string("master",player:get_player_name())
|
||||||
|
meta:set_string("material","")
|
||||||
|
meta:set_int("quantity",0)
|
||||||
|
meta:set_int("status",0)
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
if minetest.env:get_node(pos).param2 < 2 then meta:set_int("previousdir",(minetest.env:get_node(pos).param2+2))
|
||||||
|
else meta:set_int("previousdir",(minetest.env:get_node(pos).param2-2)) end
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Harvey: Hello, Master.")
|
||||||
|
end,
|
||||||
|
on_receive_fields = function(pos, formname, fields, player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
local name = player:get_player_name()
|
||||||
|
if name ~= master then
|
||||||
|
defend(player,master,"Harvey")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
fields.text = fields.text or ""
|
||||||
|
local itemstack = ItemStack(fields.text)
|
||||||
|
local nodename = itemstack:get_name()
|
||||||
|
if itemstack:is_empty() then minetest.chat_send_player(name, "Harvey: What do you want me to harvest, Master?")
|
||||||
|
elseif not itemstack:is_known() then minetest.chat_send_player(name, "Harvey: What is that, Master?")
|
||||||
|
elseif nodename == "default:lava_flowing" or nodename == "default:lava_source" or nodename == "default:water_flowing" or nodename == "default:water_source" or nodename == "air" then minetest.chat_send_player(name, "Harvey: That is forbidden, Master.")
|
||||||
|
elseif nodename == "workers:assassin" or nodename == "workers:thief" then minetest.chat_send_player(name, "Harvey: No, Master.")
|
||||||
|
else
|
||||||
|
minetest.chat_send_player(name, "Harvey: "..nodename..", as you wish, Master.")
|
||||||
|
meta:set_string("infotext", "I will harvest "..nodename..", Master.")
|
||||||
|
meta:set_string("text",nodename)
|
||||||
|
meta:set_string("material",nodename)
|
||||||
|
meta:set_int("status",1)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
on_punch = function(pos, node, player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
if player:get_player_name() ~= master then
|
||||||
|
defend(player,master,"Harvey")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if meta:get_int("status") == 0 then return end
|
||||||
|
|
||||||
|
if meta:get_int("start_work") == 0 then --if Harvey hasn't moved yet
|
||||||
|
meta:set_int("start_work",1)
|
||||||
|
minetest.chat_send_player(master, "Harvey: I will go now, Master.")
|
||||||
|
else --if Harvey has moved
|
||||||
|
player:get_inventory():add_item("main", "workers:harvester")
|
||||||
|
print(meta:get_string("material")..": "..meta:get_int("quantity"))
|
||||||
|
if meta:get_int("quantity") > 0 then
|
||||||
|
player:get_inventory():add_item("main", "\""..meta:get_string("material").."\" "..meta:get_int("quantity"))
|
||||||
|
minetest.chat_send_player(master, "Harvey: I have collected "..meta:get_int("quantity").." "..meta:get_string("material")..", Master.")
|
||||||
|
end
|
||||||
|
minetest.chat_send_player(master, "Harvey: Pleasure to work for you, Master.")
|
||||||
|
minetest.env:remove_node(pos)
|
||||||
|
end
|
||||||
|
print (meta:get_int("start_work"))
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- MORDEC THE MINER
|
||||||
|
|
||||||
|
minetest.register_node("workers:miner", {
|
||||||
|
description = "Mordec The Miner",
|
||||||
|
tile_images = worker_images("mordec"),
|
||||||
|
stack_max = 1,
|
||||||
|
paramtype = "light",
|
||||||
|
light_source = 13,
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
groups = {oddly_breakable_by_hand=2,flammable=1,worker=1},
|
||||||
|
legacy_facedir_simple = true,
|
||||||
|
|
||||||
|
after_place_node = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
meta:set_string("formspec",
|
||||||
|
"invsize[8,7;]"..
|
||||||
|
"list[current_player;main;0,3;8,4;]"..
|
||||||
|
"list[current_name;wood;0,0;1,1;]"..
|
||||||
|
"image[0,1;1,1;default_wood.png]"..
|
||||||
|
"list[current_name;ores;2,0;6,2;]")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
inv:set_size("wood", 1)
|
||||||
|
inv:set_size("ores", 12)
|
||||||
|
meta:set_string("infotext", "Give me wood and i'll start digging, Master")
|
||||||
|
meta:set_string("master",player:get_player_name())
|
||||||
|
meta:set_int("status",0)
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Mordec: *bzzt* Hello, Master.")
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_punch = function(pos, node, player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
if player:get_player_name() ~= master then
|
||||||
|
defend(player,master,"Mordec")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if inv:get_stack("wood",1):to_table() == nil then return
|
||||||
|
elseif inv:get_stack("wood",1):to_table().name ~= "default:wood" then return end
|
||||||
|
|
||||||
|
if meta:get_int("start_work") == 0 then --if Mordec hasn't moved yet
|
||||||
|
meta:set_int("start_work",1)
|
||||||
|
minetest.chat_send_player(master, "Mordec: I will go now, Master.")
|
||||||
|
else --if Mordec has moved
|
||||||
|
meta:set_int("status",0)
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
can_dig = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
if not (inv:is_empty("wood") and inv:is_empty("ores")) then
|
||||||
|
minetest.chat_send_player(master, "Mordec: *error* I cannot leave yet, Master. There are items in my inventory.")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
minetest.chat_send_player(master, "Mordec: Pleasure to work for you, Master. *shutdown*")
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- GARREN THE GARDENER
|
||||||
|
|
||||||
|
minetest.register_node("workers:gardener", {
|
||||||
|
description = "Garren The Gardener",
|
||||||
|
tile_images = worker_images("garren"),
|
||||||
|
stack_max = 1,
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
groups = {oddly_breakable_by_hand=2,flammable=1,worker=1},
|
||||||
|
legacy_facedir_simple = true,
|
||||||
|
|
||||||
|
after_place_node = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
meta:set_string("formspec",
|
||||||
|
"invsize[8,6;]"..
|
||||||
|
"list[current_player;main;0,2;8,4;]"..
|
||||||
|
"list[current_name;plant;2,0;1,1;]"..
|
||||||
|
"list[current_name;sapling;5,0;1,1;]"..
|
||||||
|
"image[6,0;1,1;default_sapling.png]")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
inv:set_size("plant", 1)
|
||||||
|
inv:set_size("sapling", 1)
|
||||||
|
meta:set_string("infotext", "Can I have a plant sample and some saplings, Master?")
|
||||||
|
meta:set_string("master",player:get_player_name())
|
||||||
|
meta:set_int("status",0)
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
if minetest.env:get_node(pos).param2 < 2 then meta:set_int("previousdir",(minetest.env:get_node(pos).param2+2))
|
||||||
|
else meta:set_int("previousdir",(minetest.env:get_node(pos).param2-2)) end
|
||||||
|
meta:set_int("clockwise",0)
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Garren: Hello, Master.")
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_punch = function(pos, node, player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
if player:get_player_name() ~= master then
|
||||||
|
defend(player,master,"Garren")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if inv:get_stack("sapling",1):to_table() == nil then return
|
||||||
|
elseif inv:get_stack("sapling",1):to_table().name ~= "default:sapling" then return end
|
||||||
|
|
||||||
|
if meta:get_int("start_work") == 0 then --if Garren hasn't moved yet
|
||||||
|
meta:set_int("start_work",1)
|
||||||
|
minetest.chat_send_player(master, "Garren: I will go now, Master.")
|
||||||
|
else --if Garren has moved
|
||||||
|
meta:set_int("status",0)
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
can_dig = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
if not (inv:is_empty("plant") and inv:is_empty("sapling")) then
|
||||||
|
minetest.chat_send_player(master, "Garren: I cannot leave yet, Master. There are items in my inventory.")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
minetest.chat_send_player(master, "Garren: Pleasure to work for you, Master.")
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- BENJO THE BUILDER
|
||||||
|
|
||||||
|
minetest.register_node("workers:builder", {
|
||||||
|
description = "Benjo The Builder",
|
||||||
|
tile_images = worker_images("benjo"),
|
||||||
|
stack_max = 1,
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
groups = {oddly_breakable_by_hand=2,flammable=1,worker=1},
|
||||||
|
legacy_facedir_simple = true,
|
||||||
|
|
||||||
|
after_place_node = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
meta:set_string("formspec",
|
||||||
|
"invsize[8,6;]"..
|
||||||
|
"list[current_player;main;0,2;8,4;]"..
|
||||||
|
"list[current_name;plan;2,0;1,1;]"..
|
||||||
|
"list[current_name;material;5,0;1,1;]"..
|
||||||
|
"image[6,0;1,1;default_brick.png]")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
inv:set_size("plan", 1)
|
||||||
|
inv:set_size("material", 1)
|
||||||
|
meta:set_string("infotext", "I can build simple structures, Master")
|
||||||
|
meta:set_string("master",player:get_player_name())
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Benjo: Hello, Master.")
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_punch = function(pos, node, player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
if player:get_player_name() ~= master then
|
||||||
|
defend(player,master,"Benjo")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if inv:is_empty("plan") or inv:is_empty("material") then return end
|
||||||
|
|
||||||
|
if meta:get_int("start_work") == 0 then --if Benjo hasn't moved yet
|
||||||
|
meta:set_int("start_work",1)
|
||||||
|
minetest.chat_send_player(master, "Benjo: Right away, Master.")
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
can_dig = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
if not (inv:is_empty("plan")) and not (inv:is_empty("material")) then
|
||||||
|
minetest.chat_send_player(master, "Benjo: I cannot leave yet, Master. There are items in my inventory.")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
minetest.chat_send_player(master, "Benjo: Pleasure to work for you, Master.")
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- GREDO THE GUARD
|
||||||
|
|
||||||
|
minetest.register_node("workers:guard", {
|
||||||
|
description = "Gredo The Guard",
|
||||||
|
tile_images = worker_images("gredo"),
|
||||||
|
stack_max = 1,
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
groups = {oddly_breakable_by_hand=2,flammable=1},
|
||||||
|
legacy_facedir_simple = true,
|
||||||
|
|
||||||
|
after_place_node = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
meta:set_string("formspec",
|
||||||
|
"invsize[8,6;]"..
|
||||||
|
"list[current_name;catch;0,0;8,1;]"..
|
||||||
|
"list[current_player;main;0,2;8,4;]")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
inv:set_size("catch", 8)
|
||||||
|
meta:set_string("infotext", "I catch'em when I see'em, Boss.")
|
||||||
|
meta:set_string("master",player:get_player_name())
|
||||||
|
meta:set_int("status",0)
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Gredo: Hello, Boss.")
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_punch = function(pos, node, player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
if player:get_player_name() ~= master then
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Gredo: Hands off!")
|
||||||
|
minetest.chat_send_player(master, "Gredo: "..player:get_player_name().."'s picking up a fight, Boss.")
|
||||||
|
player:set_hp(player:get_hp()-8)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_metadata_inventory_take = function(pos, listname, index, count, player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
if player:get_player_name() ~= master then
|
||||||
|
player:set_hp(player:get_hp()-8)
|
||||||
|
minetest.chat_send_player(master, "Gredo: Hands off!")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
return minetest.node_metadata_inventory_take_allow_all(pos, listname, index, count, player)
|
||||||
|
end,
|
||||||
|
|
||||||
|
can_dig = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
if not (inv:is_empty("catch")) then
|
||||||
|
minetest.chat_send_player(master, "Gredo: Better take these intruders first, Boss.")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
minetest.chat_send_player(master, "Gredo: Pleasure to work for you, Boss.")
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- ASVARD THE ASSASSIN
|
||||||
|
|
||||||
|
minetest.register_node("workers:assassin", {
|
||||||
|
description = "Asvard The Assassin",
|
||||||
|
tile_images = worker_images("asvard"),
|
||||||
|
stack_max = 1,
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
groups = {oddly_breakable_by_hand=2,flammable=1,badguy=1},
|
||||||
|
legacy_facedir_simple = true,
|
||||||
|
after_place_node = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
meta:set_string("formspec", "hack:sign_text_input")
|
||||||
|
meta:set_string("infotext", "Give me name, Master")
|
||||||
|
meta:set_string("text","")
|
||||||
|
meta:set_string("master",player:get_player_name())
|
||||||
|
meta:set_string("target","")
|
||||||
|
meta:set_int("status",0)
|
||||||
|
meta:set_int("start_work",0)
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Asvard: ...Master.")
|
||||||
|
minetest.sound_play("asvard_00", {pos = pos, gain = 1.0, max_hear_distance = 10,})
|
||||||
|
end,
|
||||||
|
on_receive_fields = function(pos, formname, fields, player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
local name = player:get_player_name()
|
||||||
|
if name ~= master then
|
||||||
|
player:set_hp(0)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
fields.text = fields.text or ""
|
||||||
|
meta:set_string("target",fields.text)
|
||||||
|
if meta:get_string("target") == "" then minetest.chat_send_player(name, "Asvard: Name your target, Master.")
|
||||||
|
else
|
||||||
|
if meta:get_string("target") == name then minetest.chat_send_player(name, "Asvard: Are you sure, Master?")
|
||||||
|
else minetest.chat_send_player(name, "Asvard: "..meta:get_string("target")..", as you wish, Master.") end
|
||||||
|
|
||||||
|
meta:set_string("infotext", "..."..meta:get_string("target"))
|
||||||
|
meta:set_string("text",meta:get_string("target"))
|
||||||
|
meta:set_int("status",1)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
on_punch = function(pos, node, player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
if player:get_player_name() ~= master then
|
||||||
|
player:set_hp(0)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if meta:get_int("status") == 0 then return end
|
||||||
|
|
||||||
|
if meta:get_int("start_work") == 0 then
|
||||||
|
meta:set_int("start_work",1)
|
||||||
|
else
|
||||||
|
minetest.sound_play("asvard_00", {pos = pos, gain = 1.0, max_hear_distance = 10,})
|
||||||
|
minetest.env:remove_node(pos)
|
||||||
|
minetest.env:add_item(pos,"default:sword_steel")
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- TOCO THE THIEF
|
||||||
|
|
||||||
|
minetest.register_node("workers:thief", {
|
||||||
|
description = "Toco The Thief",
|
||||||
|
--drawtype = "glasslike",
|
||||||
|
tile_images = worker_images("toco"),
|
||||||
|
stack_max = 1,
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
groups = {oddly_breakable_by_hand=2,flammable=1,badguy=1},
|
||||||
|
legacy_facedir_simple = true,
|
||||||
|
|
||||||
|
after_place_node = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
meta:set_string("formspec",
|
||||||
|
"invsize[8,9;]"..
|
||||||
|
"list[current_name;loot;0,0;8,4;]"..
|
||||||
|
"list[current_player;main;0,5;8,4;]")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
inv:set_size("loot", 32)
|
||||||
|
meta:set_string("master",player:get_player_name())
|
||||||
|
meta:set_int("status",0)
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Toco: Hey, Boss.")
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_punch = function(pos, node, player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
if player:get_player_name() ~= master then
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Toco: Ouch!")
|
||||||
|
for i = 1,32 do
|
||||||
|
if not inv:get_stack("loot",i):is_empty() then
|
||||||
|
print("not nil")
|
||||||
|
minetest.env:add_item({x = pos.x + (math.random(1,5)-3), y = pos.y, z = pos.z + (math.random(1,5)-3)},inv:get_stack("loot", i))
|
||||||
|
inv:set_stack("loot", i, inv:remove_item("loot", i))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_metadata_inventory_take = function(pos, listname, index, count, player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
if player:get_player_name() ~= master then
|
||||||
|
player:set_hp(player:get_hp()-3)
|
||||||
|
minetest.chat_send_player(master, "Toco: Hands off!")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
return minetest.node_metadata_inventory_take_allow_all(pos, listname, index, count, player)
|
||||||
|
end,
|
||||||
|
|
||||||
|
can_dig = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
if not (inv:is_empty("loot")) then
|
||||||
|
minetest.chat_send_player(master, "Toco: You sure you don't wanna have these loots, Boss?")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
if player:get_player_name() ~= master then
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Toco: You're not gonna take me anywhere!")
|
||||||
|
minetest.env:remove_node(pos)
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
minetest.chat_send_player(master, "Toco: Pleasure to work for you, Boss.")
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- CARDON THE COP
|
||||||
|
|
||||||
|
minetest.register_node("workers:cop", {
|
||||||
|
description = "Cardon The Cop",
|
||||||
|
tile_images = worker_images("cardon"),
|
||||||
|
stack_max = 1,
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
groups = {oddly_breakable_by_hand=2,flammable=1,goodguy=1},
|
||||||
|
legacy_facedir_simple = true,
|
||||||
|
|
||||||
|
after_place_node = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
meta:set_string("infotext", "I won't let them get away, Boss")
|
||||||
|
meta:set_string("master",player:get_player_name())
|
||||||
|
meta:set_string("criminal","")
|
||||||
|
meta:set_int("status",0)
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Cardon: Officer Cardon at your service.")
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_punch = function(pos, node, player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
if player:get_player_name() ~= master then
|
||||||
|
defend(player,master,"Cardon")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
can_dig = function(pos,player)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
local master = meta:get_string("master")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
minetest.chat_send_player(master, "Cardon: Pleasure to work for you, Boss.")
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- BENJO'S PLANS
|
||||||
|
|
||||||
|
minetest.register_craftitem("workers:plan_house", {
|
||||||
|
description = "House Plan",
|
||||||
|
inventory_image = "plan_house.png",
|
||||||
|
stack_max = 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craftitem("workers:plan_hut", {
|
||||||
|
description = "Hut Plan",
|
||||||
|
inventory_image = "plan_hut.png",
|
||||||
|
stack_max = 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craftitem("workers:plan_pool", {
|
||||||
|
description = "Pool Plan",
|
||||||
|
inventory_image = "plan_pool.png",
|
||||||
|
stack_max = 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craftitem("workers:plan_moat", {
|
||||||
|
description = "Moat Plan",
|
||||||
|
inventory_image = "plan_moat.png",
|
||||||
|
stack_max = 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craftitem("workers:plan_tower", {
|
||||||
|
description = "Tower Plan",
|
||||||
|
inventory_image = "plan_tower.png",
|
||||||
|
stack_max = 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craftitem("workers:plan_ubunker", {
|
||||||
|
description = "Underground Bunker Plan",
|
||||||
|
inventory_image = "plan_ubunker.png",
|
||||||
|
stack_max = 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craftitem("workers:plan_wall", {
|
||||||
|
description = "9x9 Wall Plan",
|
||||||
|
inventory_image = "plan_wall.png",
|
||||||
|
stack_max = 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craftitem("workers:plan_lavapool", {
|
||||||
|
description = "Lava Pool Plan",
|
||||||
|
inventory_image = "plan_lavapool.png",
|
||||||
|
stack_max = 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craftitem("workers:plan_lavamoat", {
|
||||||
|
description = "Lava Moat Plan",
|
||||||
|
inventory_image = "plan_lavamoat.png",
|
||||||
|
stack_max = 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- ALIASES
|
||||||
|
|
||||||
|
minetest.register_alias("harvey","workers:harvester")
|
||||||
|
minetest.register_alias("harvester","workers:harvester")
|
||||||
|
|
||||||
|
minetest.register_alias("garren","workers:gardener")
|
||||||
|
minetest.register_alias("gardener","workers:gardener")
|
||||||
|
|
||||||
|
minetest.register_alias("mordec","workers:miner")
|
||||||
|
minetest.register_alias("miner","workers:miner")
|
||||||
|
|
||||||
|
minetest.register_alias("benjo","workers:builder")
|
||||||
|
minetest.register_alias("builder","workers:builder")
|
||||||
|
|
||||||
|
minetest.register_alias("gredo","workers:guard")
|
||||||
|
minetest.register_alias("guard","workers:guard")
|
||||||
|
|
||||||
|
minetest.register_alias("asvard","workers:assassin")
|
||||||
|
minetest.register_alias("assassin","workers:assassin")
|
||||||
|
|
||||||
|
minetest.register_alias("toco","workers:thief")
|
||||||
|
minetest.register_alias("thief","workers:thief")
|
||||||
|
|
||||||
|
minetest.register_alias("cardon","workers:cop")
|
||||||
|
minetest.register_alias("cop","workers:cop")
|
16
readme.txt
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
=========================================
|
||||||
|
Workers Mod
|
||||||
|
By LocaL_ALchemisT (prof_awang@yahoo.com)
|
||||||
|
License: WTFPL
|
||||||
|
Version: 2.0
|
||||||
|
=========================================
|
||||||
|
Modified by: LionsDen
|
||||||
|
License: WTFPL
|
||||||
|
Version: 2.1
|
||||||
|
Date: August 4, 2013
|
||||||
|
Modifications: Miner checks for air, water or lava under it's current level to mine.
|
||||||
|
When mining, torches are placed (hopefully) on a wall so they
|
||||||
|
don't fall when disturbed unless you mine the node they are
|
||||||
|
attached to. Ladders show up in the direction that the miner is
|
||||||
|
facing.
|
||||||
|
=========================================
|
BIN
sounds/asvard_00.ogg
Normal file
BIN
sounds/asvard_01.ogg
Normal file
BIN
sounds/mordec_00.ogg
Normal file
BIN
textures/asvard_back.png
Normal file
After Width: | Height: | Size: 217 B |
BIN
textures/asvard_body.png
Normal file
After Width: | Height: | Size: 141 B |
BIN
textures/asvard_front.png
Normal file
After Width: | Height: | Size: 227 B |
BIN
textures/asvard_left.png
Normal file
After Width: | Height: | Size: 226 B |
BIN
textures/asvard_right.png
Normal file
After Width: | Height: | Size: 227 B |
BIN
textures/benjo_back.png
Normal file
After Width: | Height: | Size: 167 B |
BIN
textures/benjo_body.png
Normal file
After Width: | Height: | Size: 141 B |
BIN
textures/benjo_front.png
Normal file
After Width: | Height: | Size: 246 B |
BIN
textures/benjo_left.png
Normal file
After Width: | Height: | Size: 197 B |
BIN
textures/benjo_right.png
Normal file
After Width: | Height: | Size: 231 B |
BIN
textures/cardon_back.png
Normal file
After Width: | Height: | Size: 160 B |
BIN
textures/cardon_body.png
Normal file
After Width: | Height: | Size: 159 B |
BIN
textures/cardon_front.png
Normal file
After Width: | Height: | Size: 238 B |
BIN
textures/cardon_left.png
Normal file
After Width: | Height: | Size: 181 B |
BIN
textures/cardon_right.png
Normal file
After Width: | Height: | Size: 214 B |
BIN
textures/garren_back.png
Normal file
After Width: | Height: | Size: 151 B |
BIN
textures/garren_body.png
Normal file
After Width: | Height: | Size: 141 B |
BIN
textures/garren_front.png
Normal file
After Width: | Height: | Size: 272 B |
BIN
textures/garren_left.png
Normal file
After Width: | Height: | Size: 187 B |
BIN
textures/garren_right.png
Normal file
After Width: | Height: | Size: 228 B |
BIN
textures/gredo_back.png
Normal file
After Width: | Height: | Size: 160 B |
BIN
textures/gredo_body.png
Normal file
After Width: | Height: | Size: 141 B |
BIN
textures/gredo_front.png
Normal file
After Width: | Height: | Size: 199 B |
BIN
textures/gredo_left.png
Normal file
After Width: | Height: | Size: 181 B |
BIN
textures/gredo_right.png
Normal file
After Width: | Height: | Size: 179 B |
BIN
textures/harvey_back.png
Normal file
After Width: | Height: | Size: 151 B |
BIN
textures/harvey_body.png
Normal file
After Width: | Height: | Size: 141 B |
BIN
textures/harvey_front.png
Normal file
After Width: | Height: | Size: 224 B |
BIN
textures/harvey_left.png
Normal file
After Width: | Height: | Size: 187 B |
BIN
textures/harvey_right.png
Normal file
After Width: | Height: | Size: 185 B |
BIN
textures/mordec_back.png
Normal file
After Width: | Height: | Size: 170 B |
BIN
textures/mordec_body.png
Normal file
After Width: | Height: | Size: 159 B |
BIN
textures/mordec_front.png
Normal file
After Width: | Height: | Size: 256 B |
BIN
textures/mordec_left.png
Normal file
After Width: | Height: | Size: 198 B |
BIN
textures/mordec_right.png
Normal file
After Width: | Height: | Size: 255 B |
BIN
textures/plan_house.png
Normal file
After Width: | Height: | Size: 181 B |
BIN
textures/plan_hut.png
Normal file
After Width: | Height: | Size: 176 B |
BIN
textures/plan_lavamoat.png
Normal file
After Width: | Height: | Size: 227 B |
BIN
textures/plan_lavapool.png
Normal file
After Width: | Height: | Size: 226 B |
BIN
textures/plan_moat.png
Normal file
After Width: | Height: | Size: 227 B |
BIN
textures/plan_pool.png
Normal file
After Width: | Height: | Size: 188 B |
BIN
textures/plan_tower.png
Normal file
After Width: | Height: | Size: 185 B |
BIN
textures/plan_ubunker.png
Normal file
After Width: | Height: | Size: 228 B |
BIN
textures/plan_wall.png
Normal file
After Width: | Height: | Size: 193 B |
BIN
textures/toco_back.png
Normal file
After Width: | Height: | Size: 173 B |
BIN
textures/toco_body.png
Normal file
After Width: | Height: | Size: 173 B |
BIN
textures/toco_front.png
Normal file
After Width: | Height: | Size: 273 B |
BIN
textures/toco_left.png
Normal file
After Width: | Height: | Size: 173 B |
BIN
textures/toco_right.png
Normal file
After Width: | Height: | Size: 173 B |