diff --git a/README.md b/README.md deleted file mode 100644 index 2541d35..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# workers -Minetest Workers - LionsDen's fork of LocaL_ALchemisT's mod diff --git a/abm.lua b/abm.lua new file mode 100644 index 0000000..df46fe5 --- /dev/null +++ b/abm.lua @@ -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, +}) + diff --git a/craft.lua b/craft.lua new file mode 100644 index 0000000..d4c2e60 --- /dev/null +++ b/craft.lua @@ -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 "," "} + } +}) \ No newline at end of file diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..a916278 --- /dev/null +++ b/depends.txt @@ -0,0 +1,2 @@ +default +bucket \ No newline at end of file diff --git a/fungsi.lua b/fungsi.lua new file mode 100644 index 0000000..53e7302 --- /dev/null +++ b/fungsi.lua @@ -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 \ No newline at end of file diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..ac36457 --- /dev/null +++ b/init.lua @@ -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") \ No newline at end of file diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..864e9a9 --- /dev/null +++ b/readme.txt @@ -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. +========================================= diff --git a/sounds/asvard_00.ogg b/sounds/asvard_00.ogg new file mode 100644 index 0000000..4e5871c Binary files /dev/null and b/sounds/asvard_00.ogg differ diff --git a/sounds/asvard_01.ogg b/sounds/asvard_01.ogg new file mode 100644 index 0000000..4841ab1 Binary files /dev/null and b/sounds/asvard_01.ogg differ diff --git a/sounds/mordec_00.ogg b/sounds/mordec_00.ogg new file mode 100644 index 0000000..aaddfcd Binary files /dev/null and b/sounds/mordec_00.ogg differ diff --git a/textures/asvard_back.png b/textures/asvard_back.png new file mode 100644 index 0000000..7f5e54b Binary files /dev/null and b/textures/asvard_back.png differ diff --git a/textures/asvard_body.png b/textures/asvard_body.png new file mode 100644 index 0000000..4f4f1e7 Binary files /dev/null and b/textures/asvard_body.png differ diff --git a/textures/asvard_front.png b/textures/asvard_front.png new file mode 100644 index 0000000..9ea2617 Binary files /dev/null and b/textures/asvard_front.png differ diff --git a/textures/asvard_left.png b/textures/asvard_left.png new file mode 100644 index 0000000..c042f79 Binary files /dev/null and b/textures/asvard_left.png differ diff --git a/textures/asvard_right.png b/textures/asvard_right.png new file mode 100644 index 0000000..fe64daf Binary files /dev/null and b/textures/asvard_right.png differ diff --git a/textures/benjo_back.png b/textures/benjo_back.png new file mode 100644 index 0000000..3f7c238 Binary files /dev/null and b/textures/benjo_back.png differ diff --git a/textures/benjo_body.png b/textures/benjo_body.png new file mode 100644 index 0000000..53ac1be Binary files /dev/null and b/textures/benjo_body.png differ diff --git a/textures/benjo_front.png b/textures/benjo_front.png new file mode 100644 index 0000000..a7e523d Binary files /dev/null and b/textures/benjo_front.png differ diff --git a/textures/benjo_left.png b/textures/benjo_left.png new file mode 100644 index 0000000..2ff9c63 Binary files /dev/null and b/textures/benjo_left.png differ diff --git a/textures/benjo_right.png b/textures/benjo_right.png new file mode 100644 index 0000000..fa6d5e4 Binary files /dev/null and b/textures/benjo_right.png differ diff --git a/textures/cardon_back.png b/textures/cardon_back.png new file mode 100644 index 0000000..4530b12 Binary files /dev/null and b/textures/cardon_back.png differ diff --git a/textures/cardon_body.png b/textures/cardon_body.png new file mode 100644 index 0000000..b49b113 Binary files /dev/null and b/textures/cardon_body.png differ diff --git a/textures/cardon_front.png b/textures/cardon_front.png new file mode 100644 index 0000000..0df59ec Binary files /dev/null and b/textures/cardon_front.png differ diff --git a/textures/cardon_left.png b/textures/cardon_left.png new file mode 100644 index 0000000..0fca96e Binary files /dev/null and b/textures/cardon_left.png differ diff --git a/textures/cardon_right.png b/textures/cardon_right.png new file mode 100644 index 0000000..764e477 Binary files /dev/null and b/textures/cardon_right.png differ diff --git a/textures/garren_back.png b/textures/garren_back.png new file mode 100644 index 0000000..82c1f46 Binary files /dev/null and b/textures/garren_back.png differ diff --git a/textures/garren_body.png b/textures/garren_body.png new file mode 100644 index 0000000..030f892 Binary files /dev/null and b/textures/garren_body.png differ diff --git a/textures/garren_front.png b/textures/garren_front.png new file mode 100644 index 0000000..a5fd7c1 Binary files /dev/null and b/textures/garren_front.png differ diff --git a/textures/garren_left.png b/textures/garren_left.png new file mode 100644 index 0000000..f5f5a54 Binary files /dev/null and b/textures/garren_left.png differ diff --git a/textures/garren_right.png b/textures/garren_right.png new file mode 100644 index 0000000..6173fd6 Binary files /dev/null and b/textures/garren_right.png differ diff --git a/textures/gredo_back.png b/textures/gredo_back.png new file mode 100644 index 0000000..3d2cd11 Binary files /dev/null and b/textures/gredo_back.png differ diff --git a/textures/gredo_body.png b/textures/gredo_body.png new file mode 100644 index 0000000..fe2f00e Binary files /dev/null and b/textures/gredo_body.png differ diff --git a/textures/gredo_front.png b/textures/gredo_front.png new file mode 100644 index 0000000..2ef36f5 Binary files /dev/null and b/textures/gredo_front.png differ diff --git a/textures/gredo_left.png b/textures/gredo_left.png new file mode 100644 index 0000000..cf28735 Binary files /dev/null and b/textures/gredo_left.png differ diff --git a/textures/gredo_right.png b/textures/gredo_right.png new file mode 100644 index 0000000..b56219f Binary files /dev/null and b/textures/gredo_right.png differ diff --git a/textures/harvey_back.png b/textures/harvey_back.png new file mode 100644 index 0000000..3455f84 Binary files /dev/null and b/textures/harvey_back.png differ diff --git a/textures/harvey_body.png b/textures/harvey_body.png new file mode 100644 index 0000000..3076b6f Binary files /dev/null and b/textures/harvey_body.png differ diff --git a/textures/harvey_front.png b/textures/harvey_front.png new file mode 100644 index 0000000..0be0cbf Binary files /dev/null and b/textures/harvey_front.png differ diff --git a/textures/harvey_left.png b/textures/harvey_left.png new file mode 100644 index 0000000..2007fed Binary files /dev/null and b/textures/harvey_left.png differ diff --git a/textures/harvey_right.png b/textures/harvey_right.png new file mode 100644 index 0000000..423dc64 Binary files /dev/null and b/textures/harvey_right.png differ diff --git a/textures/mordec_back.png b/textures/mordec_back.png new file mode 100644 index 0000000..c6af452 Binary files /dev/null and b/textures/mordec_back.png differ diff --git a/textures/mordec_body.png b/textures/mordec_body.png new file mode 100644 index 0000000..4fe9f9e Binary files /dev/null and b/textures/mordec_body.png differ diff --git a/textures/mordec_front.png b/textures/mordec_front.png new file mode 100644 index 0000000..9948ad4 Binary files /dev/null and b/textures/mordec_front.png differ diff --git a/textures/mordec_left.png b/textures/mordec_left.png new file mode 100644 index 0000000..8b11212 Binary files /dev/null and b/textures/mordec_left.png differ diff --git a/textures/mordec_right.png b/textures/mordec_right.png new file mode 100644 index 0000000..8eada64 Binary files /dev/null and b/textures/mordec_right.png differ diff --git a/textures/plan_house.png b/textures/plan_house.png new file mode 100644 index 0000000..fb3a4ab Binary files /dev/null and b/textures/plan_house.png differ diff --git a/textures/plan_hut.png b/textures/plan_hut.png new file mode 100644 index 0000000..40bfad8 Binary files /dev/null and b/textures/plan_hut.png differ diff --git a/textures/plan_lavamoat.png b/textures/plan_lavamoat.png new file mode 100644 index 0000000..fb732d7 Binary files /dev/null and b/textures/plan_lavamoat.png differ diff --git a/textures/plan_lavapool.png b/textures/plan_lavapool.png new file mode 100644 index 0000000..b92db34 Binary files /dev/null and b/textures/plan_lavapool.png differ diff --git a/textures/plan_moat.png b/textures/plan_moat.png new file mode 100644 index 0000000..4249466 Binary files /dev/null and b/textures/plan_moat.png differ diff --git a/textures/plan_pool.png b/textures/plan_pool.png new file mode 100644 index 0000000..bb9119b Binary files /dev/null and b/textures/plan_pool.png differ diff --git a/textures/plan_tower.png b/textures/plan_tower.png new file mode 100644 index 0000000..ebac347 Binary files /dev/null and b/textures/plan_tower.png differ diff --git a/textures/plan_ubunker.png b/textures/plan_ubunker.png new file mode 100644 index 0000000..4ec1779 Binary files /dev/null and b/textures/plan_ubunker.png differ diff --git a/textures/plan_wall.png b/textures/plan_wall.png new file mode 100644 index 0000000..c605317 Binary files /dev/null and b/textures/plan_wall.png differ diff --git a/textures/toco_back.png b/textures/toco_back.png new file mode 100644 index 0000000..366fa04 Binary files /dev/null and b/textures/toco_back.png differ diff --git a/textures/toco_body.png b/textures/toco_body.png new file mode 100644 index 0000000..366fa04 Binary files /dev/null and b/textures/toco_body.png differ diff --git a/textures/toco_front.png b/textures/toco_front.png new file mode 100644 index 0000000..f786bd1 Binary files /dev/null and b/textures/toco_front.png differ diff --git a/textures/toco_left.png b/textures/toco_left.png new file mode 100644 index 0000000..366fa04 Binary files /dev/null and b/textures/toco_left.png differ diff --git a/textures/toco_right.png b/textures/toco_right.png new file mode 100644 index 0000000..366fa04 Binary files /dev/null and b/textures/toco_right.png differ