balloon_bop/items.lua

188 lines
6.3 KiB
Lua

-- licensed as follows:
-- MIT License, ExeVirus (c) 2021, MisterE (c) 2022
--
-- Please see the LICENSE file for more details
local spawn_time = 10
local time = 0
local rand = PcgRandom(os.time())
local function add_points(self,pts)
-- minetest.chat_send_all(self._arenaid)
if self._arenaid then
if arena_lib.mods["balloon_bop"].arenas[self._arenaid].in_game == true then
local arena = arena_lib.mods["balloon_bop"].arenas[self._arenaid]
if self._player then
local score = arena.players[self._player].score
arena.players[self._player].score = score + tonumber(self._points)
-- show points particle
local pos = self.object:get_pos()
local o_texture = self._original_texture
minetest.add_particlespawner({
amount = 1,
time = .5,
minpos=vector.new(pos.x,pos.y+4,pos.z),
maxpos=vector.new(pos.x,pos.y+3.5,pos.z),
minvel=vector.new(0,1,0),
maxvel=vector.new(0,1,0),
minacc = vector.new(0,0,0),
maxacc = vector.new(0,0,0),
minexptime = 2,
maxexptime = 2,
minsize = 10,
maxsize = 13,
collisiondetection = false,
vertical = false,
texture="balloon_bop_point_screen_"..self._points..".png^[mask:"..o_texture .. "^[opacity:170",
playername = self._player,
})
end
end
end
end
-- Balloon
balloon_bop.spawn = function(arena)
local obj = minetest.add_entity(vector.new(
arena.balloon_spawner.x+rand:next(1,7)-arena.spawner_range,
arena.balloon_spawner.y,
arena.balloon_spawner.z+rand:next(1,7)-arena.spawner_range)
, "balloon_bop:balloon", minetest.write_json({
_arenaid = arena_lib.get_arena_by_name("balloon_bop", arena.name),
}))
minetest.sound_play("balloon", {
gain = 1.0, -- default
loop = false,
pos = arena.balloon_spawner,
})
end
local balloon = {
initial_properties = {
hp_max = 10,
visual = "mesh",
visual_size = {x=0.1,y=0.117,z=0.1},
-- glow = 10,
static_save = false,
mesh = "balloon.obj",
physical = true,
collide_with_objects = true,
collisionbox = {-0.6, -0.5, -0.6, 0.6, 0.5, 0.6},
textures = {"balloon_1.png"},
},
--Physics, and collisions
on_step = function(self, dtime, moveresult)
if self._arenaid then
if arena_lib.mods["balloon_bop"].arenas[self._arenaid].in_game == false then
self.object:remove()
return
end
end
if minetest.find_node_near(self.object:get_pos(), 1.5, {"balloon_bop:spike"}) then
-- pop balloon harmlessly
minetest.sound_play("balloon_pop", {
gain = 1.0, -- default
loop = false,
pos = self.object:get_pos()
})
-- balloon particles
local pos = self.object:get_pos()
local o_texture = self._original_texture
local vel = 10
minetest.add_particlespawner({
amount = 35,
time = .1,
minpos=vector.new(pos.x-1.1,pos.y-1.1,pos.z-1.1),
maxpos=vector.new(pos.x+1.1,pos.y+1.1,pos.z+1.1),
minvel=vector.new(-vel,-vel,-vel),
maxvel=vector.new(vel,vel,vel),
minacc = vector.new(0,0,0),
maxacc = vector.new(0,0,0),
minexptime = .05,
maxexptime = .05,
minsize = 10,
maxsize = 13,
collisiondetection = false,
vertical = false,
texture="balloon_bop_scrap.png".."^[mask:"..o_texture .. "^[opacity:170",
})
-- add points
add_points(self,25)
--remove balloon
self.object:remove()
return
end
if moveresult.touching_ground and not(moveresult.standing_on_object) then
self._touching_ground = true
else
--slow our x,z velocities
local vel = self.object:get_velocity()
if vel == nil then vel = {x=0,y=0,z=0} end
self.object:set_velocity({x=vel.x*0.97, y=vel.y*0.97, z=vel.z*0.97})
local rot = self.object:get_rotation()
self.object:set_rotation(vector.new(rot.x,rot.y+.04,rot.z))
end
end,
--Punch Physics
on_punch = function(self, puncher, _, _, dir)
self.object:set_velocity(dir*25)
minetest.sound_play("punch", {
gain = 1.0, -- default
loop = false,
pos = self.object:get_pos()
})
if not (puncher:is_player()) then return end
self._player = puncher:get_player_name()
end,
--Setup fallspeed
on_activate = function(self, staticdata, dtime_s)
math.randomseed = os.time()
local point_chance = math.random(1,3)
if point_chance == 1 then
self._points = "10"
elseif point_chance == 2 then
self._points = "15"
else
self._points = "20"
end
self.object:set_acceleration({x=0,y=-3.0,z=0})
local props = self.object:get_properties()
local text = "balloon_" .. rand:next(1,4) .. ".png"
self._original_texture = text
props.textures = {
text.."^(balloon_bop_point_screen_"..self._points..".png^[colorize:#302C2E:255)",
}
props.automatic_rotate = 40,
self.object:set_properties(props)
minetest.sound_play("balloon_inflate", {
gain = 1.0, -- default
loop = false,
pos = self.object:get_pos()
})
if staticdata ~= "" and staticdata ~= nil then
local data = minetest.parse_json(staticdata) or {}
if data._arenaid then
self._arenaid = data._arenaid
end
end
end,
_touching_ground = false,
_player = nil,
_points = nil,
}
minetest.register_entity("balloon_bop:balloon", balloon)