Castillo Posted October 4, 2013 Posted October 4, 2013 I'll try to explain how to do it as good as I can: 1: Trigger a server side event from the client side using triggerServerEvent when the resource starts ( onClientResourceStart ) 2: On the server side, add this event using addEvent & addEventHandler, then, you must trigger a client side event using triggerClientEvent, where you'll send the 'sounds' table. 3: On the client side, add this new event you triggered from the server side using addEvent & addEventHandler, then, define the function with one argument, which will be the table you sent from the server side. 4: Loop this table with 'pairs' for-loop ( http://lua-users.org/wiki/ForTutorial ), then, use triggerEvent to trigger the 'createSoundClient' event passing theVehicle and ID from the table., so you don't have to define playSound and so on again.
~Gangsta~ Posted October 4, 2013 Author Posted October 4, 2013 does not work client gMe = getLocalPlayer(); gRoot = getRootElement(); gResRoot = getResourceRootElement( getThisResource () ); btn = {}; ipodCoor = { moving={}, pos={} }; addEvent( "clientReceiveMusicTable", true ); local sound = { } addEventHandler( "onClientResourceStart", gResRoot, function () outputChatBox( "Press 'i' to open your iPod", 0, 255, 0 ); ipod = guiCreateStaticImage( 1.0, 0.2279, 0.1916, 0.4036, "ipod.png", true ); --0.7744 ipodCoor.moving[ipod] = false; ipodCoor.pos[ipod] = "out"; songDisplay = guiCreateGridList( 0.0671, 0.0245, 0.8504, 0.4663, true, ipod ); btn[1] = guiCreateButton( 0.64, 0.67, 0.15, 0.05, "Abspielen", true, ipod ); btn[2] = guiCreateButton( 0.185, 0.67, 0.15, 0.05, "Stop", true, ipod ); btn[3] = guiCreateButton( 0.42, 0.825, 0.15, 0.05, "vD", true, ipod ); btn[4] = guiCreateButton( 0.42, 0.525, 0.15, 0.05, "vU", true, ipod ); for i=1,4 do guiSetAlpha( btn[i], 1.0 ); guiSetFont( btn[i], "default-small" ); end; songList = guiGridListAddColumn( songDisplay, "My Songs", 0.85 ); triggerServerEvent( "serverLoadMusicTable", gMe ); addEventHandler( "onClientGUIClick", gRoot, function () local theVehicle = getPedOccupiedVehicle ( gMe ) if source == btn[1] then local selSong = guiGridListGetItemData( songDisplay, guiGridListGetSelectedItem( songDisplay ) ); if selSong then triggerServerEvent ( "createSound", root, selSong, theVehicle) end; elseif source == btn[2] then triggerServerEvent ( "destroySound", localPlayer, theVehicle ) elseif source == btn[4] then if sound [ theVehicle ] then setSoundVolume( sound [ theVehicle ], getSoundVolume( sound [ theVehicle ] ) + 0.25 ); if getSoundVolume( sound [ theVehicle ] ) > 1 then setSoundVolume( sound [ theVehicle ], 1 ); end; end; elseif source == btn[3] then if sound [ theVehicle ] then setSoundVolume( sound [ theVehicle ], getSoundVolume( sound [ theVehicle ] ) - 0.25 ); if getSoundVolume( sound [ theVehicle ] ) < 0 then setSoundVolume( sound [ theVehicle ], 0 ); end; end; end; end ) bindKey( "i", "down", function () if ipodCoor.moving[ipod] == false then if ipodCoor.pos[ipod] == "out" then showCursor( true, false ); ipodCoor.moving[ipod] = true; addEventHandler( "onClientRender", gRoot, openIPod ); toggleControl( "fire", false ); else showCursor( false, false ); ipodCoor.moving[ipod] = true; addEventHandler( "onClientRender", gRoot, closeIPod ); toggleControl( "fire", true ); end; end; end ) end ) function openIPod() local x, y = guiGetPosition( ipod, true ); guiSetPosition( ipod, x - 0.01, y, true ); if x < 0.775 then ipodCoor.moving[ipod] = false; ipodCoor.pos[ipod] = "in"; removeEventHandler( "onClientRender", gRoot, openIPod ); end; end; function closeIPod() local x, y = guiGetPosition( ipod, true ); guiSetPosition( ipod, x + 0.01, y, true ); if x > 1.0 then guiSetPosition( ipod, 1.0, y, true ); ipodCoor.moving[ipod] = false; ipodCoor.pos[ipod] = "out"; removeEventHandler( "onClientRender", gRoot, closeIPod ); end; end; addEventHandler( "clientReceiveMusicTable", gRoot, function ( mTable ) if mTable == nil then triggerServerEvent( "serverLoadMusicTable", gMe ); else for _, v in ipairs ( mTable ) do local row = guiGridListAddRow( songDisplay ); local streamtable = split(v, ';') guiGridListSetItemText( songDisplay, row, 1, streamtable[2], false, false ); guiGridListSetItemData ( songDisplay, row, 1, streamtable[1]); outputChatBox(streamtable[2].." has ben added to your ipod", getLocalPlayer()); end; guiGridListAutoSizeColumn( songDisplay, 1 ); guiBringToFront( songDisplay ); end; end ) addEvent ( "createSoundClient", true ) addEventHandler ( "createSoundClient", root, function ( id, theVehicle ) if isElement ( sound [ theVehicle ] ) then stopSound ( sound [ theVehicle ] ); end local x, y, z = getElementPosition ( theVehicle ) sound [ theVehicle ] = playSound3D ( id, x, y, z ) attachElements ( sound [ theVehicle ], theVehicle ) end ) addEvent ( "destroySoundClient", true ) addEventHandler ( "destroySoundClient", root, function ( theVehicle ) if isElement ( sound [ theVehicle ] ) then stopSound ( sound [ theVehicle ] ); end sound [ theVehicle ] = nil end ) addEventHandler("onClientResourceStart", resourceRoot, function() triggerServerEvent("onPlayerToggleRadio", getLocalPlayer()) end ) addEvent("onServerToggleRadio", true) addEventHandler("onServerToggleRadio", root, function(url) for radio,_ in ipairs(url) do triggerEvent ( "createSoundClient", root,radio ) end end) server local gRoot = getRootElement(); addEvent( "serverLoadMusicTable", true ); addEventHandler( "serverLoadMusicTable", gRoot, function () local res, mTable, xml = getThisResource(), {}, xmlLoadFile( "meta.xml", res ); local nameTable = {} if xml then local i = 0; while ( xmlFindChild( xml, "stream", i ) ) do local dir = xmlNodeGetAttribute( xmlFindChild( xml, "stream", i ), "url" ); local streamname = xmlNodeGetAttribute( xmlFindChild( xml, "stream", i ), "name" ); table.insert( mTable, dir..";"..streamname ); i = i + 1; end; end; triggerClientEvent( source, "clientReceiveMusicTable", gRoot, mTable ); end ) addEvent ( "createSound", true ) addEventHandler ( "createSound", root, function ( id, theVehicle ) if ( theVehicle ) then triggerClientEvent(root, "createSoundClient", root, id, theVehicle) sounds [ theVehicle ] = id -- Store in the table the music ID using theVehicle as table index. end end ) addEvent ( "destroySound", true ) addEventHandler ( "destroySound", root, function ( theVehicle ) if ( theVehicle ) then triggerClientEvent(root, "destroySoundClient", root, theVehicle) sounds [ theVehicle ] = nil -- Remove the entry from the table. end end ) addEvent("onPlayerToggleRadio", true) addEventHandler("onPlayerToggleRadio", root, function() triggerClientEvent("onServerToggleRadio", root, sounds) end )
Castillo Posted October 4, 2013 Posted October 4, 2013 I told you to use 'pairs' not 'ipairs'. -- client side: addEvent ( "onServerToggleRadio", true ) addEventHandler ( "onServerToggleRadio", root, function ( sounds ) for vehicle, id in pairs ( sounds ) do if isElement ( vehicle ) then triggerEvent ( "createSoundClient", localPlayer, id, vehicle ) end end end ) -- server side: addEvent ( "onPlayerToggleRadio", true ) addEventHandler ( "onPlayerToggleRadio", root, function ( ) triggerClientEvent ( source, "onServerToggleRadio", source, sounds ) -- You had to use 'source' here, else, it would trigger to everyone. end )
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now