Cуdigos Ъteis #1

pawn Код:
stock tSetString(Text:texsitd, str[], pid = -1)
{
    TextDrawSetString(texsitd, str);
    return pid == -1 ? (TextDrawShowForAll(texsitd)) :  (TextDrawShowForPlayer(pid, texsitd));
}
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

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;
}
Esse seu Hash tbm nгo funciona, eu testei assim: "Paulo", "aPulo", "uolPa", enfim deu tudo o mesmo Hash.

Dei uma simplificada, mais eu testei com todos as combinaзхes para "Paulo" e nenhuma deu o mesmo resultado!

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;
}
Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
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.
Por Favor me mostre como vc encontrou para que eu possa aperfeiзoar se necessбrio!
Reply

pawn Код:
hash_reeBR(input[])
{
    new
        keycore = 0,
        index,
        len = strlen(input);
   
    for(; index < len; index++)
    {
        if(!keycore)
            keycore = input[index] & 0xFF;
        else
            keycore = (keycore + (input[index] & 0xFF)) / 2;
    }

    new hash[129];
    for(index = 0; index < len; index++)
    {
        new currentcell = 128 % len,
            hex[2],
            value;
           
        value = (input[index] * keycore) % 0xFF;
        format(hex, sizeof hex, "%x", value);
       
        hash[currentcell] = hex[0];
        hash[currentcell+1] = hex[1];
    }
    return hash;   
}
Deve funcionar.

** Esse hash й de mгo ъnica. Hash, redundвncia...
Reply

Nem vai funfar! ^^
Reply

Quote:
Originally Posted by leonardo1434
Посмотреть сообщение
Tava sem nada pra fazer, entгo resolvi tentar consertar o cуdigo de ambos. (inclui um mini tutorial sobre o que aprendi. )

pawn Код:
new // Porque nгo usar static? Bom, ela vai ser resetada ao termino da funзгo onplayerdeath.
Spree[MAX_PLAYERS],// Rsrsrsrs, por nativo do samp MAX_PLAYERS = 500; Se usas a funзгo char, vai dividir 500/4  = 125; Entгo este spree sу vai funcionar atй 125 jogadores. D:
String[57]
// Eu atй agora, nгo entendi qual й o ponto de criar uma variбvel chamada kills, se ela nem vai chegar a ser usada para no mнnimo salvar, E levando em consideraзгo que isto й um sistema de Spree.
// Gar, pra que aumentar a var de quem morreu jб que se trata de Killing Spree e nгo de Dying Spree(rsrsrsrs ri alto)
// Tambйm nгo entendi o ponto de usar um settimer ou gettimer nisso >_>....:confused: , eu sei nem aparece D:
;

public OnPlayerDeath(playerid, killerid, reason)
{
    Spree[killerid] ++; // aumenta o spree.
    format(String, sizeof(String),"%s Matou %s", GetNick(killerid), GetNick(playerid)); SendClientMessageToAll(-1, String);
    // 25 + 25 + matou + 2 espaзos = 57; correto.
    // Meio que desnecessбrio usar else if, jб que vai ser verdadeiro todos os if's.
    if(Spree[killerid] == 2) GameTextForPlayer(killerid, "DOUBLE KILL", 2000, 1); // Enviando a mensagem caso seja verdadeiro
    if(Spree[killerid] == 3) GameTextForPlayer(killerid, "TRIPLE KILL", 2000, 1);// Enviando a mensagem caso seja verdadeiro
    if(Spree[killerid] == 4) GameTextForPlayer(killerid, "MULTI KILL", 2000, 1);// Enviando a mensagem caso seja verdadeiro
    if(Spree[killerid] == 5) GameTextForPlayer(killerid, "Unstoppable Kill", 2000, 1);// Enviando a mensagem caso seja verdadeiro
    if(Spree[killerid] >= 6) GameTextForPlayer(killerid, "Get Sam!", 2000, 1);// Enviando a mensagem caso seja verdadeiro

    Spree[playerid] = 0; // playerid = que morreu, entгo se ele morreu й porque perdeu o spree :O
    return true;
} // Aqui, й o fim da funзгo, apуs isto, se fosse uma static serб resetada а 0, Assim, sendo um ciclo continuo.
// Sobre o switch, porque sу ter 9 casos? >_> no logic.
stock GetNick(p)
{
    // poderia ser assim static nome[100 char];
    // porque estб 100? :O 100/4 = 25; ( char = 4), mas nгo deveria ser 24 jб que o mбximo de caracteres para um nome й 24? Nгo, pois й adicionado mais 1 celula, para o fechamento da string.
    static nome[25]; GetPlayerName(p, nome,sizeof(nome));  // preciso explicar? rsrsrs, formatando o nome de p.
    return nome;// retornando a var nome.
}
Faзo de suas palavras minhas palavras.
pawn Код:
// Rsrsrsrs, por nativo do samp MAX_PLAYERS = 500; Se usas a funзгo char, vai dividir 500/4  = 125; Entгo este spree sу vai funcionar atй 125 jogadores. D:
Vei, quase tive um infarto, na moral!

