Cуdigos Ъteis #1

Opa! nгo vi o vehicleid ali embaixo. Peguei a funзгo do cara ali encima, sу modifiquei pra ficar mais rбpido


https://sampwiki.blast.hk/wiki/RemovePlayerFromVehicle

Nгo tem parвmetros vehicleid. Tira eles da lн
Reply

Corrigido.
Reply

pawn Код:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
    if(newstate == PLAYER_STATE_DRIVER) {
        new
            modelid = GetVehicleModel(GetPlayerVehicleID(playerid));
        ;
         
        if(GetPlayerScore(playerid) < 100) {
            switch(modelid) {
                case 425, 432, 520: {
                    SendClientMessage(playerid, 0xFF0000AA, "** Apenas jogadores com 100+ de Score podem usar este veнculo! **");
                    RemovePlayerFromVehicle(playerid);
                }
            }
        }
    }
    return true;
}
Reply

Quote:
Originally Posted by [Full]Garfield[XDB]
Посмотреть сообщение
Primeiro de tudo eu nгo falei nada, se vocк ouviu deve estar drogado ou coisa assim,
no momento que eu corrigi vocк, eu estava escrevendo, hб uma
grande diferenзa entre os dois, e nгo me vem com este seu portuguкs medнocre, que tenho
que cada vez procurar no ****** os significados. se eu quiser, posso escrever um texto
em linguagem formal, com palavras inter-relacionadas, tornado-o aplausнvel.

Ah, vocк falou Ultraje, me relembrei da banda Ultraje Riger *-*


Digo o mesmo para vocк, "Vocк tem moral para falar" ?
o fуrum foi feito para discussхes e projetos, e aqui estб houvendo uma
singela discussгo de dois membros do fуrum.
Tudo bem Garfield, como eu disse, nгo quero criar problemas, alйm do mais, esquecendo o portuguкs, eu admiro o seu talento em programaзгo. Queria eu ter este talento.

Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
pawn Код:
stock numeroImpar(num)
{
    return num % 2;
}
Bom cуdigo. Mas й melhor assim
pawn Код:
#define numeroImpar(%0)  \
                            (%0 % 2)

#define numeroPar(%0)  \
                            !numeroImpar(%0)
ou

%0 & 1

Enfim.
Bruno, por que nгo faz um tutorial sobre esses operadores menos utilizados como &, |, >> etc? Seria de grande ajuda, posto que poucos sabem utilizar. Sу uma sugestгo

@TOPIC

pawn Код:
#define CallBack:%0(%1)\
        forward %0(%1);\
        public %0(%1)
Reply

Comando "/procurar" melhorado (eu vi esse cmd aqui no cуdigo ъteis, mas nem lembro de quem.)
* Procura pelo player colocando um CheckPoint nele;
* O CheckPoint segue o player;
* O Player pode parar a procura digitando "/procurar d";
* Se o Player sair do servidor й desativada a procura.

