From a7d2967f38db3fe5885d5d7257de88946ecb85be Mon Sep 17 00:00:00 2001 From: expertmm <7557867+expertmm@users.noreply.github.com> Date: Thu, 8 Mar 2018 19:17:42 -0500 Subject: [PATCH] initial commit of LionsDen fork of LocaL_ALchemisT workers --- README.md | 2 - abm.lua | 666 +++++++++++++++++++++++++++++++++++++ craft.lua | 161 +++++++++ depends.txt | 2 + fungsi.lua | 110 ++++++ init.lua | 577 ++++++++++++++++++++++++++++++++ readme.txt | 16 + sounds/asvard_00.ogg | Bin 0 -> 24109 bytes sounds/asvard_01.ogg | Bin 0 -> 9659 bytes sounds/mordec_00.ogg | Bin 0 -> 14959 bytes textures/asvard_back.png | Bin 0 -> 217 bytes textures/asvard_body.png | Bin 0 -> 141 bytes textures/asvard_front.png | Bin 0 -> 227 bytes textures/asvard_left.png | Bin 0 -> 226 bytes textures/asvard_right.png | Bin 0 -> 227 bytes textures/benjo_back.png | Bin 0 -> 167 bytes textures/benjo_body.png | Bin 0 -> 141 bytes textures/benjo_front.png | Bin 0 -> 246 bytes textures/benjo_left.png | Bin 0 -> 197 bytes textures/benjo_right.png | Bin 0 -> 231 bytes textures/cardon_back.png | Bin 0 -> 160 bytes textures/cardon_body.png | Bin 0 -> 159 bytes textures/cardon_front.png | Bin 0 -> 238 bytes textures/cardon_left.png | Bin 0 -> 181 bytes textures/cardon_right.png | Bin 0 -> 214 bytes textures/garren_back.png | Bin 0 -> 151 bytes textures/garren_body.png | Bin 0 -> 141 bytes textures/garren_front.png | Bin 0 -> 272 bytes textures/garren_left.png | Bin 0 -> 187 bytes textures/garren_right.png | Bin 0 -> 228 bytes textures/gredo_back.png | Bin 0 -> 160 bytes textures/gredo_body.png | Bin 0 -> 141 bytes textures/gredo_front.png | Bin 0 -> 199 bytes textures/gredo_left.png | Bin 0 -> 181 bytes textures/gredo_right.png | Bin 0 -> 179 bytes textures/harvey_back.png | Bin 0 -> 151 bytes textures/harvey_body.png | Bin 0 -> 141 bytes textures/harvey_front.png | Bin 0 -> 224 bytes textures/harvey_left.png | Bin 0 -> 187 bytes textures/harvey_right.png | Bin 0 -> 185 bytes textures/mordec_back.png | Bin 0 -> 170 bytes textures/mordec_body.png | Bin 0 -> 159 bytes textures/mordec_front.png | Bin 0 -> 256 bytes textures/mordec_left.png | Bin 0 -> 198 bytes textures/mordec_right.png | Bin 0 -> 255 bytes textures/plan_house.png | Bin 0 -> 181 bytes textures/plan_hut.png | Bin 0 -> 176 bytes textures/plan_lavamoat.png | Bin 0 -> 227 bytes textures/plan_lavapool.png | Bin 0 -> 226 bytes textures/plan_moat.png | Bin 0 -> 227 bytes textures/plan_pool.png | Bin 0 -> 188 bytes textures/plan_tower.png | Bin 0 -> 185 bytes textures/plan_ubunker.png | Bin 0 -> 228 bytes textures/plan_wall.png | Bin 0 -> 193 bytes textures/toco_back.png | Bin 0 -> 173 bytes textures/toco_body.png | Bin 0 -> 173 bytes textures/toco_front.png | Bin 0 -> 273 bytes textures/toco_left.png | Bin 0 -> 173 bytes textures/toco_right.png | Bin 0 -> 173 bytes 59 files changed, 1532 insertions(+), 2 deletions(-) delete mode 100644 README.md create mode 100644 abm.lua create mode 100644 craft.lua create mode 100644 depends.txt create mode 100644 fungsi.lua create mode 100644 init.lua create mode 100644 readme.txt create mode 100644 sounds/asvard_00.ogg create mode 100644 sounds/asvard_01.ogg create mode 100644 sounds/mordec_00.ogg create mode 100644 textures/asvard_back.png create mode 100644 textures/asvard_body.png create mode 100644 textures/asvard_front.png create mode 100644 textures/asvard_left.png create mode 100644 textures/asvard_right.png create mode 100644 textures/benjo_back.png create mode 100644 textures/benjo_body.png create mode 100644 textures/benjo_front.png create mode 100644 textures/benjo_left.png create mode 100644 textures/benjo_right.png create mode 100644 textures/cardon_back.png create mode 100644 textures/cardon_body.png create mode 100644 textures/cardon_front.png create mode 100644 textures/cardon_left.png create mode 100644 textures/cardon_right.png create mode 100644 textures/garren_back.png create mode 100644 textures/garren_body.png create mode 100644 textures/garren_front.png create mode 100644 textures/garren_left.png create mode 100644 textures/garren_right.png create mode 100644 textures/gredo_back.png create mode 100644 textures/gredo_body.png create mode 100644 textures/gredo_front.png create mode 100644 textures/gredo_left.png create mode 100644 textures/gredo_right.png create mode 100644 textures/harvey_back.png create mode 100644 textures/harvey_body.png create mode 100644 textures/harvey_front.png create mode 100644 textures/harvey_left.png create mode 100644 textures/harvey_right.png create mode 100644 textures/mordec_back.png create mode 100644 textures/mordec_body.png create mode 100644 textures/mordec_front.png create mode 100644 textures/mordec_left.png create mode 100644 textures/mordec_right.png create mode 100644 textures/plan_house.png create mode 100644 textures/plan_hut.png create mode 100644 textures/plan_lavamoat.png create mode 100644 textures/plan_lavapool.png create mode 100644 textures/plan_moat.png create mode 100644 textures/plan_pool.png create mode 100644 textures/plan_tower.png create mode 100644 textures/plan_ubunker.png create mode 100644 textures/plan_wall.png create mode 100644 textures/toco_back.png create mode 100644 textures/toco_body.png create mode 100644 textures/toco_front.png create mode 100644 textures/toco_left.png create mode 100644 textures/toco_right.png 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 0000000000000000000000000000000000000000..4e5871c0b905ea84c413f077ea68fa0d641ced3b GIT binary patch literal 24109 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 literal 0 HcmV?d00001 diff --git a/sounds/mordec_00.ogg b/sounds/mordec_00.ogg new file mode 100644 index 0000000000000000000000000000000000000000..aaddfcdef8cab26d5c0b76abf16f3316d9c57830 GIT binary patch literal 14959 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 ZpIX^+qkXOJL4lLfTekJEp~(&OzX0E13Z(!5 literal 0 HcmV?d00001 diff --git a/textures/asvard_back.png b/textures/asvard_back.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5e54b3032485e5345ab696b5a97921d0f504df GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV4kOoV~B-+@|yMQ|DShYOjzWgAE6z`Y$3he zu))C2VI#Lh<1+pn34=%7tTX=azn=b(hiy(`gG|K_CZXkw3el(k?@!ubx2KPBJ~vyX zf|-elfsAEQOXB%?woBNRHhRu^G^OJ@gVQzopr02$y#%K!iX literal 0 HcmV?d00001 diff --git a/textures/asvard_body.png b/textures/asvard_body.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4f1e76b3a4dfe7272f1f77cc385230c6aaf8e5 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBppvJHV~B-+@|yMQ|DShYOjzWgAMttxnv{^{C7b{N literal 0 HcmV?d00001 diff --git a/textures/asvard_front.png b/textures/asvard_front.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea2617e9549d826feda3df385bcfb235d93d3d0 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV1=iPV~BmKjyue*$~h{31M~T0dve;C+@|rQ1@3zguy;$% zzK32N_ndZfEJ!;%p*p7Y0K?8F%YE%1t!lo>vq4I!Z%h64LubtMO#cNZ>}(Z|U+c(S T7Hz-`bOVE@tDnm{r-UW|_X|%z literal 0 HcmV?d00001 diff --git a/textures/asvard_left.png b/textures/asvard_left.png new file mode 100644 index 0000000000000000000000000000000000000000..c042f7945a772b5b45bfd56f3ab3db84eeeb0c0e GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV7aG@V~B-+@|yMQ|DShYOjzWgAMyHt^Z|~N zqX*g;m8*12%*>1!jv5>ioBl(A*Ci(Iz_hd(RuV3f6AbsYwED`PGhkqq;y92Yu)FD@ zsZ4VW=OLXXDycbf$t+gf%8HFSPV6^Kny(z-b-32zZD@A=&}1XcSrd4f81Bbvmmk>L RSqO9jgQu&X%Q~loCICdqMic-5 literal 0 HcmV?d00001 diff --git a/textures/asvard_right.png b/textures/asvard_right.png new file mode 100644 index 0000000000000000000000000000000000000000..fe64dafbcfa70bd595b9ee630b838a66cf5623d2 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV1=iPV~B-+@|yMQ|DShYOjzWgAMyHt^Z|~N zqX*g;mA6G?DaNS;hp{taVrTI$pne`M^0hvNyd#iOb@x*t{3na zGl*m;Ff86Ed4@^YrOe2V_eEPmuUpKvra3-a7;nt!eq%Hv(IVDCWBMT;W`;s%y}kRd St!e|hfx*+&&t;ucLK6TZYDjAU literal 0 HcmV?d00001 diff --git a/textures/benjo_back.png b/textures/benjo_back.png new file mode 100644 index 0000000000000000000000000000000000000000..3f7c23801afd78ac6571db37c6b1e842574f328c GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBppB=CV~B-+a?Ssg!}V-j48p8c2cy{UF&z7^ z{_{ZMfsB8hj3?NvyG6`ya4*R?5MVFG-K-$XQ{yF5Azopr0Cx5xEdT%j literal 0 HcmV?d00001 diff --git a/textures/benjo_front.png b/textures/benjo_front.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e523de58e4491ecd57fc5c18fe0946b04ca66a GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV7I4>V~B-+a?Ssg!}V-j48p8c2ctC28U$~0 zHyJS&urnSFlxg?w6I}7?|Np8|wqwU;JFqEPNJvUbIy_Qn@bBYX#*rrLp{&=S$8IF? zj&*|Y#aM>VY<89v3QZ!-ISq+V3=XKb3w1nk(L8$5Lz;QQW0_~VIY|#Rj!hFU&~)>U lvEWruHOLfZTe5?JVZk=H7gKrk4gj6S;OXk;vd$@?2>__tN;Uuh literal 0 HcmV?d00001 diff --git a/textures/benjo_left.png b/textures/benjo_left.png new file mode 100644 index 0000000000000000000000000000000000000000..2ff9c639f71fbfb63effabefe95547d80e76b8dc GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV3eneV~B-+a?Ssg!}V-j48p8c2cy{UF}N+z z{`cShBzqa(;-BhlK{tJtWI2SN?~vneGGgR$FznfIRMqZ7qeVw71DApFN@C$!~R?c+QQ)J>gTe~DWM4f&uu-# literal 0 HcmV?d00001 diff --git a/textures/benjo_right.png b/textures/benjo_right.png new file mode 100644 index 0000000000000000000000000000000000000000..fa6d5e480473ad7285f68a520adbb3352bb82034 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV2!7XV~B-+a?Ssg!}V-j48p8c2cy{UF&z8< z_0@k#>3k!G%ng%0(wM*gQI9shkmQ!LQ9(oa0E5VJj`*BM%<>&6I~5dM+ZbC`&gV-z zwZy2wfTw|pmnFfZqgSW@Vbd4&&5{lh@($CFOR+7`aM>;!ekIA5eMySJrXcvv_;CxVj%EcZb~{C0W^o3FJZsM5K}{VOfd(*my85}Sb4q9e0CUYK A(f|Me literal 0 HcmV?d00001 diff --git a/textures/cardon_body.png b/textures/cardon_body.png new file mode 100644 index 0000000000000000000000000000000000000000..b49b113bd0cf8f628aac4db09353c288f6692d70 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpoyo8V~B-+@}K%i@9mjc8#tG2PmESP>2~0Y zLC{fFmFWH@jBi-I4y<70;aQyMu+~80!WkBZS91K8w-i`c0`)U^y85}Sb4q9e0Lfr0 A)c^nh literal 0 HcmV?d00001 diff --git a/textures/cardon_front.png b/textures/cardon_front.png new file mode 100644 index 0000000000000000000000000000000000000000..0df59ec03903c9ea75294cc1cb66274b42cc639a GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV6&%-V~B-+@}K%i@9mjc8#YuV&SCI$^>bP0l+XkKXa`b7 literal 0 HcmV?d00001 diff --git a/textures/cardon_left.png b/textures/cardon_left.png new file mode 100644 index 0000000000000000000000000000000000000000..0fca96e0435f8f969d1505b4571c9e28cceeec52 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpqHnMV~B-+@}K%i@9mjc8#fRe3g0P#XrK=3XZDUeQ31kh-Kh5iD_i#&g|OTU@DuiS#(C+26z3d!a^%|3Nys^ Wh=?n=fB6kGmBG{1&t;ucLK6V$Of&fa literal 0 HcmV?d00001 diff --git a/textures/cardon_right.png b/textures/cardon_right.png new file mode 100644 index 0000000000000000000000000000000000000000..764e477511cb2a9b3edc78ff8f598268201e4161 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV78}=V~B-+@}K%i@9mjc8#fR?8`Lq;veB_8;+{keQ5Ns6*tMzR?+r77<=Kt)$0|FDLp z;F6g#41Vk%V0pXWC+9dK!k+i%V0pXWC+9dK!k+i)$A+3j$G hiL67>#RJb-8E&#L*=f$vQ2?rD@O1TaS?83{1OVvYC2s%# literal 0 HcmV?d00001 diff --git a/textures/garren_front.png b/textures/garren_front.png new file mode 100644 index 0000000000000000000000000000000000000000..a5fd7c1ef5b7a096ca5165b3e1bbebb8b38617ea GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwB;8IT)#}Etu04D1?-GR17+I1`#%0xXDg5}_+)7C=YKy3pPQQ-+X5Mh2a^wfVDeDbYw+cJ$2vjy zVl2aFHap85+zwriW(N$4fb!0qE=7w(@=coN^vV3Xp>rUU;mrL71qahP+QbvO?w?w* zAVTBM6TTV!^Xv-R7*8n7P*gbkLMn0D<1b7e%pS^iXCJtjJ=iJ8Am9>s(fa7`O+W`T Nc)I$ztaD0e0swGiU=IKQ literal 0 HcmV?d00001 diff --git a/textures/garren_left.png b/textures/garren_left.png new file mode 100644 index 0000000000000000000000000000000000000000..f5f5a547b13d709297f3fb62af2d8deac59c4f19 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV1TEKV~B-+a>%V0pXWC+9dK!k+i} literal 0 HcmV?d00001 diff --git a/textures/garren_right.png b/textures/garren_right.png new file mode 100644 index 0000000000000000000000000000000000000000..6173fd6a9387a17eecabdb2839929f4486a58837 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV5O&vV~B-+a>%V0pXWC+9dK!k+izopr0C^lET>t<8 literal 0 HcmV?d00001 diff --git a/textures/gredo_front.png b/textures/gredo_front.png new file mode 100644 index 0000000000000000000000000000000000000000..2ef36f5d77a3c2b8209271a05b8d4781ee62b5da GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV2r1WV~B-+vQ5p85A|$Z48p8c2cy{UF}N+z z*5G1xi%__A>sAsAdjOwKn}1(bBEx3hXFMr(c9uKDPxSh|s%(rAPx#8TEr30;K~7A; okcZh})<(@1SM^n+a literal 0 HcmV?d00001 diff --git a/textures/gredo_left.png b/textures/gredo_left.png new file mode 100644 index 0000000000000000000000000000000000000000..cf287353af0875c57bfcb15021191f6228b46803 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpqHnMV~B-+vQ5p85A|$Z48p8c2cy{UF}N+z z*5G1xTgAR;?ONSy1xHowJ~Uc%#4>Q3#5A&VXLjvvFqKW%EIK1@gPZzopr06Qo$egFUf literal 0 HcmV?d00001 diff --git a/textures/harvey_back.png b/textures/harvey_back.png new file mode 100644 index 0000000000000000000000000000000000000000..3455f84cf6d2036fe97d72afbcf54a419059dd51 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBppK`DV~B-+@|{T0fAbre4!AVNZMfEG-th77 sWL{=zww}cs4LB|xJh1#oV>u(k^dgQ;Hzr1;1NAX@y85}Sb4q9e0Ka}K@c;k- literal 0 HcmV?d00001 diff --git a/textures/harvey_body.png b/textures/harvey_body.png new file mode 100644 index 0000000000000000000000000000000000000000..3076b6febbb13ae2eb9d368851aec1308f89441f GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enP|4H9F~q_@`A($hzxjiu0 ztiJ7KA^yTt5(8OhpS?8_oe8 Oz~JfX=d#Wzp$PzA&O=84 literal 0 HcmV?d00001 diff --git a/textures/harvey_left.png b/textures/harvey_left.png new file mode 100644 index 0000000000000000000000000000000000000000..2007fedb69b247840d2a3c98bbbf373fa1c8fd2f GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV1TEKV~B-+@|{T0fAbre4!AVNZMfEG-th77 zWL{=zww@OoAKcqEiBY3XaNCX}>~;d|8@U}C*_aHZ!n>B<;Fh@9aXKs~kUOaRDnpQw d#L+kghGu=qbutk@lz?V4c)I$ztaD0e0s!!!H{JjM literal 0 HcmV?d00001 diff --git a/textures/harvey_right.png b/textures/harvey_right.png new file mode 100644 index 0000000000000000000000000000000000000000..423dc6414d15540e16d5a8440db8e8a51d137526 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpr5CUV~B-+@|{T0fAbre4!AVNZMfEG-th77 zWL{=zww@bF2lwWxG6%>g*KF+MuTkJD5^rGQWl1pE7UI28e1n^^Ui3y+T|efIvne9g aj10l`lI#4{pKSn|%;4$j=d#Wzp$P!<6g2?= literal 0 HcmV?d00001 diff --git a/textures/mordec_back.png b/textures/mordec_back.png new file mode 100644 index 0000000000000000000000000000000000000000..c6af452d18e7d5d6e0fc6a894dc7c0b61b8d3bc7 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpuMMyV~B-+@}K{m5AB&*8#^&hr*9;#^pne8VS3j3^P6`&9G&M*kEGu9OO7`PhDRp{NpuuJAd z!VYl@5Q#}t3gt|47EbhE46lPoCkCugQu&X%Q~loCIEv#SB?Mx literal 0 HcmV?d00001 diff --git a/textures/mordec_left.png b/textures/mordec_left.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1121255b8a6aa3662681af413ab558f534ed45 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV6>-;V~B-+@}K{m5AB&*8#XOyyJ-t+f oUCGVl(I(O8D@|AVD)Lwu{CIR^1CQ>C09wP~>FVdQ&MBb@03I(pO8@`> literal 0 HcmV?d00001 diff --git a/textures/mordec_right.png b/textures/mordec_right.png new file mode 100644 index 0000000000000000000000000000000000000000..8eada645de6c13a28cd9cfad9b2608f7fe5c0fc8 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwB;1o|6#}Etubb|@UZx$hNFfIW`)1l7dhXM44K}zr=joQ z!zTAT_a5`a%*)X~5Yv?8pgv!Nnd2~ng_q+-=B17~DV04_BL2NJW#)Ly{Nhu@UWP8G wlG_&-e>k8e-0|AuY_G!p!zPnc8FqbVFm*|Lf8)D9JJ5X$p00i_>zopr081TO2mk;8 literal 0 HcmV?d00001 diff --git a/textures/plan_house.png b/textures/plan_house.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3a4ab42fc2b8b411e666e85d5cb0a41822f0f4 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpqHnMV~B-+a!SOPNA}FD4V_GT6V@I+z~C04 z@ULG~UDHBBe80?^M1~@%GnFUm4ypPTnp`pyD72KmnJrS?n8f@b(IH67DadCdH-mbF VWWW0jo=Tvp44$rjF6*2UngGj%GP3{x literal 0 HcmV?d00001 diff --git a/textures/plan_hut.png b/textures/plan_hut.png new file mode 100644 index 0000000000000000000000000000000000000000..40bfad83b59759d9905b2a50c2d73530ce1e79b4 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpsS~gV~B-+a!SOPNA}FD4V_GT6V@(f<7qQU zI5Lgz-|?>G-q>SD^$m|?O7|*AZ@k&{hUeC5d?nxw6T{m_yqA*= S?>q+@$l&Sf=d#Wzp$P!BZa3=y literal 0 HcmV?d00001 diff --git a/textures/plan_lavamoat.png b/textures/plan_lavamoat.png new file mode 100644 index 0000000000000000000000000000000000000000..fb732d79585410138177540b5392836bd41b5155 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV1=iPV~B-+a!SOPNA}FD4V_GT6V@KS+ps;< zj7On|{{atkO79PzgP9E%9^d9UAu(M$L!O(Lm-k64<3`RN!D&;<@10feTaGfteAcY{lQyH4<+QP0U8lN$sl8wkM~qyxPR#RW4F@xh_Juzd3#JL2 zFi0_*^m~JJL!Pvp{=@G~XVhf2H8Tqzopr0MrOYi~s-t literal 0 HcmV?d00001 diff --git a/textures/plan_moat.png b/textures/plan_moat.png new file mode 100644 index 0000000000000000000000000000000000000000..424946609cf25969e236ce844ab5a5767554c46f GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV1=iPV~B-+a!SOPNA}FD4V_GT6V@KS+ps;< zj7On|{{atkO79PzgP9E%9^d9UAu(M$L!O(Lm-k64<3`RN!D&;<@10aoLmgHx TRh$1nH!yg*`njxgN@xNAZ9GY0 literal 0 HcmV?d00001 diff --git a/textures/plan_pool.png b/textures/plan_pool.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9119b0c9f1bd878405a1bb4933fa77832442f3 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV4$aqV~B-+a!SOPNA}FD4V_GT6V@I++3feTaGgMd|ng1{^P8P%hb50rN{g!y1}Zn@W5eJ|3arj9jr;QPFo`yb~i-K ezIZiIhK(WBUXoXpf$KKVa0X9TKbLh*2~7aQe>+qF literal 0 HcmV?d00001 diff --git a/textures/plan_tower.png b/textures/plan_tower.png new file mode 100644 index 0000000000000000000000000000000000000000..ebac3471ee1af3e2d3cc2fc28a093fde4488f322 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBpr5CUV~B-+a!SOPNA}FD4V_GT6V^uX{*c$^ zo5phSL{84Mhb4?Y%4ZZ}^p^IDONj43vO!?B#5n^6)r8E)t%2eWK?+s})ZC_Kq{w`@ a!@+Q*QuuLIhq)5aWCl-HKbLh*2~7aujW!$r literal 0 HcmV?d00001 diff --git a/textures/plan_ubunker.png b/textures/plan_ubunker.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec17790abdb6165b99cdee78385688781a7a27f GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBV5O&vV~B-+a!SOPNA}FD4V_GT6V@{4Gbn5D zY}+*>>BkZ8PlC*kA5BmA_(qg=)sQGu-+R$WX;VA#!& z#=T4Pgx&#F_dt3+7vU41`68NU6(VQV)=YjXL5N_rj+$YY4h_EX$BpuaU TlD|G1YA0zG`jk iWnHwG!B_Dp&~mSjyP{9{zYYi5z~JfX=d#Wzp$P!X9z0$E literal 0 HcmV?d00001 diff --git a/textures/toco_back.png b/textures/toco_back.png new file mode 100644 index 0000000000000000000000000000000000000000..366fa0474695e0ce5bb4906555c05360d0f36d7b GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP>?0v z(btiIVPjv-@4(4GzCyA`kS_y6l_~>6Lo)-z&;LOBB?CjL0RzLU1O^7H84L{K`IF+0 zx&hTHd%8G=RNPAX^Z&m+vuZ?0v z(btiIVPjv-@4(4GzCyA`kS_y6l_~>6Lo)-z&;LOBB?CjL0RzLU1O^7H84L{K`IF+0 zx&hTHd%8G=RNPAX^Z&m+vuZ?0v z(btiIVPjv-@4(4GzCyA`kS_y6l_~>6Lo)-z&;LOBB?CjL0RzLU1O^7H84L{K`IF+0 zx&hU;d%8G=RNOifWGK|2z>{qg_u$;E0Ncvt@l=Q^&UDxO)LakCtP7p%I} z>}d7yQsa|PZXTDqI~+ncTO6Aq?Zlz(*sJ_rOBnc)K|}Ch@{8uioM^ zz3S$(3yv!8EX#c;FaNU1=A7MGqr7abzsk+EvsQ04)N=l#)123w%&^nM(edJzx4(c+ OV(@hJb6Mw<&;$TxdSj;m literal 0 HcmV?d00001 diff --git a/textures/toco_left.png b/textures/toco_left.png new file mode 100644 index 0000000000000000000000000000000000000000..366fa0474695e0ce5bb4906555c05360d0f36d7b GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP>?0v z(btiIVPjv-@4(4GzCyA`kS_y6l_~>6Lo)-z&;LOBB?CjL0RzLU1O^7H84L{K`IF+0 zx&hTHd%8G=RNPAX^Z&m+vuZ?0v z(btiIVPjv-@4(4GzCyA`kS_y6l_~>6Lo)-z&;LOBB?CjL0RzLU1O^7H84L{K`IF+0 zx&hTHd%8G=RNPAX^Z&m+vuZ