-
Posts
3,980 -
Joined
-
Last visited
-
Days Won
181
Everything posted by Lord Henry
-
if isPedInVehicle ( theElement ) then local theVehicle = getPedOccupiedVehicle ( theElement ) setElementPosition( theVehicle, TeleportLocation[1], TeleportLocation[2], TeleportLocation[3]) else setElementPosition( theElement, TeleportLocation[1], TeleportLocation[2], TeleportLocation[3]) end Dessa forma, se o jogador estiver em um veículo, teleporta o veículo e o jogador dentro. Se não estiver em um veículo, teleporta só o jogador.
-
Na linha 38, faça isso: if isPedInVehicle ( theElement ) then local vehicle = getPedOccupiedVehicle ( theElement ) removePedFromVehicle ( theElement ) end setElementPosition( theElement, TeleportLocation[1], TeleportLocation[2], TeleportLocation[3])
-
Did you set the texture position manually or you get it automatically? I can get this result using DxDrawImage3D, but it's client only and really hardworking to set the image position and image rotation.
-
Hello, I have interest in your project and I have some questions: How do you get the texture element from the vehicle? Is there a way to get the other light textures to turn them on? In your preview, there's a fail when the vehicle is reversing, did you fix this? I can help you in this case. Nice job. ------------------------- By the way, I have a project with turn arrow lights and reverse lights, but only works on predefined vehicles because I need to set the light position manually.
-
Funciona sim. Fiz o teste com um nick com 2 códigos HEX e removeu os 2 códigos. name = "#909090The#00bfffLord" function teste (thePlayer, cmd) local name = name:gsub('#%x%x%x%x%x%x','') outputChatBox (name, thePlayer) end addCommandHandler ("asd", teste) De acordo com o manual da linguagem LUA: string.gsub (s, pattern, replacement [, n]) Retorna uma cópia de s em que todas as ocorrências (ou as primeiras n ocorrências, se fornecidas) de pattern foram substituídas pelo que for especificado em replacement, que pode ser uma string, uma tabela ou uma função. gsub também retorna, como seu segundo valor, o número total de correspondências que ocorreram. Isso significa que por padrão ele já substitui todas as ocorrências. Se você quiser que ele substitua apenas a 1ª ocorrência, especifique 1 em n.
-
Isso aí é MySQL. Prefira usar SQLite. ExecuteSQLQuery
-
Obrigado. Sim. O problema ocorre pois as posições dos objetos 4, 5 e 6 dependem da rotação offset do guindasteTop, em vez de sua posição. Dai não consigo obter a real posição deles ao rotacionar o guindasteTop, pois ao rotacioná-lo, os objetos anexados a ele são considerados na mesma posição porém rotacionados. No caso pra obter a posição do guindasteTop é simples, pois o objeto que ele está anexado (guindasteBase) nunca rotaciona, então consigo obter com facilidade a posição dele usando getElementAttachedOffsets (guindasteTop) somado com a posição do guindasteBase. Não funcionou quando rotaciono o guindasteTop.
-
Eae pessoal. Bom, hoje trago um novo problema com objetos anexados. Estou criando um script que cria e movimenta um guindaste localizado nas docas de SF (lá onde faz exportação/importação de veículos). Para criar esse guindaste, eu criei 6 objetos e anexei eles da seguinte maneira: guindasteBase (criado normalmente na posição e rotação correta, não está anexado em nenhum objeto) guindasteMiddle (anexado no guindasteBase, sem nenhum offset) guindasteTop (anexado no guindasteBase com offset de x = 0, y = -3.2, z = 19) guindasteSupport (anexado no guindasteTop com offset de x = 0, y = 50, z = 3.45) guindasteMagnet (anexado no guindasteSupport com offset de x = 0, y = 0, z = -1) theCam (Uma caixa invisível, anexada no guindasteSupport com offset de x = 15, y = -60, z = 20. Será onde a câmera do jogador vai ficar.) Até aí tudo certo, os objetos estão devidamente anexados e suas posições estão aparentemente corretas. O problema surge na hora de começar a movimentar o guindaste. Movimentando a base do guindaste (só se movimenta em duas direções, pra frente e pra trás), não ocorre nenhum problema. Todos os elementos anexados acompanham corretamente a movimentação, que é feita da seguinte maneira: function moveBaseUp () if isTimer (baseTimer) then killTimer (baseTimer) end if not getElementData (guindasteBase, "movingUp") then setElementData (guindasteBase, "movingUp", true) setMarkerSize (enterMarker, 0) baseTimer = setTimer (function() local x, y, z = getElementPosition (guindasteBase) if x <= -1532.5 then setElementPosition (guindasteBase, x+0.1, y+0.1, z) end end, 50, 0) else setElementData (guindasteBase, "movingUp", false) end end function moveBaseDown () if isTimer (baseTimer) then killTimer (baseTimer) end if not getElementData (guindasteBase, "movingDown") then setElementData (guindasteBase, "movingDown", true) baseTimer = setTimer (function() local x, y, z = getElementPosition (guindasteBase) if x >= -1647.5 then setElementPosition (guindasteBase, x-0.1, y-0.1, z) end end, 50, 0) else setElementData (guindasteBase, "movingDown", false) end end Quando o jogador entra no guindaste, as teclas W e S são bindadas para ativar essas funções. W para moveBaseUp e S para moveBaseDown. bindKey (thePlayer, "w", "both", moveBaseUp) bindKey (thePlayer, "s", "both", moveBaseDown) Obs: O movimento da base é na diagonal. Até então tudo certo. O problema começa quando eu rotaciono o guindasteTop, os elementos anexados nele acompanham corretamente mas não é mais possível obter a real localização deles, pois a localização deles depende da rotação do guindasteTop e não mais de sua posição. Como faço para obter a real posição dos objetos anexados no guindasteTop depois de rotacioná-lo? E dos objetos anexados nos objetos que estão anexados nele? Obs: Estou rotacionando ele assim: function rotateTopLeft () if isTimer (topTimer) then killTimer (topTimer) end if not getElementData (guindasteTop, "movingLeft") then setElementData (guindasteTop, "movingLeft", true) setMarkerSize (enterMarker, 0) topTimer = setTimer (function() local x, y, z, rx, ry, rz = getElementAttachedOffsets (guindasteTop) setElementAttachedOffsets (guindasteTop, x, y, z, rx, ry, rz+0.1) end, 50, 0) else setElementData (guindasteTop, "movingLeft", false) end end function rotateTopRight () if isTimer (topTimer) then killTimer (topTimer) end if not getElementData (guindasteTop, "movingRight") then setElementData (guindasteTop, "movingRight", true) topTimer = setTimer (function() local x, y, z, rx, ry, rz = getElementAttachedOffsets (guindasteTop) setElementAttachedOffsets (guindasteTop, x, y, z, rx, ry, rz-0.1) end, 50, 0) else setElementData (guindasteTop, "movingRight", false) end end
-
Utilizando as seguintes funções: SetPlayerTeam SetElementModel SetElementPosition
-
Server-side: function playerLogou (previousAcc, currentAcc) triggerClientEvent (source, "showPanel", getRootElement()) end addEventHandler ("onPlayerLogin", getRootElement(), playerLogou) function playerMorreu (ammo, attacker, weapon, bodypart) triggerClientEvent (source, "showPanel", getRootElement()) end addEventHandler ("onPlayerWasted", getRootElement(), playerMorreu) function setStuff () giveWeapon (client, 46, 1, true) setElementPosition (client, 0, 0, 300, true) end addEvent ("spawnMe", true) addEventHandler ("spawnMe", getRootElement(), setStuff) Client-side: mainWindow = guiCreateWindow (0.1, 0.4, 0.2, 0.3, "Seleção de Skin", true) spawnButton = guiCreateButton (0.25, 0.8, 0.5, 0.2, "spawn", true, mainWindow) guiSetVisible (mainWindow, false) guiWindowSetSizable (mainWindow, false) function mostraOcultaPainel () if guiGetVisible (mainWindow) then guiSetVisible (mainWindow, false) else guiSetVisible (mainWindow, true) end end addEvent ("showPanel", true) addEventHandler ("showPanel", getRootElement(), mostraOcultaPainel) function clickEvents (button) if button ~= 'left' then return false end if source == spawnButton then mostraOcultaPainel() triggerServerEvent("spawnMe", localPlayer) end end addEventHandler ("onClientGUIClick", root, clickEvents) O resto é com vc. Aprenda a construir o painel e a inserir funções nos botões.
-
Bom, vc pode salvar a quantidade de fome do jogador com setElementData, dai usa um setTimer para ir abaixando o nível da fome e da sede de tempos em tempos. (considerando que 0 é morto de fome/morto de sede e 100 é totalmente alimentado/sem sede). Para recarregar, vc pode criar pickups ou lugares pro jogador se alimentar/beber e você pode usar setElementData novamente, colocando os valores cheios. Se algum valor chegar a 0, mata o personagem com killPed. Ou se preferir, você pode ir diminuindo a vida gradativamente do personagem enquanto ele estiver com algum valor 0 usando setElementHealth e setTimer, até ele morrer. Para evitar que os jogadores burlem o sistema, relogando para tentar recarregar a vida, você pode salvar esses valores na conta do jogador quando ele deslogar/desconectar ou morrer, (onPlayerLogout, onPlayerQuit, onPlayerWasted) usando setAccountData. E quando ele logar no server (onPlayerLogin), carrega esses valores da conta usando getAccountData, se não existir esse valor na conta então coloca um valor padrão no jogador e salva esse valor padrão na conta dele, não necessariamente valor cheio.
-
[HELP] Adicionar o jogador do Time atraves do marker/button
Lord Henry replied to TeixeiraRB's topic in Programação em Lua
Perdão pelo vacilo, realmente falta um R ali na linha 14. onde está entraLenhador, é pra ser entrarLenhador addEventHandler ("onMarkerHit", lenhadorMarker, entrarLenhador) Bem que o editor de script do fórum poderia ter um auto-complete, que nem o notepad++ Mas isso teria gerado erro no debug, não teria? Ele teria reclamado que a função entraLenhador não existe. -
Script de Introdução (Video de abertura)
Lord Henry replied to GuilhermeP's topic in Programação em Lua
Eu fiz um script teste, ele mostra o vídeo quando vc usar o comando /intro local x, y = guiGetScreenSize() -- Tamanho da tela do jogador. local webBrowser = createBrowser(x, y, false, false) -- Cria um navegador. function webBrowserRender() dxDrawImage(0, 0, x, y, webBrowser, 0, 0, 0, tocolor(255,255,255,255), true) -- Mostra esse navegador na tela. end addCommandHandler("intro", function() loadBrowserURL(webBrowser, "https://www.youtube.com/embed/RWpYAifm8tk?autoplay=1&controls=0&showinfo=0&rel=0") -- Carrega esse link no navegador. (vídeo em fullscreen e com autoplay) setTimer (function() addEventHandler ("onClientRender", root, webBrowserRender)-- Começa a mostrar o navegador na tela depois de meio segundo. end, 500, 1) setElementFrozen (localPlayer, true) -- Congela o jogador que está vendo o navegador. setTimer (function() -- Começa uma contagem de tempo. Depois de 14 segundos, faz o seguinte: removeEventHandler ("onClientRender", root, webBrowserRender) -- Para de mostrar o navegador na tela. setElementFrozen (localPlayer, false) -- Descongela o jogador. end, 14000, 1) -- (Duração do vídeo + 2 segundos). Sempre teste o tempo para ver se vai fechar antes de terminar o vídeo. Se o seu vídeo tiver por exemplo 1:30 (90 segundos), coloque 92000. end) -
Script de Introdução (Video de abertura)
Lord Henry replied to GuilhermeP's topic in Programação em Lua
Pode ser que o vídeo dele sejam várias imagens sequenciais criadas com DxDrawImage, onde cada frame era uma imagem diferente, parecendo ser um vídeo. E o áudio era tocado com playSound. Mas isso é bem complexo de ser feito e bem pesado. É possível vc criar um navegador na tela do usuário e dar play automaticamente em um vídeo. Mas não é recomendável fazer isso quando o jogador entra no servidor pois ele estará fazendo download de alguns arquivos e podem ocorrer problemas. Para criar um navegador, você tem 2 opções: 1) Navegador em DX, usado para mostrar coisas, sites e conteúdos que o usuário não irá interagir (clicar). Crie ele usando CreateBrowser. 2) Navegador em GUI, usado para mostrar sites e conteúdos onde o jogador pode clicar nos botões, acessar coisas, etc. Crie ele usando GuiCreateBrowser. -
[HELP] Adicionar o jogador do Time atraves do marker/button
Lord Henry replied to TeixeiraRB's topic in Programação em Lua
Qual erro aparece? -
Script de Introdução (Video de abertura)
Lord Henry replied to GuilhermeP's topic in Programação em Lua
MTA não suporta arquivos de vídeo. Não é possível fazer isso que você quer. -
[Ajuda] Destruir veiculo quando o player sair
Lord Henry replied to TeixeiraRB's topic in Programação em Lua
Spawna = createMarker (-314.8583984375, 1546.0322265625, 75.5625 -1, "cylinder", 2, 255 ,0 ,0, 255) veh = {} function Pegar(hitElement) if hitElement and getElementType (hitElement) == "player" then if veh[hitElement] and isElement(veh[hitElement]) then destroyElement (veh[hitElement]) veh[hitElement] = nil end local x, y, z = getElementPosition (hitElement) -- Isso não tem utilidade. Islamico = true -- Isso também não. veh[hitElement] = createVehicle(422,-282.26953125, 1529.451171875, 75.359375, 0, 0, 61.878692626953) warpPedIntoVehicle(hitElement, veh[hitElement]) end end addEventHandler("onMarkerHit", Spawna, Pegar) function sair (quitType, reason, responsible) local hilux = getPedOccupiedVehicle(source) if hilux then destroyElement (hilux) end end addEventHandler ("onPlayerQuit", getRootElement(), sair) -
Fica meio difícil entender seu código server-side sem indentação. Mas pelo que percebi, você adicionou o event "trabalho", mas em momento algum você ativou ele. Veja como é feito no triggerServerEvent. Perceba que após ele adicionar o evento, ele já chama o evento usando addEventHandler. Além disso você precisa passar o marker pelos parâmetros do evento "trabalho" caso você queira usá-lo no outro script, mas você só passou um argumento true. triggerServerEvent(source, "trabalho", source, true) -- Pra que serve o argumento true? E cadê o marker nos argumentos? Você criou o marker mas não passou ele pro outro script pelo trigger.
- 11 replies
-
- script
- triggerevent
-
(and 2 more)
Tagged with:
-
getvehiclevelocity Como detectar que o veículo está dando a ré?
Lord Henry replied to Lord Henry's topic in Programação em Lua
Está disponível na Wiki, isVehicleReversing. -
[Ajuda] Destruir veiculo quando o player sair
Lord Henry replied to TeixeiraRB's topic in Programação em Lua
Vai gerar erro se o jogador que sair não estiver em um veículo. Coloque um verificador para evitar isso. function quitcar (thePlayer) local veh = getPedOccupiedVehicle(thePlayer) if veh then destroyElement(veh) end end addEventHandler ("onPlayerQuit", getRootElement(), quitcar) -
[Ajuda] Destruir veiculo quando o player sair
Lord Henry replied to TeixeiraRB's topic in Programação em Lua
Use isso: onPlayerQuit destroyElement -
\n Caracteres especiais obtidos de arquivo XML se tornam inválidos?
Lord Henry replied to Lord Henry's topic in Programação em Lua
Foi oq eu optei em fazer. Refiz o \n no código quando ele detecta o underline no XML. -
\n Caracteres especiais obtidos de arquivo XML se tornam inválidos?
Lord Henry replied to Lord Henry's topic in Programação em Lua
Descobri um jeito de corrigir, mas parece gambiarra. Eu substituí todos os \n do XML por underline ( _ ). E então no script, eu substituo o underline pelo \n. Já que o \n foi criado no próprio script, dai ele funciona. xmlACLValues[i][2] = xmlNodeGetAttribute(xmlNodes[i][k], "title") xmlACLValues[i][2] = string.gsub (xmlACLValues[i][2], "_", "\n")