pawn Код:
// Meio que desnecessбrio usar else if, jб que vai ser verdadeiro todos os if's.
Vou infartar vei...

pawn Код:
// poderia ser assim static nome[100 char];
    // porque estб 100? :O 100/4 = 25; ( char = 4), mas nгo deveria ser 24 jб que o mбximo de caracteres para um nome й 24? Nгo, pois й adicionado mais 1 celula, para o fechamento da string.
Assim se qr que eu morra vei...

Explicaзгo do CHAR.

pawn Код:
new String[MAX_PLAYERS]; //String com 500 Celulas.

new String[MAX_PLAYERS char]; //Quando usado CHARS o modo de se usar a Array й {Pos}. CHARS ele poupa memуria em atй 4 vezes, que seria normalmente 32 bit / 4 ficando 8 bit assim vocк somente poderб usar de 0 a 255 em cada cйlula, se for maior que isso nгo da certo!

//Entгo usa-se assim:
String{playerid} = 255; //Assim funciona, 255 й o mбximo permitido. 0xFF
String{playerid} = GetPlayerMoney(playerid); //Assim nгo vai dar certo, Pq ? pois se o money for maior que 255 vai bugar, entгo nesse caso seria necessбrio Array sem CHARS.
Reply

Rsrsrsrs, Sбbia que tinha errado nisto. Obrigado pelo fix !
Reply

Quote:
Originally Posted by paulor
Посмотреть сообщение
pawn Код:
// Rsrsrsrs, por nativo do samp MAX_PLAYERS = 500; Se usas a funзгo char, vai dividir 500/4  = 125; Entгo este spree sу vai funcionar atй 125 jogadores. D:
Vei, quase tive um infarto, na moral!

pawn Код:
// Meio que desnecessбrio usar else if, jб que vai ser verdadeiro todos os if's.
Vou infartar vei...

pawn Код:
// poderia ser assim static nome[100 char];
    // porque estб 100? :O 100/4 = 25; ( char = 4), mas nгo deveria ser 24 jб que o mбximo de caracteres para um nome й 24? Nгo, pois й adicionado mais 1 celula, para o fechamento da string.
Assim se qr que eu morra vei...

Explicaзгo do CHAR.

pawn Код:
new String[MAX_PLAYERS]; //String com 500 Celulas.

new String[MAX_PLAYERS char]; //Quando usado CHARS o modo de se usar a Array й {Pos}. CHARS ele poupa memуria em atй 4 vezes, que seria normalmente 32 bit / 4 ficando 8 bit assim vocк somente poderб usar de 0 a 255 em cada cйlula, se for maior que isso nгo da certo!

//Entгo usa-se assim:
String{playerid} = 255; //Assim funciona, 255 й o mбximo permitido. 0xFF
String{playerid} = GetPlayerMoney(playerid); //Assim nгo vai dar certo, Pq ? pois se o money for maior que 255 vai bugar, entгo nesse caso seria necessбrio Array sem CHARS.
MAX CHAR vai dividir mesmo a array em 4. Assim de 500 passa a ser 125. Entгo se vocк fazer:

PHP код:
new array[10 char]; 
e acessar por
PHP код:
array[1]; 
Vocк sу poderб fazer atй (16 / 4) que й 4.

