aboutsummaryrefslogtreecommitdiff
path: root/src/script/lua_api/l_sound.cpp
blob: b86eda53e6016f71372010bc4e51d3dd0e70b344 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
Minetest
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#include "l_sound.h"
#include "l_internal.h"
#include "common/c_content.h"
#include "gui/guiEngine.h"


int ModApiSound::l_sound_play(lua_State *L)
{
	SimpleSoundSpec spec;
	read_soundspec(L, 1, spec);
	bool looped = readParam<bool>(L, 2);

	s32 handle = getGuiEngine(L)->playSound(spec, looped);

	lua_pushinteger(L, handle);

	return 1;
}

int ModApiSound::l_sound_stop(lua_State *L)
{
	u32 handle = luaL_checkinteger(L, 1);

	getGuiEngine(L)->stopSound(handle);

	return 1;
}

void ModApiSound::Initialize(lua_State *L, int top)
{
	API_FCT(sound_play);
	API_FCT(sound_stop);
}
pan>, 0.5,0.5,0.5}, visual_size = {x=1, y=1}, initial_sprite_basepos = {x=0, y=0}, is_discouple=true, on_activate=function(self, staticdata) if staticdata=="DISCOUPLE" then --couple entities have no right to exist further... self.object:remove() return end self.object:set_armor_groups({immortal=1}) end, get_staticdata=function() return "DISCOUPLE" end, on_punch=function(self, player) --only if player owns at least one wagon next to this local own=player:get_player_name() if self.wagon.owner and self.wagon.owner==own then local train=advtrains.trains[self.wagon.train_id] local nextwgn_id=train.trainparts[self.wagon.pos_in_trainparts-1] for aoi, le in pairs(minetest.luaentities) do if le and le.is_wagon then if le.unique_id==nextwgn_id then if le.owner and le.owner~=own then minetest.chat_send_player(own, "You need to own at least one neighboring wagon to destroy this couple.") return end end end end advtrains.split_train_at_wagon(self.wagon)--found in trainlogic.lua self.object:remove() else minetest.chat_send_player(own, "You need to own at least one neighboring wagon to destroy this couple.") end end, on_step=function(self, dtime) local t=os.clock() if not self.wagon then self.object:remove() return end --getyaw seems to be a reliable method to check if an object is loaded...if it returns nil, it is not. if not self.wagon.object:getyaw() then self.object:remove() return end local velocityvec=self.wagon.object:getvelocity() self.updatepct_timer=(self.updatepct_timer or 0)-dtime if not self.old_velocity_vector or not vector.equals(velocityvec, self.old_velocity_vector) or self.updatepct_timer<=0 then--only send update packet if something changed local flipsign=self.wagon.wagon_flipped and -1 or 1 self.object:setpos(vector.add(self.wagon.object:getpos(), {y=0, x=-math.sin(self.wagon.object:getyaw())*self.wagon.wagon_span*flipsign, z=math.cos(self.wagon.object:getyaw())*self.wagon.wagon_span*flipsign})) self.object:setvelocity(velocityvec) self.updatepct_timer=2 end atprintbm("discouple_step", t) end, }) --advtrains:couple --when two trains overlap with their end-positions, this entity will be spawned and both trains set its id into appropiate fields for them to know when to free them again. The entity will destroy automatically when it recognizes that any of the trains left the common position. --[[fields train_id_1 train_id_2 train1_is_backpos train2_is_backpos ]] minetest.register_entity("advtrains:couple", { visual="sprite", textures = {"advtrains_couple.png"}, collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, visual_size = {x=1, y=1}, initial_sprite_basepos = {x=0, y=0}, is_couple=true, on_activate=function(self, staticdata) if staticdata=="COUPLE" then --couple entities have no right to exist further... self.object:remove() return end end, get_staticdata=function(self) return "COUPLE" end, on_rightclick=function(self) if not self.train_id_1 or not self.train_id_2 then return end local id1, id2=self.train_id_1, self.train_id_2 if self.train1_is_backpos and not self.train2_is_backpos then advtrains.do_connect_trains(id1, id2) --case 2 (second train is front) elseif self.train2_is_backpos and not self.train1_is_backpos then advtrains.do_connect_trains(id2, id1) --case 3 elseif self.train1_is_backpos and self.train2_is_backpos then advtrains.invert_train(id2) advtrains.do_connect_trains(id1, id2) --case 4 elseif not self.train1_is_backpos and not self.train2_is_backpos then advtrains.invert_train(id1) advtrains.do_connect_trains(id1, id2) end self.object:remove() end,