Jump to content

_Ace

Members
  • Posts

    67
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by _Ace

  1. yes getWorldFromScreenPosition just above player head, and processLineOfSight should do, fill the params with player for start coords and a bit of offset (like 1 or 2 meters) to evade the ray hitting the player itself, and getWorldFromScreenPosition for end coord, you can customize others params to your needs. something like: local wordx,worldy,worldz=getWorldFromScreenPosition(... local hitornot,hitx,hity,hitz=processLineOfSight(playerx,playery,playerz,worldx,worldy,worldz)
  2. function testp() valor={ [581] = 10000, [468] = 20000, [461] = 30000, [521] = 30000, [586] = 80000, [522] = 120000, --e outros ids } v=getPedOccupiedVehicle(localPlayer)--v é o veiculo a ter o preço checado, aqui to usando o veiculo que o player esta for veiculo in pairs(valor) do if v and veiculo==getElementModel(v) then outputChatBox("valor desse veiculo: "..valor[getElementModel(v)]/5) end end end addCommandHandler("testepreco",testp)
  3. esse objeto ja ta no mta/gta id: 1570 createObject(1570, 0, 0, 5)--meio do mapa
  4. _Ace

    Button

    Button = guiCreateButton(0.45, 0.54, 0.10, 0.06, "Get Value", true) guiSetProperty(Button, "NormalTextColour", "FFAAAAAA") guiSetVisible(Button, false) EditBox= guiCreateEdit(0.41, 0.45, 0.18, 0.04, " chcesz tego kupić sztuk?", true) guiSetProperty(EditBox, "NormalTextColour", "FFFF0000") guiSetVisible(EditBox, false) addEventHandler("onClientGUIClick", Button, function() local inputBox = tonumber(guiGetText(EditBox))--I think the idea was to set max 3 (count) to the edit? if tonumber(guiGetText(EditBox)) and tonumber(guiGetText(EditBox))<=3 then outputChatBox("U set value input "..inputBox, 255, 255, 0)--if input text was 3 or less else return outputChatBox("input > 3 or not number", 255, 255, 0) end end) -- Another Client Side addCommandHandler("TurnOnButton", function() guiSetVisible(Button, true) guiSetVisible(EditBox, true) showCursor(true)--showCursor(false) to disable mouse end)
  5. --clientside: addEventHandler("onClientVehicleEnter", getRootElement(), function() for i=2,5 do setVehicleDoorState(source,i,0) end end )
  6. @Arantes estranho pq eu testei com 2 players, e funcionou perfeito, unica coisa diferente foi que inseri o nome por comando e nao por painel, mas seria o mesmo ja que passa como texto tbm, pra testar vc pode inserir no chat como outputChatBox os dados e ver onde ta o problema: function haveOtherNick (myName) outputChatBox("funcao haveothernick recebeu: "..myName.." de player: "..getPlayerName(client)) for i, player in ipairs (getElementsByType("player")) do outputChatBox("for leu o checknick: "..getElementData (player, "checknick").." de "..getPlayerName(player)) if player~=client and (getElementData (player, "checknick") and getElementData (player, "checknick") == myName) then return true--se todos os players exceto eu não tem elementdata checknick igual a myName end end return false end function checkNick() local nome = getElementData (client, "checknick") outputChatBox("funcao checknick: leu elementdata: "..nome.." de "..getPlayerName(client)) if (nome) then if (haveOtherNick(nome)) then outputChatBox ("Já tem alguém com esse nome online.") removeElementData(client,"checknick")--opcional: remover o elementdata de quem nao foi aprovado pra nao ocupar o checknick em 2+ players else triggerClientEvent("successNick", getRootElement()) setElementData(client, "playername", nome) end end end addEvent("checkNick", true) addEventHandler("checkNick", getRootElement(), checkNick) e nessas funções de account data deu algum erro ou warning? e no caso esse sistema de nick que vc ta fazendo seria um nome secundario? pq vc poderia usar direto o getPlayerName pra checar nick/nome
  7. haveOtherNick sempre retorna true pq ele ta passando o for em todos os players, inclusive o proprio que acabou de setar o nick em si mesmo, pra comparar vc precisa excluir o player que deu trigger, antes faz essa alteração de source pra client, na wiki diz o seguinte: Atenção: vc deve usar a variavel global client no serverside ao invés de passar localPlayer ou por parametro ou source, Senão falsificação de evento (passar outro player invés de localPlayer) poderia ser possível (triggerServerEvent) ps: essa alteração source pra client é só no server, o script client fica igual tava o script server ficaria assim: function haveOtherNick (myName) for i, player in ipairs (getElementsByType("player")) do if player~=client and (getElementData (player, "checknick") and getElementData (player, "checknick") == myName) then return true--se todos os players exceto eu não tem elementdata checknick igual a myName end end return false end function checkNick() local nome = getElementData (client, "checknick") if (nome) then if (haveOtherNick(nome)) then outputChatBox ("Já tem alguém com esse nome online.") removeElementData(client,"checknick")--opcional: remover o elementdata de quem nao foi aprovado pra nao ocupar o checknick em 2+ players else triggerClientEvent("successNick", getRootElement()) setElementData(client, "playername", nome) end end end addEvent("checkNick", true) addEventHandler("checkNick", getRootElement(), checkNick)
  8. I answered a similar question before: I edited one line from the original code (from the wiki) dxDrawMaterialLine3D(x, y, z+1+height-(distanceBetweenPoints/distance*width)-1+width, x, y, z+height, Image, width-(distanceBetweenPoints/distance*width), tocolor(R or 255, G or 255, B or 255, alpha or 255)) so the width parameter works as scale, this code is tested and works fine to change the size of the image, if you need non uniform height change you can use the same line with some edits
  9. source é usado pra eventos dai não tenho certeza se pode gerar algum problema outra coisa são os triggerServerEvent com elemento localPlayer, geralmente se usa resourceRoot, verifique isso tbm pra ver se tem algum warning/erro no debugscript 3 quanto a solução vc pode usar o setElementData com flag no proprio player/assaltante, quando inicia o assalto deixa como true e qnd termina poe false, quando o cara quiser acionar a animação verifica se ele tem a elementdata e se tiver cancela con return, deixei um codigo que nao testei mas deve estar td ok, comentei pra ficar mais facil ver onde editei --CLIENT function animcruzabraco () if getElementData(localPlayer,"assaltando") then--checagem se o player tem elementdata assaltando, se tiver é cancelado outputChatBox("teste= animação impedida por elementdata") return end if getElementData ( localPlayer, "cruzabracodt" ) == false then setElementData(localPlayer, "cruzabracodt", true) setElementFrozen ( localPlayer, true ) triggerServerEvent("animcruzabraco",localPlayer)--verifique else setElementFrozen ( localPlayer, false ) setElementData(localPlayer, "cruzabracodt", false) triggerServerEvent("paraanim",localPlayer)--verifique end end bindKey("b", "both", animcruzabraco) --- --SERVER function sistema1(player)--coloquei player pq nao tenho certezz sobre usar source if player then if isElementWithinMarker(player, loja1) then local weaponType = getPedWeapon ( player ) if weaponType == 0 then outputChatBox ( "#727272Você está desarmado. #464646Tenha uma arma para assaltar.", player, 255, 255, 255, true ) else outputChatBox(" ", player, 255, 255, 255, true) outputChatBox("#cf3f3fINDFO: #e2e2e2Você está começando a roubar o banco Caixa #727272(Aguarde 4 minutos ou será punido). #e41c1cAs autoridades estão vindo.", player, 255, 255, 255, true) outputChatBox(" ", player, 255, 255, 255, true) setElementVisibleTo( loja1ass, root, true) setElementFrozen( player, true ) setElementData(player,"assaltando",true)-- aqui dou elementdata assaltando para o player, proibido de usar animacao b setPedAnimation( player, "bomber", "bom_plant_loop", 240000, true, false, false, false ) setMarkerSize(loja1, 0) outputChatBox(" ", player, 255, 255, 255, true) outputChatBox("#cf3f3fINFO: #e41c1cAtenção todas as autoridades. #e2e2e2O banco Caixa está sendo assaltado, compareçam ao local urgentemente!", root, 255, 255, 255, true) outputChatBox(" ", player, 255, 255, 255, true) setTimer(function(player) givePlayerMoney(player, GranaBanco)--GranaBanco nao ta definida na codigo do post verifique se esta no seu codigo inteiro setElementFrozen( player, false ) setPlayerWantedLevel( player, 6 ) outputChatBox("#cf3f3fINFO: #e41c1cVocê assaltou o banco Caixa e ganhou R$ "..GranaBanco, player, 255, 255, 255, true) setElementData(player,"assaltando",false)-- aqui tiro elementdata assaltando do player, liberado pra usar animação b end,240000,1,player) setTimer(function(player) setMarkerSize(loja1, 2.5) setElementVisibleTo( loja1ass, root, false) end,1800000,1,player) end end end end addCommandHandler("roubar", sistema1)
  10. no mesmo momento que tira o dinheiro, ja pode fazer o pagamento: function setMoneyOnWasted (_, killer ) local money = getPlayerMoney(source) local perde = money/10 if getElementType( killer ) ~= "player" or ( killer == source ) then cancelEvent() else if (money <=0) then cancelEvent() else takePlayerMoney ( source, perde ) if killer~=source then givePlayerMoney ( killer, perde ) end end end end addEventHandler ( "onPlayerWasted", getRootElement(), setMoneyOnWasted )
  11. use onPlayerWasted (serverside) ja que ta alterando o dinheiro, pro evento onplayerwasted o killer é o segundo parametro: --server function setMoneyOnWasted (_, killer ) local money = getPlayerMoney(source) local perde = money/10 if getElementType( killer ) ~= "player" then cancelEvent() else if (money <=0) then cancelEvent() else takePlayerMoney ( source, perde ) end end end addEventHandler ( "onPlayerWasted", getRootElement(), setMoneyOnWasted ) testado e funcionando
  12. dei uma ajeitada no código e comentei pra ficar melhor de entender, testei e agora ta funcionando e spawneando o vehiculo e o outro marker destroi normal, verifique se o resource infobox ta funcionando quando testar, aqui nao usei infobox. *a função getplayerfrompartialname nao vi uso Spawn = createMarker(197.93676757813, 1875.7465820313, 17.648057937622 -1,"cylinder", 1.9, 255, 140, 0, 99) Destroy = createMarker(174.04705810547, 2021.0935058594, 21.667898178101 -2,"cylinder", 5.0, 128, 0, 0, 99) veh = {} function spawnhl (elemento)--os parametros que vc usou sao pra comando, aqui vamos usar elemento = o elemento que encostou no marker if getElementType(elemento)=="player" then--verifica se é player e nao veiculo etc que chegou no marker, pra evitar msg de erro if veh[elemento] and isElement( veh[elemento] ) then destroyElement ( veh[elemento] ) veh[elemento] = nil end local accName = getAccountName ( getPlayerAccount ( elemento ) ) if isObjectInACLGroup ("user."..accName, aclGetGroup ("EB") ) then--verifique na acl se existe grupo EB e se tem algum user.conta veh[elemento] = createVehicle(479, 162.86917114258, 2007.6252441406, 21.667898178101, -0, 0, 0.93193572759628)--ta saindo carro inves de helicoptero, verifica id warpPedIntoVehicle (elemento, veh[elemento] ) exports._infobox:addNotification(elemento, "#FFFF00Você pegou o Helicóptero da EB!!!", "success") --outputChatBox("Você pegou o Helicóptero da EB!!!",elemento)--outputchatbox pra teste = testado ok else exports._infobox:addNotification(elemento, "#FF0000Você não é da EB para pegar esse VEÍCULO!", "error") --outputChatBox("Você não é da EB para pegar esse VEÍCULO!",elemento) end end end addEventHandler("onMarkerHit", Spawn, spawnhl) function destroyvtr (elemento) if getElementType(elemento)=="player" then if veh[elemento] and isElement(veh[elemento]) then destroyElement (veh[elemento]) exports._infobox:addNotification(elemento, "#FFFF00Você destruiu o Helicóptero da EB!!!", "success") --outputChatBox("Você destruiu o Helicóptero da EB!!!") end end end addEventHandler("onMarkerHit", Destroy, destroyvtr)
  13. tem alguns erros no codigo, eu coloquei os comentarios dentro do codigo pra vc ver onde foi alterado: --server markerotas = createMarker(784.80267, -1345.52063, 12.54122, "cylinder", 1.5, 255,58,45, 50) --por ser um comando não vamos usar source e sim uma variavel function openpnl (jogador)--vc precisa por o primeiro parametro aqui para o player que usou o comando, no caso to usando jogador pra vc entender if isElementWithinMarker (jogador, markerotas) then if getElementData (jogador, "Jornal") ==true then--esse ==true é desnecessario, mas se quiser pode deixar como ta triggerClientEvent(jogador,"abrirotas", getRootElement(), jogador)--jogador ali no começo, senao vai abrir o painel ou o que tenha no evento pra todos no sv else outputChatBox("Você não trabalha aqui ainda, vá para uma agência de empregos", jogador) end end end addCommandHandler("rotas", openpnl) -- --CLIENT function rotaspnl() --COMANDOS DO PAINEL DX end function openrotas () rotasbtn() addEventHandler("onClientRender", root, rotaspnl) showCursor(true) end addEvent("abrirotas", true) addEventHandler("abrirotas", root, openrotas)--faltou isso, é pra ativar a função openrotas não tem a função do painel dx no seu codigo, mas no teste que fiz a função rotaspnl é chamada então deve funcionar *ps ali na linha 9 no triggerclientevent, deixei o ultimo 'jogador', esta sendo passado como parametro pro evento do client, deixe pq não sei se vc vai usar depois
  14. first try setOcclusionsEnabled if doesnt work use: engineSetModelLODDistance(object id, distance visible) this is client side. if the object you are using dont have a lod (some objects dont have lod), you will need to create one and place in the same position/ attach it to the original, use the same object, same scale, and the last argument true, (to set as the lod) set it to setLowLODElement and then use engineSetModelLODDistance too
  15. yes it is possible but the player needs to be kinda close to the area, like 600mts/units, for the collision data to load and processLineofSight or getGroundPosition to work, you can do a loop and wait for some player to be near and then trigger the function, I made a test code clientside, you can use it from far away and close to the area to see how it works: --clientside createColCuboid(-2846.07104, -1545.08484, 137.68427, 64.902099609375, 53.124267578125, 4.56259765625) function cub() math.randomseed(getTickCount()) setTimer(function() local x=-2846.07104+math.random(64)--position random from x local y=-1545.08484+math.random(53)--position random from y local h, hx, hy, hz,_,_,_,_,_,_,_,model=processLineOfSight(x,y,150,x,y,130,_,_,_,_,_,_,_,_,_,true)--check for ground position and world model if not h then return outputChatBox("player too far")--if player is too far stop execution elseif model~=18306 then cub()--if randomizer hit the house or trees try again until hit the ground return end createObject(1238,hx,hy,hz+0.4) outputChatBox("obj created in: "..hx.." "..hy.." "..hz) end,100,1)--litle delay to randomizer end addCommandHandler("cuboid",cub) you can adapt this concept to work serverside using triggers / elementdata / tables if needed
  16. sim vc precisa usar um arquivo html, dai adicione esse arquivo no meta.xml do seu resource, depois depende do que vc quer adicionar na hud, por exemplo pra mostrar a vida com um numero de 0 a 100 ou uma barra, vc precisa enviar pro arquivo html essa informação pra dai mostrar na tela: https://wiki.multitheftauto.com/wiki/ExecuteBrowserJavascript veja o exemplo desse link ta praticamente pronto, só substitua ali por https://wiki.multitheftauto.com/wiki/GetElementHealth pra mostrar a vida, depois disso é só seguir o mesmo padrão do exemplo pra outras coisas como colete, arma etc. e pra montar o arquivo html se não tiver experiência, use um editor online de html ou ja baixe um pronto pra pegar pratica
  17. tem algumas opções pra fazer isso, primeiro escolher qual vai ser o tipo de programação do visual: cegui: é o padrão de menus do mta, vc encontra os métodos em "gui" na parte client da wiki. Cef (https://wiki.multitheftauto.com/wiki/CEF_Tutorial) é feito em html juntamente com css e dependendo javascript tbm, cef da oportunidade pra um visual mais interessante. Dx é feito com os métodos do próprio mta, exemplo: dxDrawImage e dxDrawText e os outros métodos drawing da wiki client depois de feito o visual, use https://wiki.multitheftauto.com/wiki/AddAccount e https://wiki.multitheftauto.com/wiki/LogIn veja os exemplos da wiki e adapte pra receber o texto do seu painel de login, os dados ficam salvos no arquivo do mta internal.db, se tiver dificuldade baixe algum painel de login em resources do mta pra ter uma ideia de como fazer tbm tem login/criação de conta por mysql, mas esse é bem complicado de fazer pra quem ta começando, requer programas externos etc, mesmo assim se quiser tentar, procure por xampp (exemplo) e https://wiki.multitheftauto.com/wiki/DbConnect e os outros métodos Db do mta.
  18. a dica principal é primeiro ver se o evento ou método é clientside ou serverside/shared, resumindo os 3 tipos: client/shared/server: client: os scripts clientside são baixados no pc do player, e executados na grande maioria das vezes sem sincronia com os outros, exemplo: setVehicleComponentVisible para esconder componentes do carro, só é visível para o player que solicitou, para ser visto por todos, precisaria de triggers e funções server para sincronizar/ser visível para outros shared: são funções que funcionam tanto em serverside quanto clientside, createObject é um exemplo, a versão client cria um objeto visível só para o player que requisitou, a server é visivel pra todos (em uso normal), as vezes a versão client tem parâmetros diferentes da server, exemplo o setPlayerMoney server: aqui o resultado do método/evento fica visível/disponível pra todos no server, a não ser que vc especifique que seja pra um player ou mais específicos, exemplo: outputChatBox veja no artigo da wiki nos 2 eventos, um tem como primeiro parametro o player, e o outro o veiculo, vc deve ter se confundido com a palavra player que na verdade poderia ser qualquer coisa, os parâmetros vc pode usar qualquer palavra, exemplo server: function vei() outputChatBox("O nome do veículo atual é: "..getVehicleName(source))--o source desse evento é o veiculo que o player entrou (wiki) end addEventHandler("onVehicleEnter", getRootElement(), vei) --outro exemplo: function vei(carroqueentrou) outputChatBox("O nome do veículo atual é: "..getVehicleName(carroqueentrou))--primeiro parametro = o carro que entraram, pode ser qualquer nome end addEventHandler("onPlayerVehicleEnter", getRootElement(), vei) a dica tbm é lembrar que quando é evento, cada um tem seus parâmetros, e vc tbm pode usar o source de cada evento, e quanto usar comandos, tbm muda de server pra client (addCommandHandler)
  19. * se quiser somar com o dinheiro que o player ja tem é tudo igual porem use givePlayerMoney
  20. essa sua duvida é comum e bem vinda, não se preocupe na verdade oq acontece é que tanto o addCommandHandler quanto setPlayerMoney usam diferentes sequencias de argumentos, veja na wiki: https://wiki.multitheftauto.com/wiki/SetPlayerMoney tem os quadros em 2 cores, o laranja é server, o vermelho é client, o mesmo acontece com https://wiki.multitheftauto.com/wiki/AddCommandHandler a wiki recomenda que o uso de setPlayerMoney seja feito em server side, e isso significa que vc deve usar os parâmetros de addCommandHandler tbm em server side veja na wiki do addCommandHandler em Handler function parameters: parametro 1: o player que executou o comando parametro 2: o nome do comando (isso vc vai usar raramente, é pra quando quer usar dois comandos ou mais pra mesma função) parametro 3 em diante: sao argumentos opcionais (isso é o que por exemplo seria o player e quantia para dar o dinheiro /dar Fulano 1000, sendo fulando o argumento 3 e 1000 o 4) na sua tentativa que funcionou provavel que foi clientside e o dinheiro caiu pra seu proprio player, ja que o primeiro parametro ta direto como quantia. para clientside vc não poderia dar dinheiro para outros em sincronia com o server, seria efetivo só para o próprio player que deu o comando, entao eu vou deixar um exemplo em server side: function DarDinheiro(player,cmd,paraquem,quantia) setPlayerMoney(getPlayerFromName(paraquem), quantia) end addCommandHandler("dar", DarDinheiro)--use /dar nomedoplayer quantia note que esse exemplo não faz checagem se o player digitado existe e nao da nenhuma mensagem de sucesso, porem sim testei e funciona, se quiser fazer essas melhorias para praticar blz
  21. you need to create a .col for your object, if you are using kams plugin you can use the model itself and convert it to a col, then load with https://wiki.multitheftauto.com/wiki/EngineLoadCOL then replace with: https://wiki.multitheftauto.com/wiki/EngineReplaceCOL
  22. nesse evento o código sabe o assento pq ele foi desenvolvido com esses 3 parâmetros pra verificar quais parâmetros cada evento usa veja na parte de Parameters no artigo da wiki: https://wiki.multitheftauto.com/wiki/OnPlayerVehicleEnter theVehicle: a vehicle element representing the vehicle that was entered. (parâmetro 1: o veiculo que o player entrou) seat: an int representing the seat in which the player is entering. (parâmetro 2: um numero inteiro representando o assento, 0 seria o motorista, 1 = assento de passageiro (a localização depende do veiculo) e assim por diante) jacked: a player element representing a player who has been jacked. (parâmetro 3: seria o caso de quando um player arranca outro do carro, esse parâmetro retorna o player que foi arrancado) também no artigo da wiki tem o Source que pra esse evento é o player/ped que entrar no carro no seu outro tópico o Lord Henry citou outro evento parecido que no caso o primeiro parâmetro era player e o segundo tbm o assento: https://wiki.multitheftauto.com/wiki/OnVehicleEnter vc pode entrar nesses 2 e os outros eventos server pra ver como eles funcionam: https://wiki.multitheftauto.com/wiki/Server_Scripting_Events
  23. de uma olhada em https://wiki.multitheftauto.com/wiki/OnPlayerVehicleEnter veja que o primeiro argumento ali onde vc deixou 'player' é na verdade o veiculo que foi entrado, pra acessar o player use source pra esse evento, isso tbm ta especificado na wiki, outro detalhe que sugiro adicionar é fazer a checagem só pro banco do motorista, senão quem entrar de passageiro sem cnh vai desligar o carro.. function desligarCarro(carro,assento) if not getElementData(source, "cnh") and assento==0 then--se nao tiver elementdata cnh e estiver no banco do motorista (assento 0) setVehicleEngineState(carro, false) end end addEventHandler("onPlayerVehicleEnter" , getRootElement (), desligarCarro)
  24. use the table with roads/paths from eXo-OpenSource / ml_pathfind: https://raw.githubusercontent.com/eXo-MTA/ml_pathfind/master/test/sa_nodes.json or add a table and insert the car position xyz in this table (inside your timer) from past 10 second should be enough, then when you fall in the water do a for loop in the table from last index to first, passing a processlineofsight (https://wiki.multitheftauto.com/wiki/ProcessLineOfSight) on the positions, if the material id (https://wiki.multitheftauto.com/wiki/Material_IDs) provided by the processlineofsight is some of the road related ids (I guess id 1 to 5) then teleport to the coords
  25. nao ta chamando a funcao pq o marker ta mto pequeno/baixo muda pra: fnh = createMarker(-2026.83, -114.85, 1034.3, "cylinder", 1.0, _,_,_,_, getRootElement()) dai vai chamar a função, (testado)
×
×
  • Create New...