Jump to content

androksi

Other Languages Moderators
  • Posts

    543
  • Joined

  • Last visited

  • Days Won

    38

Posts posted by androksi

  1. 4 minutes ago, Gaimo said:

    O timer vai usar isso uma vez ou sempre que a função dele for chamada ele ganha um novo tempo?
     

    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.

    4 minutes ago, Gaimo said:

    E na ideia de OTIMIZAÇÃO, ficaria mais otimizado se eu colocasse as variáveis:

    Opcional. Não irá fazer muita diferença neste caso.

    • Thanks 1
  2. 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. :D

    • Like 1
    • Thanks 1
  3. 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.

    • Thanks 1
  4. 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.

    • Like 1
  5. 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.

    • Like 2
  6. 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 );

     

    • Thanks 2
  7. 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.

    • Like 1
    • Thanks 1
  8. 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)

     

    • Thanks 2
  9. 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 );

     

    • Thanks 2
  10. 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.
    ]]--

     

    • Thanks 1
  11. 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.

  12. 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.

  13. 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

     

  14. 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".

    • Thanks 1
×
×
  • Create New...