188 lines
6.3 KiB
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)
|