mover: can now work in elevator mode. To do so punch target position directly above/below mover and upgrade mover with 1 diamond block for every 100 height difference.

This commit is contained in:
rnd1 2016-04-14 08:20:42 +02:00
parent e29d2dc346
commit 4ab1c396a4
3 changed files with 158 additions and 26 deletions

90
enviro.lua Normal file
View File

@ -0,0 +1,90 @@
-- ENVIRO block
-- TO DO: mod only: skybox, speed > 1, jump?, radius > 10, gravity < 0
-- privs: kick
-- rnd 2016:
basic_machines.skyboxes = {
["default"]={type = "regular", tex = {}},
["space"]={type="skybox", tex={"sky_pos_y.png","sky_neg_y.png","sky_pos_z.png","sky_neg_z.png","sky_neg_x.png","sky_pos_x.png",}},
["caves"]={type = "cavebox", tex = {"black.png","black.png","black.png","black.png","black.png","black.png",}}};
-- enviroment changer
minetest.register_node("basic_machines:enviro", {
description = "Changes enviroment for players around target location",
tiles = {"enviro.png"},
groups = {oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
after_place_node = function(pos, placer)
local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", "Right click to set it. Activate by signal.")
meta:set_string("owner", placer:get_player_name()); meta:set_int("public",1);
meta:set_int("x0",0);meta:set_int("y0",0);meta:set_int("z0",0); -- target
meta:set_int("r",5); meta:set_string("skybox","default");
meta:set_float("speed",1);
meta:set_float("jump",1);
meta:set_float("g",1);
meta:set_float("sneak",1);
local name = placer:get_player_name();
meta:set_string("owner",name);
end,
mesecons = {effector = {
action_on = function (pos, node,ttl)
end
}
},
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
local meta = minetest.get_meta(pos);
local privs = minetest.get_player_privs(player:get_player_name());
local cant_build = minetest.is_protected(pos,player:get_player_name());
--meta:get_string("owner")~=player:get_player_name() and
if not privs.privs and cant_build then
return
end -- only ppl sharing protection can set up keypad
local x0,y0,z0;
x0=meta:get_int("x0");y0=meta:get_int("y0");z0=meta:get_int("z0");
local skybox = meta:get_string("skybox");
local skylist = "";
for i,_ in pairs(basic_machines.skyboxes) do
skylist = skylist .. i .. ",";
end
machines.pos1[player:get_player_name()] = {x=pos.x+x0,y=pos.y+y0,z=pos.z+z0};machines.mark_pos1(player:get_player_name()) -- mark pos1
local r = meta:get_int("r");
local speed,jump, g, sneak;
speed = meta:get_float("speed");jump = meta:get_float("jump");
g = meta:get_float("g"); sneak = meta:get_float("sneak");
local form =
"size[4.25,3.75]" .. -- width, height
"field[0.25,0.5;1,1;x0;target;"..x0.."] field[1.25,0.5;1,1;y0;;"..y0.."] field[2.25,0.5;1,1;z0;;"..z0.."]"..
"field[3.25,0.5;1,1;r;radius;"..r.."]"..
--speed, jump, gravity,sneak
"field[0.25,1.5;1,1;speed;speed;"..speed.."]"..
"field[1.25,1.5;1,1;jump;jump;".. jump.."]"..
"field[2.25,1.5;1,1;g;gravity;"..g.."]"..
"field[3.25,1.5;1,1;sneak;sneak;"..sneak.."]"..
"label[0.,3.0;Skybox selection]"..
"dropdown[0.,3.35;3,1;skybox;"..skylist..";".. skybox .."]"..
"button_exit[3.25,3.25;1,1;OK;OK]";
minetest.show_formspec(player:get_player_name(), "basic_machines:enviro_"..minetest.pos_to_string(pos), form)
meta:set_string("formspec",form);
-- end
end,
on_receive_fields = function(pos, formname, fields, sender)
minetest.chat_send_all(" FORM ");
local meta = minetest.get_meta(pos);
local x0=0; local y0=0; local z0=0;
if fields.x0 then x0 = tonumber(fields.x0) or 0 end
if fields.y0 then y0 = tonumber(fields.y0) or 0 end
if fields.z0 then z0 = tonumber(fields.z0) or 0 end
meta:set_int("x0",x0);meta:set_int("y0",y0);meta:set_int("z0",z0);
-- TO DO..
end
})

View File

@ -24,8 +24,10 @@ dofile(minetest.get_modpath("basic_machines").."/mover.lua")
dofile(minetest.get_modpath("basic_machines").."/technic_power.lua") -- technic power for mover
dofile(minetest.get_modpath("basic_machines").."/recycler.lua")
dofile(minetest.get_modpath("basic_machines").."/grinder.lua")
--dofile(minetest.get_modpath("basic_machines").."/cpu.lua") -- experimental
dofile(minetest.get_modpath("basic_machines").."/autocrafter.lua") -- borrowed and adapted from pipeworks mod
dofile(minetest.get_modpath("basic_machines").."/enviro.lua")
--dofile(minetest.get_modpath("basic_machines").."/cpu.lua") -- experimental
minetest.after(0, function() -- if you want open/close doors with signal, also steel doors are made impervious to dig through, removal by repeat punch
dofile(minetest.get_modpath("basic_machines").."/mesecon_doors.lua")

View File

@ -257,17 +257,27 @@ minetest.register_node("basic_machines:mover", {
-- FUEL COST: calculate
local dist = math.abs(pos2.x-pos1.x)+math.abs(pos2.y-pos1.y)+math.abs(pos2.z-pos1.z);
local fuel_cost = (basic_machines.hardness[node1.name] or 1);
local upgrade = meta:get_float("upgrade") or 1;
if node1.name == "default:chest_locked" or mode == "inventory" then fuel_cost = basic_machines.hardness[prefer] or 1 end;
fuel_cost=fuel_cost*dist/machines_operations; -- machines_operations=10 by default, so 10 basic operations possible with 1 coal
if mode == "object"
then fuel_cost=fuel_cost*0.1;
elseif mode == "inventory" then fuel_cost=fuel_cost*0.1;
if mode == "object" then
fuel_cost=fuel_cost*0.1;
if pos2.x==pos1.x and pos2.z==pos1.z then -- check if elevator mode
local requirement = math.floor(math.abs(pos2.y-pos.y)/100)+1;
if upgrade-1<requirement then
meta:set_string("infotext","MOVER: Elevator error. Need at least "..requirement .. " diamond block(s) in upgrade (1 for every 100 height). ");
return;
end
fuel_cost = 0
end
elseif mode == "inventory" then
fuel_cost=fuel_cost*0.1;
end
local upgrade = meta:get_float("upgrade") or 1;fuel_cost = fuel_cost/upgrade; -- upgrade decreases fuel cost
if upgrade == -1 then fuel_cost = 0 end -- free operation
fuel_cost = fuel_cost/upgrade; -- upgrade decreases fuel cost
if upgrade == -1 then fuel_cost = 0 end -- free operation for admin
-- FUEL OPERATIONS
@ -688,10 +698,10 @@ local function use_keypad(pos,ttl, again) -- position, time to live ( how many t
-- pass the signal on to target
if mode == 2 then -- on
if not effector.action_on then return end
effector.action_on(tpos,node,ttl); -- run
effector.action_on(tpos,node,ttl-1); -- run
elseif mode == 1 then -- off
if not effector.action_off then return end
effector.action_off(tpos,node,ttl); -- run
effector.action_off(tpos,node,ttl-1); -- run
end
end
@ -1455,9 +1465,38 @@ minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
if punchset[name].state == 3 then
if punchset[name].node~="basic_machines:mover" then punchset[name].state = 0 return end
local privs = minetest.get_player_privs(puncher:get_player_name());
if not privs.privs and (math.abs(punchset[name].pos.x - pos.x)>range or math.abs(punchset[name].pos.y - pos.y)>range or math.abs(punchset[name].pos.z - pos.z)>range) then
minetest.chat_send_player(name, "MOVER: Punch closer to mover. aborting.")
punchset[name].state = 0; return
local elevator_mode = false;
if punchset[name].pos.x == pos.x and punchset[name].pos.z == pos.z then -- check if elevator mode
if math.abs(punchset[name].pos.y-pos.y)>10 then -- trying to make elevator?
local meta = minetest.get_meta(punchset[name].pos);
if meta:get_string("mode")=="object" then -- only if object mode
--count number of diamond blocks to determine elevator can be set up with this height distance
local inv = meta:get_inventory();
local upgrade = 0;
if inv:get_stack("upgrade", 1):get_name() == "default:diamondblock" then
upgrade = (inv:get_stack("upgrade", 1):get_count()) or 0;
end
local requirement = math.floor(math.abs(punchset[name].pos.y-pos.y)/100)+1;
if upgrade<requirement then
minetest.chat_send_player(name, "MOVER: Error while trying to make elevator. Need at least "..requirement .. " diamond block(s) in upgrade (1 for every 100 height). ");
punchset[name].state = 0; return
else
elevator_mode=true;
meta:set_int("upgrade",upgrade+1);
end
end
end
end
if not privs.privs and not elevator_mode and (math.abs(punchset[name].pos.x - pos.x)>range or math.abs(punchset[name].pos.y - pos.y)>range or math.abs(punchset[name].pos.z - pos.z)>range) then
minetest.chat_send_player(name, "MOVER: Punch closer to mover. aborting.")
punchset[name].state = 0; return
end
punchset[name].pos2 = {x=pos.x,y=pos.y,z=pos.z}; punchset[name].state = 0;
@ -1465,25 +1504,26 @@ minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
minetest.chat_send_player(name, "MOVER: End position for mover set.")
local x = punchset[name].pos1.x-punchset[name].pos.x;
local y = punchset[name].pos1.y-punchset[name].pos.y;
local z = punchset[name].pos1.z-punchset[name].pos.z;
local x0 = punchset[name].pos1.x-punchset[name].pos.x;
local y0 = punchset[name].pos1.y-punchset[name].pos.y;
local z0 = punchset[name].pos1.z-punchset[name].pos.z;
local meta = minetest.get_meta(punchset[name].pos);
meta:set_int("x0",x);meta:set_int("y0",y);meta:set_int("z0",z);
x = punchset[name].pos11.x-punchset[name].pos.x;
y = punchset[name].pos11.y-punchset[name].pos.y;
z = punchset[name].pos11.z-punchset[name].pos.z;
meta:set_int("x1",x);meta:set_int("y1",y);meta:set_int("z1",z);
x = punchset[name].pos2.x-punchset[name].pos.x;
y = punchset[name].pos2.y-punchset[name].pos.y;
z = punchset[name].pos2.z-punchset[name].pos.z;
meta:set_int("x2",x);meta:set_int("y2",y);meta:set_int("z2",z);
local x0,y0,z0,x1,y1,z1;
x0 = meta:get_int("x0");y0 = meta:get_int("y0");z0 = meta:get_int("z0");
x1 = meta:get_int("x1");y1 = meta:get_int("y1");z1 = meta:get_int("z1");
local x1 = punchset[name].pos11.x-punchset[name].pos.x;
local y1 = punchset[name].pos11.y-punchset[name].pos.y;
local z1 = punchset[name].pos11.z-punchset[name].pos.z;
local x2 = punchset[name].pos2.x-punchset[name].pos.x;
local y2 = punchset[name].pos2.y-punchset[name].pos.y;
local z2 = punchset[name].pos2.z-punchset[name].pos.z;
meta:set_int("x1",x1);meta:set_int("y1",y1);meta:set_int("z1",z1);
meta:set_int("x0",x0);meta:set_int("y0",y0);meta:set_int("z0",z0);
meta:set_int("x2",x2);meta:set_int("y2",y2);meta:set_int("z2",z2);
meta:set_int("pc",0); meta:set_int("dim",(x1-x0+1)*(y1-y0+1)*(z1-z0+1))
return
end