fastway/init.lua

232 lines
6.9 KiB
Lua

local S=minetest.get_translator("fastway")
local function setting_get(name, default)
return minetest.settings:get(name) or default
end
local dir = minetest.is_yes(setting_get("sprint_forward_only", "false"))
local mod_player_monoids = minetest.get_modpath("player_monoids") ~= nil
local way_timer_step = 0
local way_timer = 0
local function way_step(player, dtime)
local name = player:get_player_name()
local ground_pos = vector.add(player:get_pos(), {x=0,y=-1,z=0})
local ground_block = minetest.get_node_or_nil(ground_pos)
--fastblock
if(ground_block ~=nil) then
if (ground_block.name=="fastway:track") then
if mod_player_monoids then
player_monoids.speed:add_change(player,3,"fastway:speed")
player_monoids.jump:add_change(player,2,"fastway:jump")
else
player:set_physics_override({speed = 3, jump = 2})
end
else
if(ground_block.name=="fastway:trampoline") then
if mod_player_monoids then
player_monoids.jump:add_change(player,4,"fastway:jump")
else
player:set_physics_override({jump = 4})
end
else
if(ground_block.name~="air") then
if mod_player_monoids then
player_monoids.speed:del_change(player, "fastway:speed")
player_monoids.jump:del_change(player, "fastway:jump")
else
player:set_physics_override({speed = 1, jump = 1})
end
end
end
end
end
--jetpack
local inventory = player:get_inventory()
if inventory:contains_item("main", "fastway:jetpack")==true then
for i=1,inventory:get_size("main") do
local jetpack = inventory:get_stack("main", i)
if jetpack:get_name()=="fastway:jetpack" then
local meta = minetest.deserialize(jetpack:get_metadata())
if not meta or not meta.charge or meta.mode == nil then
break
end
if meta.mode ~= nil and meta.mode ~= "disable" then
if meta.mode == "enable" then
meta.charge = meta.charge - dtime*600
elseif meta.mode == "fast" then
meta.charge = meta.charge - dtime*3000
end
if meta.charge<=0 then
meta.charge=0
meta.enable=false
player_monoids.fly:del_change(player,"fastway:jetpack")
end
jetpack:set_metadata(minetest.serialize(meta))
technic.set_RE_wear(jetpack, meta.charge, 65535)
inventory:set_stack("main", i,jetpack)
end
break
end
end
end
--wayplacer
local ctrl = player:get_player_control()
local key_press
if dir then
key_press = ctrl.aux1 and ctrl.up and not ctrl.left and not ctrl.right
else
key_press = ctrl.aux1 and (ctrl.up or ctrl.left or ctrl.right or ctrl.down)
end
if not key_press then
return
end
local ground_pos = vector.round(player:get_pos())
local yaw = player:get_look_horizontal()
local testpos = vector.add(ground_pos, {x=0, y=-1, z=0})
--bug!
--[[
if(yaw>315 or yaw<45) then
testpos = vector.add(ground_pos, {x=0, y=-1, z=1})
end
if(yaw>135 and yaw<225) then
testpos = vector.add(ground_pos, {x=0, y=-1, z=-1})
end
if(yaw>225 and yaw<315) then
testpos = vector.add(ground_pos, {x=1, y=-1, z=0})
end
if(yaw>45 and yaw<135) then
testpos = vector.add(ground_pos, {x=-1, y=-1, z=0})
end
--]]
local testnode = minetest.get_node_or_nil(testpos)
if(testnode~=nil) then
if(testnode.name=="air") then
local inv=player:get_inventory()
if not inv:is_empty("main") and not inv:get_list("main")[1]:is_empty() and inv:get_list("main")[1]:get_definition() then
local placeblocks =inv:get_stack("main",1)
local done = pcall(
function()
minetest.place_node(testpos,{name=placeblocks:get_name()})
end
)
if done then
placeblocks:take_item()
inv:set_stack("main",1,placeblocks)
end
end
end
end
end
minetest.register_globalstep(function(dtime)
way_timer = way_timer + dtime
if way_timer >= way_timer_step then
for _, player in ipairs(minetest.get_connected_players()) do
way_step(player, way_timer)
end
way_timer = 0
end
end)
minetest.register_tool("fastway:parachute",{
description = S("parachute"),
inventory_image = "fastway_parachute.png",
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
local old = user:get_player_velocity()
user:add_player_velocity({x=0,y=(1-old.y),z=0})
itemstack:add_wear(2184)--65536/20(times)
return itemstack
end
})
minetest.register_craft({
recipe = {
{"wool:white", "wool:white", "wool:white"},
{"default:stick", "", "default:stick"},
{"", "technic:zinc_ingot", ""},
},
output = "fastway:parachute 3"
})
minetest.register_node("fastway:track",{
description = S("track"),
inventory_image = "fastway_track.png",
tiles = {"fastway_track.png", "fastway_track_side.png", "fastway_track_side.png", "fastway_track_side.png", "fastway_track_side.png", "fastway_track_side.png"},
groups = {crumbly = 3},
paramtype2 = "facedir",
is_ground_content = false
})
minetest.register_craft({
recipe = {
{"wool:red","technic:zinc_ingot", "wool:red"},
{"", "default:stone", ""},
{"", "wool:white", ""},
},
output = "fastway:track 3"
})
minetest.register_node("fastway:trampoline",{
description = S("trampoline"),
inventory_image = "fastway_trampoline.png",
tiles = {"fastway_trampoline.png", "fastway_trampoline_side.png", "fastway_trampoline_side.png", "fastway_trampoline_side.png", "fastway_trampoline_side.png", "fastway_trampoline_side.png"},
groups = {crumbly = 3}
})
minetest.register_craft({
recipe = {
{"basic_materials:chain_steel","", "basic_materials:chain_steel"},
{"wool:yellow", "wool:grey", "wool:yellow"},
{"default:stick", "technic:zinc_ingot", "default:stick"},
},
output = "fastway:trampoline 3"
})
technic.register_power_tool("fastway:jetpack", 65535)
minetest.register_tool("fastway:jetpack", {
description = S("jetpack"),
inventory_image = "fastway_jetpack.png",
stack_max = 1,
wear_represents = "technic_RE_charge",
on_refill = technic.refill_RE_charge,
on_use = function(itemstack, player, pointed_thing)
local meta = minetest.deserialize(itemstack:get_metadata())
if not meta then
return
end
if meta.mode == nil then
meta.mode = "disable"
end
if meta.mode=="disable" then
player_monoids.fly:add_change(player,true,"fastway:jetpack")
player_monoids.speed:del_change(player,"fastway:jetpack")
meta.mode = "enable"
elseif meta.mode=="enable" then
player_monoids.speed:add_change(player,3,"fastway:jetpack")
player_monoids.fly:add_change(player,true,"fastway:jetpack")
meta.mode = "fast"
elseif meta.mode=="fast" then
player_monoids.fly:del_change(player,"fastway:jetpack")
player_monoids.speed:del_change(player,"fastway:jetpack")
meta.mode = "disable"
end
minetest.chat_send_player(player:get_player_name(), meta.mode)
itemstack:set_metadata(minetest.serialize(meta))
return itemstack
end
})
minetest.register_craft({
recipe = {
{"technic:battery","default:obsidian", "technic:battery"},
{"dye:red", "default:obsidian", "dye:red"},
{"technic:rubber", "technic:diamond_drill_head", "technic:rubber"},
},
output = "fastway:jetpack"
})