portaltest/init.lua

120 lines
3.7 KiB
Lua

local modpath = minetest.get_modpath("portaltest")
local DEFAULT_GRAVITY = -9.8
-- Load separate files
dofile(modpath .. "/aerial_faith_plate.lua")
dofile(modpath .. "/config.lua")
dofile(modpath .. "/gun.lua")
dofile(modpath .. "/panels.lua")
dofile(modpath .. "/portal.lua")
-- Global callbacks
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname == "portaltest:afp_params_form" then
local cur_edited_afp_node_pos = minetest.deserialize(player:get_meta():get_string("cur_edited_afp_node_pos"))
if not cur_edited_afp_node_pos then
return
end
if fields.quit then
player:get_meta():set_string("cur_edited_afp_node_pos", "")
return true
end
if fields.save then
local params = {height = tonumber(fields.max_height), distance = tonumber(fields.max_distance)}
minetest.get_meta(cur_edited_afp_node_pos):set_string("params", minetest.serialize(params))
player:get_meta():set_string("cur_edited_afp_node_pos", "")
minetest.show_formspec(player:get_player_name(), formname, "")
return true
end
end
end)
minetest.register_globalstep(function(dtime)
for _, player in ipairs(minetest.get_connected_players()) do
local pos = player:get_pos()
local under_node = minetest.get_node(pos)
--minetest.debug("under_node: " .. under_node.name)
if under_node.name == "portaltest:aerial_faith_plate_idle" then
local node_dir = minetest.facedir_to_dir(under_node.param2)
local params = minetest.deserialize(minetest.get_meta(pos):get_string("params"))
if params and params.height and params.distance then
local gravity = DEFAULT_GRAVITY * player:get_physics_override().gravity
local v_y = math.sqrt(19.6 * params.height)
local v_z = 2 * -DEFAULT_GRAVITY * params.distance / v_y
local v = {x=0, y=v_y, z=v_z}
v = vector.rotate_around_axis(v, {x=0, y=1, z=0}, vector.dir_to_rotation(node_dir).y)
player:add_velocity(v)
minetest.swap_node(pos, {name = "portaltest:aerial_faith_plate_active", param2 = under_node.param2})
local timer = minetest.get_node_timer(pos)
timer:start(2)
end
end
local name = player:get_player_name()
if player:get_wielded_item():get_name() == "portaltest:gun_item" then
local gun_pos, gun_rot = gun.calculate_gun_pos_and_rot(player)
if not gun.spawned_guns[name] then
minetest.debug("add gun entity")
gun.spawned_guns[name] = minetest.add_entity(gun_pos, "portaltest:gun")
player_api.set_model(player, "portaltest_player_with_gun.b3d")
else
gun.spawned_guns[name]:set_pos(gun_pos)
end
gun.spawned_guns[name]:set_rotation(gun_rot)
local ctrls = player:get_player_control()
local anim
local speed = 30
local meta = player:get_meta()
if ctrls.up or ctrls.right then
anim = "walk_forward"
elseif ctrls.down or ctrls.left then
anim = "walk_backward"
elseif ctrls.LMB or ctrls.RMB then
if meta:get_string("is_shooting") == "" then
minetest.debug("\'is_shooting\' is empty!")
anim = "shoot"
speed = 10
local gun_color = ctrls.LMB and "blue" or "orange"
meta:set_string("is_shooting", "1")
minetest.debug("\'is_shooting\' is 1!")
gun.spawned_guns[name]:set_properties({textures={"portaltest_gun.png", "portaltest_gun_" .. gun_color .. "_tube.png"}})
gun.shoot(player, gun.spawned_guns[name], gun_color)
gun.knockback_gun(player, gun.spawned_guns[name])
end
elseif meta:get_string("is_shooting") == "" then
anim = "stand"
end
player_api.set_animation(player, anim, speed)
else
if gun.spawned_guns[name] then
minetest.debug("remove gun entity")
gun.spawned_guns[name]:remove()
gun.spawned_guns[name] = nil
player_api.set_model(player, "character.b3d")
end
end
end
end)