Logo
array[5] nгo irб ser acessada ..

Por este motivo, ao usar CHAR devemos obrigatoriamente usar:
PHP код:
array{0
Em vez de [] usamos {}. Pois {} vai pegar apenas 8 bits da parte da array, assim podendo pegar atй array{15}, enquanto [] vai pegar 32 bits, assim nгo pode-se pegar mais que array[4]

--------

Ficaria assim:
pawn Код:
// Aqui. Como usamos muitas variaves vocк pode usar "CHAR" em Spree e Timer"
// Tenho certeza que o cara nгo mataria 255 em menos de 5 segundos e tambйm seu servidor nгo teria 255 timers

new Spree[MAX_PLAYERS], Kills[MAX_PLAYERS], Timer[MAX_PLAYERS];

public OnPlayerDeath(playerid, killerid, reason)
{
    // AQUI. Por questгo de "arrumaзгo" vocк pode dar MAX_PLAYER_NAME. Imagina se a  SA:MP muda o tamanho total do nick. seu cуdigo iria bugar

    new String[32], PlayerName[24], MatouName[24];
   
    ++Spree[killerid];
    ++Kills[killerid];
   

    // Nгo use SIZEOF ARRAY. Pra que medir o tamanho de uma array se vocк pode colocar MAX_PLAYER_NAME
   
    GetPlayerName(playerid, PlayerName, sizeof(PlayerName)), GetPlayerName(killerid, MatouName, sizeof(MatouName));
   
    format(String, sizeof(String), "MORTO: %s", MatouName);
    GameTextForPlayer(playerid, String, 2000, 0);
    format(String, sizeof(String), "MATOU: %s", PlayerName);
    GameTextForPlayer(killerid, String, 2000, 0);
   
    // Gustavo aqui vocк DEVE usar switch case por ser muito mais rбpido que ELSES ou IF
    /// APENAS FORMATE A STRING NAS CONDICIONAIS. Deixe o GameText por ultimo.
    ///
    if(Spree[killerid] == 1) format(String, sizeof(String), "%d KILLS", Spree[killerid]), GameTextForPlayer(killerid, String, 2000, 3);
    else if(Spree[killerid] == 2) GameTextForPlayer(killerid, "DOUBLE KILL", 2000, 1);
    else if(Spree[killerid] == 3) GameTextForPlayer(killerid, "TRIPLE KILL", 2000, 1);
    else if(Spree[killerid] == 4) GameTextForPlayer(killerid, "MULTI KILL", 2000, 1);
    else if(Spree[killerid] == 5) GameTextForPlayer(killerid, "FANTASTIC!", 2000, 1);
    else if(Spree[killerid] >= 6) format(String, sizeof(String), "INCRIVEL %d!!!", Spree[killerid]), GameTextForPlayer(killerid, String, 2000, 3);

    KillTimer(Timer[killerid]);
    SetTimerEx("PassarTempoKill", 5000, false, "i", playerid);
    return 1;
}

// Nгo precisa especificar o tipo de variбvel pъblica. Tire o forward, deixe apenas o nome dela
forward PassarTempoKill(playerid);
// PassarTempoKill(playerid); <- assim
public PassarTempoKill(playerid)
{
    Spree[playerid] = 0;
    return 1;
}
Reply

Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
MAX CHAR vai dividir mesmo a array em 4. Assim de 500 passa a ser 125. Entгo se vocк fazer:

PHP код:
new array[10 char]; 
e acessar por
PHP код:
array[1]; 
Vocк sу poderб fazer atй (16 / 4) que й 4.

Logo
array[5] nгo irб ser acessada ..

Por este motivo, ao usar CHAR devemos obrigatoriamente usar:
PHP код:
array{0
Em vez de [] usamos {}. Pois {} vai pegar apenas 8 bits da parte da array, assim podendo pegar atй array{15}, enquanto [] vai pegar 32 bits, assim nгo pode-se pegar mais que array[4]
Sim, mas o Garfield usou {} entгo nгo ficaria somente 125 e sim 500.
Reply

Bela explicaзгo drakins, Gostei.
Reply

Eu nгo vi o cуdigo do Garfield, mas em um ponto mais crнtico. leonardo1434 estaria certo.

Usando "char" e acessando de forma comum ([]) realmente a array vai apresentar um menor tamanho, de 500 pra 125. Mas como Garfield usou {}, nгo ficou errado.

Digamos que:

PHP код:
new array[4 char] ;
array[
1] = 2147483647
Basicamente hб um lуgica binбria por trбs, portanto devemos representar os nъmeros em bits, ou digitos binбrios.

Quote:

2147483647 em binбrio fica 1111111111111111111111111111111

Alн, existem 32 nъmeros "1s" isto й 32 bits !

Basicamente usando array[1] vocк irб pegar os 32 nъmeros, retornando:
1111111111111111111111111111111

Mas usando array{1} vocк pegarб apenas pegarб 8 nъmeros, retornando:
11111111

Os outros nъmeros fazem parte jб de array{2} array{3} e array{4}:
11111111111111111111111

Dividindo:
11111111 = array{1}
11111111 = array{2}
11111111 = array{3}
11111111 = array{4}

8 nъmeros para cada parte de array{}

Juntando tudo isto. Temos:
array[1] que й e consegue retornar 11111111111111111111111 tudo em um ъnico item.

------

Por este motivo a capacidade de "[]" й maior que a dк "{}" pois ela consegue pegar nъmeros maiores.
Reply

Lol... eu estou certo? >_> nem eu mesmo acredito(xD)

Seu post drakin ajudou bastante a compreender o char, eu pensava que fazia apenas uma simples divisгo assim tornando o resto da array nula.
Reply

Eu falei pelo o que o Garfield postou e tbm e na minha explicaзгo citei que ele estava errado em dizer que no caso do Garfield nгo ficaria 500 players e sim 125... Mais blz!
Reply

Se serve de uso, um cуdigo basico, para getar os dados bбsicos do jogador.

pawn Код:
#include <a_samp>
#include <zcmd>

GetPlayerDados(playerid)
{
    new IP[16], Str[100], SenderDialog[300], Float:Vida, Float:Colete, MeuNome[24];
    GetPlayerIp(playerid, IP, sizeof(IP));
    GetPlayerName(playerid, MeuNome, sizeof(MeuNome));
    GetPlayerHealth(playerid, Vida);
    GetPlayerArmour(playerid, Colete);
    format(Str, sizeof(Str), "Nome Do Jogador: %s\n", MeuNome); strcat(SenderDialog, Str);
    format(Str, sizeof(Str), "IP Do Jogador: %s\n", IP); strcat(SenderDialog, Str);
    format(Str, sizeof(Str), "Ping do Jogador: %d\n", GetPlayerPing(playerid)); strcat(SenderDialog, Str);
    format(Str, sizeof(Str), "Score do Jogador: %d\n", GetPlayerScore(playerid)); strcat(SenderDialog, Str);
    format(Str, sizeof(Str), "Dinheiro do Jogador: $%i\n", GetPlayerMoney(playerid)); strcat(SenderDialog, Str);
    format(Str, sizeof(Str), "Arma Em Punhos: %d\n", GetPlayerWeapon(playerid)); strcat(SenderDialog, Str);
    format(Str, sizeof(Str), "Vida do Jogador: %.0f\n", Vida); strcat(SenderDialog, Str);
    format(Str, sizeof(Str), "Colete do Jogador: %.0f\n", Colete); strcat(SenderDialog, Str);
    ShowPlayerDialog(playerid, 10, DIALOG_STYLE_MSGBOX, "Meus Status", SenderDialog, "Ok", "Fechar");
    return 1;
}

CMD:meustatus(playerid)
{
    GetPlayerDados(playerid);
    return 1;
}
Funcionando Corretamente rs...
Reply

Detectando um player pausado, eu fiz este cуdigo a pouco tempo, entгo decidi postar:

pawn Код:
new checkTimer;

forward PauseCheck();

public OnGameModeInit()
{
    checkTimer = SetTimer("PauseCheck", 1000, true);
    return 1;
}

public OnGameModeExit()
{
    KillTimer(checkTimer);
    return 1;
}

public OnPlayerConnect(playerid)
{
    SetPVarInt(playerid, "whileConnect", 1);
    return 1;
}

public OnPlayerSpawn(playerid)
{
    if(GetPVarInt(playerid, "whileConnect") == 1) SetPVarInt(playerid, "whileConnect", 0);
    SetPVarInt(playerid, "spawnedPlayer", 1);
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    SetPVarInt(playerid, "spawnedPlayer", 0);
    return 1;
}

public OnPlayerUpdate(playerid)
{
    SetPVarInt(playerid, "lastUpdate", GetTickCount());

    if(GetTickCount() < (GetPVarInt(playerid, "lastUpdate")+5000) && GetPVarInt(playerid, "pausedPlayer") == 1)
    {
        SetPVarInt(playerid, "pausedPlayer", 0);
        printf("Debug: O Player com o id '%d' nгo estб mais pausado.", playerid);
    }
   
    return 1;
}

public PauseCheck()
{
    for(new i, gM = GetMaxPlayers(); i != gM; ++i)
    {
        if(IsPlayerConnected(i) && !IsPlayerNPC(i))
        {
            if(GetTickCount() > (GetPVarInt(i, "lastUpdate")+5000) && GetPVarInt(i, "whileConnect") && GetPVarInt(i, "spawnedPlayer") == 1 && GetPVarInt(i, "pausedPlayer") == 0)
            {
                SetPVarInt(i, "pausedPlayer", 1);
                printf("Debug: O Player com o id '%d' estб pausado", i);
            }
        }
    }
    return 1;
}
Cуdigo com comentбrios: http://pastebin.com/AwwHvdEQ

Print (Nome do gamemode e pessoal, nickname foram apagados para evitar entendimento de divulgaзгo):

http://i45.tinypic.com/21md8na.png
Reply

Legal o cуdigo

[COD] onplayerpause -> http://pastebin.com/QHWuBp5r
Reply

OnPlayerScoreChange v2

pawn Код:
#include <a_samp>

stock iPs_SetPlayerScore(playerid, score)
{
    new current_score = GetPlayerScore(playerid);
    return score == current_score ? 1 : SetPlayerScore(playerid, score), CallLocalFunction("OnPlayerScoreChange", "iii", playerid, score, current_score);
}
#define SetPlayerScore iPs_SetPlayerScore

forward OnPlayerScoreChange(playerid, newscore, oldscore);
Reply

Verificar se um veiculo existe ou se estб conectado ao servidor.

pawn Код:
#define IsVehicleConnected(%0) \
                (GetVehicleModel(%0)) || (600 > %0 >400)
Reply

Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
Legal o cуdigo

[COD] onplayerpause -> http://pastebin.com/QHWuBp5r
Eu nгo tinha visto este seu cуdigo, se houve entendimento de cуpia ou algo do tipo, nгo foi minha intenзгo.
Reply

GetVehicleModel(id) != 0 jб funciona


Quote:
Originally Posted by ScrashOff
Посмотреть сообщение
Eu nгo tinha visto este seu cуdigo, se houve entendimento de cуpia ou algo do tipo, nгo foi minha intenзгo.
Nгo nгo, eu sу quis mostrar mesmo.


--

Pegar Endereзo de Memуria de uma Matriz


pawn Код:
stock getaddr(arr[]) {

    #emit load.s.pri arr
   
    #emit retn
   
    return 0;
}
Resetar valor em uma matriz e index


pawn Код:
set_reset(arrs[], idx) {

    idx *= 4;

    #emit load.s.alt 12 // -> getaddr
   
    #emit LOAD.S.pri idx
   
    #emit ADD
   
    #emit STOR.S.pri idx

    #emit CONST.alt  0
   
    #emit sref.s.alt idx
   
    return 0;
}
Quote:

#emit load.s.alt 12
#emit load.s.alt arrName

sгo a mesma coisa

Tem modos melhores de fazer isto (arr[idx] = 0). Mas optei por #emit
Reply

Um simples GM que fiz para evitar perdas de tempo com debug de objetos ^^

Ъtil para mappers que queiram retirar os crashes do seu mapa xD

http://pastebin.com/pB7xUkWs

bY Kuddy
Reply


Forum Jump:


Users browsing this thread: 13 Guest(s)