From 2fdcd61b95059ae885914909e097bda73cb83c9c Mon Sep 17 00:00:00 2001 From: HybridDog Date: Sun, 13 Dec 2015 15:59:15 +0100 Subject: [PATCH] dm shoot sound --- api.lua | 119 ++++++++++++++++++++++++++++++++------------- init.lua | 14 +++--- sounds/mobs_dm.ogg | Bin 0 -> 17052 bytes 3 files changed, 93 insertions(+), 40 deletions(-) create mode 100644 sounds/mobs_dm.ogg diff --git a/api.lua b/api.lua index 71b55e5..5636178 100644 --- a/api.lua +++ b/api.lua @@ -29,7 +29,7 @@ function mobs:register_mob(name, def) animation = def.animation, follow = def.follow, jump = def.jump or true, - + timer = 0, env_damage_timer = 0, -- only if state = "attack" attack = {player=nil, dist=nil}, @@ -38,7 +38,7 @@ function mobs:register_mob(name, def) old_y = nil, lifetimer = 600, tamed = false, - + set_velocity = function(self, v) local yaw = self.object:getyaw() if self.drawtype == "side" then @@ -48,12 +48,12 @@ function mobs:register_mob(name, def) local z = math.cos(yaw) * v self.object:setvelocity({x=x, y=self.object:getvelocity().y, z=z}) end, - + get_velocity = function(self) local v = self.object:getvelocity() return (v.x^2 + v.z^2)^(0.5) end, - + set_animation = function(self, type) if not self.animation then return @@ -111,12 +111,12 @@ function mobs:register_mob(name, def) end end end, - + on_step = function(self, dtime) if self.type == "monster" and minetest.setting_getbool("only_peaceful_mobs") then self.object:remove() end - + self.lifetimer = self.lifetimer - dtime if self.lifetimer <= 0 and not self.tamed then local player_count = 0 @@ -130,7 +130,7 @@ function mobs:register_mob(name, def) return end end - + if self.object:getvelocity().y > 0.1 then local yaw = self.object:getyaw() if self.drawtype == "side" then @@ -142,7 +142,7 @@ function mobs:register_mob(name, def) else self.object:setacceleration({x=0, y=-10, z=0}) end - + if self.disable_fall_damage and self.object:getvelocity().y == 0 then if not self.old_y then self.old_y = self.object:getpos().y @@ -158,7 +158,7 @@ function mobs:register_mob(name, def) self.old_y = self.object:getpos().y end end - + self.timer = self.timer+dtime if self.state ~= "attack" then if self.timer < 1 then @@ -166,15 +166,15 @@ function mobs:register_mob(name, def) end self.timer = 0 end - + if self.sounds and self.sounds.random and math.random(1, 100) <= 1 then minetest.sound_play(self.sounds.random, {object = self.object}) end - + local do_env_damage = function(self) local pos = self.object:getpos() local n = minetest.env:get_node(pos) - + if self.light_damage and self.light_damage ~= 0 and pos.y>0 and minetest.env:get_node_light(pos) @@ -187,7 +187,7 @@ function mobs:register_mob(name, def) self.object:remove() end end - + if self.water_damage and self.water_damage ~= 0 and minetest.get_item_group(n.name, "water") ~= 0 then @@ -196,7 +196,7 @@ function mobs:register_mob(name, def) self.object:remove() end end - + if self.lava_damage and self.lava_damage ~= 0 and minetest.get_item_group(n.name, "lava") ~= 0 then @@ -206,7 +206,7 @@ function mobs:register_mob(name, def) end end end - + self.env_damage_timer = self.env_damage_timer + dtime if self.state == "attack" and self.env_damage_timer > 1 then self.env_damage_timer = 0 @@ -214,7 +214,7 @@ function mobs:register_mob(name, def) elseif self.state ~= "attack" then do_env_damage(self) end - + if self.type == "monster" and minetest.setting_getbool("enable_damage") then for _,player in pairs(minetest.get_connected_players()) do local s = self.object:getpos() @@ -235,7 +235,7 @@ function mobs:register_mob(name, def) end end end - + if self.follow ~= "" and not self.following then for _,player in pairs(minetest.get_connected_players()) do local s = self.object:getpos() @@ -246,7 +246,7 @@ function mobs:register_mob(name, def) end end end - + if self.following and self.following:is_player() then if self.following:get_wielded_item():get_name() ~= self.follow then self.following = nil @@ -290,7 +290,7 @@ function mobs:register_mob(name, def) end end end - + if self.state == "stand" then if math.random(1, 4) == 1 then self.object:setyaw(self.object:getyaw()+((math.random(0,360)-180)/180*math.pi)) @@ -337,7 +337,7 @@ function mobs:register_mob(name, def) else self.attack.dist = dist end - + local vec = {x=p.x-s.x, y=p.y-s.y, z=p.z-s.z} local yaw = math.atan(vec.z/vec.x)+math.pi/2 if self.drawtype == "side" then @@ -394,7 +394,7 @@ function mobs:register_mob(name, def) else self.attack.dist = dist end - + local vec = {x=p.x-s.x, y=p.y-s.y, z=p.z-s.z} local yaw = math.atan(vec.z/vec.x)+math.pi/2 if self.drawtype == "side" then @@ -405,16 +405,16 @@ function mobs:register_mob(name, def) end self.object:setyaw(yaw) self.set_velocity(self, 0) - + if self.timer > self.shoot_interval and math.random(1, 100) <= 60 then self.timer = 0 - + self:set_animation("punch") - + if self.sounds and self.sounds.attack then minetest.sound_play(self.sounds.attack, {object = self.object}) end - + local p = self.object:getpos() p.y = p.y + (self.collisionbox[2]+self.collisionbox[5])/2 local obj = minetest.env:add_entity(p, self.arrow) @@ -428,7 +428,7 @@ function mobs:register_mob(name, def) end end end, - + on_activate = function(self, staticdata, dtime_s) self.object:set_armor_groups({fleshy=self.armor}) self.object:setacceleration({x=0, y=-10, z=0}) @@ -452,7 +452,7 @@ function mobs:register_mob(name, def) self.object:remove() end end, - + get_staticdata = function(self) local tmp = { lifetimer = self.lifetimer, @@ -460,7 +460,7 @@ function mobs:register_mob(name, def) } return minetest.serialize(tmp) end, - + on_punch = function(self, hitter) if self.object:get_hp() <= 0 then if hitter and hitter:is_player() and hitter:get_inventory() then @@ -472,7 +472,7 @@ function mobs:register_mob(name, def) end end end, - + }) end @@ -514,7 +514,7 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_o if spawn_func and not spawn_func(pos, node) then return end - + if minetest.setting_getbool("display_mob_spawn") then minetest.chat_send_all("[mobs] Add "..name.." at "..minetest.pos_to_string(pos)) end @@ -532,10 +532,56 @@ function mobs:register_arrow(name, def) velocity = def.velocity, hit_player = def.hit_player, hit_node = def.hit_node, - + + count = 0, + sounds = {}, + on_step = function(self, dtime) + self.object:set_properties({textures = {"mobs_fireball.png^[transform"..math.random(0,7)}}) + local vel = self.object:getvelocity() + local quiet = vector.equals(vel, {x=0,y=0,z=0}) + if quiet + and (not self.vel or vector.equals(self.vel, {x=0,y=0,z=0})) then + for _,i in pairs(self.sounds) do + minetest.sound_stop(i) + end + self.object:remove() + return + end + if not self.vel then + self.vel = vel + self.object:setvelocity({x=0,y=0,z=0}) + local newp = vector.normalize({x=vel.x, y=0, z=vel.z}) + self.object:setpos(vector.add(self.object:getpos(), newp)) + for _,i in pairs(self.sounds) do + minetest.sound_stop(i) + end + end local pos = self.object:getpos() - if minetest.env:get_node(self.object:getpos()).name ~= "air" then + if quiet then + local count = self.count + if count >= 60 then + minetest.sound_play("mobs_fireball", {pos = pos}) + for _,i in pairs(self.sounds) do + minetest.sound_stop(i) + end + self.object:setvelocity(self.vel) + return + end + count = count+1 + self.sounds[count] = minetest.sound_play("mobs_dm", { + pos = pos, + gain = count/50, + loop = true + }) + self.count = count + return + end + for _,i in pairs(self.sounds) do + minetest.sound_stop(i) + end + + if minetest.env:get_node(pos).name ~= "air" then self.hit_node(self, pos, node) self.object:remove() return @@ -548,6 +594,13 @@ function mobs:register_arrow(name, def) return end end - end + end, + + on_serialize = function(self) + self.object:remove() + for _,i in pairs(self.sounds) do + minetest.sound_stop(i) + end + end, }) end diff --git a/init.lua b/init.lua index 0bf5f26..bb62e1d 100644 --- a/init.lua +++ b/init.lua @@ -201,7 +201,7 @@ mobs:register_mob("mobs:sheep", { }, follow = "farming:wheat", view_range = 5, - + on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() if item:get_name() == "farming:wheat" then @@ -275,7 +275,7 @@ mobs:register_mob("mobs:rat", { water_damage = 0, lava_damage = 1, light_damage = 0, - + on_rightclick = function(self, clicker) if clicker:is_player() and clicker:get_inventory() then clicker:get_inventory():add_item("main", "mobs:rat") @@ -288,7 +288,7 @@ mobs:register_spawn("mobs:rat", {"default:dirt_with_grass", "default:stone"}, 20 minetest.register_craftitem("mobs:rat", { description = "Rat", inventory_image = "mobs_rat_inventory.png", - + on_place = function(itemstack, placer, pointed_thing) if pointed_thing.above then minetest.env:add_entity(pointed_thing.above, "mobs:rat") @@ -297,11 +297,11 @@ minetest.register_craftitem("mobs:rat", { return itemstack end, }) - + minetest.register_craftitem("mobs:rat_cooked", { description = "Cooked Rat", inventory_image = "mobs_cooked_rat.png", - + on_use = minetest.item_eat(3), }) @@ -376,9 +376,9 @@ mobs:register_mob("mobs:dungeon_master", { attack_type = "shoot", arrow = "mobs:fireball", shoot_interval = 2.5, - sounds = { + --[[sounds = { attack = "mobs_fireball", - }, + },--]] animation = { stand_start = 0, stand_end = 19, diff --git a/sounds/mobs_dm.ogg b/sounds/mobs_dm.ogg new file mode 100644 index 0000000000000000000000000000000000000000..385ff75806f406f3155e57ac836551fd01538f06 GIT binary patch literal 17052 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

nu2qYv4(L>T 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 literal 0 HcmV?d00001