Tiny optimisations and luacheck fixesc

master^2
ROllerozxa 2022-08-29 22:32:48 +02:00
parent 49a7451781
commit 13a0a513d2
2 changed files with 103 additions and 116 deletions

211
api.lua
View File

@ -123,7 +123,7 @@ function vehicles.object_drive(entity, dtime, def)
local jump_speed = def.jump_speed or 5 local jump_speed = def.jump_speed or 5
local simple_vehicle = def.simple_vehicle or false local simple_vehicle = def.simple_vehicle or false
local is_watercraft = def.is_watercraft or false local is_watercraft = def.is_watercraft or false
local swims = def.swims or false --local swims = def.swims or false
local driving_sound = def.driving_sound or nil local driving_sound = def.driving_sound or nil
local sound_duration = def.sound_duration or 5 local sound_duration = def.sound_duration or 5
local extra_yaw = def.extra_yaw or 0 local extra_yaw = def.extra_yaw or 0
@ -149,7 +149,6 @@ function vehicles.object_drive(entity, dtime, def)
local vec_stop = {x=velo.x*decell,y=velo.y+1*-2,z=velo.z*decell} local vec_stop = {x=velo.x*decell,y=velo.y+1*-2,z=velo.z*decell}
local pos = entity.object:get_pos() local pos = entity.object:get_pos()
local node = minetest.get_node(pos).name local node = minetest.get_node(pos).name
local node_under = minetest.get_node({x=pos.x, y=pos.y+2, z=pos.z})
local accell = 1 local accell = 1
--lava explode --lava explode
@ -168,8 +167,11 @@ function vehicles.object_drive(entity, dtime, def)
return cache.water[node] return cache.water[node]
end end
entity.on_water = is_water(node) entity.on_water = is_water(node)
entity.in_water = is_water(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name)
or is_water(node_under.name) local function in_water()
return is_water(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name)
or is_water(minetest.get_node({x=pos.x, y=pos.y+2, z=pos.z}).name)
end
local function is_watercraft_and_in_water() local function is_watercraft_and_in_water()
entity.object:set_velocity({x=velo.x*0.9, y=math.min(2, velo.y+0.5), z=velo.z*0.9}) entity.object:set_velocity({x=velo.x*0.9, y=math.min(2, velo.y+0.5), z=velo.z*0.9})
@ -183,17 +185,17 @@ function vehicles.object_drive(entity, dtime, def)
if not entity.driver then if not entity.driver then
--apply water effects --apply water effects
if is_watercraft and entity.in_water then if is_watercraft and in_water() then
is_watercraft_and_in_water() is_watercraft_and_in_water()
elseif is_watercraft and not entity.on_water then elseif is_watercraft and not entity.on_water then
is_watercraft_and_not_on_water() is_watercraft_and_not_on_water()
elseif (entity.on_water or entity.in_water) and not is_watercraft then elseif entity.on_water and not is_watercraft then
not_watercraft_and_on_or_in_water() not_watercraft_and_on_or_in_water()
else else
--stop --stop
entity.object:set_velocity(vec_stop) entity.object:set_velocity(vec_stop)
--animation --animation
if moving_anim ~= nil and entity.moving and not hovering then if moving_anim ~= nil and entity.moving then
entity.object:set_animation(stand_anim, 20, 0) entity.object:set_animation(stand_anim, 20, 0)
entity.moving = false entity.moving = false
end end
@ -202,9 +204,7 @@ function vehicles.object_drive(entity, dtime, def)
--variables --variables
local ctrl = entity.driver:get_player_control() local ctrl = entity.driver:get_player_control()
local dir = entity.driver:get_look_dir() local dir = entity.driver:get_look_dir()
local vec_backward = {x=-dir.x*speed/4,y=velo.y+1*-2,z=-dir.z*speed/4}
local yaw = entity.driver:get_look_horizontal() local yaw = entity.driver:get_look_horizontal()
local creative_mode = creative and creative.is_enabled_for and creative.is_enabled_for(entity.driver:get_player_name())
--dummy variables --dummy variables
local vec_rise = {} local vec_rise = {}
@ -242,7 +242,7 @@ function vehicles.object_drive(entity, dtime, def)
end end
--death_node --death_node
if death_node ~= nil and node == death_node then if death_node and node == death_node then
if entity.driver then if entity.driver then
vehicles.object_detach(entity, entity.driver, {x=1, y=0, z=1}) vehicles.object_detach(entity, entity.driver, {x=1, y=0, z=1})
end end
@ -252,9 +252,8 @@ function vehicles.object_drive(entity, dtime, def)
end end
--place node --place node
if place_node ~= nil and node == "air" or if place_node and (node == "air" or node == "default:snow"
place_node ~= nil and node == "default:snow" or or minetest.get_item_group(node, "flora")) ~= 0 then
place_node ~= nil and minetest.get_item_group(node, "flora") ~= 0 then
if place_trigger == nil and math.random(1, place_chance) == 1 then if place_trigger == nil and math.random(1, place_chance) == 1 then
minetest.set_node(pos, {name=place_node}) minetest.set_node(pos, {name=place_node})
end end
@ -265,7 +264,7 @@ function vehicles.object_drive(entity, dtime, def)
end end
--destroy node --destroy node
if destroy_node ~= nil and node == destroy_node then if destroy_node and node == destroy_node then
minetest.dig_node(pos) minetest.dig_node(pos)
local item = minetest.get_node_drops(destroy_node) local item = minetest.get_node_drops(destroy_node)
if item[1] ~= nil then if item[1] ~= nil then
@ -276,38 +275,35 @@ function vehicles.object_drive(entity, dtime, def)
end end
end end
local turning_factor = 2 local turning_factor
--brakes --brakes
local braking = 0 local braking = 0
local timer2 = 0
if ctrl.jump and brakes then if ctrl.jump and brakes then
braking = 1 braking = 1
timer2 = timer2 + dtime*1
local velo3 = nil local velo3 = nil
if velo3 == nil then if velo3 == nil then
velo3 = velo velo3 = velo
end end
local effect_pos = {x=pos.x-dir.x*2, y=pos.y, z=pos.z-dir.z*2} local effect_pos = {x=pos.x-dir.x*2, y=pos.y, z=pos.z-dir.z*2}
minetest.add_particlespawner( minetest.add_particlespawner({
4, --amount amount = 4,
0.5, --time time = 0.5,
{x=effect_pos.x, y=effect_pos.y, z=effect_pos.z}, --minpos minpos = {x=effect_pos.x, y=effect_pos.y, z=effect_pos.z},
{x=effect_pos.x, y=effect_pos.y, z=effect_pos.z}, --maxpos maxpos = {x=effect_pos.x, y=effect_pos.y, z=effect_pos.z},
{x=0, y=0, z=0}, --minvel minvel = {x=0, y=0, z=0},
{x=-velo3.x, y=0.4, z=-velo3.z}, --maxvel maxvel = {x=-velo3.x, y=0.4, z=-velo3.z},
{x=-0,y=-0,z=-0}, --minacc minacc = {x=-0,y=-0,z=-0},
{x=0,y=0,z=0}, --maxacc maxacc = {x=0,y=0,z=0},
0.5, --minexptime minexptime = 0.5,
1, --maxexptime maxexptime = 1,
10, --minsize minsize = 10,
15, --maxsize maxsize = 15,
false, --collisiondetection collisiondetection = false,
braking_effect --texture texture = braking_effect
) })
turning_factor = handling.initial turning_factor = handling.initial
else else
timer2 = 0
turning_factor = handling.braking turning_factor = handling.braking
end end
@ -333,11 +329,11 @@ function vehicles.object_drive(entity, dtime, def)
end end
--apply water effects --apply water effects
if is_watercraft and entity.in_water then if is_watercraft and in_water() then
is_watercraft_and_in_water() is_watercraft_and_in_water()
elseif is_watercraft and not entity.on_water then elseif is_watercraft and not entity.on_water then
is_watercraft_and_not_on_water() is_watercraft_and_not_on_water()
elseif (entity.on_water or entity.in_water) and not is_watercraft then elseif entity.on_water and not is_watercraft then
not_watercraft_and_on_or_in_water() not_watercraft_and_on_or_in_water()
--brakes --brakes
@ -348,22 +344,23 @@ function vehicles.object_drive(entity, dtime, def)
end end
local effect_pos = {x=pos.x-dir.x*2, y=pos.y, z=pos.z-dir.z*2} local effect_pos = {x=pos.x-dir.x*2, y=pos.y, z=pos.z-dir.z*2}
entity.object:set_velocity({x=velo2.x*(0.95), y=velo.y, z=velo2.z*(0.95)}) entity.object:set_velocity({x=velo2.x*(0.95), y=velo.y, z=velo2.z*(0.95)})
minetest.add_particlespawner( minetest.add_particlespawner({
4, --amount amount = 4,
0.5, --time time = 0.5,
{x=effect_pos.x, y=effect_pos.y, z=effect_pos.z}, --minpos minpos = {x=effect_pos.x, y=effect_pos.y, z=effect_pos.z},
{x=effect_pos.x, y=effect_pos.y, z=effect_pos.z}, --maxpos maxpos = {x=effect_pos.x, y=effect_pos.y, z=effect_pos.z},
{x=0, y=0.1, z=0}, --minvel minvel = {x=0, y=0.1, z=0},
{x=-velo2.x, y=0.4, z=-velo2.z}, --maxvel maxvel = {x=-velo2.x, y=0.4, z=-velo2.z},
{x=-0,y=-0,z=-0}, --minacc minacc = {x=-0,y=-0,z=-0},
{x=0,y=0,z=0}, --maxacc maxacc = {x=0,y=0,z=0},
0.5, --minexptime minexptime = 0.5,
1, --maxexptime maxexptime = 1,
10, --minsize minsize = 10,
15, --maxsize maxsize = 15,
false, --collisiondetection collisiondetection = false,
braking_effect --texture texture = braking_effect
) })
if vtimer >= 0.5 then if vtimer >= 0.5 then
vtimer = vtimer-vtimer/10 vtimer = vtimer-vtimer/10
end end
@ -376,29 +373,29 @@ function vehicles.object_drive(entity, dtime, def)
z=dir.z*(speed*0.2)*math.log(vtimer+0.5)+8*dir.z}) z=dir.z*(speed*0.2)*math.log(vtimer+0.5)+8*dir.z})
if boost_effect ~= nil then if boost_effect ~= nil then
local effect_pos = {x=pos.x-dir.x*2, y=pos.y, z=pos.z-dir.z*2} local effect_pos = {x=pos.x-dir.x*2, y=pos.y, z=pos.z-dir.z*2}
minetest.add_particlespawner( minetest.add_particlespawner({
10, --amount amount = 10,
0.25, --time time = 0.25,
{x=effect_pos.x, y=effect_pos.y+0.2, z=effect_pos.z}, --minpos minpos = {x=effect_pos.x, y=effect_pos.y+0.2, z=effect_pos.z},
{x=effect_pos.x, y=effect_pos.y+0.2, z=effect_pos.z}, --maxpos maxpos = {x=effect_pos.x, y=effect_pos.y+0.2, z=effect_pos.z},
{x=-velo.x, y=-velo.y, z=-velo.z}, --minvel mixvel = {x=-velo.x, y=-velo.y, z=-velo.z},
{x=-velo.x, y=-velo.y, z=-velo.z}, --maxvel maxvel = {x=-velo.x, y=-velo.y, z=-velo.z},
{x=-0,y=-0,z=-0}, --minacc minacc = {x=-0,y=-0,z=-0},
{x=0,y=1,z=0}, --maxacc maxacc = {x=0,y=1,z=0},
0.02, --minexptime minexptime = 0.02,
0.02, --maxexptime maxexptime = 0.02,
20, --minsize minsize = 20,
20, --maxsize maxsize = 20,
false, --collisiondetection collisiondetection = false,
boost_effect --texture texture = boost_effect
) })
end end
minetest.after(boost_duration, function() minetest.after(boost_duration, function()
entity.boost = false entity.boost = false
end) end)
--animation --animation
if moving_anim ~= nil and not entity.moving and not hovering then if moving_anim ~= nil and not entity.moving and not hovering then
entity.object:set_animation(move_anim, anim_speed, 0) entity.object:set_animation(moving_anim, anim_speed, 0)
entity.moving = true entity.moving = true
end end
--rise --rise
@ -445,22 +442,22 @@ function vehicles.object_drive(entity, dtime, def)
end end
local effect_pos = {x=pos.x-dir.x*2, y=pos.y, z=pos.z-dir.z*2} local effect_pos = {x=pos.x-dir.x*2, y=pos.y, z=pos.z-dir.z*2}
entity.object:set_velocity({x=velo2.x*(0.95), y=velo.y, z=velo2.z*(0.95)}) entity.object:set_velocity({x=velo2.x*(0.95), y=velo.y, z=velo2.z*(0.95)})
minetest.add_particlespawner( minetest.add_particlespawner({
4, --amount amount = 4,
0.5, --time time = 0.5,
{x=effect_pos.x, y=effect_pos.y, z=effect_pos.z}, --minpos minpos = {x=effect_pos.x, y=effect_pos.y, z=effect_pos.z},
{x=effect_pos.x, y=effect_pos.y, z=effect_pos.z}, --maxpos maxpos = {x=effect_pos.x, y=effect_pos.y, z=effect_pos.z},
{x=0, y=0.1, z=0}, --minvel minvel = {x=0, y=0.1, z=0},
{x=-velo2.x, y=0.4, z=-velo2.z}, --maxvel maxvel = {x=-velo2.x, y=0.4, z=-velo2.z},
{x=-0,y=-0,z=-0}, --minacc minacc = {x=-0,y=-0,z=-0},
{x=0,y=0,z=0}, --maxacc maxacc = {x=0,y=0,z=0},
0.5, --minexptime minexptime = 0.5,
1, --maxexptime maxexptime = 1,
10, --minsize minsize = 10,
15, --maxsize maxsize = 15,
false, --collisiondetection collisiondetection = false,
braking_effect --texture texture = braking_effect
) })
if vtimer >= 0.5 then if vtimer >= 0.5 then
vtimer = vtimer-vtimer/10 vtimer = vtimer-vtimer/10
end end
@ -478,22 +475,22 @@ function vehicles.object_drive(entity, dtime, def)
end end
local effect_pos = {x=pos.x-dir.x*2, y=pos.y, z=pos.z-dir.z*2} local effect_pos = {x=pos.x-dir.x*2, y=pos.y, z=pos.z-dir.z*2}
entity.object:set_velocity({x=velo2.x*(0.95), y=velo.y, z=velo2.z*(0.95)}) entity.object:set_velocity({x=velo2.x*(0.95), y=velo.y, z=velo2.z*(0.95)})
minetest.add_particlespawner( minetest.add_particlespawner({
4, --amount amount = 4,
0.5, --time time = 0.5,
{x=effect_pos.x, y=effect_pos.y, z=effect_pos.z}, --minpos minpos = {x=effect_pos.x, y=effect_pos.y, z=effect_pos.z},
{x=effect_pos.x, y=effect_pos.y, z=effect_pos.z}, --maxpos maxpos = {x=effect_pos.x, y=effect_pos.y, z=effect_pos.z},
{x=0, y=0.1, z=0}, --minvel minvel = {x=0, y=0.1, z=0},
{x=-velo2.x, y=0.4, z=-velo2.z}, --maxvel maxvel = {x=-velo2.x, y=0.4, z=-velo2.z},
{x=-0,y=-0,z=-0}, --minacc minacc = {x=-0,y=-0,z=-0},
{x=0,y=0,z=0}, --maxacc maxacc = {x=0,y=0,z=0},
0.5, --minexptime minexptime = 0.5,
1, --maxexptime maxexptime = 1,
10, --minsize minsize = 10,
15, --maxsize maxsize = 15,
false, --collisiondetection collisiondetection = false,
braking_effect --texture texture = braking_effect
) })
if vtimer >= 0.5 then if vtimer >= 0.5 then
vtimer = vtimer-vtimer/10 vtimer = vtimer-vtimer/10
end end
@ -518,7 +515,7 @@ function vehicles.object_drive(entity, dtime, def)
--shoot weapons --shoot weapons
if ctrl.sneak and shoots and entity.loaded then if ctrl.sneak and shoots and entity.loaded then
if inv:contains_item("main", arrow.."_item") or infinite_arrow then if inv:contains_item("main", arrow.."_item") or infinite_arrow then
if not creative_mode then inv:remove_item("main", arrow.."_item") end if not minetest.is_creative_enabled(entity.driver:get_player_name()) then inv:remove_item("main", arrow.."_item") end
entity.loaded = false entity.loaded = false
local obj = minetest.add_entity({x=pos.x+0+dir.x*2,y=pos.y+shoot_y+dir.y,z=pos.z+0+dir.z*2}, arrow) local obj = minetest.add_entity({x=pos.x+0+dir.x*2,y=pos.y+shoot_y+dir.y,z=pos.z+0+dir.z*2}, arrow)
local vec = {x=dir.x*14,y=dir.y*14+shoot_angle,z=dir.z*14} local vec = {x=dir.x*14,y=dir.y*14+shoot_angle,z=dir.z*14}
@ -542,7 +539,7 @@ function vehicles.object_drive(entity, dtime, def)
if ctrl.aux1 and shoots2 and entity.loaded2 then if ctrl.aux1 and shoots2 and entity.loaded2 then
if inv:contains_item("main", arrow2.."_item") or infinite_arrow2 then if inv:contains_item("main", arrow2.."_item") or infinite_arrow2 then
if not creative_mode then inv:remove_item("main", arrow2.."_item") end if not minetest.is_creative_enabled(entity.driver:get_player_name()) then inv:remove_item("main", arrow2.."_item") end
entity.loaded2 = false entity.loaded2 = false
local obj = minetest.add_entity({x=pos.x+0+dir.x*2,y=pos.y+shoot_y2+dir.y,z=pos.z+0+dir.z*2}, arrow2) local obj = minetest.add_entity({x=pos.x+0+dir.x*2,y=pos.y+shoot_y2+dir.y,z=pos.z+0+dir.z*2}, arrow2)
local vec = {x=dir.x*20,y=dir.y*20+shoot_angle,z=dir.z*20} local vec = {x=dir.x*20,y=dir.y*20+shoot_angle,z=dir.z*20}
@ -661,10 +658,8 @@ function vehicles.object_glide(self, dtime, speed, decell, gravity, moving_anim,
for dy=-1,1 do for dy=-1,1 do
for dz=-1,1 do for dz=-1,1 do
local p = {x=pos.x+dx, y=pos.y-1, z=pos.z+dz} local p = {x=pos.x+dx, y=pos.y-1, z=pos.z+dz}
local t = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
local n = minetest.get_node(p).name local n = minetest.get_node(p).name
if n ~= "massdestruct:parachute" and n ~= "air" then if n ~= "massdestruct:parachute" and n ~= "air" then
local pos = self.object:get_pos()
self.object:remove() self.object:remove()
return return
end end
@ -681,9 +676,7 @@ function vehicles.register_spawner(vehicle, desc, texture, is_boat)
liquids_pointable = is_boat, liquids_pointable = is_boat,
wield_scale = {x = 1.5, y = 1.5, z = 1}, wield_scale = {x = 1.5, y = 1.5, z = 1},
on_place = function(item, placer, pointed_thing) on_place = function(item, placer, pointed_thing)
local dir = placer:get_look_dir() local creative_mode = minetest.is_creative_enabled(placer:get_player_name())
local playerpos = placer:get_pos()
local creative_mode = creative and creative.is_enabled_for and creative.is_enabled_for(placer:get_player_name())
if pointed_thing.type == "node" and not is_boat then if pointed_thing.type == "node" and not is_boat then
local obj = minetest.add_entity(pointed_thing.above, vehicle) local obj = minetest.add_entity(pointed_thing.above, vehicle)
local object = obj:get_luaentity() local object = obj:get_luaentity()
@ -753,7 +746,7 @@ function vehicles.on_punch(self, puncher)
vehicles.explodinate(self, 5) vehicles.explodinate(self, 5)
end end
if not self.driver then return end if not self.driver then return end
local creative_mode = creative and creative.is_enabled_for and creative.is_enabled_for(self.driver:get_player_name()) local creative_mode = minetest.is_creative_enabled(self.driver:get_player_name())
if self.driver == puncher and (hp == self.hp_max-5 or hp == self.hp_max or creative_mode) then if self.driver == puncher and (hp == self.hp_max-5 or hp == self.hp_max or creative_mode) then
local name = self.object:get_luaentity().name local name = self.object:get_luaentity().name
local pos = self.object:get_pos() local pos = self.object:get_pos()

View File

@ -38,7 +38,6 @@ local function missile_bullet_hit_check(self, obj, pos)
for dy=-1,1 do for dy=-1,1 do
for dz=-1,1 do for dz=-1,1 do
local p = {x=pos.x+dx, y=pos.y, z=pos.z+dz} local p = {x=pos.x+dx, y=pos.y, z=pos.z+dz}
local t = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
local n = minetest.env:get_node(p) local n = minetest.env:get_node(p)
if n.name ~= "air" and n.drawtype ~= "airlike" then if n.name ~= "air" and n.drawtype ~= "airlike" then
return {} return {}
@ -193,7 +192,6 @@ minetest.register_entity("vehicles:bullet", {
damage = 2, damage = 2,
collisionbox = {0, 0, 0, 0, 0, 0}, collisionbox = {0, 0, 0, 0, 0, 0},
on_activate = function(self) on_activate = function(self)
local pos = self.object:get_pos()
minetest.sound_play("shot", minetest.sound_play("shot",
{gain = 0.4, max_hear_distance = 3, loop = false}) {gain = 0.4, max_hear_distance = 3, loop = false})
end, end,
@ -1706,7 +1704,6 @@ minetest.register_tool("vehicles:backpack", {
on_use = function(item, placer, pointed_thing) on_use = function(item, placer, pointed_thing)
local dir = placer:get_look_dir() local dir = placer:get_look_dir()
local playerpos = placer:get_pos() local playerpos = placer:get_pos()
local pname = placer:get_player_name()
local obj = minetest.env:add_entity({x=playerpos.x+0+dir.x,y=playerpos.y+1+dir.y,z=playerpos.z+0+dir.z}, "vehicles:parachute") local obj = minetest.env:add_entity({x=playerpos.x+0+dir.x,y=playerpos.y+1+dir.y,z=playerpos.z+0+dir.z}, "vehicles:parachute")
local entity = obj:get_luaentity() local entity = obj:get_luaentity()
if obj.driver and placer == obj.driver then if obj.driver and placer == obj.driver then
@ -1735,8 +1732,6 @@ minetest.register_entity("vehicles:wing_glider", {
on_step = function(self, dtime) on_step = function(self, dtime)
if self.driver then if self.driver then
local dir = self.driver:get_look_dir() local dir = self.driver:get_look_dir()
local velo = self.object:get_velocity()
local speed = math.sqrt(math.pow(velo.x, 2)+math.pow(velo.z, 2))
local vec = {x=dir.x*16,y=dir.y*16+1,z=dir.z*16} local vec = {x=dir.x*16,y=dir.y*16+1,z=dir.z*16}
local yaw = self.driver:get_look_horizontal() local yaw = self.driver:get_look_horizontal()
self.object:set_yaw(yaw+math.pi) self.object:set_yaw(yaw+math.pi)
@ -1803,7 +1798,6 @@ minetest.register_tool("vehicles:wings", {
local entity = obj:get_luaentity() local entity = obj:get_luaentity()
placer:set_attach(entity.object, "", {x=0,y=-5,z=0}, {x=0,y=-3,z=0}) placer:set_attach(entity.object, "", {x=0,y=-5,z=0}, {x=0,y=-3,z=0})
entity.driver = placer entity.driver = placer
local dir = placer:get_look_dir()
placer:set_properties({ placer:set_properties({
visual_size = {x=1, y=-1}, visual_size = {x=1, y=-1},
}) })
@ -1831,7 +1825,7 @@ minetest.register_tool("vehicles:rc", {
local pname = placer:get_player_name() local pname = placer:get_player_name()
local inv = minetest.get_inventory({type="player", name=pname}) local inv = minetest.get_inventory({type="player", name=pname})
if inv:contains_item("main", "vehicles:missile_2_item") then if inv:contains_item("main", "vehicles:missile_2_item") then
local creative_mode = creative and creative.is_enabled_for and creative.is_enabled_for(placer:get_player_name()) local creative_mode = minetest.is_creative_enabled(placer:get_player_name())
if not creative_mode then inv:remove_item("main", "vehicles:missile_2_item") end if not creative_mode then inv:remove_item("main", "vehicles:missile_2_item") end
local obj = minetest.env:add_entity({x=playerpos.x+0+dir.x,y=playerpos.y+1+dir.y,z=playerpos.z+0+dir.z}, "vehicles:missile") local obj = minetest.env:add_entity({x=playerpos.x+0+dir.x,y=playerpos.y+1+dir.y,z=playerpos.z+0+dir.z}, "vehicles:missile")
local object = obj:get_luaentity() local object = obj:get_luaentity()