22.07.2014, 16:58
(
Последний раз редактировалось S4t3K; 24.07.2014 в 13:47.
)
Yo.
Inspirй par un thread anglais (dis donc ils sont forts ceux lа :o), j'ai dйcidй de crйer ce thread.
Concrиtement, il sert а quoi ?
A partager des bouts de codes ou des fonctions uniques sans crйer un thread avec le prйfixe "include" (car include = bibliothиque et une bibliothиque avec un seul livre c'est pas une bibliothиque m'voyez ?).
Pas de hors sujet s'il vous plait ;)
Le topic original (anglais) est celui ci.
J'en balance quelques unes
randstr et crandom (une string random et un caractиre random)
Utilisation :
[pawn]
new str[31], chr;
randstr(30, str, true);
crandom(chr, false);
printf("Random string : %s | Caractиre random : %c | Valeur ASCII du caractиre : %d", str, chr, chr);
[/pawn]
Fonction :
[pawn]
static const chars[] =
{
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120
};
static const numbers[] =
{
42, 43, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57
};
static const specials[] =
{
33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 46, 58, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94, 95, 96, 123, 124, 125, 126
};
static const all[] =
{
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 42, 43, 45, 47,
33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 46, 58, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94, 95, 96, 123, 124, 125, 126
};
static const alphanum[] =
{
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 42, 43, 45, 47
};
#pragma unused chars, numbers, specials
stock randstr(lenght, string[], bool:specialsc = true)
{
for(new i = 0; i < lenght; i++)
{
do
{
if(specialsc)
{
new j = 33 + random(93); // 126 (max) - 33 (min)
for(new k = 0; k < sizeof(all); k++)
{
if(all[k] == j) string[i] = j, break;
else continue;
}
}
else
{
new j = 48 + random(72);
for(new k = 0; k < sizeof(alphanum); k++)
{
if(alphanum[k] == j) string[i] = j, break;
else continue;
}
}
}
while(string[i] == 0);
}
return 1;
}
stock crandom(&chara, bool:specialc = true)
{
do
{
if(specialsc)
{
new j = 33 + random(93); // 126 (max) - 33 (min)
for(new k = 0; k < sizeof(all); k++)
{
if(all[k] == j) chara = j, break;
else continue;
}
}
else
{
new j = 48 + random(72);
for(new k = 0; k < sizeof(alphanum); k++)
{
if(alphanum[k] == j) chara = j, break;
else continue;
}
}
if(chara != 0) break;
}
while(chara == 0);
return 1;
}
[/pawn]
strreplace - Remplace une partie (oldsub) d'une string (str) par un autre morceau, peu importe que les tailles correspondent ou pas (newsub). (merci а Kilou)
Utilisation :
[pawn]
new str[] = "Salut, suis-je bien sur SMAP ?";
printf(str);
printf("Remplacement...");
strrep(str, "SMAP", "SA-MP");
printf(str);
[/pawn]
Fonction :
[pawn]
#if !defined strreplace
#define strreplace strrep
#endif
stock strrep(str[], oldsub[], newsub[])
{
if(strfind(str, oldsub) == -1) return 0;
new pos[2];
pos[0] = strfind(str, oldsub);
for(new i = 0, l = strlen(str); i < l; i++)
{
if(i <= pos[0] + strlen(oldsub)) continue;
if(str[i] == ' ') break;
}
pos[1] = s_string_var;
strdel(str, pos[0], pos[1]);
strins(str, newsub, pos[0], .maxlength = sizeof(str));
return 1;
}
[/pawn]
ProxDetector йditй avec 5 couleurs qui se substituent selon la distance, qui permet de propager un message sur un radius spйcifique sans utiliser format au prйalable.
Utilisation :
[pawn]
// dans une commande
new pName[MAX_PLAYER_NAME+1];
GetPlayerName(playerid, pName, MAX_PLAYER_NAME+1);
ProxDetector(20.0, playerid, "* %s attrape sa ceinture et l'enfonce dans la boucle.", -1, -1, -1, -1, -1, pName);
[/pawn]
Fonction :
[pawn]
stock ProxDetector__(Float:radi, playerid, const message[], col1, col2, col3, col4, col5, {Float,_}:...)
{
if(!IsPlayerConnected(playerid)) return 1;
static const ARGUMENTS = 8;
new n = (numargs() - ARGUMENTS) * BYTES_PER_CELL, bool:used = false;
if(!n) goto final;
new
arg_start,
arg_end,
fstring[145]
;
#emit CONST.alt col5 // Changer l'argument de cette ligne si vous les rйarrangez (зa doit toujours кtre le dernier argument obligatoire)
#emit LCTRL 5
#emit ADD
#emit STOR.S.pri fstring
#emit LOAD.S.pri n
#emit ADD
#emit STOR.S.pri arg_end
do
{
#emit LOAD.I
#emit PUSH.pri
arg_end -= BYTES_PER_CELL;
#emit LOAD.S.pri arg_end
}
while(arg_end > arg_start);
#emit PUSH.S message
#emit PUSH.C 145
#emit PUSH.ADR fstring
n += BYTES_PER_CELL * 3;
#emit PUSH.S n
#emit SYSREQ.C format
n += BYTES_PER_CELL;
#emit LCTRL 4
#emit LOAD.S.alt n
#emit ADD
#emit SCTRL 4
used = true;
final:
{
new Float:pos[6], Float:f;
GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
foreach(new i : Player)
{
if(GetPlayerVirtualWorld(playerid) != GetPlayerVirtualWorld(i)) continue;
if(i == playerid) continue;
if(radi <= 20.0 && GetPlayerInterior(playerid) != GetPlayerInterior(i)) continue;
GetPlayerPos(i, pos[3], pos[4], pos[5]);
f = VectorSize(pos[0]-pos[3], pos[1]-pos[4], pos[2]-pos[5]);
if(!used)
{
if(f <= radi/16) SCM(i, col1, message);
else if(f <= radi/8) SCM(i, col2, message);
else if(f <= radi/4) SCM(i, col3, message);
else if(f <= radi/2) SCM(i, col4, message);
else if(f <= radi) SCM(i, col5, message);
}
else
{
if(f <= radi/16) SCM(i, col1, fstring);
else if(f <= radi/8) SCM(i, col2, fstring);
else if(f <= radi/4) SCM(i, col3, fstring);
else if(f <= radi/2) SCM(i, col4, fstring);
else if(f <= radi) SCM(i, col5, fstring);
}
}
}
return 1;
}
[/pawn]
mysql_tquery_file - Permet d'exйcuter des requкtes SQL threadйes une par une lorsqu'elles se situent dans un fichier lui-mкme situй dans scriptfiles ! Possibilitй d'appeler une callback lorsque TOUTES les requкtes sont terminйes. (UNE REQUКTE PAR LIGNE SVP)
Utilisation :
[pawn]
mysql_tquery_file(1, "requetes.txt", "OnQueriesFinish", "i", GetTickCount());
// en bas du gm
forward OnQueriesFinish(const &time);
public OnQueriesFinish(const &time)
{
printf("Pour exйcuter toutes les requкtes du fichier requetes.txt, le serveur a mit %d millisecondes", time);
return true;
}
[/pawn]
Fonction :
[pawn]
mysql_tquery_file(const conHandle, const file[], callback[] = "", formt[] = "", {Float,_}:...)
{
new l = strlen(formt);
if((numargs() - 4) != l) return 0;
new bool:passed = false;
if(strlen(callback) <= 1 && l <= 1) goto reading;
static const ARGUMENTS = 4;
new n = (numargs() - ARGUMENTS) * BYTES_PER_CELL;
if(!n) goto reading;
new
parstring[256],
formatted[256],
arg_start,
arg_end;
for(new ii = 0; ii < l; ii++)
{
switch(formt[ii])
{
case 'd': strcat(parstring, "%d, ");
case 'i': strcat(parstring, "%i, ");
case 'f': strcat(parstring, "%f, ");
case 'a', 's': strcat(parstring, "%s, "), formt[ii] = 's';
}
}
#emit CONST.alt formt
#emit LCTRL 5
#emit ADD
#emit STOR.S.pri arg_start
#emit LOAD.S.alt n
#emit ADD
#emit STOR.S.pri arg_end
do
{
#emit LOAD.I
#emit PUSH.pri
arg_end -= BYTES_PER_CELL;
#emit LOAD.S.pri arg_end
}
while (arg_end > arg_start);
#emit PUSH.S parstring
#emit PUSH.C 256
#emit PUSH.ADR formatted
n += BYTES_PER_CELL * 4;
#emit PUSH.S n
#emit SYSREQ.C format
n += BYTES_PER_CELL;
#emit LCTRL 4
#emit LOAD.S.alt n
#emit ADD
#emit SCTRL 4
passed = true;
reading:
{
new File:hfile = fopen(file);
new query[256];
if(!hfile) return 0;
while(read_query(hfile, query)) mysql_tquery(conHandle, query);
fclose(hfile);
reading:
{
new File:hfile = fopen(file);
new query[256];
if(!hfile) return 0;
while(read_query(hfile, query)) mysql_tquery(conHandle, query);
fclose(hfile);
if(passed && funcidx(callback) != -1) CallLocalFunction(callback, formt, formatted);
} return 1;
}
[/pawn]
Voilа, si vous en avez qui pourraient кtre pas mal, postez les !
Inspirй par un thread anglais (dis donc ils sont forts ceux lа :o), j'ai dйcidй de crйer ce thread.
Concrиtement, il sert а quoi ?
A partager des bouts de codes ou des fonctions uniques sans crйer un thread avec le prйfixe "include" (car include = bibliothиque et une bibliothиque avec un seul livre c'est pas une bibliothиque m'voyez ?).
Pas de hors sujet s'il vous plait ;)
Le topic original (anglais) est celui ci.
J'en balance quelques unes
randstr et crandom (une string random et un caractиre random)
Utilisation :
[pawn]
new str[31], chr;
randstr(30, str, true);
crandom(chr, false);
printf("Random string : %s | Caractиre random : %c | Valeur ASCII du caractиre : %d", str, chr, chr);
[/pawn]
Fonction :
[pawn]
static const chars[] =
{
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120
};
static const numbers[] =
{
42, 43, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57
};
static const specials[] =
{
33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 46, 58, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94, 95, 96, 123, 124, 125, 126
};
static const all[] =
{
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 42, 43, 45, 47,
33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 46, 58, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94, 95, 96, 123, 124, 125, 126
};
static const alphanum[] =
{
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 42, 43, 45, 47
};
#pragma unused chars, numbers, specials
stock randstr(lenght, string[], bool:specialsc = true)
{
for(new i = 0; i < lenght; i++)
{
do
{
if(specialsc)
{
new j = 33 + random(93); // 126 (max) - 33 (min)
for(new k = 0; k < sizeof(all); k++)
{
if(all[k] == j) string[i] = j, break;
else continue;
}
}
else
{
new j = 48 + random(72);
for(new k = 0; k < sizeof(alphanum); k++)
{
if(alphanum[k] == j) string[i] = j, break;
else continue;
}
}
}
while(string[i] == 0);
}
return 1;
}
stock crandom(&chara, bool:specialc = true)
{
do
{
if(specialsc)
{
new j = 33 + random(93); // 126 (max) - 33 (min)
for(new k = 0; k < sizeof(all); k++)
{
if(all[k] == j) chara = j, break;
else continue;
}
}
else
{
new j = 48 + random(72);
for(new k = 0; k < sizeof(alphanum); k++)
{
if(alphanum[k] == j) chara = j, break;
else continue;
}
}
if(chara != 0) break;
}
while(chara == 0);
return 1;
}
[/pawn]
strreplace - Remplace une partie (oldsub) d'une string (str) par un autre morceau, peu importe que les tailles correspondent ou pas (newsub). (merci а Kilou)
Utilisation :
[pawn]
new str[] = "Salut, suis-je bien sur SMAP ?";
printf(str);
printf("Remplacement...");
strrep(str, "SMAP", "SA-MP");
printf(str);
[/pawn]
Fonction :
[pawn]
#if !defined strreplace
#define strreplace strrep
#endif
stock strrep(str[], oldsub[], newsub[])
{
if(strfind(str, oldsub) == -1) return 0;
new pos[2];
pos[0] = strfind(str, oldsub);
for(new i = 0, l = strlen(str); i < l; i++)
{
if(i <= pos[0] + strlen(oldsub)) continue;
if(str[i] == ' ') break;
}
pos[1] = s_string_var;
strdel(str, pos[0], pos[1]);
strins(str, newsub, pos[0], .maxlength = sizeof(str));
return 1;
}
[/pawn]
ProxDetector йditй avec 5 couleurs qui se substituent selon la distance, qui permet de propager un message sur un radius spйcifique sans utiliser format au prйalable.
Utilisation :
[pawn]
// dans une commande
new pName[MAX_PLAYER_NAME+1];
GetPlayerName(playerid, pName, MAX_PLAYER_NAME+1);
ProxDetector(20.0, playerid, "* %s attrape sa ceinture et l'enfonce dans la boucle.", -1, -1, -1, -1, -1, pName);
[/pawn]
Fonction :
[pawn]
stock ProxDetector__(Float:radi, playerid, const message[], col1, col2, col3, col4, col5, {Float,_}:...)
{
if(!IsPlayerConnected(playerid)) return 1;
static const ARGUMENTS = 8;
new n = (numargs() - ARGUMENTS) * BYTES_PER_CELL, bool:used = false;
if(!n) goto final;
new
arg_start,
arg_end,
fstring[145]
;
#emit CONST.alt col5 // Changer l'argument de cette ligne si vous les rйarrangez (зa doit toujours кtre le dernier argument obligatoire)
#emit LCTRL 5
#emit ADD
#emit STOR.S.pri fstring
#emit LOAD.S.pri n
#emit ADD
#emit STOR.S.pri arg_end
do
{
#emit LOAD.I
#emit PUSH.pri
arg_end -= BYTES_PER_CELL;
#emit LOAD.S.pri arg_end
}
while(arg_end > arg_start);
#emit PUSH.S message
#emit PUSH.C 145
#emit PUSH.ADR fstring
n += BYTES_PER_CELL * 3;
#emit PUSH.S n
#emit SYSREQ.C format
n += BYTES_PER_CELL;
#emit LCTRL 4
#emit LOAD.S.alt n
#emit ADD
#emit SCTRL 4
used = true;
final:
{
new Float:pos[6], Float:f;
GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
foreach(new i : Player)
{
if(GetPlayerVirtualWorld(playerid) != GetPlayerVirtualWorld(i)) continue;
if(i == playerid) continue;
if(radi <= 20.0 && GetPlayerInterior(playerid) != GetPlayerInterior(i)) continue;
GetPlayerPos(i, pos[3], pos[4], pos[5]);
f = VectorSize(pos[0]-pos[3], pos[1]-pos[4], pos[2]-pos[5]);
if(!used)
{
if(f <= radi/16) SCM(i, col1, message);
else if(f <= radi/8) SCM(i, col2, message);
else if(f <= radi/4) SCM(i, col3, message);
else if(f <= radi/2) SCM(i, col4, message);
else if(f <= radi) SCM(i, col5, message);
}
else
{
if(f <= radi/16) SCM(i, col1, fstring);
else if(f <= radi/8) SCM(i, col2, fstring);
else if(f <= radi/4) SCM(i, col3, fstring);
else if(f <= radi/2) SCM(i, col4, fstring);
else if(f <= radi) SCM(i, col5, fstring);
}
}
}
return 1;
}
[/pawn]
mysql_tquery_file - Permet d'exйcuter des requкtes SQL threadйes une par une lorsqu'elles se situent dans un fichier lui-mкme situй dans scriptfiles ! Possibilitй d'appeler une callback lorsque TOUTES les requкtes sont terminйes. (UNE REQUКTE PAR LIGNE SVP)
Utilisation :
[pawn]
mysql_tquery_file(1, "requetes.txt", "OnQueriesFinish", "i", GetTickCount());
// en bas du gm
forward OnQueriesFinish(const &time);
public OnQueriesFinish(const &time)
{
printf("Pour exйcuter toutes les requкtes du fichier requetes.txt, le serveur a mit %d millisecondes", time);
return true;
}
[/pawn]
Fonction :
[pawn]
mysql_tquery_file(const conHandle, const file[], callback[] = "", formt[] = "", {Float,_}:...)
{
new l = strlen(formt);
if((numargs() - 4) != l) return 0;
new bool:passed = false;
if(strlen(callback) <= 1 && l <= 1) goto reading;
static const ARGUMENTS = 4;
new n = (numargs() - ARGUMENTS) * BYTES_PER_CELL;
if(!n) goto reading;
new
parstring[256],
formatted[256],
arg_start,
arg_end;
for(new ii = 0; ii < l; ii++)
{
switch(formt[ii])
{
case 'd': strcat(parstring, "%d, ");
case 'i': strcat(parstring, "%i, ");
case 'f': strcat(parstring, "%f, ");
case 'a', 's': strcat(parstring, "%s, "), formt[ii] = 's';
}
}
#emit CONST.alt formt
#emit LCTRL 5
#emit ADD
#emit STOR.S.pri arg_start
#emit LOAD.S.alt n
#emit ADD
#emit STOR.S.pri arg_end
do
{
#emit LOAD.I
#emit PUSH.pri
arg_end -= BYTES_PER_CELL;
#emit LOAD.S.pri arg_end
}
while (arg_end > arg_start);
#emit PUSH.S parstring
#emit PUSH.C 256
#emit PUSH.ADR formatted
n += BYTES_PER_CELL * 4;
#emit PUSH.S n
#emit SYSREQ.C format
n += BYTES_PER_CELL;
#emit LCTRL 4
#emit LOAD.S.alt n
#emit ADD
#emit SCTRL 4
passed = true;
reading:
{
new File:hfile = fopen(file);
new query[256];
if(!hfile) return 0;
while(read_query(hfile, query)) mysql_tquery(conHandle, query);
fclose(hfile);
reading:
{
new File:hfile = fopen(file);
new query[256];
if(!hfile) return 0;
while(read_query(hfile, query)) mysql_tquery(conHandle, query);
fclose(hfile);
if(passed && funcidx(callback) != -1) CallLocalFunction(callback, formt, formatted);
} return 1;
}
[/pawn]
Voilа, si vous en avez qui pourraient кtre pas mal, postez les !