Jump to content

[Ajuda] /moto SpawnVehicle


Recommended Posts

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

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)

 

  • Thanks 1
Link to comment

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_cirandinhano 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 :).

  • Thanks 2
Link to comment

-

 

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_cirandinhano 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 by +snts
Não foi feito como gostaria que fosse.
Link to comment

@+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. :)

  • Thanks 1
Link to comment
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
  • Other Languages Moderators
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.

  • Like 1
  • Confused 1
Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...