-
Posts
3,980 -
Joined
-
Last visited
-
Days Won
181
Everything posted by Lord Henry
-
Adicione isso no seu script. local delayfps = 0 setTimer (function () delayfps = fps end, 1000, 0) -- No seu dxDrawText, coloque delayfps no lugar de fps. Troque também no math.floor.
-
Eu faria apenas verificando se os jogadores tem permissão de mutar com hasObjectPermissionTo. Se o jogador tem essa permissão, então ele é staff. É melhor e mais fácil do que ficar verificando um monte de ACL Group de Staff.
-
Porte de armas + venda de armas. Alguém me ajuda por favor
Lord Henry replied to Rafaelxvv's topic in Programação em Lua
Aproveite e dê uma olhada nas regras:- 19 replies
-
- programação em lua
- porte de armas
- (and 11 more)
-
Porte de armas + venda de armas. Alguém me ajuda por favor
Lord Henry replied to Rafaelxvv's topic in Programação em Lua
@Rafaelxvvsó tome cuidado com a formatação de código nos tópicos. Utilize o botão <> do fórum e escolha a linguagem Lua para deixar o código na formatação adequada. Não cole o código direto no texto.- 19 replies
-
- programação em lua
- porte de armas
- (and 11 more)
-
Problemas com resource
Lord Henry replied to singer's topic in Ajudas relacionadas ao MTA:SA (Cliente/Servidor)
Eu pedi pra mostrar oq tem na pasta vtrbope e não na pasta BOPE-VRTv2 que está dentro dela. O que parece que está ocorrendo é que vc está colocando mods dentro de um mod. O MTA não consegue interpretar as pastas que estão dentro de vtrbope pois considera ele como um Mod. Então ele procura os arquivos meta.xml e scripts.lua na pasta, mas não encontra eles pois vc deixou dentro da sub-pasta BOPE-VRTv2. -
Problemas com resource
Lord Henry replied to singer's topic in Ajudas relacionadas ao MTA:SA (Cliente/Servidor)
@singerMostre o que tem dentro da pasta vtrbope -
Se você prestar atenção, naquele exemplo que eu dei ele já inclui a hora de cada ação.
-
Sim, eles pesam mais no processamento. Além de dependerem do framerate. O getTickCount é mais leve.
-
Painéis em DX precisam ser ativados com um evento onClientRender para se manterem visíveis na tela.
-
Comente esta linha guiGridListAddRow(GUI.gridlist[1], name) E coloque essa apenas para testar: print (name)
-
Assim está melhor. function getPlayerID(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 function playerHasItem(player, itemID) for i, v in pairs(getElementData(player, 'TS:InventarioInfo')) do if type(v) == 'table' then if v['Item'] == tonumber(itemID) then return true end end end return false end function returnQntdItem(player, itemID) if (player) then for i, v in pairs(getElementData(player, "TS:InventarioInfo")) do if (type(v) == "table") then if (v['Item'] == tonumber(itemID)) then return v['Quantidade'] end end end end return false end function verificarDistancia (player, abordado) if player and abordado then local x,y,z = getElementPosition(player) local x2,y2,z2 = getElementPosition(abordado) local distancia = getDistanceBetweenPoints3D(x,y,z,x2,y2,z2) if distancia then return distancia end end end local itens = { [10] = "Bandeide(s)", [11] = "Kit(s) de Reparo", [12] = "Maconha(s)", [13] = "Armamento(s) AK-47", [14] = "Munição(ões) 762", [15] = "Armamento(s) FALL", [16] = "Munição(ões) 762", -- Repete mesmo? [17] = "Armamento(s) MP5", [18] = "Munição(ões) 9mm", [19] = "Armamento(s) TEC-9", [20] = "Armamento(s) UZI", [21] = "Armamento(s) Revólver-38", [22] = "Armamento(s) Glock", [23] = "Munição(ões) 45", [24] = "Faca(s)", [25] = "Armamento(s) AK-47-VIP", [26] = "Armamento(s) AK-47-VIP", -- Repete mesmo? [27] = "Munição(ões) Sniper", [28] = "Armamento(s) AWP-VIP", [30] = "Colete(s)", [31] = "Dinheiro Sujo(s)", [32] = "Galão(ões)", [33] = "Lockpick(s)", } function revista (thePlayer, commandName, id) -- Não use source como parâmetro de função. if (tonumber(id)) then local targetPlayer = getPlayerID(tonumber(id)) if (targetPlayer) then if (verificarDistancia (thePlayer, targetPlayer) > 5) then -- Se a distância pro jogador for maior que 5, manda o feedback e nada acontece. outputChatBox ("O jogador com este ID não está perto o suficiente para ser revistado.", thePlayer, 255, 150, 0) -- Sempre dê feedback em caso de erro. return end for i, item in pairs (itens) do -- Tabela de itens com seus ids indexados, pra não precisar entupir de if. if (playerHasItem (targetPlayer, i) == true) then outputChatBox ("✘#ffffffINFO#0037FF✘➺ #ffffff O Cidadão tem "..returnQntdItem (targetPlayer, i).." "..item.." em sua mochila!", thePlayer, 0, 55, 255, true) end end else outputChatBox ("Nenhum jogador com este ID foi encontrado.", thePlayer, 255, 150, 0) end else outputChatBox ("Sintaxe: /revistar <playerID>", thePlayer, 255, 150, 0) end end addCommandHandler ("revistar", revista) -- Não use o nome da função igual ao comando.
-
Cmd é o comando que vc usou para executar essa função. Não é utilizado neste caso pois só existe 1 comando ativando essa função. Ele só é usado para casos onde vc tem outros comandos ativando a mesma função, mas quer que a função diferencie cada um deles. State é a palavra que vc usou depois do comando. Se vc usar /ptr eae, então state será igual a "eae". Você pode indicar quantos parâmetros quiser após o comando, cada um ficará em um parâmetro separado pelo espaço. function qualquerCoisa (thePlayer, cmd, parametro1, parametro2, parametro3) -- Depois de cmd, os demais parâmetros são as palavras que serão usadas após o comando. -- CODE end addCommandHandler ("teste", qualquerCoisa) -- Se vc usar /teste eae olá oi, então: -- cmd = "teste" -- parametro1 = "eae" -- parametro2 = "olá" -- parametro3 = "oi"
-
PORTÃO QUE ABRE E FECHAR DEPOIS DE INICIAR UM ASSALTO
Lord Henry replied to iamVitoor's topic in Programação em Lua
createObject moveObject -
Não. O mais próximo seriam esses: Client-side onClientObjectDamage - Evento ativado quando algum objeto próximo toma dano. onClientObjectBreak - Evento ativado quando algum objeto próximo é quebrado. Server-side onPlayerContact - Evento ativado sempre que o jogador começa a pisar em um elemento diferente do que ele estava pisando antes.
-
Pra criar um log, você precisa fazer com que o servidor escreva mensagens em um arquivo de texto. Vou dar um exemplo genérico de um log que marca o instante e o nick quando alguém usar o comando /ptr. (Script server-side.) addCommandHandler ("ptr", function (thePlayer, cmd, state) if (state == "iniciar" or state == "finalizar") then -- Verifica se o comando é seguido por um parâmetro válido. local name = getPlayerName (thePlayer) -- Obtém o nick de quem executou o comando. local horario = showTime() -- Obtém o horário atual do servidor por meio de uma função útil. if (fileExists ("logPTR.txt")) then -- Se já existe um arquivo de texto com este nome neste resource, então: newFile = fileOpen ("logPTR.txt") -- Abre o arquivo para poder editá-lo. fileSetPos (newFile, fileGetSize (newFile)) -- Coloca o cursor de escrita no fim do arquivo, caso contrário ele vai começar a escrever no começo dele, antes do que já estiver escrito no arquivo. if (state == "iniciar") then -- Se o parâmetro que o jogador usou após o comando foi "iniciar" então: outputChatBox ("Patrulha iniciada.", thePlayer) -- Apenas pra saber q o comando funcionou, normalmente teria as verificações antes de permissões e se já está em patrulha. fileWrite (newFile, "["..horario.."] "name.." Iniciou sua patrulha.\n") -- Escreve isso no documento. O \n pula para a linha seguinte após a mensagem. elseif (state == "finalizar") then outputChatBox ("Patrulha finalizada.", thePlayer) fileWrite (newFile, "["..horario.."] "name.." Finalizou sua patrulha.\n") end fileClose (newFile) -- Para todo fileOpen ou fileCreate, é necessário um fileClose pois enquanto arquivos estiverem abertos, eles podem ser corrompidos e os dados serão perdidos. else -- Se o arquivo ainda não existe, então: newFile = fileCreate ("logPTR.txt") -- Cria o arquivo de texto dentro deste resource e abre ele. (se já existisse um arquivo com esse nome, substituiria por um novo em branco) if (newFile) then -- Se conseguiu criar o arquivo, então: (as vezes pode dar erro de permissão no servidor, então use isso para evitar erros.) fileSetPos (newFile, fileGetSize (newFile)) if (state == "iniciar") then outputChatBox ("Patrulha iniciada.", thePlayer) fileWrite (newFile, "["..horario.."] "name.." Iniciou sua patrulha.\n") elseif (state == "finalizar") then outputChatBox ("Patrulha finalizada.", thePlayer) fileWrite (newFile, "["..horario.."] "name.." Finalizou sua patrulha.\n") end fileClose (newFile) else -- Se não conseguiu criar o arquivo, então: debug ("ERRO: Impossivel criar arquivo 'logPTR.txt' no servidor.") end end else -- Se não usou nenhum parâmetro após o comando ou então usou um parâmetro incorreto, então: outputChatBox ("Sintaxe: /ptr <iniciar / finalizar>", thePlayer, 255, 255, 0) end end) function showtime () -- Função que apenas retorna o horário atual. local time = getRealTime() local hours = time.hour local minutes = time.minute local seconds = time.second -- Make sure to add a 0 to the front of single digits. if (hours < 10) then hours = "0"..hours end if (minutes < 10) then minutes = "0"..minutes end if (seconds < 10) then seconds = "0"..seconds end return hours..":"..minutes..":"..seconds end Sobre a parte de tornar obrigatório a finalização da patrulha antes de começar outra, você tem 2 modos: Sete um elementData no jogador após ele iniciar uma patrulha. Sempre que ele tentar iniciar uma nova patrulha, verifique se ele já tem essa elementData. Se tiver, bloqueia e pede pra finalizar a patrulha atual. Ao finalizar uma patrulha, remove o elementData do jogador (setando o valor dela como false). Utilize tabelas. Quando alguém inicia uma patrulha, adiciona a conta dele na tabela e quando ele finaliza, remove ele da tabela. É mais leve do que elementData mas vc precisa adicionar verificadores de logout/quit/disconnect do servidor. Caso contrário o jogador pode sair do servidor e sua patrulha ainda vai estar ativa na tabela do resource. Além disso, todas as patrulhas são perdidas ao reiniciar o resource.
-
function isMouseInPosition ( x, y, width, height ) -- Função útil. Serve pra verificar se o mouse está dentro de determinada área ou não. if ( not isCursorShowing( ) ) then return false end local sx, sy = guiGetScreenSize ( ) local cx, cy = getCursorPosition ( ) local cx, cy = ( cx * sx ), ( cy * sy ) return ( ( cx >= x and cx <= x + width ) and ( cy >= y and cy <= y + height ) ) end addEventHandler ("onClientRender", root, function () dxDrawImage (x*400, y*100, x*233, y*214, "teste.png", 0, 0, 0, (isMouseInPosition (x*400, y*100, x*233, y*214) and tocolor (255, 255, 255, 240) or tocolor (255, 255, 255, 100))) end) -- O alpha do botão ficará em 240 quando o mouse estiver em cima da imagem e 100 quando não estiver.
-
Consegui fazer o marker acompanhar o objeto somente client-side. local obj = createObject (1264, -2400, -650, 132.5) setObjectBreakable (obj, false) local marker = createMarker (-2400, -650, 132.5, "cylinder", 2, 255, 255, 255, 255) setTimer (function () setElementVelocity (obj, 0, 0, 0) end, 100, 1) addEventHandler ("onClientRender", root, function() local x, y, z = getElementPosition (obj) setElementPosition (marker, x, y, z - 1) end)
-
if not (clickedElement) then return end Coloque isso no começo da função de clique de apagar objetos. E da próxima vez não crie um tópico duplicado.
- 1 reply
-
- 1
-
toggleControl ("next_weapon", false) toggleControl ("previous_weapon", false)
-
-
Aumentar/diminuir alpha de elemento DX gradualmente.
Lord Henry replied to ber's topic in Programação em Lua
Sim, é possível usar setTimer. Mas o setTimer depende do framerate. Ou seja, ele vai ser mais rápido em quem tem FPS maior.