05.07.2012, 06:30
pawn Код:
stock tSetString(Text:texsitd, str[], pid = -1)
{
TextDrawSetString(texsitd, str);
return pid == -1 ? (TextDrawShowForAll(texsitd)) : (TextDrawShowForPlayer(pid, texsitd));
}
stock tSetString(Text:texsitd, str[], pid = -1)
{
TextDrawSetString(texsitd, str);
return pid == -1 ? (TextDrawShowForAll(texsitd)) : (TextDrawShowForPlayer(pid, texsitd));
}
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 Код:
|
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;
}
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;
}
Tava sem nada pra fazer, entгo resolvi tentar consertar o cуdigo de ambos. (inclui um mini tutorial sobre o que aprendi. )
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:
// Meio que desnecessбrio usar else if, jб que vai ser verdadeiro todos os if's.
// 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.
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.
pawn Код:
pawn Код:
pawn Код:
Explicaзгo do CHAR. pawn Код:
|
new array[10 char];
array[1];
array{0}
// 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;
}
MAX CHAR vai dividir mesmo a array em 4. Assim de 500 passa a ser 125. Entгo se vocк fazer:
PHP код:
PHP код:
Logo array[5] nгo irб ser acessada .. Por este motivo, ao usar CHAR devemos obrigatoriamente usar: PHP код:
|
new array[4 char] ;
array[1] = 2147483647;
2147483647 em binбrio fica 1111111111111111111111111111111 |
#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;
}
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;
}
#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);
#define IsVehicleConnected(%0) \
(GetVehicleModel(%0)) || (600 > %0 >400)
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.
|
stock getaddr(arr[]) {
#emit load.s.pri arr
#emit retn
return 0;
}
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;
}
#emit load.s.alt 12 #emit load.s.alt arrName sгo a mesma coisa |