Developer.

Members
  • Content Count

    89
  • Joined

  • Last visited

  • Days Won

    1

Developer. last won the day on February 4

Developer. had the most liked content!

Community Reputation

24 Decent

4 Followers

About Developer.

  • Rank
    Transformer
  • Birthday 19/12/1999

Recent Profile Visitors

423 profile views
  1. Bom questionamento, porém acredito eu que não. Pois no if eu estou comparando a "data" da marker hitada, com a "data" salva na tabela. Quando o gaimo salva a marker na tabela acredito eu que seja algo mais ou menos assim: markers = { -- a tabela nomeada userdata = { -- uma segunda tabela(sub-tabela), que seria a userdata ([thePlayer]) ["StartData"] = markerData -- e por fim ele salva a "data" do marker. }, }; Seguindo a lógica acima, o que me importa é a markerData, então quando eu faço assim: if marker == markers[source]["StartMarker"] then Eu to querendo dizer: SE a data da marker hitada é equivalente a data que esta dentro da sub-tabela(source, que no caso é a userdata) com index de ["StartMarker"] então faça: Abaixo o código, testado: veh = {}; markers = {}; for i=1,6 do veh[createVehicle(459, 1700.75781 + 3*i, -1806.09680, 13.54688, 0,0,0)] = true; createBlip(1700.75781, -1806.09680, 13.54688); end addEventHandler ( "onVehicleEnter", getRootElement(), function(thePlayer, seat) if not markers[thePlayer] then markers[thePlayer] = {}; end if veh[getPedOccupiedVehicle(thePlayer)] then markers[thePlayer]["StartMarker"] = createMarker(1683.57776, -1811.70239, 13.54688 - 0.8, "cylinder", 3, 255, 0, 0, 255, thePlayer); createMarker(1683.57776, -1811.70239 + 5, 13.54688 - 0.8, "cylinder", 3, 0, 255, 0, 255, thePlayer); createBlipAttachedTo(markers[thePlayer]["StartMarker"]); outputChatBox("marker table: "..tostring(markers[thePlayer]), thePlayer, 255, 255, 0); -- debug outputChatBox("marker data: "..tostring(markers[thePlayer]["StartMarker"]), thePlayer, 255, 255, 0); -- debug end end) addEventHandler("onPlayerMarkerHit", getRootElement(), function(marker, dim) if dim then outputChatBox("onHit: "..tostring(marker), source, 0, 255, 0); -- debug if marker ~= markers[source]["StartMarker"] then -- se for diferente outputChatBox("o marker é diferente", source, 255, 0, 0); else -- se for igual outputChatBox("o marker é igual", source, 0, 255, 0); end end end) addCommandHandler("teste", function(player) for index, value in pairs(markers) do -- se fizer com ipairs não irá funcionar, por causa do "StartMarker" outputChatBox(" #ff0000indexado: #ffffff"..tostring(index).." #ff0000tabela: #ffffff"..tostring(value).." #ff0000valorReal: #ffffff"..tostring(value["StartMarker"]),player, 255, 0, 255, true); end end ) Abaixo mais uma "prova" dessa explicação, agora com tudo declarado: test = { -- tabela nomeada test2 = { -- "sub-tabela" ["value"] = 10, -- index contendo o valor desejado. }, }; for i, v in pairs(test) do outputChatBox(tostring(v["value"])); end OBS (muito importante): Eu tenho absoluta certeza do que estou falando? R: Nem um pouco, provavelmente posso estar falando groselha, e se estiver quem souber melhor por favor comente xD. Porém os códigos acima foram testados e funcionou! @Angelo Pereira
  2. troque o ponto ( . ) por colchetes ( [ ) markers[thePlayer]["StartMarker"] = createMarker(...) if marker == markers[source]["StartMarker"] then Três perguntas: Qual a finalidade do mod? Por que a necessidade de nomear "StartMarker"? Vai existir mais de uma marker para ser hitada?
  3. De acordo com a descrição da wiki sobre este evento, o mesmo funciona em qualquer elemento-gui. wiki: "This event happens when any gui-element clicked."
  4. @Gaimo bom isto acontece porque a sua variável valorAtual não reseta. Onde esta status == false após o then coloque "valorAtual = 1", que assim sempre que o painel for fechado ira atribuir-se o valor 1 a esta variável.
  5. Developer.

    Building

    local player = getLocalPlayer(); local build function building(key, state) if (key == "b") then -- check Key pressed if (state == "down") then -- check state destroy(build) -- useful local x, y, z = getElementPosition(player); build = createObject(3374, x, y, z, 0, 0, 0); setElementAlpha(build, 150); attachElements(build, player , 0, 3, -1, 0, 0, 0); elseif (state =="up") then -- check state if isElementAttached(build) then setElementAlpha(build, 255); detachElements(build, player); setTimer(function() destroy(build) end, 1500, 1); end end end end bindKey("b", "both", building) function destroy(element) -- useful function if isElement(element) then -- if exists destroyElement(element) -- destroy end end
  6. Funções, eventos e resource's que você vai necessitar para fazer esse script: Server-Side ( lado servidor) addCommandHandler getPlayerByID ou getPlayerFromPartialNick (as duas são funções úteis, mandarei logo abaixo.) givePlayerMoney addEvent addEventHandler Client-Side (lado cliente) guiEditor (resource útil, só clicar para ser redirecionado a community.) cursorPosition (função útil, mandarei logo abaixo.) triggerServerEvent onClientClick getPlayerByID: function getPlayerByID(id) v = false for i, player in ipairs (getElementsByType("player")) do if getElementData(player, "ID") == id then v = player break end end return v end getPlayerFromPartialName: function getPlayerFromPartialName (name) local name = name and name:gsub("#%x%x%x%x%x%x", ""):lower() or nil if name then for _, player in ipairs(getElementsByType("player")) do local name_ = getPlayerName(player):gsub("#%x%x%x%x%x%x", ""):lower() if name_:find(name, 1, true) then return player end end end end cursorPosition: function cursorPosition(x, y, w, h) if (not isCursorShowing()) then return false end local mx, my = getCursorPosition() local fullx, fully = guiGetScreenSize() cursorx, cursory = mx*fullx, my*fully if cursorx > x and cursorx < x + w and cursory > y and cursory < y + h then return true else return false end end
  7. @MesaDowN O state é um parâmetro do evento onClientClick (no caso o segundo parâmetro). o state ele verifica se o player Pressionou o botão ("down") ou se ele solto o botão ("up").
  8. @+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.
  9. @Gaimo Bom tem duas formas, para dx em especifico tem a função util IsCursorOnElement ou você pode criar um botão com gui GuiCreateButton Exemplo Dx: local posX, posY, posW, posH = 500, 500, 200, 200 local painel = true function teste(button,state) if painel == true then if state == "down" then if isCursorOnElement(posX, posY, posW, posH ) then outPutChatBox("Teste Dx bem-sucedido") end end end end addEventHandler ("onClientClick", root, teste) -- função util function isCursorOnElement(x,y,w,h) local mx,my = getCursorPosition () local fullx,fully = guiGetScreenSize() cursorx,cursory = mx*fullx,my*fully if cursorx > x and cursorx < x + w and cursory > y and cursory < y + h then return true else return false end end Exemplo Gui: function testeGui() botao = guiCreateButton(500, 500, 50, 32, "testeGui", false) -- guiSetAlpha(botao, 0) -- deixa o botão invisivel addEventHandler("onClientGUIClick", botao, testeGui2) end addEventHandler("onClientResourceStart", resourceRoot, testeGui) function testeGui2() outputChatBox("Teste gui bem-sucedido") end No exemplo do gui, vc criaria os botão embaixo das imagens. Então tipo a imagem é só algo realmente visual, o que importa é o botão onde o player clicou que estará invisível.
  10. 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 :).
  11. Bom eu faria desta forma, ao meu ver é mais fácil: enterMarker = { -- index valor [1] = {createMarker(1170.88306, -1489.64990, 22.75516 - 1, "cylinder", 2, 0, 20, 255, 160)}, -- marker 1 [2] = {createMarker(1147.24207, -1487.55115, 22.76903 - 1, "cylinder", 2, 0, 20, 255, 160)}, -- marker 2 [3] = {createMarker(1159.714, -1511.431, 22.748 - 1, "cylinder", 2, 0, 20, 255, 160)}, -- marker 3 }; for i=1, #enterMarker do createBlipAttachedTo(enterMarker[i][1], 45) -- mesma coisa do seu createMarker porém com blip e com um for diferente. end -- abaixo a funcaoExemplo, vc pode criar funções proprias e automatizar seu script. -- em vez de eu colocar setElementModel em cada if/elseif, eu chamo a função que já faz isso por mim. function funcaoExemplo(playerSource, number) -- abaixo o setElementModel. -- se vc for na wiki essa função requer um player ou um ped (playerSource), e tambem o modelo no caso o (number) setElementModel(playerSource, number) end function hitarMarker(marker, dim) if dim then -- abaixo ele verifica se o marker hitado é equivalente ao index [1] valor [1] da tabela enterMarker, ou seja a marker criada 1. if marker == enterMarker[1][1] then outputChatBox("loja 1", source, 0, 255, 0) funcaoExemplo(source, 1) -- chamando a função criada por mim, setando ao source (player) a skin (1) elseif marker == enterMarker[2][1] then -- verificação no index [2] valor [1] outputChatBox("loja 2", source, 0, 255, 0) funcaoExemplo(source, 2) -- chamando a função criada por mim, setando ao source (player) a skin (2) elseif marker == enterMarker[3][1] then -- verificação no index [3] valor [1] outputChatBox("loja 3", source, 0, 255, 0) funcaoExemplo(source, 7) -- chamando a função criada por mim, setando ao source (player) a skin (7) end end end addEventHandler("onPlayerMarkerHit", getRootElement(), hitarMarker)
  12. Comprado? Bom sem o código fica bem difícil lhe ajudar meu querido...
  13. Ta ai, um sistema simples de Detran. local acl = "Detran" -- acl que tem permissão para efetuar os comandos /guinchar /soltar e pegar o carro do detran. local detran = { vtr = {}, last = {}, inUse = {}, guinchado = {}, }; function darCarro(jogador) if isPlayerInACL(jogador, acl) then if detran.inUse[jogador] ~= true then if detran.vtr[jogador] then destroyElement(detran.vtr[jogador]) detran.vtr[jogador] = nil end detran.vtr[jogador] = createVehicle(578, 1547.663, -2303.496, 13.545,-0, 0, 1.548) warpPedIntoVehicle(jogador, detran.vtr[jogador]) outputChatBox("#FFA500[Detran]:#FFFFFFVocê pegou carro do Detran", jogador, 255, 255, 255, true) else outputChatBox("#FFA500[Detran]:#FFFFFFVocê não pode pegar um novo carro do Detran", jogador, 255, 255, 255, true) end end end addEventHandler("onPickupHit", carro, darCarro) function salvar_Carro (vehicle, seat, jacked) if isPlayerInACL(source, acl) then detran.last[source] = vehicle end end addEventHandler('onPlayerVehicleEnter', getRootElement(), salvar_Carro) function guinVeh (jogador) if isPlayerInACL(jogador, acl) then local vtr = detran.vtr[jogador] local veh = detran.last[jogador] local vtrx, vtry, vtrz = getElementPosition(vtr) local vehx, vehy, vehz = getElementPosition(veh) local dist = getDistanceBetweenPoints3D(vtrx, vtry, vtrz, vehx, vehy, vehz) if (vtr) and (veh) then if dist < 5.5 then if not detran.inUse[jogador] then attachElements(veh, vtr, 0, -1, 1) detran.guinchado[jogador] = veh detran.inUse[jogador] = true outputChatBox("#FFA500[Detran]:#FFFFFFVeículo guinchado!", jogador, 255, 255, 255, true) else outputChatBox("#FFA500[Detran]:#FFFFFFVocê já guinchou um veículo!", jogador, 255, 255, 255, true) end else outputChatBox("#FFA500[Detran]:#FFFFFFAproxime o guincho do veículo!", jogador, 255, 255, 255, true) end end end end addCommandHandler("guinchar", guinVeh) function soltarVeh (jogador) if isPlayerInACL(jogador, acl) then local vtr = detran.vtr[jogador] local veh = detran.guinchado[jogador] local jogx, jogy, jogz = getElementPosition(jogador) local vtrx, vtry, vtrz = getElementPosition(vtr) local dist = getDistanceBetweenPoints3D(jogx, jogy, jogz, vtrx, vtry, vtrz) if (vtr) and (veh) then if dist < 3.5 then if detran.inUse[jogador] then detachElements(veh, vtr) detran.inUse[jogador] = false detran.guinchado[jogador] = nil outputChatBox("#FFA500[Detran]:#FFFFFFVeículo liberado!", jogador, 255, 255, 255, true) end else outputChatBox("#FFA500[Detran]:#FFFFFFAproxime-se do guincho!", jogador, 255, 255, 255, true) end end end end addCommandHandler("soltar", soltarVeh) function isPlayerInACL(player, acl) if isElement(player) and getElementType(player) == "player" and aclGetGroup(acl or "") and not isGuestAccount(getPlayerAccount(player)) then local account = getPlayerAccount(player) return isObjectInACLGroup( "user.".. getAccountName(account), aclGetGroup(acl) ) end return false end Se ocorrer algum erro, só estar comentando aqui. Não se esqueça de ativar seu debugscript (/debugscript 3). @zking0d
  14. - Crie uma tabela - Insira o veículo dentro da tabela - Use onPlayerVehicleEnter como evento. local viatura = {} -- tabela criada function salvar_Carro (vehicle, seat, jacked) viatura[source] = vehicle -- veiculo inserido end addEventHandler('onPlayerVehicleEnter', getRootElement(), salvar_Carro) -- evento de ativação!
  15. Faça o seguinte. Nas linhas 436, 437, 439 e 440 troque player por source. Algumas dicas simples: - Antes de tudo, procure postar suas duvidas nesta seção, pois isto ajuda a manter a organização do fórum: https://forum.mtasa.com/forum/127-programação-em-Lua/ - Abaixo vou deixar um post explicando melhor como funciona este fórum: - Sempre que estiver mexendo com seus mods ative o debugscript 3, digitando /debugscript 3 no chat ( para desligar use /debugscript 0). Isto lhe ajuda a identificar o que esta dando erro! - Se você entende quase 0 de scripts de uma olhada nesses posts: Post por manawydan - Lógica de Programação Básica: Post por DNL291 - Informações úteis - Scripting/Configurações/Tutoriais para o MTA: Para finalizar, caso não funcione o script só estar comentando novamente, e por favor se puder informe o erro com uma print ou algo do tipo (não se esqueça de ativar o debugscript!). Facilita bastante a estar te ajudando.