Add multiple ball colors, and increased a bit ball maxspeed.

Idea and textures due to user Xiug. Thanks goes to him.
Also added contributors to the README.
This commit is contained in:
kaeza 2013-08-28 21:22:46 -03:00
parent 235fc35751
commit d1b2a6b268
14 changed files with 118 additions and 91 deletions

View File

@ -15,3 +15,10 @@ right-click. You can take it again by punching it.
You can push the ball by standing near it, and kick it by holding the "sneak"
key (by default "Shift"). The ball will get pushed/kicked in the direction the
player is facing (you can center-on the ball by looking up).
Special thanks
--------------
- 12Me21: Ideas about the crafting recipe.
- ecube: Original (black) texture.
- Xiug: Ideas and textures.

202
init.lua
View File

@ -1,91 +1,120 @@
local BALL_PUSH_CHECK_INTERVAL = 0.1
minetest.register_entity("soccer:ball", {
physical = true,
visual = "mesh",
mesh = "soccer_ball.x",
hp_max = 1000,
groups = { immortal = true },
textures = { "soccer_ball.png" },
collisionbox = { -0.2, -0.2, -0.2, 0.2, 0.2, 0.2 },
on_step = function(self, dtime)
self.timer = self.timer + dtime
if self.timer >= BALL_PUSH_CHECK_INTERVAL 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.80
if vel.y < 0 then vel.y = vel.y * -0.50 end
vel.z = vel.z * 0.80
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
local function reg_ball(color)
local ball_item_name = "soccer:ball_"..color.."_item"
local ball_ent_name = "soccer:ball_"..color.."_entity"
minetest.register_entity(ball_ent_name, {
physical = true,
visual = "mesh",
mesh = "soccer_ball.x",
hp_max = 1000,
groups = { immortal = true },
textures = { "soccer_ball_"..color..".png" },
collisionbox = { -0.2, -0.2, -0.2, 0.2, 0.2, 0.2 },
timer = 0,
on_step = function(self, dtime)
self.timer = self.timer + dtime
if self.timer >= BALL_PUSH_CHECK_INTERVAL 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
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
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
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("soccer:ball_item"))
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,
timer = 0,
})
end,
minetest.register_craftitem("soccer:ball_item", {
description = "Soccer Ball",
inventory_image = "soccer_ball_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, "soccer:ball")
ent:setvelocity({x=0, y=-4, z=0})
itemstack:take_item()
return itemstack
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 = "Soccer Ball ("..color..")",
inventory_image = "soccer_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 = {
{ "", "wool:white", "" },
{ "wool:white", "wool:"..color, "wool:white" },
{ "", "wool:white", "" },
},
})
end
colors = {
"black", "red", "green", "blue", "yellow", "purple",
}
for _,color in ipairs(colors) do
reg_ball(color)
end
minetest.register_node("soccer:goal", {
description = "Soccer Goal",
@ -147,13 +176,4 @@ reg_decal("line_d", "Diagonal Line")
reg_decal("line_point", "Point")
reg_decal("line_corner", "Corner")
minetest.register_craft({
output = "soccer:ball_item",
recipe = {
{ "", "wool:white", "" },
{ "wool:white", "default:coal_lump", "wool:white" },
{ "", "wool:white", "" },
},
})
minetest.register_alias("ball", "soccer:ball_item")
minetest.register_alias("ball", "soccer:ball_item_black")

View File

Before

Width:  |  Height:  |  Size: 180 B

After

Width:  |  Height:  |  Size: 180 B

View File

Before

Width:  |  Height:  |  Size: 193 B

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B