Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    3,966
  • Joined

  • Last visited

  • Days Won

    179

Everything posted by Lord Henry

  1. Basta colocar um resource de "/pro" no seu servidor e então colocar a elementData dele no jogador quando ele entra no carro blindado.
  2. Olá. Você precisa postar a parte do seu código que está com dúvida, não temos como adivinhar o problema.
  3. Não é aconselhável mexer no painel admin ser ter conhecimento avançado no que está fazendo, pois ele é um resource muito complexo e cheio de dependências entre os códigos, uma mudança errada e você pode perder seu painel admin. Eu lembro que na minha versão, precisei criar uma ACL Right nova padrão para o painel, da mesma forma que a permissão para a aba Bans existe. <right name="general.tab_settings" access="false"></right> É claro que simplesmente criar a permissão nova não é suficiente, você tem que configurar a aba das opções para depender dessa permissão, como as demais abas foram feitas.
  4. -- Para salvar as cores na conta: local colors = toJSON({r, g, b}) -- Converte a tabela {r, g, b} numa string e salva essa string como accountData. setAccountData(account, "colors", colors) -- Para obter as cores da conta: local data = fromJSON(getAccountData(account, "colors")) -- Converte a string da tabela numa tabela normal. local r, g, b = unpack(data)
  5. Isso acontece pq você está usando duas constantes. shop.prodAtual é sempre 0 shop.adc é sempre 1 Ou seja, vc está fazendo isso: shop.novosProdutos = (0 + 1) Tente fazer assim: shop.novosProdutos = (shop.novosProdutos + shop.adc) Na primeira vez, será 0 + 1. Mas na segunda vez, será 1 + 1, depois 2 + 1 e assim por diante.
  6. function onSair(thePed) -- Nunca use source como parâmetro de função. if isElement(veiculo[thePed]) then -- Verifique se o veículo do jogador existe. Se existir, destrói ele. destroyElement(veiculo[thePed]) veiculo[thePed] = nil end end addEventHandler("onVehicleExit", root, onSair) -- Não use onPedVehicleExit pois ele não funciona para players, só com NPCs.
  7. Na próxima vez, crie uma votação com as duas opções. É mais fácil do que cada um ficar respondendo.
  8. Existem 2 formas de fazer isso, a primeira é como nosso colega havia mencionado que seria evitar a propagação do evento adicionando um false após o último end. addEventHandler("onClientGUIClick", Butoon_Sair, function(tecla) if tecla == "left" then guiSetVisible(Janela_Agencia_Emprego, false) showCursor(false) end end, false) A segunda forma e também a mais recomendada seria você adicionar um evento inteiro que ativa com todos os elementos CEGUI do seu resource e então verificar qual deles é o source (elemento cegui clicado). addEventHandler ("onClientGUIClick", resourceRoot, function (button) if (button == "left") then if (source == Butoon_Sair) then guiSetVisible (Janela_Agencia_Emprego, false) showCursor (false) -- elseif (source == Butoon_???) then -- Aqui você vai adicionando o que os demais botões do painel devem fazer. end end end)
  9. Se a bind pertencer ao mesmo resource do assalto onde está o marker, você poderia apenas adicionar o jogador como índice de uma tabela e depois de um tempo remover ele da tabela. Enquanto o jogador estiver nessa tabela, ele não conseguirá assaltar novamente. Exemplo: local assaltantes = {} -- Tabela vazia, onde os jogadores que estão assaltando ficam e depois de um tempo somem. local theMarker = createMarker (0, 0, 4) -- Aqui é onde você coloca o marker do assalto. Onde o jogador precisa estar para usar a bind. -- setElementInterior(theMarker, 0) -- setElementDimension(theMarker, 0) function assaltar(keyPresser) if (assaltantes[keyPresser]) then return end -- Se o jogador já ativou essa função, nada acontece e não executa o resto da função. if (isElementWithinMarker(keyPresser, theMarker)) then -- Se o jogador que ativou essa função está dentro do marker theMarker, então: assaltantes[keyPresser] = true -- Adiciona o jogador como índice na tabela de assaltantes. assalt(keyPresser) -- Ativa a função que faz o assalto. setTimer(function() -- Depois que o assalto é concluído, remove o jogador da tabela. Permitindo que ele assalte novamente. assaltantes[keyPresser] = nil end, config["Gerais"]["tempoAssaltar"]*1000, 1) -- Você também pode aumentar esse tempo, assim o jogador precisará esperar mais tempo depois de concluir o assalto, além do próprio tempo de duração do assalto. end end bindKey (root, "q", "down", assaltar) -- Binda a função assaltar na tecla Q. OBS: Você ainda terá um bug de que vários jogadores conseguem assaltar o mesmo lugar ao mesmo tempo. Mas dai essa parte é com vc.
  10. Basicamente ele está reclamando que a ACL Vip que você está tentando atribuir ao jogador ela não existe. Antes da linha do erro, coloque isso na linha anterior e descubra qual o nome da ACL que não existe. iprint("Nome da ACL inexistente:", item.informations.vip)
  11. Mostre o código que você está tentando fazer. Sua pergunta é muito vaga. O bloqueio é para todo mundo ou só para quem está fazendo spam de bind? (bloquear somente pra quem acabou de usar a bind e depois de um tempo desbloquear) O bloqueio da bind é de uma tecla única? Ou uma combinação de teclas? Se refere a bloquear um controle do jogador (andar, atirar, correr) ou a um comando bindado? (bind de /say, bind de /repair)
  12. Nesse seu setTimer, faltou você definir um parâmetro de função para receber o Player. setTimer(function() setElementVisibleTo(assaltarassaltado,Player,false) end,tempopranew,1,Player) Faça dessa forma: setTimer (function (thePlayer) setElementVisibleTo (assaltarassaltado, thePlayer, false) end, tempopranew, 1, Player) Além disso, nesse seu outro setTimer: setTimer(function(source) assaltada3 = false setElementVisibleTo(assaltarassaltado,source,false) setElementVisibleTo(assaltardessaltado,source,true) end,tempopranew,1,source) Nunca defina source como parâmetro de função, pois isso pode causar conflito. Faça dessa forma: setTimer (function (theSource) assaltada3 = false setElementVisibleTo (assaltarassaltado, theSource, false) setElementVisibleTo (assaltardessaltado, theSource, true) end, tempopranew, 1, source)
  13. @Daniel RPAo utilizar a função fromJSON, é necessário que JSON esteja em maiúsculo. local title, value = fromJSON(myvariable)
  14. Você pode começar com isso: for i, player in ipairs(getElementsByType("player")) do local name = getPlayerName(player) local id = getElementData(player, "ID") or "N/A" dxDrawText(name.." ("..id..")", screenW * 0.574, (screenH * 0.2639) + (i * 20), screenW * 0.687, (screenH * 0.7167) + (i * 20), tocolor(255, 255, 255, 255), 1.30, "default", "center") end
  15. @STB HURONAdicione dois traços no início da última linha do código que você mandou. -- addEventHandler("onPlayerWasted", getRootElement(), spawnOnDead)
  16. @Périclesfaça com que o resource do DX Msg exporte suas funções para os demais scripts usarem, exportando as funções dele no meta.xml Para chamar uma função exportada por outro resource, use a função call. Mais conhecida como exports.
  17. Por algum bug, esse parâmetro opcional não funciona se usar no mesmo instante em que o veículo é criado. Para fazer com que ele funcione, adicione um tempo para que a função seja chamada só depois que o veículo já está criado. Usando um setTimer de 100 milissegundos já resolve. taxi = createVehicle (420, 2472.5, -1688, 13.3) -- Cria um taxi na Grove Street. setTimer (setVehicleDoorState, 100, 1, taxi, 0, 4, false) -- Arranca o capô do taxi em seguida, mas sem deixar ele voando perto do veículo.
  18. O interpolateBetween é uma função onde você consegue obter o "meio" de dois valores inserindo o começo e o final e especificando qual a posição deste meio entre 0 e 1. Por exemplo: Se você tem a coordenada do início do trajeto da bala e a coordenada do final da bala (coordenada onde ela atingiu), se você especificar o valor 0.5 entre eles em um interpolateBetween, você vai obter a coordenada do meio entre elas. local laserShoots = {} -- Tabela que vai armazenar as infos de cada laser. local contador, limite = 0, 20 -- Índice do laser atual | Número máximo de lasers que este jogador pode ver ao mesmo tempo. -- Ao atingir este limite, os lasers mais antigos serão substituídos pelos novos. Limites altos demais causarão lag. local tamanho, velocidadeLaser = 0.05, 0.16 -- Comprimento do laser | Velocidade do laser. (o tiro real continua na mesma velocidade) function onPlayerShoot(w,a,aC,hX,hY,hZ,hE) local sx, sy, sz = getPedWeaponMuzzlePosition(source) -- Obtém a posição de onde sai o tiro. if (sx) then -- Se o jogador atirou com uma arma de fogo (existe a posição do início do tiro), então: contador = contador + 1 -- Contador de 0 vai pra 1, depois vai pra 2 e assim por diante. if (contador > limite) then -- Se o contador passou do limite, então volta pro 1. contador = 1 end laserShoots[contador] = {0, sx, sy, sz, hX, hY, hZ} -- Adiciona as posições de início e final do tiro. O zero indica a posição do tiro ainda não percorreu seu traçado, 0 é no começo e 1 é no final. end end addEventHandler("onClientPlayerWeaponFire", root, onPlayerShoot) -- Ativa essa função quando algum player atirar. addEventHandler("onClientPedWeaponFire", root, onPlayerShoot) -- Ativa essa função quando algum NPC atirar. (opcional) function renderLaserShoots() for i, tiro in pairs (laserShoots) do -- Para cada tiro faça: local percorrido, startX, startY, startZ, endX, endY, endZ = unpack(tiro) -- Obtém as infos do tiro. percorrido = percorrido + velocidadeLaser -- Adiciona a velocidade ao percorrido. Isso faz com que quanto maior a velocidade, mais o laser percorre a cada frame. if (percorrido > 1) then -- Se o laser chegou ao seu destino, então: laserShoots[i] = nil -- Remove ele da tabela de lasers. else -- Se o laser ainda não chegou no destino, então: laserShoots[i] = {percorrido, startX, startY, startZ, endX, endY, endZ} -- Atualiza a nova posição percorrida do laser na tabela. local px1, py1, pz1, px2, py2, pz2 if (percorrido - tamanho >= 0) then -- Isso serve para dar comprimento ao laser, em vez de ser um ponto, ele será um traço. px1, py1, pz1 = interpolateBetween (startX, startY, startZ, endX, endY, endZ, percorrido - tamanho, "Linear") -- Obtém a posição um pouco atrás do tiro. else px1, py1, pz1 = interpolateBetween (startX, startY, startZ, endX, endY, endZ, 0, "Linear") -- Considera como 0 as posições abaixo de 0 para evitar erros. end if (percorrido + tamanho <= 1) then px2, py2, pz2 = interpolateBetween (startX, startY, startZ, endX, endY, endZ, percorrido + tamanho, "Linear") -- Obtém a posição um pouco na frente do tiro. else px2, py2, pz2 = interpolateBetween (startX, startY, startZ, endX, endY, endZ, 1, "Linear") -- Considera como 1 as posições acima de 1 para evitar erros. end dxDrawLine3D (px1, py1, pz1, px2, py2, pz2, tocolor(0,162,0,150), 2.3) -- Cria um traço entre a posição um pouco na frente e um pouco atrás da posição simulada do tiro com a cor e espessura especificados. (cria o laser) end end end addEventHandler("onClientRender", root, renderLaserShoots) -- Executa essa função a cada frame. Caso queira testar com um NPC: Adicione isso no final do client-side: -- ============ Apenas para testes =========== setTimer (function () for i, thePed in pairs (getElementsByType("ped")) do -- Para cada NPC, faça: if (getElementData (thePed, "autoShot")) then -- Se o NPC tem essa elementData, então: setPedAimTarget (thePed, 2488, -1670, 12.3) -- Faz ele mirar no meio do chão da Grove Street. (se não tiver isso, os lasers não aparecem pois não existe posição final do tiro) setPedControlState (thePed, "fire", true) -- Faz ele ficar atirando. end end end, 500, 1) -- Executa isso meio segundo depois que iniciar este resource. E coloque isso server-side: -- ============== Apenas para testes ================= randomPed = createPed (0, 2510, -1670, 13.55, 90) -- Cria um NPC na Grove Street. giveWeapon (randomPed, 30, 9999, true) -- Dá uma AK-47 com 9999 de munição pra ele. setElementData (randomPed, "autoShot", true) -- Coloca essa data nele só pra diferenciá-lo de outros NPCs.
  19. @angelunivc precisa escolher uma linguagem de programação específica para desenvolvimento de aplicativos e sites. Recomendo que estude JavaScript, CSS e HTML para sites. Tem tutoriais no Youtube.
  20. Não. Isso é nativo do MTA e não pode ser alterado pelos servidores. A parte server-side ali do código já garante que nenhuma mensagem de teamsay seja enviada pelos jogadores.
  21. Faltou fechar aspas ao final do link do vídeo.
  22. -- CLIENT-SIDE addEventHandler("onClientKey", root, function(button, state) -- Se o jogador pressionar ou soltar uma tecla, ativa essa essa função: if (button == "y" and state) then -- Se a tecla for o Y e for pressionada, então: cancelEvent() -- Cancela a função e a tecla Y não vai funcionar. (ela ainda funcionará para digitar comandos) end end) -- SERVER-SIDE addEventHandler("onPlayerChat", root, function(message, messageType) -- Ativa essa função quando alguém tentar usar o chat. if (messageType == 2) then -- Se for usando o teamsay, então: outputChatBox("Team Chat está desabilitado.", source, 255, 150, 0) -- Opcional, manda essa mensagem pro jogador que tentou. cancelEvent() -- Não envia a mensagem que o jogador tentou. end end) Vale lembrar que se o jogador trocar a tecla do teamsay nas configurações do menu ESC para outra tecla, ele vai conseguir abrir o teamsay pela outra tecla que ele configurar. Da mesma forma, se ele colocar o chat normal na tecla Y, este chat deixará de funcionar para o jogador.
×
×
  • Create New...