Jump to content

androksi

Other Languages Moderators
  • Posts

    545
  • Joined

  • Last visited

  • Days Won

    38

Everything posted by androksi

  1. Apenas destruir o elemento não deixa sem valor na variável. Anule a variável também. destroyElement(markerVerifcador) markerVerifcador = nil
  2. Tudo depende de como você realiza as tarefas de sincronização dentro do código. Concordo que "tem hora pra tudo", mas tabelas são mais eficientes. E também, pra falar a verdade, a diferença é mínima. Prefiro ter o código mais organizado com tabelas e criar a sincronização manual, através dos triggers, do que utilizar elementData. Sim, você precisa ter a tabela no client-side e server-side, é aí que entra a parte de sincronizar tudo, basta usar a lógica de como as coisas devem ser feitas.
  3. O recomendado não é utilizar elementData para isso, uma tabela seria suficiente. Mas vamos lá. Para editar uma tabela que está dentro de uma elementData, você terá de obter essa tabela, editá-la e adicionar de novo ao jogador. (pior performance possível hauauhauhau) addCommandHandler("add", function(player) setElementData(player, "player.items", {name = "Vibrador Neutro", amount = 3}) end) addCommandHandler("edit", function(player) -- Digamos que eu queira editar o item Vibrador Neutro local handleItem = "Vibrador Neutro" local playerItems = getElementData(player, "player.items") if playerItems then -- Encontrar a index do item local index for i = 1, #playerItems do if playerItems[i].name == handleItem then index = {i, tonumber(playerItems[i].amount)} break end end -- Agora que encontramos o índice, vamos editar o valor. O nome continuará igual, e o valor terá aumentado mais 1. local editItem = {name = "Vibrador Neutro", amount = index[2] + 1} -- Editamos dentro da tabela table.remove(playerItems, index[1]) table.insert(playerItems, index[1], editItem) -- Salvamos novamente a elementData no jogador setElementData(player, "player.items", playerItems) end end)
  4. Parabéns por conseguir. Irei apenas explicar duas coisas, quer dizer, duas formas de fazer isso. Usar webhooks (método mais fácil); Criar uma aplicação (BOT) e também uma API REST. Dessa forma, você poderia, por exemplo, usar um link externo. Sendo assim, quando jogador criasse uma conta, você enviaria os dados utilizando o método POST, juntamente à função fetchRemote. Exemplo de chamada: URL: https://localhost:5500/api/discord/create Parâmetros do método POST: nickname, account_name, created_at Uma vez que a API fosse chamada, você pegaria os dados enviados e mandaria no canal do Discord.
  5. O que você quer de fato fazer? Há alguns fatores envolvendo o envio de dados, isso inclui back-end ou front-end. Diga-nos mais detalhes o que pretende fazer.
  6. Você pode definir isso dentro do arquivo mtaserver.conf. Procure por isto: <resource src="admin" startup="1" protected="0" /> <resource src="defaultstats" startup="1" protected="0" /> <resource src="helpmanager" startup="1" protected="0" /> <resource src="joinquit" startup="1" protected="0" /> <resource src="mapcycler" startup="1" protected="0" /> <resource src="mapmanager" startup="1" protected="0" /> <resource src="parachute" startup="1" protected="0" /> <resource src="performancebrowser" startup="1" protected="0" /> <resource src="ipb" startup="1" protected="0" /> <resource src="reload" startup="1" protected="0" /> <resource src="resourcebrowser" startup="1" protected="1" default="true" /> <resource src="resourcemanager" startup="1" protected="1" /> <resource src="scoreboard" startup="1" protected="0" /> <resource src="spawnmanager" startup="1" protected="0" /> <resource src="voice" startup="1" protected="0" /> <resource src="votemanager" startup="1" protected="0" /> <resource src="webadmin" startup="1" protected="0" /> <!-- play is the default freeroam gamemode. Remove the following line to prevent it from starting. --> <resource src="play" startup="1" protected="0" /> Basta copiar uma linha, colar abaixo de alguma e inserir o nome do resource que você deseja. Lembre-se de manter o atributo startup com o valor 1.
  7. Fiz um exemplo abaixo de como eu costumo estruturar minhas funções exportadas. É bem bobo o exemplo. --- Client-side local playerIp function updateClientIP(ip) playerIp = ip end addEvent("ip:update", true) addEventHandler("ip:update", resourceRoot, function(ip) playerIp = ip end) addCommandHandler("verip", function() if playerIp then print(playerIp) end end) -- Server-side function updateClientIP(player, ip) triggerClientEvent(player, "ip:update", resourceRoot, ip or "?") end No meta.xml, eu defino dessa forma: <exports function="updateClientIP" type="shared" /> Sendo assim, nesse exemplo, o sistema pode alterar a variável playerIp em ambos lados, tanto client-side quanto server-side. Sem contar que, como o DNL291 disse, caso você for documentar tudo, ficará muito mais legível.
  8. Há diversos erros no seu código. attacker não está definido em lugar nenhum; algumas funções utilizam player e outras source (???); a função setTimer, que está dentro da função SetarCaidoComHS, não possui funcionamento nenhum, uma vez que não é passado argumentos; a função setTimer, que está fora da função, também não há função referente à ela; evento na última linha adicionado de forma incorreta. Sugiro aprender a desenvolver seus próprios códigos, com base em códigos que são bem feitos. O código que você está tentando editar é totalmente mal otimizado e possui vários erros. Consertá-los é irrelevante. Não perca tempo. Você também pode aprender mais sobre a linguagem Lua neste link.
  9. Olá. Primeiro: sua lógica possui alguns erros, especificamente na linha 11. Deveria ser assim: if texture and model == "player_face" or model == "head" then Segundo: a função getPlayerSkin está obsoleta. Use getElementModel ao invés disso.
  10. Negativo. Você não precisa mudar nada. O que eu fiz é apenas um exemplo. Use de base para fazer o que deseja, dei o código pronto apenas como exemplo. É você quem precisa estudar e criar por conta própria. го!
  11. Olá. Você deve obter os dados do jogador que matou e enviar para quem foi a vítima. Fiz um exemplo:
  12. O "host" é o IP do seu servidor onde está o banco de dados. Lembrando que o host pode ser uma DNS, com letras, ou uma sequência numérica, o IP.
  13. Verifique se você não está abrindo a conexão MySQL toda vez que a chama. Considere também checar se você está fechando os arquivos XML após usá-los.
  14. Você precisa sim indexar o jogador à tabela. Ficaria mais ou menos assim:
  15. Não, o source do evento não será o parâmetro veh. Use desta forma, passando todos os parâmetros para o client-side. triggerClientEvent("show_tag", resourceRoot, veh, name, id, price, amount) E lá no client-side, use assim: addEvent( "show_tag", true ) addEventHandler( "show_tag", resourceRoot, function(veh, name, id, price, amount) if amount then all_veh = {veh, name, id, price, amount} end all_veh = {veh, name, id, price, amount="ilimitada"} end) Agora uma correção: a variável all_veh SEMPRE irá ser substituída por outra, pois ela não está recebendo indexação nenhuma para cada novo carro. Faça dessa maneira: addEvent( "show_tag", true ) addEventHandler( "show_tag", resourceRoot, function(veh, name, id, price, amount) local index = #all_veh + 1 if not all_veh[index] then all_veh[index] = {} end if amount then return all_veh[index] = {veh, name, id, price, amount} end all_veh[index] = {veh, name, id, price, amount="ilimitada"} end)
  16. Fará diferença. Além do mais, se eu entendi bem, isso daria ainda mais trabalho e aumentaria a carga do servidor kkk. Na minha concepção, você teria dois trabalhos. Melhor tabelas.
  17. Use tabelas. O inventário não precisa renderizar toda hora o valor de um certo item, basta atualizá-lo quando o jogador pegar/remover o item. Dará um pouco mais de trabalho, mas no final, o servidor sai ganhando.
  18. Cara, é o que eu disse, depende muito de seus objetivos. Particularmente, eu faria usando tabelas.
  19. Depende de como você quer fazer, há possibilidades de fazer usando as duas formas: setElementData ou tabelas. Outra coisa que você deve levar em conta é a organização, pois se usar tabelas para aprimorar o desempenho, mas fizer de qualquer jeito, não adianta de nada, vamos combinar, né? O que você deve pensar é: Coisas que irão atualizar e devem ser atualizadas em tempo real; O que seria mais viável: usar triggerClientEvent para atualizar o client-side ou ir pelo caminho mais fácil, usando setElementData Por que usar for? Basta verificar se o veículo está indexado à tabela, assim como se usa para verificar o jogador. -- SERVER-SIDE local vehicles = {} -- Criar veículo local veh = createVehicle(411, 0, 0, 3) -- Indexar à tabela vehicles[veh] = {owner = "Andrei", plateText = "JFA-8842", vehId = 3} -- Como buscaria? addEventHandler("onVehicleEnter", root, function(thePlayer) if vehicles[source] and vehicles[source].owner == getPlayerName(thePlayer) then print("Você é o dono!") triggerClientEvent(thePlayer, "updateInfo", resourceRoot, vehicles[source]) else print("Você não é o dono ou algo deu errado :/") end end) -- CLIENT-SIDE local myVehicle = {} addEventHandler("onClientRender", root, function() if isPedInVehicle(localPlayer) then dxDrawText("A placa do seu veículo é: " .. myVehicle.plateText or "?", 400, 320, 80, 20) end end) addEvent("updateInfo", true) addEventHandler("updateInfo", resourceRoot, function(t) -- O nome dos atributos dentro de myVehicle poderia ser qualquer um, estou copiando apenas para ser mais rápido hehe myVehicle.owner = t.owner myVehicle.plateText = t.plateText end)
  20. O math.random que está dentro da função, sim, sempre irá ser gerado um novo (de 1 a 20). Já o math.random que executa a função setTimer, irá ser definido apenas uma vez (de 10 a 30 minutos), ou seja, se o número gerado for, por exemplo, 900000, o seu alerta irá SEMPRE executar a cada 15 minutos. Solução: function changeWeather() local weatherId = math.random(20) setWeather(weatherId) -- Quando essa função (changeWeather) ser executada, então chamaremos novamente a função (setTimerForChangeWeather) para setar o timer setTimerForChangeWeather() end function setTimerForChangeWeather() local ms = math.random(60 * 1000 * 10, 60 * 1000 * 30) setTimer(changeWeather, ms, 1) -- Irá executar apenas uma vez, mas a função setTimerForChangeWeather() sempre será chamada, então SEMPRE terá o que fazer end -- Script inicia setTimerForChangeWeather()
  21. Sim, você pode fazer isso, sem problema algum. Editei a minha outra resposta, leia por favor, apenas um conselho sobre o seu código.
  22. Isso ocorre pois você precisa criar uma tabela para a tabela que indexa o jogador também. Dessa forma: local players = {} function startWork (source) print(getPlayerName(source)) -- Retorna o nick ou seja o source existe if not players[source] then players[source] = {} players[source]["rubble"] = 0 players[source]["rubbleRemoved"] = false players[source]["atWork"] = false end end Offtopic: percebo que você costuma não utilizar variáveis locais, o que deixa a desejar em questão de otimização (não é tanta diferença, mas boas práticas de programação devem estar em todos os códigos ?). No topo do seu código, defina todas as tabelas e variáveis como local. Ao decorrer do código, você poderá usar sem o local, pois uma vez definida dessa forma, sempre será local. Isso vale também para funções, laços de repetições e afins, sempre considere usar local para definir uma variável ou tabela dentro do escopo seja de função ou laço de repetição.
×
×
  • Create New...