Super truc trop bien qui permet de formater ( on l'appellera symbole )
#define COUNT 1024
main()
{
new i,
iVariable[COUNT],
iValue;
for (i = 0; i < COUNT; i++)
{
iValue = iVariable[i];
if (iValue != 0)
{
printf("iVariable[%i] = %i", i, iValue);
}
}
}
Sinon, comment avez vous découvert/appris le pawn?
- Major performance improvements and smoother game-play.Ce n'est peut-être qu'une impression mais on dirait qu'avec cette version 0.3d le jeu est plus fluide. J'ai testé sur ma machine du boulot (qui n'est pas vraiment faite pour jouer). Mais le différence n'est peut-être pas visible sur des machines plus puissantes.
- Moving objects can now rotate smoothly.Sur le coup, j'ai cru qu'ils avaient ajouté des fonctions pour la rotation des objets (sur le principe de MoveObject) mais en fait ils ont juste optimisé les rotations des objets attachés (aux joueurs ou aux véhicules)
- Many new scripting functions and callbacks for SA-MP servers.Est-ce que quelqu'un sait où on peut trouver une liste spécifique des callbacks et fonctions qu'ils ont ajouté dans cette version (j'avoue, je n'ai pas cherché très longtemps) ?
forward OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid);
forward OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid);
forward OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ);
#define KEY_YES (65536)
#define KEY_NO (131072)
#define KEY_CTRL_BACK (262144)
Citer- Major performance improvements and smoother game-play.Ce n'est peut-être qu'une impression mais on dirait qu'avec cette version 0.3d le jeu est plus fluide. J'ai testé sur ma machine du boulot (qui n'est pas vraiment faite pour jouer). Mais le différence n'est peut-être pas visible sur des machines plus puissantes.Citer- Moving objects can now rotate smoothly.Sur le coup, j'ai cru qu'ils avaient ajouté des fonctions pour la rotation des objets (sur le principe de MoveObject) mais en fait ils ont juste optimisé les rotations des objets attachés (aux joueurs ou aux véhicules)Citer- Many new scripting functions and callbacks for SA-MP servers.Est-ce que quelqu'un sait où on peut trouver une liste spécifique des callbacks et fonctions qu'ils ont ajouté dans cette version (j'avoue, je n'ai pas cherché très longtemps) ?
++
Syg
Je pense que cette version de SA-MP (la 0.3d) signe un peu la mort (au niveau développement) de SA-MP, non ?
<?php
$sString = "Xartrick";
?>
new sString[9] = "Xartrick";
<?php
$sString1 = "Xartrick";
$sString2 = " le leet.";
$sString = $sString1 . $sString2;
?>
new sString1[9] = "Xartrick",
sString2[10] = " le leet.",
sString[18] = "";
strcat(sString, sString1, sizeof(sString));
strcat(sString, sString2, sizeof(sString));
Omg mais il en a pas marre ce Kye de faire nawak? D'après c'que je lis le jeu serait acceleré mais on nage toujours en mode slow motion? Mais stop quoi, il ferait mieu de filer son poste à quelqu'un de compétant...
ok je lie tout sa =) merci,si non pas de fs ? ((les tuto son bien expliquer a 1er vue =) ))
memcmp in pawn take 8737 ms
memcmp in asm take 1826 ms
swap with 3 xor take 1137 ms
swap with 3 var take 874 ms
swap in asm take 373 ms
Est-ce que certains (débutants en priorité, le but c'est d'apprendre) seraient intéressés par la création d'un GM à plusieurs sur Google code ? Ça peut vous aider si vous avez du mal avec le Pawn.
J'ai trouvé un topic qui pourrait vous intéresser car il concerne les timers.
En général dans la tête de tous les scripteurs plus de timer = plus de lags, mais voilà qu'Y_Less démontre le contraire.
http://forum.sa-mp.com/showthread.php?t=61322 (http://forum.sa-mp.com/showthread.php?t=61322)
Si vous avez du mal à comprendre pourquoi, je pourrai mieux vous expliquer et cela en Français :p
Mais il faudrait quand même plus de monde, à 3 ça va être un peu juste
En plus de gérer le projet, je pense que je m'occuperai du panel surtout (le site + la partie SQL du GM)
fonction_de_base()
{
for(;;)
{
ExecuterCodeReseau();
ExecuterCodeSynchronisation();
ExecuterCodeTimers();
}
}
(http://i.imgur.com/qUevdUl.png)Respect franchement, il y a du travail !
http://forum.sa-mp.com/showthread.php?t=428742 (http://forum.sa-mp.com/showthread.php?t=428742)
Best plugin ever
#include <a_samp>
new g_AmxDefsize = -1;
new g_AddrPublicTable = -1;
new g_AddrNativeTable = -1;
stock AMX_ReadString(addr, str[], len = sizeof (str))
{
new Value;
new i;
/* Fonction pas du tout optimisée mais elle fonctionne */
for(i = 0; i < len; i++, addr++)
{
#emit LREF.S.PRI addr
#emit STOR.S.PRI Value
str[i] = Value & 0xff;
if(str[i] == 0) return;
}
}
GetPublicCount()
{
return (g_AddrNativeTable - g_AddrPublicTable) / g_AmxDefsize;
}
ReadAmxHeader()
{
new Addr;
new Offset;
new Value;
#emit LCTRL 1
#emit STOR.S.PRI Addr
Addr = -Addr;
/* Offset of flags + defsize*/
Offset = Addr + 8;
#emit LREF.S.PRI Offset
#emit STOR.S.PRI Value
g_AmxDefsize = (Value >> 16);
/* Offset of publics table */
Offset = Addr + 32;
#emit LREF.S.PRI Offset
#emit STOR.PRI g_AddrPublicTable
/* Offset of natives table*/
Offset = Addr + 36;
#emit LREF.S.PRI Offset
#emit STOR.PRI g_AddrNativeTable
}
GetPublicIdx(public_name[])
{
new Addr;
new Offset;
new Public_Name;
new Name[128];
new i;
#emit LCTRL 1
#emit STOR.S.PRI Addr
Addr = -Addr;
for(i = 0; i < GetPublicCount(); i++)
{
Offset = Addr + g_AddrPublicTable + i * g_AmxDefsize + 4;
#emit LREF.S.PRI Offset
#emit STOR.S.PRI Public_Name
AMX_ReadString(Addr+Public_Name, Name);
if(strcmp(public_name, Name) == 0)
{
return i;
}
}
return -1;
}
GetPublicAddr(idx)
{
new Addr;
new Offset;
new Public_Addr;
#emit LCTRL 1
#emit STOR.S.PRI Addr
Addr = -Addr;
Offset = Addr + g_AddrPublicTable + idx * g_AmxDefsize;
#emit LREF.S.PRI Offset
#emit STOR.S.PRI Public_Addr
return Public_Addr;
}
DetourPublic(funcToDetour[], func_dest[])
{
new Addr;
new func_1, func_2;
new Offset;
new Func_Addr;
#emit LCTRL 1
#emit STOR.S.PRI Addr
Addr = -Addr;
func_1 = GetPublicIdx(funcToDetour);
func_2 = GetPublicIdx(func_dest);
if(func_1 != -1 && func_2 != -1)
{
Func_Addr = GetPublicAddr(func_2);
Offset = Addr + g_AddrPublicTable + func_1 * g_AmxDefsize;
#emit LOAD.S.pri Func_Addr
#emit SREF.S.PRI Offset
}
}
public MyOnPlayerConnect(playerid);
public MyOnPlayerConnect(playerid)
{
print("MyOnPlayerConnect()");
OnPlayerConnect(playerid);
}
public OnPlayerConnect(playerid)
{
print("OnPlayerConnect()");
}
public OnGameModeInit()
{
}
main()
{
ReadAmxHeader();
DetourPublic("OnPlayerConnect", "MyOnPlayerConnect");
}
[/spoiler]Et c'est la que tu te rend compte que "faire la java" c'est mieux que "faire du java".
:jesors:
Tu peux faire pas mal de choses basiques : calculatrices, lecteurs mp3, et j'en passe. Mais le temps d'exécution des applications est très long, le mieux reste d'utiliser un langage plus rapide tel que le Java, ou si tu veux des performances maximales, le C.
C'est le calme avant la tempête, préparez vous !
C'est le calme avant la tempête, préparez vous !
(je suis perfectionniste et j'aime pas déléguer le travail par peur qu'il soit bâclé)ça nous fait un point en commun alors
Y'a quoi de drôle à devoir respecter les "règles" de la vraie vie dans un jeu, au fait? Enfin bon chacun ses délires après, mais j'ai jamais compris ça.
Les goûts et les couleurs, ça ne se discute pas.
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp("/mycommand", cmdtext, true)==0)
{
//Lol
return 1;
}
return 0;
}
et:public OnPlayerCommandText(playerid, cmdtext[])
{
new
pos,
funcname[MAX_FUNC_NAME];
while (cmdtext[++pos] > ' ')
{
funcname[pos-1] = tolower(cmdtext[pos]);
}
format(funcname, sizeof(funcname), "cmd_%s", funcname);
while (cmdtext[pos] == ' ') pos++;
if (!cmdtext[pos])
{
if (zcmd_g_HasOPCE)
{
return CallLocalFunction("OnPlayerCommandPerformed", "isi", playerid, cmdtext, CallLocalFunction(funcname, "is", playerid, "\1"));
}
return CallLocalFunction(funcname, "is", playerid, "\1");
}
if (zcmd_g_HasOPCE)
{
return CallLocalFunction("OnPlayerCommandPerformed", "isi", playerid, cmdtext, CallLocalFunction(funcname, "is", playerid, cmdtext[pos]));
}
return CallLocalFunction(funcname, "is", playerid, cmdtext[pos]);
}
COMMAND:mycommand(playerid, params[])
{
//lol
return 1;
}
Y'a même pas besoin de se poser la question hein ?
Attention,J'ai oublié de préciser que je parlais de commandes sans paramètres ^^ (donc juste en utilisant strcmp)
strcmp() est une simple fonction de comparaison de chaîne de caractères. Quant à ZCMD c'est un outil de création de commandes rapides incluant la récupération des paramètres, si paramètre il y a, de la commande.
Il faut utiliser au minimum strtok avec strcmp(), et je pense que la comparaison doit se faire à ce niveau là.
CMD:coucou(playerid, params[])
{
SendClientMessage(playerid, -1, "Coucou toi !");
return 1;
}
if(strcmp("/mycommand", cmdtext, true)==0)
{
SendClientMessage(playerid, -1, "Coucou toi !");
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
new
pos,
funcname[MAX_FUNC_NAME];
while (cmdtext[++pos] > ' ')
{
funcname[pos-1] = tolower(cmdtext[pos]);
}
format(funcname, sizeof(funcname), "cmd_%s", funcname);
while (cmdtext[pos] == ' ') pos++;
if (!cmdtext[pos])
{
if (zcmd_g_HasOPCE)
{
return CallLocalFunction("OnPlayerCommandPerformed", "isi", playerid, cmdtext, CallLocalFunction(funcname, "is", playerid, "\1"));
}
return CallLocalFunction(funcname, "is", playerid, "\1");
}
if (zcmd_g_HasOPCE)
{
return CallLocalFunction("OnPlayerCommandPerformed", "isi", playerid, cmdtext, CallLocalFunction(funcname, "is", playerid, cmdtext[pos]));
}
return CallLocalFunction(funcname, "is", playerid, cmdtext[pos]);
}
est exécuté à chaque commande tapée (va voir dans l'include)
CMD:coucou(playerid, params[])
{
#pragma unused params // pour éviter les erreurs du compilateur ;-)
SendClientMessage(playerid, -1, "Coucou toi !");
return 1;
}
Et bien alors ?Code: (pawn) [Sélectionner]CMD:coucou(playerid, params[])
{
SendClientMessage(playerid, -1, "Coucou toi !");
return 1;
}
Est plus rapide que...Code: (pawn) [Sélectionner]if(strcmp("/mycommand", cmdtext, true)==0)
{
SendClientMessage(playerid, -1, "Coucou toi !");
return 1;
}
Non..?
main()
{
print("Testing Started");
new
i = 0,
x = 0,
StartTick[3]
;
StartTick[0] = GetTickCount();
while(++i != ITERATIONS)
{
OnPlayerCommandText(0, "zcmdcommand");
}
StartTick[1] = GetTickCount();
while(++x != ITERATIONS)
{
zcmd_OnPlayerCommandText(0, "/strcmpcommand");
}
StartTick[2] = GetTickCount();
printf( "ZCMD vs STRCMP - %d Commands", ITERATIONS);
printf( "ZCMD took %d ms to execute %d commands", ( StartTick[1] - StartTick[0] ), ITERATIONS );
printf( "STRCMP took %d ms to execute %d commands", ( StartTick[2] - StartTick[1] ), ITERATIONS );
print("Testing Ended, sir.");
}
La meilleur méthode à faire c'est de créer une callback pour chaque commande, et de passer en paramètre la chaîne complète
Après t'auras juste à utiliser le strtok dans la callback de la commande
Il me semble que ce devrait être définitivement plus rapide que ZCMD (car une centaine de strcmp pour détecter une commande, ça pèse lourd)