-
Posts
3,972 -
Joined
-
Last visited
-
Days Won
179
Everything posted by Lord Henry
-
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. -
Se o objeto for criado no lado servidor e for movimentado no lado cliente, só o cliente verá ele na nova posição. Isso dará problema de sincronização cliente/servidor. Você deve mover o objeto pelo lado server se quiser que os outros jogadores também vejam o objeto na nova posição.
-
Código ilegível. Favor indente seu código.
-
Já leu a wiki do isObjectInACLGroup?
-
Não anexe o cilindro em objetos com física dinâmica. Eles irão bugar os markers pois o jogo não atualiza direito a posição da colisão dos markers. Em vez disso use um onClientRender (se o script for client-side) para ficar obtendo a posição do objeto e setando o marker nessa posição. Se for server-side, use setTimer para ficar atualizando a posição do marker de acordo com a posição do objeto.
-
local chamados = {} addCommandHandler ("samu", function (thePlayer, cmd) -- Comando pro jogador chamar o Samu. local name = getPlayerName (thePlayer) -- Name recebe o nick do jogador que executou o comando. if (chamados[name]) then -- Se já tem um chamado na table com esse nome, então: outputChatBox ("Você já tem um chamado em aberto. Aguarde mais tempo até alguém aceitar.", thePlayer, 255, 0, 0) else -- Se não tem nenhum chamado deste jogador na table, então: chamados[name] = true -- Adiciona ele na table. outputChatBox ("Você chamou um Samu. Aguarde alguém aceitar.", thePlayer, 0, 255, 0) end end) addCommandHandler ("aceitar", function (thePlayer, cmd, name) if (name) then -- Se o jogador que vai aceitar incluiu o nick do jogador, então: if (chamados[name]) then -- Se tem um chamado do jogador mencionado na table, então: chamados[name] = nil -- Fecha o chamado. outputChatBox ("Você aceitou o chamado de "..name, thePlayer, 0, 255, 0) -- Aqui é o código que cria o blip no jogador que chamou o socorro e que aparece somente pra quem aceitou. Essa parte é por sua conta. else -- Se não tem um chamado do jogador mencionado na table, então: outputChatBox ("O jogador "..name.." não tem nenhum chamado de Samu em aberto.", thePlayer, 255, 0, 0) end else -- Se o jogador que vai aceitar não informou o nick para o qual vai aceitar, então: outputChatBox ("Erro de sintaxe: /aceitar <nick>", thePlayer, 255, 255, 0) end end) Exemplo bem simples. Se o jogador trocar de nick ou sair do server já irá bugar o sistema. Mas serve pra vc usar de base.
-
É necessário criar uma table de chamados. Pois pode ocorrer de vários jogadores pedirem o Samu ao mesmo tempo e dai um pedido iria substituir o outro. Dai para aceitar o chamado, você poderia fazer com um segundo argumento opcional do nome do jogador que chamou. Ex: /aceitar Joaozinho123 "Você aceitou o chamado de socorro de Joaozinho123, a posição dele foi marcada no seu radar." (remove o Joaozinho123 da table de chamados)
-
Esse script é server-side ou client-side?