Topo do GM
Код:
forward Procurar(playerid,give);
new procurando[MAX_PLAYERS];
Comando
Код:
CMD:procurar(playerid, params[]) {
	if (procurando[playerid]==0)
	{
	new tmp[128];
	tmp = strtok(cmd, idx);
	giveplayerid = strval(tmp);
	if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000FF,"[SERVER] USO: /procurar [ID]");
	if(!IsPlayerConnected(giveplayerid)) return SendClientMessage(playerid, 0xFFFFFFFF, "[SERVER] Id invalido.");
        SendClientMessage(playerid, 0xFFXX22AA, "[SERVER] Para desativar o GPS use /procurar d");
	new Float:X,Float:Y,Float:Z;
	procurando[playerid]=1;
	GetPlayerPos(giveplayerid, X,Y,Z);
        SetPlayerCheckpoint(playerid, X,Y,Z, 6);
	timer[playerid] = SetTimerEx("Procurar",100,true,"ii",playerid,giveplayerid);
	}
	if (procurando[playerid]==1)
	{
    	switch (cmd[10])
    	{
		case 'd': DisablePlayerCheckpoint(playerid), KillTimer(timer[playerid]), procurando[playerid]=0, SendClientMessage(playerid, 0xFFFFFFFF, "[SERVER] GPS Desativado.");
		}
	}
	return 1;
}
Final do GM
Код:
public Procurar(playerid,give)
{
if(!IsPlayerConnected(give)) {
DisablePlayerCheckpoint(playerid), KillTimer(timer[playerid]), procurando[playerid]=0;
return SendClientMessage(playerid, 0xFFFFFFFF, "[SERVER] O Player saiu");
}
Reply

pawn Код:
stock TerroR_HashKey(Dados[]) {
    static Len, Hash; Len = strlen(Dados), Hash = 0;
    for(new i; i != Len; ++i) Hash += Dados[i];
    return Hash;
}
Optimizado e Irreversнvel! Perfeito para Senhas...

@Edit

Retorna Inteiro assim evitando ter de comparar usando 'strcmp'!

Simples Exemplo:
pawn Код:
new SenhaHash = DOF2_GetInt(File, "Senha");
if(SenhaHash == TerroR_HashKey(inputtext)) {
//Acertou!
}
Reply

Quote:
Originally Posted by paulor
Посмотреть сообщение
pawn Код:
stock TerroR_HashKey(Dados[]) {
    static Len, Hash; Len = strlen(Dados), Hash = 0;
    for(new i; i != Len; ++i) Hash += Dados[i];
    return Hash;
}
Optimizado e Irreversнvel! Perfeito para Senhas...
Pra que isso vai ser ъtil se й Irreversнvel? Como vou obter a informaзгo de volta? -q
Reply

Quote:
Originally Posted by CidadeNovaRP
Посмотреть сообщение
Pra que isso vai ser ъtil se й Irreversнvel? Como vou obter a informaзгo de volta? -q
Senha nгo precisa ser UnHash, Compare ela com Hash... Se nгo pode ter problemas com Roubo de senhas!
Reply

Quote:
Originally Posted by paulor
Посмотреть сообщение
Senha nгo precisa ser UnHash, Compare ela com Hash... Se nгo pode ter problemas com Roubo de senhas!
Oh yes, entendi.
Reply

pawn Код:
/*
 * Concatenate two numbers
 * © Copyright Bruno da Silva
 */


intcat(n1,n2)
{
    static
        string[10]
    ;
   
    format(string, 10, "%d%d", n1,n2);
   
    return strval(string);
}
Reply

Jб passou 24 horas desde meu ъltimo post.
Gang Zonas Circulares
Imagem:


Usando floatsin, floatcos e uns cбlculos matemбticos bбsicos.


Funзгo:
pawn Код:
stock GangZoneRedonda(Float:raio, Float:x , Float:y, color, gzs = 20) {


    static
        Float:gz_X,
        Float:gz_Y,
        gzIndenti;
   
    for(new i; i < gzs; i++){
   
        gz_X = floatcos(i/(float(gzs))*6.28, radian) * raio + x ;
        gz_Y = floatsin(i/(float(gzs))*6.28, radian) * raio + y  ;
       
        gzIndenti = GangZoneCreate(gz_X-(10.0), gz_Y-10.0, gz_X+10.0, gz_Y+10.0);
        GangZoneShowForAll(gzIndenti, color);
    }
    return gzIndenti;
}
Porque 6.28? Porque й o dobro do PI oras! PI й a principal relaзгo numйrica com cнrculos, para manipulaзгo deles torna-se obrigatуrio o uso de PI

Porque 10.0? Porque й o tamanho de cada GZ unitбria, para formar o circulo.

Isto pode ser adaptado a text draws, tornando MUITOO ъtil este calculo para quem deseja fazer desenhos e coisas do tipo Eu usei um trecho de cуdigo parecido para fazer um circulo de fogo ao redor do jogador (estilo filme). Mas vocк pode achar outras utilidades Tambйm jб fiz um coraзгo usando 2 bolas e uma linha reta

Exemplo:
pawn Код:
GangZoneRedonda(100.0, 0.1,0.1, 0xFF0000FF,200);
Para checar se o cara estб dentro do circulo basta usar:
IsPlayerInRangeOfPoint(playerid, 100.0, 0.1, 0.1, 0.1);

0.1 й as coordenadas que coloquei na funзгo. 100.0 й o nosso radius que й o centro do circulo.


Por Bruno da Silva
Reply

E pra colocar cor dentro dele?
Reply

Quote:
Originally Posted by sanalex
Посмотреть сообщение
E pra colocar cor dentro dele?
Teria que criar mais umas 111384 gangzones, entгo ocuparia muito espaзo. Estou criando um algorнtimo aqui para colocara cor dentro, usando algumas gang zones grandes, mas й algo bastante difнcil, pelo menos pra mim й.

Os caras matemбticos deste tуpico poderiam me ajudar agora ..

Para colocar as gangzones dentro teria apenas que dar X do angulo anterior atй o X do angulo posterior. Que seria uma diferenзa de 180 graus. O problema й que ocuparia muitas gang zones. rs

pawn Код:
stock TerroR_HashKey(Dados[]) {
    static Len, Hash; Len = strlen(Dados), Hash = 0;
    for(new i; i != Len; ++i) Hash += Dados[i];
    return Hash;
}
Isto й totalmente inseguro. O nъmero de colisхes que pode ocorrer no hash sгo extremamente altos, isto й. Vocк pode achar umas 700 senhas para a ъnica senha correta.

Exemplo
ABC = CBA = BCA = CARACETERE COM VALOR DE "CBA" entre outras combinaзхes. Um simples brute force derruba isto em questгo de minutos.
Reply

Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
Teria que criar mais umas 111384 gangzones, entгo ocuparia muito espaзo. Estou criando um algorнtimo aqui para colocara cor dentro, usando algumas gang zones grandes, mas й algo bastante difнcil, pelo menos pra mim й.

Os caras matemбticos deste tуpico poderiam me ajudar agora ..

Para colocar as gangzones dentro teria apenas que dar X do angulo anterior atй o X do angulo posterior. Que seria uma diferenзa de 180 graus. O problema й que ocuparia muitas gang zones. rs

pawn Код:
stock TerroR_HashKey(Dados[]) {
    static Len, Hash; Len = strlen(Dados), Hash = 0;
    for(new i; i != Len; ++i) Hash += Dados[i];
    return Hash;
}
Isto й totalmente inseguro. O nъmero de colisхes que pode ocorrer no hash sгo extremamente altos, isto й. Vocк pode achar umas 700 senhas para a ъnica senha correta.

Exemplo
ABC = CBA = BCA = CARACETERE COM VALOR DE "CBA" entre outras combinaзхes. Um simples brute force derruba isto em questгo de minutos.
Verdade, Sempre pensando em coisas q nгo me passa na cabeзa...

@Edit

Corrigido!

pawn Код:
stock TerroR_HashKey(Dados[]) {
    static Len, Hash; Len = strlen(Dados), Hash = 0;
    for(new i; i != Len; ++i) Hash += (Dados[i]+Dados[(i+1)]);
    return (Hash*123);
}
Reply

Esse seu cуdigo nгo vai dar problema por causa do -1 ?

Terminei a funзгo para completar o circulo:

Gang Zonas Redondas


Esta funзгo й similar as gang zones circulas. Porйm preenche totalmente o circulo!
pawn Код:
stock GangZoneRedonda(Float:raio, Float:x , Float:y, color, gzs = 20) {

    static
        Float:gz_X,
        Float:gz_Y,
        Float:gz_XZ,
        Float:gz_YZ,
        gzIndenti;
   
    for(new i; i < gzs; i++){
   
        gz_YZ = i/(float(gzs))*6.28;
       
        gz_Y = floatsin(gz_YZ, radian) * raio + y;
        gz_X = floatcos(gz_YZ, radian) * raio + x;
       
        gz_XZ = floatcos((i+gzs/2)/(float(gzs))*6.28, radian) * raio + x ;

        gzIndenti = GangZoneCreate(gz_X, gz_Y, gz_XZ, gz_Y+(raio)/2);
        GangZoneShowForAll(gzIndenti, color);
    }
    return gzIndenti;
}
Porque 6.28? Porque й o dobro do PI oras! PI й a principal relaзгo numйrica com cнrculos, para manipulaзгo deles torna-se obrigatуrio o uso de PI

Porque 10.0? Porque й o tamanho de cada GZ unitбria, para formar o circulo.

Isto pode ser adaptado a text draws, tornando MUITOO ъtil este calculo para quem deseja fazer desenhos e coisas do tipo Eu usei um trecho de cуdigo parecido para fazer um circulo de fogo ao redor do jogador (estilo filme). Mas vocк pode achar outras utilidades Tambйm jб fiz um coraзгo usando 2 bolas e uma linha reta

Exemplo:
Quote:

GangZoneRedonda(100.0, 0.1,0.1, 0xFF0000FF,200);

Para checar se o cara estб dentro do circulo basta usar:
IsPlayerInRangeOfPoint(playerid, 100.0, 0.1, 0.1, 0.1);

0.1 й as coordenadas que coloquei na funзгo. 100.0 й o nosso radius que й o centro do circulo.


Por Bruno da Silva
Reply

Quote:
Originally Posted by sanalex
Посмотреть сообщение
Muito bom Drakins! os limites do SA-MP sгo cada vez menores .

@OFF

Йeehh Curintia poha!!!
Й eu estava atй pensando em criar um streamer, mas como nгo tem gang zones per player й impossнvel

Que merda. Sou colorado e odeio Corinthians, ainda preferia que o Boca ganhasse, nгo seria assim se o titulo de 2005 do Inter nгo tivesse sido roubado .. Vocк sabe do que eu estou falando. Enfim, parabйns pro Corinthians, pelo menos este nгo foi roubado !!

IsPlayerInArea Otimizado

Й o mesmo usado no sistema de sinaleiras

pawn Код:
IsPlayerInArea(playerid, Float:xmin, Float:ymin, Float:xmax , Float:ymax)
{
    static
        Float:X,
        Float:Y,
        Float:Z
    ;

    GetPlayerPos(playerid, X, Y, Z);
   
    return (X >= xmin && X <= xmax && Y >= ymin && Y <= ymax) ;
}
Reply

Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
Esse seu cуdigo nгo vai dar problema por causa do -1 ?
?? Problemas nгo, pois testei e funfou perfeitamente... Mais sem bem que aquele hash para a pessoa quebrar ele, ela teria que pelo menos saber a senha neh, mais sei que aumentaria as chances de chute, mais esse foi o mais simples que fiz com seguranзa total!
Reply

Paulo em relaзгo ao seu cуdigo eu aconselho inverter a posiзгo dos caracteres e intercalar os valores, de modo que fique uma combinaзгo ъnica. Como o valor fica grande no final use bit shift ou divisгo durante a operaзгo

** Jб acho algum cуdigo para postar moderaзгo

Editado:
pawn Код:
HashKey(Dados[]) {

    static
        Len,
        Hash,
        valor;

    Len = strlen(Dados),
    Hash = 0;
    valor = 0;

    for(new i; i != Len; ++i) {
   
        valor = Dados[i];
       
        if(valor < 128) {            // caso letra atual for colisora
            valor = 8160 * Dados[i]; // 32 chars (32 * 255)
        }
       
        Hash += valor;
    }
    return Hash;
}
Reply

Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
Paulo em relaзгo ao seu cуdigo eu aconselho inverter a posiзгo dos caracteres e intercalar os valores, de modo que fique uma combinaзгo ъnica. Como o valor fica grande no final use bit shift ou divisгo durante a operaзгo

** Jб acho algum cуdigo para postar moderaзгo
Tbm, nгo entendi a primeira coisa, Mais jб vai sair uma combinaзгo unica nesse Code!

pawn Код:
stock TerroR_HashKey(Dados[]) {
    static Len, Hash; Len = strlen(Dados), Hash = 0;
    for(new i; i != Len; ++i) Hash += (Dados[i]+Dados[(i+1)]);
    return (Hash << 10);
}
@Edit

Bruno dps me coloca no Grupo da iPs que o Miki *** me tirou de lб...
Reply

Nгo. Ainda sim nгo serб seguro. Em um teste que fiz com udbEncode, consegui achar umas 150 combinaзхes de senhas iguais (colisхes) em poucos minutos.

Um algorнtimo que atualmente tenho em mente й o algorнtimo de vocк separar caracteres com mesmo valor

Basta pegar os caracteres que vem um apуs o outro e tirar este sistema:

A "fуrmula" de colisгo й a seguinte:
char a + char b = -> (char a * 2) + 1

Como assim Bruno?

Simples. Faзa no Pawn
pawn Код:
printf("%d", 'a' + 'b');
E nos retornar 195

Agora faзa
pawn Код:
printf("%d", (('a' + 1)* 2));
Adivinha? 195



Tб mais qual o problema disto?
pawn Код:
printf("%c", 195);
Isto й
'a' + 'b' serб o mesmo 'Г'

Faзa:
pawn Код:
printf("%d - %d", Г, 'a' + 'b');

Como bloquear isto?
Sabemos que os caracteres vгo de 0 a 255. Logo todos caracteres menores que (255 / 2) - 1 poderгo se repetir. Entгo vocк precisa checar se um destes caracteres faz parte desta lista. Caso fazer eleve o nъmero deles para um valor que nгo dк colisгo.


Essa й minha dica. Passe os valores que colidem para maior que a soma de 255 * 128 desta maneira vocк farб um hash que nгo hб colisхes em strings menores que 128 caracteres

POST ACIMA EDITADO COM CУDIGO DE EXEMPLO
Reply


Forum Jump:


Users browsing this thread: 6 Guest(s)