diff --git a/README.txt b/README.txt index 60f5d52..d860a23 100644 --- a/README.txt +++ b/README.txt @@ -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. diff --git a/init.lua b/init.lua index eb7ad8f..183eb73 100644 --- a/init.lua +++ b/init.lua @@ -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") diff --git a/textures/soccer_ball.png b/textures/soccer_ball_black.png similarity index 100% rename from textures/soccer_ball.png rename to textures/soccer_ball_black.png diff --git a/textures/soccer_ball_inv.png b/textures/soccer_ball_black_inv.png similarity index 100% rename from textures/soccer_ball_inv.png rename to textures/soccer_ball_black_inv.png diff --git a/textures/soccer_ball_blue.png b/textures/soccer_ball_blue.png new file mode 100644 index 0000000..0cca107 Binary files /dev/null and b/textures/soccer_ball_blue.png differ diff --git a/textures/soccer_ball_blue_inv.png b/textures/soccer_ball_blue_inv.png new file mode 100644 index 0000000..89e0213 Binary files /dev/null and b/textures/soccer_ball_blue_inv.png differ diff --git a/textures/soccer_ball_green.png b/textures/soccer_ball_green.png new file mode 100644 index 0000000..e2eefcc Binary files /dev/null and b/textures/soccer_ball_green.png differ diff --git a/textures/soccer_ball_green_inv.png b/textures/soccer_ball_green_inv.png new file mode 100644 index 0000000..f6068d8 Binary files /dev/null and b/textures/soccer_ball_green_inv.png differ diff --git a/textures/soccer_ball_purple.png b/textures/soccer_ball_purple.png new file mode 100644 index 0000000..6d834ec Binary files /dev/null and b/textures/soccer_ball_purple.png differ diff --git a/textures/soccer_ball_purple_inv.png b/textures/soccer_ball_purple_inv.png new file mode 100644 index 0000000..91f48ee Binary files /dev/null and b/textures/soccer_ball_purple_inv.png differ diff --git a/textures/soccer_ball_red.png b/textures/soccer_ball_red.png new file mode 100644 index 0000000..30d4a5f Binary files /dev/null and b/textures/soccer_ball_red.png differ diff --git a/textures/soccer_ball_red_inv.png b/textures/soccer_ball_red_inv.png new file mode 100644 index 0000000..48aff7a Binary files /dev/null and b/textures/soccer_ball_red_inv.png differ diff --git a/textures/soccer_ball_yellow.png b/textures/soccer_ball_yellow.png new file mode 100644 index 0000000..8f34080 Binary files /dev/null and b/textures/soccer_ball_yellow.png differ diff --git a/textures/soccer_ball_yellow_inv.png b/textures/soccer_ball_yellow_inv.png new file mode 100644 index 0000000..6171164 Binary files /dev/null and b/textures/soccer_ball_yellow_inv.png differ