-
Posts
3,875 -
Joined
-
Days Won
67
Everything posted by DNL291
-
getvehiclevelocity Como detectar que o veículo está dando a ré?
DNL291 replied to Lord Henry's topic in Programação em Lua
Já tentou usando getControlState? -
1: I haven't understood what is wrong exactly, but I recommend using the matchingDimension parameter. 2: Replace getRootElement() with resourceRoot. 3: Check if the parameter 'thePlayer' is actually a player element. 4: Your code was probably decompiled; keep in mind that we don't provide help with leaked/stolen script.
-
onPlayerConnect + cancelEvent () is more appropriate and it will not kick the player from server.
-
You can also save this way: -- saving local r,g,b = getPlayerNametagColor( source ) setAccountData( playeraccount, "ntszin", toJSON({ r,g,b }) ) -- getting local nametagC = getAccountData( playeraccount, "ntszin" ) if nametagC then local r,g,b = unpack(fromJSON( nametagC )) end Also, you can remove the first if-statement in the "onPlayerLogin" event since the account parameter will always be returned.
-
Use source instead of thePlayer. Also, getPlayerNametagColor returns 3 values (r, g, b), so you can't save the data this way.
-
Replace the function 'fimdoevento' with this: function fimdoevento(ammo, killer, weapon, bodypart) local getData = getElementData ( source, "eventoblip" ) -- quando o cara morrer , se o cara for o que tiver iniciado o evento, e o evento ainda tiver rolando if getData and killer and killer ~= source then local killerName = getElementType(killer) == "player" and getPlayerName(killer) or false if not ( killerName ) then killerName = getElementType(killer) == "vehicle" and getVehicleController(killer) or false end if type(killerName) ~= "string" then stopEvent( source ) return end local item = itens[math.random(tamanho(itens))][1] local quantidade = 1 destroyElement(blip) setElementData(source, "eventoblip",false) setElementData(killer, item , quantidade) setElementData(source, item, quantidade) outputChatBox ('#00a5ff==============================================================',getRootElement(),255,255,255,true) outputChatBox ('#00a5ff GETDATA TRUE',getRootElement(),255,255,255,true) outputChatBox ("#00a5ff Parabéns [#FF0000" .. getPlayerName(killer) .. "#00a5ff] matou o Staff e ganhou [#ff0000 "..quantidade.."x "..item.."#00a5ff]!",getRootElement(),255,255,255,true) outputChatBox ('#00a5ff==============================================================',getRootElement(),255,255,255,true) else stopEvent( source ) end end function stopEvent( p ) destroyElement(blip) setElementData(p, "eventoblip",false) outputChatBox ('#00a5ff==============================================================',getRootElement(),255,255,255,true) outputChatBox ('#00a5ff O Staff #FF0000' .. getPlayerName(p) .. ' #00a5ff se matou, o evento irá reiniciar',getRootElement(),255,255,255,true) outputChatBox ('#00a5ff==============================================================',getRootElement(),255,255,255,true) end If it didn't work, type /debugscript 3 to make sure there are no errors in the code. Also, debug each value from your code, like killer, item and getData.
-
What's the problem with GTA:SA? Why do you need to have the MTA without GTA installed?
-
Ajuda para criar um veiculo BOT [Assalto ao Carro Forte]
DNL291 replied to Citryon25's topic in Programação em Lua
A parte de programar pro veículo andar uma rota não é muito fácil. Se for uma coisa mais simples, como seguir reto e virar não vai ser complexo, mas se quiser que seja mais preciso e a prova de falhas (como batidas pra desviar a rota) vai ser mais trabalho. -
Não sei se dá pra corrigir isso, mas acredito que não tenha muita importância já que mostra a textura só quando clica rápido pra mirar. Acho melhor você tirar esse loop em todos objetos do server cada vez que mira, isso pode estar dando um atraso pra ocultar. Se for possível, tente obter todos objetos anexados ao jogador. E também, a função setTimer está errada; deve ser assim: setTimer(verifyAlpha, 200, 1, alpha)
-
Acho que a melhor solução na verdade não é criar outro resource, você pode fazer funcionar com um só script pra mais de uma gang fazer o uso. Quanto ao evento, você pode usar em vários scripts, mas precisa se certificar que nenhum evento irá afetar outro script desnecessariamente. Você pode usar localmente colocando resourceRoot como disse Banex ou com localPlayer.
-
Você pode usar createMarker com o tipo "corona" ou um shader que não é recomendável pra PC's fracos. Edit: Acho que você quis dizer pra piscar os faróis apenas, então use esta função: setVehicleOverrideLights
-
Você precisa ocultar o padrão. Use esta função pra isso: https://wiki.multitheftauto.com/wiki/SetPlayerHudComponentVisible Coloque na HUD nova se não tiver essa função; se já tiver, deve ser outro script reativando a original.
-
Só usar a função string.sub e string.find ( pra encontrar os índices dos caracteres ). Off: Me lembro de ter 'quebrado a cabeça' usando funções de string e executando com o programa Lua pra separar certos números de um arquivo de texto, enfim, acabei nem finalizando isso, mas funcionou e deu pra aprender algumas coisas já que eu também explorei umas funções Lua que não faz parte do MTA.
-
local s = "[aabbcc]12345" print( s:sub( 1, s:find("]")) ) -- > [aabbcc]
-
@Ninguém Já tem esse mesmo post aqui no fórum, por favor evite postar em outros tópicos. Caso contrário, tenha em mente que o post poderá ser removido sem nenhum aviso por infringir as regras.
-
Fiz um teste com o meu código e mudei algumas coisas; e funcionou: db = dbConnect( "sqlite", "testdb.db" ) addEventHandler( "onResourceStart", resourceRoot, function( ) dbExec( db, "CREATE TABLE IF NOT EXISTS players ( account TEXT, Level INT, Exp INT )" ) for _,p in pairs( getElementsByType"player" ) do local acc = getPlayerAccount(p) if not isGuestAccount(acc) then local d = db_query( "SELECT * FROM players WHERE account=? LIMIT 1", getAccountName(acc) ) if d and #d > 0 then setElementData( p, "level", d[1]["Level"] or 0 ) setElementData( p, "experience", d[1]["Exp"] or 0 ) else setElementData( p, "level", 0 ) setElementData( p, "experience", 0 ) end end end end ) addEventHandler( "onPlayerLogin", root, function ( _, acc ) local d = db_query( "SELECT * FROM players WHERE account=? LIMIT 1", getAccountName(acc) ) if d and #d > 0 then setElementData( source, "level", d[1]["Level"] or 0 ) setElementData( source, "experience", d[1]["Exp"] or 0 ) else setElementData( source, "level", 0 ) setElementData( source, "experience", 0 ) end end ) addEventHandler( "onPlayerQuit", root, function() savePlayerData( source ) end ) addEventHandler( "onPlayerLogout", root, function() savePlayerData( source ) end ) addEventHandler( "onResourceStop", resourceRoot, function() for _,p in pairs( getElementsByType"player" ) do savePlayerData( p ) end end ) function savePlayerData( p ) local acc = getPlayerAccount(p) if not isGuestAccount(acc) then local lvl = getElementData( p, "level" ) local exp = getElementData( p, "experience" ) local d = db_query( "SELECT * FROM players WHERE account=? LIMIT 1", getAccountName(acc) ) if d and #d > 0 then dbExec( db, "DELETE FROM players WHERE account=?", getAccountName(acc) ) end dbExec( db, "INSERT INTO `players` ( `account`, `Level`, `Exp` ) VALUES ( ?, ?, ? );", getAccountName(acc), lvl or 0, exp or 0 ) end end function db_query( ... ) return dbPoll( dbQuery ( db, ... ), - 1 ) end INSERT INTO vai inserir sempre um valor, ele só faz a função de atualizar se você excluir o valor antigo primeiro. Você pode substituir pelo UPDATE na linha 64 e colocar else para adicionar na tabela usando INSERT INTO caso os dados não constem na DB.
- 12 replies
-
Como você não mostrou aqui o script, não vai dar pra ter ajudar muito, mas acredito que o script esteja redefinindo a patente quando o jogador morre.
-
Bom saber que conseguiu fazer funcionar. O código parece ter alguns trechos incorretos, mas se você não recebe nenhum erro então tá ótimo. Ainda assim, acho que seria bom pra você mesmo tentar aprender o básico das funções de banco de dados, meu código já tá aí, se tiver algum problema só pedir ajuda aqui.
- 12 replies
-
Aqui no fórum tem um tutorial sobre as funções de banco de dados do MTA: Eu fiz um código que usa um banco de dados local pra armazenar o LV e XP dos jogadores: db = dbConnect( "sqlite", "server_data.db" ) addEventHandler( "onResourceStart", resourceRoot, function( ) dbExec( db, "CREATE TABLE IF NOT EXISTS players ( account TEXT, Level INT, Exp INT )" ) for _,p in pairs( getElementsByType"player" ) do local acc = getPlayerAccount(p) if not isGuestAccount(acc) then local d = db_query( "SELECT * FROM players WHERE account=? LIMIT 1", getAccountName(acc) ) if d then setElementData( p, "level", d[1]["Level"] or "false" ) setElementData( p, "exp", d[1]["Exp"] or "false" ) end end end end ) addEventHandler( "onPlayerLogin", root, function ( _, acc ) local d = db_query( "SELECT * FROM players WHERE account=? LIMIT 1", getAccountName(acc) ) if d then setElementData( source, "level", d[1]["Level"] or "false" ) setElementData( source, "exp", d[1]["Exp"] or "false" ) end end ) addEventHandler( "onPlayerQuit", root, function() savePlayerData( source ) end ) addEventHandler( "onPlayerLogout", root, function() savePlayerData( source ) end ) addEventHandler( "onResourceStop", resourceRoot, function() for _,p in pairs( getElementsByType"player" ) do savePlayerData( p ) end end ) function savePlayerData( p ) local acc = getPlayerAccount(p) if not isGuestAccount(acc) then local lvl = getElementData( p, "level" ) local exp = getElementData( p, "exp" ) dbExec( db, "UPDATE players SET Level=?, Exp=? WHERE account=?", lvl or 0, exp or 0, getAccountName(acc) ) end end function db_query( ... ) return dbPoll( dbQuery ( db, ... ), - 1 ) end Você pode ler o tutorial e aproveitar o código pra entender como funciona. Pra criar o arquivo .db é só abrir o seu notepad e criar um novo arquivo com a extensão .db. Edit: O código não foi testado.
- 12 replies
-
Glad it worked, you're welcome.
-
Depure o código pra encontrar os erros. Faça uma verificação com os valores 'xml', 'node' e xmlNodeGetAttribute usando outputChatBox. Use também o comando /debugscript 3 e veja se mostra algum erro com o script. A propósito, eu usaria um banco de dados local nesse caso. Mesmo que não queira salvar nos dados da conta, pode salvar numa database local que é muito melhor que XML.
- 12 replies
-
I still can't understand why you need a timer for it. Can you explain better, please? Because reading your quote, I assume you want the next song to play after the previous one finished, and the code I wrote works that way. Anyway, If you want to access the timer variable globally, just do as I did with 'playingSound' variable in my code above.
-
I'm not sure if that's what you mean, but I made this code and I haven't tested it. Here it is: addEvent("stoploginsound", true) local songs = { "sounds/1.mp3", "sounds/2.mp3", "sounds/3.mp3", "sounds/4.mp3", "sounds/5.mp3", "sounds/6.mp3", "sounds/7.mp3", "sounds/8.mp3" } local playingSound function PlayLoginSound() playRandomSong_orStop() addEventHandler( "onClientSoundStopped", resourceRoot, onSoundStopped ) addEventHandler( "stoploginsound", root, playRandomSong_orStop ) end addEventHandler ( "onClientResourceStart", resourceRoot, PlayLoginSound) function onSoundStopped ( reason ) if ( reason == "finished" ) then --outputChatBox ( "end of sound" ) destroyElement( source ) playRandomSong_orStop() end end function playRandomSong_orStop( stop ) if stop then destroyElement( playingSound ) playingSound = nil return end local rndSong = math.random( #songs ) playingSound = playSound( tostring(songs[rndSong]) ) --Play the song setSoundVolume(sound, 0.5) --Set the sound volume to 20% end -- server-side function PlayLogin() triggerClientEvent(source, "stoploginsound", source, true) end addEventHandler("onPlayerLogin", root, PlayLogin)
-
Você pode usar setAccountData e guardar na conta do jogador o nível e XP. Da mesma forma que está fazendo com XML, quando logar na conta, define os dados da conta em setElementData e assim que deslogar/sair do servidor/parar o resource salva na conta usando getElementData. Além do que o Lord Henry disse, também é mais fácil de usar.
- 12 replies
-
I think this server-side code should work: bindKey( player, key, "both", funcInput ) function funcInput ( player, key, keyState ) if key == "key" and keyState == "down" then if timer then return end timer = setTimer( f, 2000, 1, player ) --outputChatBox("down") elseif key == "key" and keyState == "up" then if timer and isTimer(timer) then --did not wait 2 seconds end --outputChatBox("up") end end function f( p ) killTimer(timer) timer = nil end