Re: [ Cуdigos Ъteis ] -
zSuYaNw - 05.07.2012
pawn Код:
stock tSetString(Text:texsitd, str[], pid = -1)
{
TextDrawSetString(texsitd, str);
return pid == -1 ? (TextDrawShowForAll(texsitd)) : (TextDrawShowForPlayer(pid, texsitd));
}
Re: [ Cуdigos Ъteis ] -
paulor - 05.07.2012
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!
Re: [ Cуdigos Ъteis ] -
reeBR - 05.07.2012
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...
Re: [ Cуdigos Ъteis ] -
paulor - 05.07.2012
Nem vai funfar! ^^
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
paulor - 06.07.2012
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.
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
leonardo1434 - 06.07.2012
Rsrsrsrs, Sбbia que tinha errado nisto. Obrigado pelo fix !
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
ipsBruno - 06.07.2012
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
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:
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;
}
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
paulor - 06.07.2012
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
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:
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.
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
leonardo1434 - 06.07.2012
Bela explicaзгo drakins, Gostei.
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
ipsBruno - 06.07.2012
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.
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
leonardo1434 - 06.07.2012
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.
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
paulor - 06.07.2012
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!
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
.FuneraL. - 07.07.2012
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...
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
ScrashOff - 07.07.2012
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
Respuesta: [ Cуdigos Ъteis ] *Posiзгo temporбria -
ipsBruno - 07.07.2012
Legal o cуdigo
[COD] onplayerpause ->
http://pastebin.com/QHWuBp5r
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
Jason` - 07.07.2012
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);
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
zSuYaNw - 07.07.2012
Verificar se um veiculo existe ou se estб conectado ao servidor.
pawn Код:
#define IsVehicleConnected(%0) \
(GetVehicleModel(%0)) || (600 > %0 >400)
Re: Respuesta: [ Cуdigos Ъteis ] *Posiзгo temporбria -
ScrashOff - 07.07.2012
Quote:
Originally Posted by [FeK]DraKiNs
|
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.
Respuesta: [ Cуdigos Ъteis ] *Posiзгo temporбria -
ipsBruno - 07.07.2012
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
Re: [ Cуdigos Ъteis ] *Posiзгo temporбria -
Kuddy - 09.07.2012
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