Skip to content

Commit

Permalink
Add multiple ball colors, and increased a bit ball maxspeed.
Browse files Browse the repository at this point in the history
Idea and textures due to user Xiug. Thanks goes to him.
Also added contributors to the README.
  • Loading branch information
kaeza committed Aug 29, 2013
1 parent 235fc35 commit d1b2a6b
Show file tree
Hide file tree
Showing 14 changed files with 117 additions and 90 deletions.
7 changes: 7 additions & 0 deletions README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
200 changes: 110 additions & 90 deletions init.lua
Original file line number Diff line number Diff line change
@@ -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,

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
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,
})
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",
Expand Down Expand Up @@ -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")
File renamed without changes
File renamed without changes
Binary file added textures/soccer_ball_blue.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added textures/soccer_ball_blue_inv.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added textures/soccer_ball_green.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added textures/soccer_ball_green_inv.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added textures/soccer_ball_purple.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added textures/soccer_ball_purple_inv.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added textures/soccer_ball_red.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added textures/soccer_ball_red_inv.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added textures/soccer_ball_yellow.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added textures/soccer_ball_yellow_inv.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit d1b2a6b

Please sign in to comment.