summer/pallone.lua
Vitaliy Olkhin 2e125601e8 init
2024-06-28 17:44:25 +05:00

132 lines
3.4 KiB
Lua

--pallone
local CALCIO = 0.1
local function reg_ball(color)
local ball_item_name = "summer:ball_"..color.."_item"
local ball_ent_name = "summer:ball_"..color.."_entity"
minetest.register_entity(ball_ent_name, {
physical = true,
visual = "mesh",
mesh = "ball.obj",
hp_max = 1000,
liquids_pointable = true,
groups = { immortal = true },
textures = { "ball_"..color..".png" },
collisionbox = { -0.2, -0.2, -0.2, 0.2, 0.2, 0.2 }, --{ -1, -1, -1, 1, 1, 1 },
timer = 0,
on_step = function(self, dtime)
self.timer = self.timer + dtime
if self.timer >= CALCIO then
self.object:setacceleration({x=0, y=-10, z=0})
self.timer = 0
local vel = self.object:getvelocity()
local p = self.object:getpos();
p.y = p.y - 0.5
if minetest.registered_nodes[minetest.env:get_node(p).name].walkable then
vel.x = vel.x * 0.85
if vel.y < 0 then vel.y = vel.y * -0.65 end
vel.z = vel.z * 0.90
end
if (math.abs(vel.x) < 0.1)
and (math.abs(vel.z) < 0.1) then
vel.x = 0
vel.z = 0
end
self.object:setvelocity(vel)
local pos = self.object:getpos()
local objs = minetest.env:get_objects_inside_radius(pos, 1)
local player_count = 0
local final_dir = { x=0, y=0, z=0 }
for _,obj in ipairs(objs) do
if obj:is_player() then
local objdir = obj:get_look_dir()
local mul = 1
if (obj:get_player_control().sneak) then
mul = 3
end
final_dir.x = final_dir.x + (objdir.x * mul)
final_dir.y = final_dir.y + (objdir.y * mul)
final_dir.z = final_dir.z + (objdir.z * mul)
player_count = player_count + 1
end
end
if final_dir.x ~= 0 or final_dir.y ~= 0 or final_dir.z ~= 0 then
final_dir.x = (final_dir.x * 5) / player_count
final_dir.y = (final_dir.y * 5) / player_count
final_dir.z = (final_dir.z * 5) / player_count
self.object:setvelocity(final_dir)
end
end
end,
on_punch = function(self, puncher)
if puncher and puncher:is_player() then
local inv = puncher:get_inventory()
inv:add_item("main", ItemStack(ball_item_name))
self.object:remove()
end
end,
is_moving = function(self)
local v = self.object:getvelocity()
if (math.abs(v.x) <= 0.1)
and (math.abs(v.z) <= 0.1) then
v.x = 0
v.z = 0
self.object:setvelocity(v)
return false
end
return true
end,
})
minetest.register_craftitem(ball_item_name,{
description = "Summer Ball ("..color..")",
inventory_image = "summer_ball_"..color.."_inv.png",
on_place = function(itemstack, placer, pointed_thing)
local pos = pointed_thing.above
--pos = { x=pos.x+0.5, y=pos.y, z=pos.z+0.5 }
local ent = minetest.env:add_entity(pos, ball_ent_name)
ent:setvelocity({x=0, y=-15, z=0})
itemstack:take_item()
return itemstack
end,
})
minetest.register_craft({
output = ball_item_name,
recipe = {
{ "default:paper", "group:leaves", "default:paper" },
{ "group:leaves", "wool:"..color, "group:leaves" },
{ "default:paper", "group:leaves", "default:paper" },
},
})
if minetest.get_modpath("cannabis") then
minetest.register_craft({
output = ball_item_name,
recipe = {
{ "", "cannabis:canapa_plastic", "" },
{ "cannabis:canapa_plastic", "wool:"..color, "cannabis:canapa_plastic" },
{ "", "cannabis:canapa_plastic", "" },
},
})
end
end
colors = {
"black", "red", "green", "blue", "yellow", "violet","orange"
}
for _,color in ipairs(colors) do
reg_ball(color)
end