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:
parent
e29d2dc346
commit
4ab1c396a4
90
enviro.lua
Normal file
90
enviro.lua
Normal 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
|
||||
})
|
4
init.lua
4
init.lua
@ -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")
|
||||
|
90
mover.lua
90
mover.lua
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user