+snts Posted February 25, 2020 Share Posted February 25, 2020 Estou inicializando em .Lua, e como exercicio, tinha a função de criar um scrip que ao digitar /moto, spawnar um veículo na posição do player e tele transportar ele para o mesmo, porém estou com um erro no debugscript 3 que me causa uma dorzinha de cabeça e depois de horas a remexer na wiki, ainda não percebi como o resolver. Codigo: function SpawnMoto() local px, py, pz = getElementPosition (getLocalPlayer()) local VehCar = createVehicle(522, px, py, pz+2) warpPedIntoVehicle(player, VehCar ) end addCommandHandler("moto", SpawnMoto) Erro no debug: Expected ped at argument 1, got nil. Ele dá erro no warpped, porém não sei o porquê. Link to comment
#RooTs Posted February 25, 2020 Share Posted February 25, 2020 Tente isso veh = {} function SpawnMoto () if veh[source] and isElement( veh[source] ) then destroyElement( veh[source] ) veh[source] = nil end local x,y,z = getElementPosition(source) veh[source] = createVehicle(522, x,y,z) warpPedIntoVehicle (source,veh[source]) end addCommandHandler("moto", SpawnMoto) 1 Link to comment
Developer. Posted February 25, 2020 Share Posted February 25, 2020 Bom é assim, se formos traduzir o erro seria algo neste sentido: Esperado ped/player no argumento 1, recebeu valor nil (nil é um valor inexistente) Isto ocorreu porque você não declarou o parâmetro da sua função. Se você observar na wiki o evento (addCommandHandler), vai ver que em um trecho ele fala sobre playerSource e argumentos. Mais precisamente isto aqui que estou me referindo: http://prntscr.com/r7neut Para todas as funções no MTA, existe um SOURCE. Source é o nativo daquela função, é o objeto/player/marker em que a função tem como base. Podemos acionar este source simplesmente digitando source, Exemplo Prático: local px, py, pz = getElementPosition(source) -- pegamos a posição do parâmetro nativo da função(source) warpPedIntoVehicle(source, VehCar) -- forçamos o player no veículo usando um parâmetro nativo da função(source) e uma variavel (VehCar) Obs: o SOURCE do addCommandHandler é o player que digitou o comando. -- Olhando para o seu script nós temos na linha 1 function -- function Indicamos que estamos iniciando uma função que ira executar algo SpawnMoto -- o nome desta função () -- e os parâmetros, ou seja a quem ela seja direcionada. Podemos perceber aqui que não existe nenhum parâmetro! Se não existe nenhum parâmetro DECLARADO, se formos olhar para a linha 4 player não existe, pois ele não foi declarado em nenhum momento. Obs: Não necessariamente você precisa escrever "player", eu posso colocar "ciranda_cirandinha" no lugar de "player" que irá funcionar normalmente. -- Na linha dois tem um outro erro: local px, py, pz = -- 3 váriaveis getElementPosition -- a função (getLocalPlayer()) -- o argumento Nós temos dois lados, o lado cliente e o lado servidor. Lado servidor é o que será executado na host, e o lado cliente é o executado no pc do player. Se você pesquisar por getLocalPlayer() na wiki você vai ver isto: http://prntscr.com/r7npad. Client-Side Only, ou seja somente lado cliente isto você pode identificar no meta.xml temos <script src="nomeDoArquivo" type="client"/> ou <script src="nomeDoArquivo" type="server"/> o type diz quais funções você pode usar naquele arquivo... Obs: temos também funções do tipo shared que funcionam tanto nos arquivos de lado client, quanto nos arquivos de lado server. Ex: http://prntscr.com/r7nr9j -- Basicamente é isso maninho esses foram os erros em seu script, use o código que o #Roots mandou e pesquise sobre "tabelas", é algo que vai ser muito essencial para você desenvolver seus próximos códigos :). 2 Link to comment
+snts Posted February 26, 2020 Author Share Posted February 26, 2020 (edited) - 1 hour ago, Developer. said: Bom é assim, se formos traduzir o erro seria algo neste sentido: Esperado ped/player no argumento 1, recebeu valor nil (nil é um valor inexistente) Isto ocorreu porque você não declarou o parâmetro da sua função. Se você observar na wiki o evento (addCommandHandler), vai ver que em um trecho ele fala sobre playerSource e argumentos. Mais precisamente isto aqui que estou me referindo: http://prntscr.com/r7neut Para todas as funções no MTA, existe um SOURCE. Source é o nativo daquela função, é o objeto/player/marker em que a função tem como base. Podemos acionar este source simplesmente digitando source, Exemplo Prático: local px, py, pz = getElementPosition(source) -- pegamos a posição do parâmetro nativo da função(source) warpPedIntoVehicle(source, VehCar) -- forçamos o player no veículo usando um parâmetro nativo da função(source) e uma variavel (VehCar) Obs: o SOURCE do addCommandHandler é o player que digitou o comando. -- Olhando para o seu script nós temos na linha 1 function -- function Indicamos que estamos iniciando uma função que ira executar algo SpawnMoto -- o nome desta função () -- e os parâmetros, ou seja a quem ela seja direcionada. Podemos perceber aqui que não existe nenhum parâmetro! Se não existe nenhum parâmetro DECLARADO, se formos olhar para a linha 4 player não existe, pois ele não foi declarado em nenhum momento. Obs: Não necessariamente você precisa escrever "player", eu posso colocar "ciranda_cirandinha" no lugar de "player" que irá funcionar normalmente. -- Na linha dois tem um outro erro: local px, py, pz = -- 3 váriaveis getElementPosition -- a função (getLocalPlayer()) -- o argumento Nós temos dois lados, o lado cliente e o lado servidor. Lado servidor é o que será executado na host, e o lado cliente é o executado no pc do player. Se você pesquisar por getLocalPlayer() na wiki você vai ver isto: http://prntscr.com/r7npad. Client-Side Only, ou seja somente lado cliente isto você pode identificar no meta.xml temos <script src="nomeDoArquivo" type="client"/> ou <script src="nomeDoArquivo" type="server"/> o type diz quais funções você pode usar naquele arquivo... Obs: temos também funções do tipo shared que funcionam tanto nos arquivos de lado client, quanto nos arquivos de lado server. Ex: http://prntscr.com/r7nr9j -- Basicamente é isso maninho esses foram os erros em seu script, use o código que o #Roots mandou e pesquise sobre "tabelas", é algo que vai ser muito essencial para você desenvolver seus próximos códigos :). No caso, para fazer o tipo de programa que eu quero fazer, preciso de fazer uma ligação entre Client e Server devido ao getLocalPlayer? //----------------------------------------------------------- 2 hours ago, #RooTs said: Tente isso veh = {} function SpawnMoto () if veh[source] and isElement( veh[source] ) then destroyElement( veh[source] ) veh[source] = nil end local x,y,z = getElementPosition(source) veh[source] = createVehicle(522, x,y,z) warpPedIntoVehicle (source,veh[source]) end addCommandHandler("moto", SpawnMoto) Ele dá me 3 erros no debug3, https://prnt.sc/r7otl0 Edited February 26, 2020 by +snts Não foi feito como gostaria que fosse. Link to comment
Developer. Posted February 26, 2020 Share Posted February 26, 2020 @+snts Bom a não ser que você queira mostrar alguma imagem/texto na tela do player é totalmente desnecessário a conexão entre server e client. Esse script em especifico pode ser somente server-side sem problemas, inclusive é o que eu recomendo. No caso o certo a se fazer seria você declarar o parâmetro e passar ele, só isto acho que já resolveria os erros function SpawnMoto (jogador) local x,y,z = getElementPosition(jogador) No caso do script do #Roots seria algo assim: local veh = {} function SpawnMoto (jogador) if veh[jogador] and isElement( veh[jogador] ) then destroyElement( veh[jogador] ) veh[jogador] = nil end local x,y,z = getElementPosition(jogador) veh[jogador] = createVehicle(522, x,y,z) warpPedIntoVehicle (jogador, veh[jogador]) end addCommandHandler("moto", SpawnMoto) Seria legal você já pensar em usar os outros parâmetros tipo: local veh = {} function SpawnMoto (jogador, comando, id) if veh[jogador] and isElement( veh[jogador] ) then destroyElement( veh[jogador] ) veh[jogador] = nil end local x,y,z = getElementPosition(jogador) veh[jogador] = createVehicle(tonumber(id),x,y,z) warpPedIntoVehicle (jogador, veh[jogador]) end addCommandHandler("moto", SpawnMoto) 3 parâmetros o ultimo(id) seria o id do veiculo! Então vc iria digitar tipo /moto 522 ai apareceria a NRG, ou se vc digitasse /moto 462 aparecia outro veiculo e assim por diante... Teste e nos de um retorno se esta funcionando ou não. 1 Link to comment
+snts Posted February 26, 2020 Author Share Posted February 26, 2020 5 minutes ago, Developer. said: @+snts Bom a não ser que você queira mostrar alguma imagem/texto na tela do player é totalmente desnecessário a conexão entre server e client. Esse script em especifico pode ser somente server-side sem problemas, inclusive é o que eu recomendo. No caso o certo a se fazer seria você declarar o parâmetro e passar ele, só isto acho que já resolveria os erros function SpawnMoto (jogador) local x,y,z = getElementPosition(jogador) No caso do script do #Roots seria algo assim: local veh = {} function SpawnMoto (jogador) if veh[jogador] and isElement( veh[jogador] ) then destroyElement( veh[jogador] ) veh[jogador] = nil end local x,y,z = getElementPosition(jogador) veh[jogador] = createVehicle(522, x,y,z) warpPedIntoVehicle (jogador, veh[jogador]) end addCommandHandler("moto", SpawnMoto) Seria legal você já pensar em usar os outros parâmetros tipo: local veh = {} function SpawnMoto (jogador, comando, id) if veh[jogador] and isElement( veh[jogador] ) then destroyElement( veh[jogador] ) veh[jogador] = nil end local x,y,z = getElementPosition(jogador) veh[jogador] = createVehicle(tonumber(id),x,y,z) warpPedIntoVehicle (jogador, veh[jogador]) end addCommandHandler("moto", SpawnMoto) 3 parâmetros o ultimo(id) seria o id do veiculo! Então vc iria digitar tipo /moto 522 ai apareceria a NRG, ou se vc digitasse /moto 462 aparecia outro veiculo e assim por diante... Teste e nos de um retorno se esta funcionando ou não. Está sim, agradeço aos 2 pela ajuda e pelo tempo despendido, já dei thanks em todas as respostas que achava que deveria dar, por fim, dou o tópico como encerrado. Link to comment
#RooTs Posted February 26, 2020 Share Posted February 26, 2020 8 minutes ago, +snts said: Está sim, agradeço aos 2 pela ajuda e pelo tempo despendido, já dei thanks em todas as respostas que achava que deveria dar, por fim, dou o tópico como encerrado. De nada.. deu certo ? Link to comment
Other Languages Moderators Lord Henry Posted February 26, 2020 Other Languages Moderators Share Posted February 26, 2020 15 hours ago, +snts said: Erro no debug: Expected ped at argument 1, got nil. Ele dá erro no warpped, porém não sei o porquê. Isso ocorre pois vc não declarou player em lugar nenhum. Então vc está basicamente tentando teleportar nulo para dentro do veículo. Tenha em mente que veículos criados client-side servem apenas como decoração. Eles não funcionam. (Leia na Wiki do createVehicle) Ou seja, daria erro mesmo se vc usasse localPlayer ali no warp. A solução do problema é simples, mas vai resultar em problemas posteriormente, tornando a solução no fim das contas um pouco complexa. 1) Passe o script para o server-side. (Mude o lado dele no meta.xml) 2) Adicione o parâmetro de função thePlayer, exigido pelo addCommandHandler no server-side. 3) Use thePlayer em vez de localPlayer. Vai ficar assim o script: function SpawnMoto (thePlayer) local px, py, pz = getElementPosition (thePlayer) local VehCar = createVehicle (522, px, py, pz+2) warpPedIntoVehicle (thePlayer, VehCar) end addCommandHandler ("moto", SpawnMoto) Isso resolve seu problema de erros no debug. Mas logo vc vai perceber que o jogador pode ficar criando infinitos veículos. O que vc precisa fazer é deletar o veículo criado anteriormente antes de criar um novo. Mas vc não pode simplesmente dar destroyElement no VehCar. Primeiramente pois ele não existe fora do escopo daquela função, por estar numa variável local. E se você torná-la global, irá influenciar nos veículos criados por outros jogadores, uma vez que VehCar será o veículo criado pela última vez e não o necessariamente o veículo criado por você. Para corrigir isso, devemos identificar quais veículos pertencem a cada jogador para que assim possamos verificar se este jogador já tem um veículo criado antes ou não. Façamos isso por meio de uma table que será indexada com os jogadores. 1) Crie uma table vazia. 2) Na função SpawnMoto, verifique se já existe um item na tabela com o thePlayer como índice. 3) Condição: Se já existir um item com thePlayer como índice, destrói esse item e anula sua variável. 4) Substitua os VehCar por motos[thePlayer] e deixe como sendo global e não como local. O código vai ficar assim: motos = {} function SpawnMoto (thePlayer) local px, py, pz = getElementPosition (thePlayer) if (isElement (motos[thePlayer])) then destroyElement (motos[thePlayer]) motos[thePlayer] = nil end motos[thePlayer] = createVehicle (522, px, py, pz+2) warpPedIntoVehicle (thePlayer, motos[thePlayer]) end addCommandHandler ("moto", SpawnMoto) Isso fará com que os jogadores só possam criar 1 moto por vez. Ao usar o comando novamente, ele vai destruir a moto criada anteriormente e criar a nova no lugar. Ainda tem a questão de segurança, você vai precisar destruir a moto e anular sua variável caso o jogador desconecte do servidor, pois ao voltar, ele será outro elemento e sua moto permanecerá no mapa. Mas dai essa parte é com você. Obs: Postagem feita via mobile. 1 1 Link to comment
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