-
Posts
543 -
Joined
-
Last visited
-
Days Won
38
Posts posted by androksi
-
-
1 minute ago, Lord Henry said:
Explique o porquê disto. A diferença entre as funções.
É uma opção pessoal. Prefiro usar onMarkerHit pois você pode já anexar o marker neste evento, acho que facilitaria pra ele e deixaria mais otimizado. Já no onPlayerMarkerHit não é possível anexar um marker, você tem que adicionar o evento como root e, dentro do evento, verificar os marcadores.
- 1
- 1
-
Você colocou pra destruir "rndPos", sendo que rndPos é uma variável que tá armazenando posições.
Tente substituir por isso:
if ( marker and isElement( marker ) ) then destroyElement( marker ); end if ( blip and isElement( blip ) ) then destroyElement( blip ); end if ( object and isElement( object ) ) then destroyElement( object ); end
Também, retire a palavra local antes de marker, blip e object. Se eu fosse você, passaria a usar o evento onMarkerHit ao invés de onPlayerMarkerHit.
- 1
-
5 minutes ago, #DaNiLiN said:
Mas sobre vários servidores ter mais de 1 Skin com várias caricaturas diferentes, É tudo no cj?
Não. Como você sabe, basta converter skins do GTA pro MTA. O que eu disse é sobre personalizar o personagem. Vários tipos de pele, cabelo, tamanho do nariz, boca, olhos, seios, bunda, novas camisas, luvas e calças, esses itens em geral, isso sim é tudo no CJ, feito com shaders.
O sistema é simples de fazer, mas criar esses modelos/texturas é bem complexo.
- 1
-
3 minutes ago, #DaNiLiN said:
@asrzk Eu consigo fazer em outra skin sem ser do cj? É possivel?
Não, não é possível. Apenas o CJ é compatível com isso.
-
Isso é feito através de shaders. Basicamente, você precisa criar texturas de pele, rosto, cabelo, camisas, calças, tênis etc e aplicar no CJ. Daí você poderá facilmente alterar a roupa, pele, cabelo, apenas aplicando shaders.
- 2
-
2 minutes ago, zMpyster said:
No txd está... Size 512*512, 32 bit
Tente redimensionar para 256, tanto na largura quanto na altura. Se mesmo assim não funcionar, baixe outra camisa.
- 1
-
Existe sim, Lord.
-> https://wiki.multitheftauto.com/wiki/Clothing_Component_IDs
-
De onde você está baixando essas novas texturas?
A textura deve estar assim e ter tamanho 256x256.
-
Exemplo com localPlayer
-- // CLIENT-SIDE triggerServerEvent( "someTrigger", localPlayer, 1, 2, 3 ); -- // SERVER-SIDE addEvent( "someTrigger", true ); addEventHandler( "someTrigger", root, function( n1, n2, n3 ) print( n1 ); -- // retorna 1 print( n2 ); -- // retorna 2 print( n3 ); -- // retorna 3 --[[ Quando você usa o parâmetro 'localPlayer' em algum triggerServerEvent, o elemento retornado é source. Abaixo está um exemplo simples de como obter o nickname do jogador que executou o 'someTrigger'. ]]-- print( getPlayerName( source ) ); end );
Exemplo com resourceRoot
-- // CLIENT-SIDE triggerServerEvent( "someTrigger", resourceRoot, 1, 2, 3 ); -- // SERVER-SIDE addEvent( "someTrigger", true ); addEventHandler( "someTrigger", resourceRoot, function( n1, n2, n3 ) print( n1 ); -- // retorna 1 print( n2 ); -- // retorna 2 print( n3 ); -- // retorna 3 --[[ Agora, quando você usa o parâmetro 'resourceRoot' em algum triggerServerEvent, o elemento retornado é client (que seria o mesmo caso do source, porém client). Veja o exemplo abaixo. ]]-- print( getPlayerName( client ) ); end );
- 2
-
31 minutes ago, Gaimo said:
Quando o jogador logar eu preciso deletar todos os elementos criados né?
Não é necessário, mas como você disse
32 minutes ago, Gaimo said:AMO OTIMIZAÇÃO!
Então sim, pode destruir os elementos e anular as variáveis. A propósito, vejo que você ainda está errando naquilo que eu lhe disse, sobre nomes iguais em tabelas. Veja o seu código com atenção e tente-o corrigir. Cada vez que você posta algo aqui, fico surpreendido com sua evolução. De fato, colocar todos os elementos dentro de apenas uma função, fica bem otimizado. Seus eventos estão otimizados. Lembre-se: verifique o seu código e tente encontrar os erros de repetição.
- 1
- 1
-
9 minutes ago, Gaimo said:
Qual a maneira correta de fazer para trocar do login para o register? Porque assim está travando muito, se ir do login para o register e voltar umas duas vezes começa um baita lag.
Quando você aciona a função de aparecer o login ou registro, você está CRIANDO novamente o conteúdo, esse é o motivo do travamento. Use simplesmente a função guiSetVisible para deixar a window visível.
Outro detalhe: você está usando, novamente, o mesmo nome para dois elementos.
Isto:
CEGUI.image["background"] = guiCreateStaticImage( 0, 0, screenW, screenH, "files/background.jpg", false )
Troque o nome da janela de registro para "background_register" e a janela de login para "background_login". Daí, para fazer aparecer ou ocultar, basta fazer isso:
addEventHandler ("onClientGUIClick", guiRoot, function() if (source == CEGUI.button["back"]) then guiSetVisible( CEGUI.image[ "background_login" ], true ); -- // Irá voltar para a janela de login guiSetVisible( CEGUI.image[ "background_register" ], false ); -- // Irá ocultar a janela de registro e seus respectivos elementos que estão anexados. end end end)
- 2
-
Verifique se a resolução do seu monitor é igual a resolução do MTA. Se o seu monitor for 1920x1080, também deixe, dentro do jogo, 1920x1080. (Lembre-se que a taxa de bits também influencia x16/x32).
Caso não resolva, pode ser problema de compatibilidade do seu driver de vídeo com o Windows 10.
-
Faça assim:
-- // CLIENT-SIDE addEventHandler( "onClientPlayerDamage", root, function( attacker, weapon, bodypart, loss ) cancelEvent( ); -- // Cancela o dano if ( attacker == localPlayer ) then -- // Verifica se o 'attacker' é o jogador que está dando dano e não o que está sofrendo o dano triggerServerEvent( "onClientGotDamage", localPlayer, attacker, weapon, bodypart, loss, source ); -- // Sincroniza o dano else if ( weapon == 53 ) then -- // Verifica se o jogador sofreu uma queda setElementHealth( localPlayer, loss ); -- // Sofreu? Então ele perderá vida end end end ); -- // SERVER-SIDE local TABLE_DAMAGE = { -- // [ID da Arma] = Novo Dano [23] = 20, -- // Pistola Silenciada [24] = 35, -- // Desert Eagle [30] = 25, -- // AK-47 }; addEvent( "onClientGotDamage", true ) -- // atirador, arma, bodypart, dano, alvo addEventHandler( "onClientGotDamage", root, function( attacker, weapon, bodypart, damage, target ) if ( not isPeadDead( attacker ) ) then -- // Caso o atirador esteja morto, o alvo não sofrerá mais danos local newDamage local targetArmor = getPedArmor( target ); -- // Obtém o valor do colete (se tiver) local targetHealth = getElementHealth( target ); -- // Obtém o valor da vida if ( getElementData( attacker, "mane123" ) ) then -- // A sua verificação, se ele é um "admin" local g_Damage = TABLE_DAMAGE[ weapon ] or damage; newDamage = g_Damage; if ( targetArmor > 0 ) then -- // O alvo tem colete? setPedArmor( target, targetArmor - newDamage ); else -- // O alvo não tem colete? Então bora tirar a vida dele. local h = math.max( targetHealth - newDamage, 0 ); setElementHealth( target, h ); if ( h <= 0 ) then killPed( target, attacker, weapon, bodypart, false ); end end end end end );
- 2
-
Usando essa função creio eu que não, não seja possível. Porém há outra forma de fazer isso. Usando o evento onClientPlayerDamage.
-
Obtenha o texto com guiGetText e verifique se é maior que 0.
Exemplo:
local g_Text = guiGetText( eLogin ); if ( #g_Text > 0 ) then -- O símbolo # (hashtag) antes de uma variável que é string, retorna o valor de caracteres que essa variável possui. -- // blá, blá, blá end
OBS.: Não é recomendado colocar o mesmo nome da variável para a mesma função. Você definiu "eLogin" para o campo de login e registro. Sendo assim, use sempre tabelas para armazenar e poupar Memória RAM do jogador.
local CEGUI = { window = { }, button = { }, edit = { }, gridlist = { } } -- // Exemplo com números CEGUI.window[ 1 ] = guiCreateWindow( ... ); CEGUI.button[ 1 ] = guiCreateButton( ... ); CEGUI.edit[ 1 ] = guiCreateEdit( ... ); CEGUI.edit[ 2 ] = guiCreateEdit( ... ); -- // Exemplo com strings (nomes) CEGUI.window[ "janelaPrincipal" ] = guiCreateWindow( ... ); CEGUI.button[ "botãoRegistro" ] = guiCreateButton( ... ); CEGUI.edit[ "campoUsuário" ] = guiCreateEdit( ... ); CEGUI.edit[ "campoSenha" ] = guiCreateEdit( ... ); --[[ Você pode usar tanto números quanto nomes. (Para mim, nomes são melhores para facilitar o que cada um é) SIM! Você pode usar acentuação caso esteja usando strings. ]]--
- 1
-
Veja este tópico já resolvido. É o mesmo conceito.
- 1
-
-
Engraçado que ele começa falando que o script é para retirar as armas, depois que uma barra de progresso chegar em 100%. De repente, no segundo reply dele, o propósito do script muda. OMEGALUL
-
50 minutes ago, Lord Henry said:
É, mas NÃO TEM COMO fazer um painel DX fora de funções, né? hauahauahua
Pois ele depende de uma função render.
KKKKK. Concordo. É que eu uso minha framework, aí eu meio que fiz todas as funções GUI como DX. dxCreateGridList, dxCreateButton, dxCreateScrollBar, dxCreateWindow, dxWindowSetMovable, dxWindowSetSizable etc. Todas as funções de GUI, porém em DX. Acabei me esquecendo desse detalhe do render.
-
24 minutes ago, danblemes1 said:
Não sei se é do meu PC, mas tipo, quando eu tava com a GridList dentro da Função, assim que eu abria o Painel começava a travar tudo
Isso definitivamente NÃO é normal. Eu costumo fazer meus painéis em DirectX(DX) e nunca tive problemas com performance.
-
Apenas fiz um exemplo. Você escreve o código do jeito que quiser (claro, dentro dos padrões da programação).
Respondendo: Sim, pode deixá-los fora de alguma função.
-
Se sua definição de "logados" for apenas os jogadores que estiverem registrados e usando uma conta, você pode usar, em um evento onPlayerLogin, a função setElementData e adicionar uma data temporária e, na função de adicionar os jogadores na GridList, basta verificar com getElementData.
-- // SERVER-SIDE addEventHandler( "onPlayerLogin", root, function( _, acc ) -- // Assim que o jogador logar, vamos armazenar, dentro da uma data, o valor true setElementData( source, "isPlayerLoggedIn", true ); end ); -- // CLIENT-SIDE local Screen = Vector2( guiGetScreenSize( ) ); local gridList = guiCreateGridList( Screen.x - 300, Screen.y + 250, 280, 180, false ); guiGridListAddColumn( gridList, "Jogadores", 0.85 ); -- // Adicionar apenas os jogadores logados for _, v in pairs( getElementsByType( "player" ) ) do if ( getElementData( v, "isPlayerLoggedIn" ) ) then local row = guiGridListAddRow( gridList ); guiGridListSetItemText( gridList, row, 1, string.gsub( getPlayerName( v ), "#%x%x%x%x%x%x", "" ), false, false ); end end
-
Melhorou!
-
Troque essa função:
function Texto (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) dxDrawText(a, x*b, y*c, x*d, y*e, f, x*g, h, i, j, k, l, m, n, o) end
Por esta:
function Texto (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) dxDrawText(a, x*b, y*c, x*d, y*e, f, y*g, h, i, j, k, l, m, n, o) end
Já disse em um outro tópico que não se usa a posição "X" da tela para ajustar o tamanho de fontes, e sim a posição "Y".
- 1
bolsa de dinheiro aleatório
in Programação em Lua
Posted · Edited by asrzk
Quando a função for chamada, um novo tempo será definido. Pelo o que eu vejo na sua tabela: 5, 10, 15 ou 20 minutos.
Opcional. Não irá fazer muita diferença neste caso.