Includes



* Comentário

Essa include é uma include que visa o melhoramento de certas Funções/CallBack's que todos podem contribuir com ela, modificando funções existentes para melhora-las, esse projeto é meio que parecido com a Fixes, Creio eu que a muitas funções que deixam a desejar em seus parâmetros e então decidi cria-la para que todos que tenham funções editadas e deseja compartilhar ou até mesmo que tem a ideia e não consegue coloca-la em prática postarem no tópico que irei incluir na include! 

*Como usar ?

pawn Code:
#include <a_samp> #include <FunctionEdit>

Sempre mude os parâmetros das funções editadas em seu GM para que não haja erro, Ex:

pawn Code:
public OnVehicleDamageStatusUpdate(vehicleid, playerid) { //Função original     return 1; } public OnVehicleDamageStatusUpdate(vehicleid, playerid, Float:amount) { //Função editada     return 1; }

Agora se você preferir pode desativar qualquer função que não queria usar, Basta fazer o seguinte!

pawn Code:
#define @FE_OnVehicleDamageStatusUpdate false // Caso for desativar alguma função coloque '@FE_NomeFunção' seguido do valor 'false' para desativa-la. #include <FunctionEdit> //Sempre utilize a include abaixo das definições que desativam certas funções para não haver erros.
* Funções
NomeParâmetrosAutorPost
OnVehicleDamageStatusUpdate(vehicleid, playerid, Float:amount)Paulo_TerroR
GetPlayerHealth(playerid, &Float: health = 0.0)LosLink
GetPlayerArmour(playerid, &Float: armour = 0.0)LosLink
GetPlayerFacingAngle(playerid, &Float: ang = 0.0)LosLink
GetPlayerIp(playerid, name[]len)LosLink
GetPlayerName(playerid, const name[]len)LosLink
GetPlayerVersion(playerid, version[]len)LosLink
OnPlayerEnterVehicle(playerid, vehicleid, ispassenger, veiculo)Paulo_TerroR
OnPlayerStateChange(playerid, newstate, oldstate, vehicleidveiculo)Paulo_TerroR
SetPlayerPos(playerid, Float: x, Float: y, Float: z, Float: a)ViniBornLink
SetVehiclePos(vehicleid, Float: x, Float: y, Float: z, Float: a)ViniBornLink
GetPlayerPos(playerid, Float:FE_Pos[4])Paulo_TerroR
GetVehiclePos(vehicleid, Float:FE_Pos[4])Paulo_TerroR
SendClientMessageEx(playerid, color, const message[], {Float,_}:...)Lucas_AlemaoLink
SendClientMessageToAllEx(color, const message[], {Float,_}:...)Lucas_AlemaoLink
OnPlayerDamage(playerid, Float:amount)Paulo_TerroR

* Creditos

Paulo_TerroR - Criador
Equipe SA-MP(Passado\Presente\Futuro) - SAMP.
Hiuship - Ideias.
ViniBorn - Participação na Include.
Los - Participação na Include.
Lucas_Alemao - Participação na Include.


* Download

PasteBin
SitesGoogle


* Observação

Participem desse projeto, Poste suas funções ou suas ideias.
Qualquer BUG me contatar por MP ou pelo Post mesmo! Ficarei agradecido.
Rumo há Sticky!
Dúvidas sobre as funções, Pergunte no Post!
Bom jogo!

 ___________________________________________________________________________________________________

[Include] Bits Booleanos - O que são bits?


Resolvi criar um simples sistema de bits 1 e 0. Isto pode poupar sua memória e amx em até 32 vezes.

Qual melhora?
lvdm.amx sem BITS -> 4 mb
lvdm.amx com BITS -> 177kb


Código usado:
pawn Code:
// com bits new Bit:arr<5000000>; // sem bits new arr[5000000]

Só usa-se para arrays de true e false !!

Pode deixar a execução mais lenta. Isto é obvio e ocorre em qualquer sistema de bits, mas não muito. A propósito, este meu até que ficou rápido.

O que são bits? Como tiveram está ideia genial?

Primeiramente, vou explicar como funciona manipulação de alocação por Bits
Primeiramente, você deve saber que "Bits nada mais nada menos são "Binary Digits" ou "Digitos Binários"."

-

Atualmente no pawn, podemos ter o seguinte valor máximo em uma variável

pawn Code:
new var = cellmax;

Cellmax é o máximo valor que se pode ter em uma array/variável. Caso você tente 

pawn Code:
new var = cellmax + 1;

Não dará certo! Isto retorna em notação cientifica pois pawn não tem suporte para números maiores que cellmax

Pois bem, o valor 2147483647 ou cellmax equivale ao seguinte em binário:

Quote:
1111111111111111111111111111111
(digitos binários são 1 e 0. APENAS)

Então foi aí, que alguém teve a idéia criativa de usar estes valores como uma array true e false

pawn Code:
new ab = 0b001

Em bits booleanos. Isto equivale a:

pawn Code:
new ab[3]; ab[0] = 0; ab[1] = 0; ab[2] = 1;

Note: 001 e 001

ou outro exemplo:

pawn Code:
new ab[3]; ab[0] = 1; ab[1] = 0; ab[2] = 1; // equivale a "new ab = 0b101" // "0b" indica que o número é binário
Note 0b101

Logo. Uma única variável pode receber

pawn Code:
1111111111111111111111111111111
ou 32 elementos em valor 1 conforme o número acima ou valor 0 ..

Sendo assim você não precisará de uma array de [32] partes. Mas sim apenas uma array de [1] parte. Viu a memória poupada?

Pois bem, existem varias formas de manipulação destes valores. Desde usar strings para manipular ou até mesmo cálculos (que é o mais aconselhável)

Include

PHP Code:
#define Bit_Lenght(%0) \
            
(sizeof(%0) * cellbits)
             
#define Bit:%0<%1> \
            
%0[(%+cellbits) / cellbits]
         
stock Bit_Get(bit[], possize sizeof bit) {

    new
        
index = (pos) / cellbits
    
;

     return 
index size || index false : (!= (bit[index] & (<< pos))) ;
}
stock Bit_Set(bit[], posbool:valsize sizeof bit) {

    new
        
index = (pos) / cellbits
    
;

    return 
index size || index : (bit[index] = val ?(bit[index] | 1) << pos bit[index] & ~(<< pos)), 1;
}  
Pastebinhttp://pastebin.com/S4DbCEAL


Modo de uso e comparação

pawn Code:
new Bit:bites<MAX_PLAYERS>;         printf("%d", Bit_Lenght(bites));         Bit_Set(bites, 499, true);         for(new i = Bit_Lenght(bites)-1 ; i > -1; i--) {         if(Bit_Get(bites, i)) {             printf("%d -> true", i);         }     }

Isto deverá imprimir
499 -> true

Pois é o valor que usamos em set. O uso é simples:

Comparação:

Array normal: new var[32];
Array bit: new Bit:var<32>; // var[1]
Memória poupada em 32x

Colocando valor
Método normal-> var[499] = true;
Método Bits - > Bit_Set(var, 499, true);

Pegando valor
printf("metodo normal %d", var[499]);
printf("metodo bits %d", Bit_Get(var, 499));

-
-
-

É isto. Espero que tenham gostado

Criado por Bruno da Silva



___________________________________________________________________________________________________


Bini 4

Após algumas semanas de desenvolvimento da nova versão de Bini. Finalmente consigo acaba-la.
A nova versão de Bini não conta com muitas alterações, exceto a engine de manipulação de arquivos na memória. Desta vez utiliza memória cache mais avançada usando Setproperty e Getproperty!

Velocidade
Com esta nova engine, a velocidade foi bastante aprimorada. O que já era rápido ficou mais rápido ainda



Quote:
[09:59:37] Bini -> write 1827 ms - read 31 ms - read/write 1858 ms
[09:59:37] Dof2 -> write 2746 ms - read 247 ms - read/write 2993 ms
Código usado para teste de velocidade:
pawn Code:
public OnFilterScriptInit(){     DOF2_CreateFile("ipsBruno1");     DOF2_CreateFile("ipsBruno2");         new dof[3];     dof[0] = GetTickCount();     dof[2] = GetTickCount();     for(new i; i != 3000; i++) {         DOF2_SetInt("ipsBruno1", "teste1", 1000);         DOF2_SetInt("ipsBruno1", "teste2", 2000);         DOF2_SetInt("ipsBruno1", "teste3", 3000);         DOF2_SetInt("ipsBruno1", "teste4", 4000);         DOF2_SetInt("ipsBruno1", "teste5", 5000);         DOF2_SetInt("ipsBruno1", "teste6", 6000);         DOF2_SetInt("ipsBruno1", "teste7", 7000);         DOF2_SetInt("ipsBruno1", "teste8", 8000);         DOF2_SetInt("ipsBruno1", "teste9", 9000);         DOF2_SetInt("ipsBruno1", "teste10", 10000);         DOF2_SetInt("ipsBruno1", "teste11", 11000);                 DOF2_SaveFile();     }     dof[0] = GetTickCount() - dof[0];         dof[1] = GetTickCount();     for(new i; i != 3000; i++) {         DOF2_GetInt("ipsBruno1", "teste1");         DOF2_GetInt("ipsBruno1", "teste2");         DOF2_GetInt("ipsBruno1", "teste3");         DOF2_GetInt("ipsBruno1", "teste4");         DOF2_GetInt("ipsBruno1", "teste5");         DOF2_GetInt("ipsBruno1", "teste6");         DOF2_GetInt("ipsBruno1", "teste7");         DOF2_GetInt("ipsBruno1", "teste8");         DOF2_GetInt("ipsBruno1", "teste9");         DOF2_GetInt("ipsBruno1", "teste10");         DOF2_GetInt("ipsBruno1", "teste11");     }     dof[1] = GetTickCount() - dof[1];     dof[2] = GetTickCount() - dof[2];     //             new bin[3];     bin[0] = GetTickCount();     bin[2] = GetTickCount();     for(new i; i != 3000; i++) {         INI_WriteInt("ipsBruno2", "teste1", 1000);         INI_WriteInt("ipsBruno2", "teste2", 2000);         INI_WriteInt("ipsBruno2", "teste3", 3000);         INI_WriteInt("ipsBruno2", "teste4", 4000);         INI_WriteInt("ipsBruno2", "teste5", 5000);         INI_WriteInt("ipsBruno2", "teste6", 6000);         INI_WriteInt("ipsBruno2", "teste7", 7000);         INI_WriteInt("ipsBruno2", "teste8", 8000);         INI_WriteInt("ipsBruno2", "teste9", 9000);         INI_WriteInt("ipsBruno2", "teste10", 10000);         INI_WriteInt("ipsBruno2", "teste11", 11000);                 INI_Save();     }     bin[0] = GetTickCount() - bin[0];     bin[1] = GetTickCount();     for(new i; i != 3000; i++) {         INI_ReadInt("ipsBruno2", "teste1");         INI_ReadInt("ipsBruno2", "teste2");         INI_ReadInt("ipsBruno2", "teste3");         INI_ReadInt("ipsBruno2", "teste4");         INI_ReadInt("ipsBruno2", "teste5");         INI_ReadInt("ipsBruno2", "teste6");         INI_ReadInt("ipsBruno2", "teste7");         INI_ReadInt("ipsBruno2", "teste8");         INI_ReadInt("ipsBruno2", "teste9");         INI_ReadInt("ipsBruno2", "teste10");         INI_ReadInt("ipsBruno2", "teste11");     }     bin[1] = GetTickCount() - bin[1];     bin[2] = GetTickCount() - bin[2];     printf("Bini -> write %d ms - read %d ms - read/write %d ms", bin[0], bin[1], bin[2]);     printf("Dof2 -> write %d ms - read %d ms - read/write %d ms", dof[0], dof[1], dof[2]);     return true; } public OnFilterScriptExit() {     DOF2_Exit();     INI_Exit();     return true; }

NOVOS TESTES DE VELOCIDADES SERÃO ACEITOS.

Usando
Para usar Bini é bastante simples! Basta fazer o seguinte:

Escrevendo:

Números

pawn Code:
INI_WriteInt("arquivo.ini", "key", valor); INI_Save();

Textos:

pawn Code:
INI_WriteString("arquivo.ini", "key", "valor"); INI_Save();

Lendo valores:

Números

pawn Code:
INI_ReadInt("arquivo.ini", "key")


Textos

pawn Code:
INI_ReadString("arquivo.ini", "key")

Então sempre deixe:

pawn Code:
public OnFilterScriptExit() {     INI_Exit();     return true; }


** Importante
- Se você tem arquivos escritos por DOF2 ou Y_Ini este sistema não será compatível pois meu sistema usa o método formal para escrita de escrita em arquivos ini, sem espaço entre as keys

Quote:
key=value
e não
Quote:
key = value
http://en.wikipedia.org/wiki/INI_file

Porém é TOTALMENTE compatível com Dini e outros sistemas conhecidos

Funções disponíveis:

pawn Code:
// Funções Atuais: //   CallBack INI_WriteString("arquivo", "key", "valor") //   CallBack INI_WriteFloat("arquivo"",key", valor) //   CallBack INI_WriteInt("arquivo","key", valor) //   CallBack INI_WriteBool("arquivo","key", bool:valor) //   CallBack INI_ReadString("arquivo", "key") //   CallBack INI_ReadInt("arquivo", "key") //   CallBack INI_ReadFloat("arquivo","key") //   CallBack INI_ReadBool("arquivo","key") //   CallBack INI_Create("arquivo") //   CallBack INI_Delete("arquivo") //   CallBack INI_Open("arquivo")

Download
-> http://pastebin.com/gjEJMnH5

Com está velocidade é permitido que você possa colocar em até 50 escritas/leituras em OnPlayerUpdate 
Salve em bini.inc por favor.
 
 ___________________________________________________________________________________________________


Introdução:
Olá galerinha.. bom como todos sabem existe alguns lammers que adoram infernizar os servidores com diversos tipos de flood, como, spam death, flood chat/comandos etc.. com esse script seus problemas acabaram! ele tem a finalidade de acabar com isso, você poderá adimistrar diversos tipos de flood com um toque de magica!. Basta apenas configura-lo ao seu gosto .

Funções:
O script. Ele permite você administrar vários tipos de floods, e configura-lo ao seu gosto! 

NomeParâmetrosFunção
FLOOD_CONTROL_DEATHN/AFlood death spam, fake kill
FLOOD_CONTROL_BOOTN/AFlood boot
FLOOD_CONTROL_VEHICLESN/AFlood vehicles(Car mass spawner)
FLOOD_CONTROL_COMMANDN/AFlood command
FLOOD_CONTROL_CHATN/AFlood chat
OnPlayerFloodControl(playerid, config)Painel de controle
OnPlayerFloodChat@Command(playerid, config, iCountiTime)Painel dos floods chat/comandos

Exemplo:

pawn Code:
#include <a_samp> #include <FloodControl> public OnPlayerFloodControl(playerid, config) {     if(config == FLOOD_CONTROL_DEATH) {         SendClientMessage(playerid, 0xFFFFFFFF, "FloodControl: Você foi banido por flood death!");         Ban(playerid);     }     else if(config == FLOOD_CONTROL_BOOT) {         SendClientMessage(playerid, 0xFFFFFFFF, "FloodControl: Você foi banido por flood boot!");         Ban(playerid);     }     else if(config == FLOOD_CONTROL_VEHICLES) {         SendClientMessage(playerid, 0xFFFFFFFF, "FloodControl: Você foi banido por flood vehicle! (CAR MASS SPAWNER)");         Ban(playerid);     }     else if(config == FLOOD_CONTROL_CHAT || FLOOD_CONTROL_COMMAND) {         SendClientMessage(playerid, 0xFFFFFFFF, "FloodControl: Você foi kickado por flood chat/comando!");         Kick(playerid);     }     return true; } public OnPlayerText(playerid, text[]) {     /* -- Novos parametros --         OnPlayerFloodChat@Command(playerid, FLOOD_CONTROL_CHAT, iCount, iTime);         Ex:             OnPlayerFloodChat@Command(playerid, FLOOD_CONTROL_CHAT, 4, 2);         Note:             if((gettime() - GetPVarInt(playerid, "#lasttext")) < iTime && flood_stamp[playerid] > iCount)             De acordo com o exemplo funcionara desta maneira, iCount(2) = Contagem de mensagens em menos do iTime(4).             Então caso o player mande 2 mensagens em menos de 4 segundos a callback OnPlayerFloodControl é chamada!     */     // -- Começa a contagem --     OnPlayerFloodChat@Command(playerid, FLOOD_CONTROL_CHAT, 4, 2);         return 1; } public OnPlayerCommandText(playerid, cmdtext[]) {     /* -- Novos parametros --         OnPlayerFloodChat@Command(playerid, FLOOD_CONTROL_CHAT, iCount, iTime);         Ex:             OnPlayerFloodChat@Command(playerid, FLOOD_CONTROL_CHAT, 4, 2);         Note:             if((gettime() - GetPVarInt(playerid, "#lasttext")) < iTime && flood_stamp[playerid] > iCount)             De acordo com o exemplo funcionara desta maneira, iCount(2) = Contagem de mensagens em menos do iTime(4).             Então caso o player mande 2 mensagens em menos de 4 segundos a callback OnPlayerFloodControl é chamada!     */     // -- Começa a contagem --     OnPlayerFloodChat@Command(playerid, FLOOD_CONTROL_COMMAND, 4, 2);     if(!strcmp(cmdtext, "/floodcontrol", true)) {         SendClientMessage(playerid, 0xFFFFFFFF, "FloodControl: Você será kickado por flood!");         return 1;     }     return 0; }
Download:
Pastebin
Dúvidas, sugestões, bugs, Poste aqui!

ChangeLog:

  • 22/06/2012:
    • Release inicial
  • 23/06/2012:
    • Adds:
      • Novos parâmetros para a função: OnPlayerFloodChat@Command.
      • (playerid, config, iCount, iTime)!
    • Notes:
      • A sintaxe. Foi mudada e adicionada mais dois parâmetros, isto é, será preciso trocar de acordo!

Créditos:
RoacH` - Criador
SA-MP TEAM - For All