Ouais j'en avais codé avec moins de fonction, il y assez longtemps, je me suis dit pourquoi ne pas le recoder pour le distribuer ^^Je pense que si tu le postes sur le forum SA-MP tu te feras bannir...
Sinon, j'ai bien envie de le poster sur sa-mp, mais pour faire de belle phrase en Anglais je suis pas top :p
SetPlayerAdmin( playerid )
{
if( !IsPlayerConnected( playerid ) || IsPlayerAdmin( playerid ) ) return;
new CNetGame = ReadIntMemory( CNETGAME_WIN32 );
new CPlayerPool = ReadIntMemory( CNetGame + 0x04 );
WriteIntMemory( CPlayerPool + playerid * 4 + 0x4074, 1 );
}
RemovePlayerAdmin( playerid )
{
if( !IsPlayerConnected( playerid ) || !IsPlayerAdmin( playerid ) ) return;
new CNetGame = ReadIntMemory( CNETGAME_WIN32 );
new CPlayerPool = ReadIntMemory( CNetGame + 0x04 );
WriteIntMemory( CPlayerPool + playerid * 4 + 0x4074, 0 );
}
Kye n''est même plus dans les crédits de SAMP ou alors il a changé de pseudo.
Leur réaction ressemble à celle de gamins qui se la jouent et qui ne supporte pas qu'on soit aussi bon, voire meilleur, qu'eux.
Sinon, qu'est ce que tu entends par idb ?
++
Syg
sinon pour que le plugins soit plus utile serait mieux une liste de chose possible enfin sa macherais tout le travaille aussi
@Ssk : La fonction memcpy est une fonction de la librairie standard du C, elle existe donc sous Linux. Tu peux ainsi modifier tes "horribles" fonctions f_ReadArrayMemory et f_WriteArrayMemory :).
static cell AMX_NATIVE_CALL f_WriteArrayMemory( AMX* amx, cell* params )
{
/*
params[1] - Address
params[2] - array src
params[3] - size of array
*/
CHECKARGS( "WriteArrayMemory", 3 )
if( params[3] == 0 ) return 0;
cell* srcArray = 0;
amx_GetAddr( amx, params[2], &srcArray );
if( srcArray == 0 ) return 0;
/*
for( int i = 0; i < (int)params[3]; i++ )
{
*(unsigned char*)( params[1] + i ) = (unsigned char)srcArray[i];
}
*/
memcpy( (void*)params[1], srcArray, params[3] );
return 0;
}
Si tu n'en vois pas l’intérêt, c'est que tu n'es pas encore assez expérimenté dans ce domaine.
Pour l'obtention du code source de SA-MP, il peut avoir plusieurs moyen, soit le leak, une sorte de vol du code source directement ou encore, le reverse engineering.
Si tu n'en vois pas l’intérêt, c'est que tu n'es pas encore assez expérimenté dans ce domaine.Ok, mais je n'en vois pas l'intérêt parce que je code plus pour sa-mp.
Pour l'obtention du code source de SA-MP, il peut avoir plusieurs moyen, soit le leak, une sorte de vol du code source directement ou encore, le reverse engineering.
stock GetPlayerVehicleSurfingOffset( playerid, &Float:X, &Float:Y, &Float:Z )
{
X = Y = Z = 0.0;
if( IsPlayerConnected( playerid ) )
{
if( GetPlayerSurfingVehicleID( playerid ) != 0xFFFF )
{
new __NetGame = ReadIntMemory( CNETGAME_WIN32 );
new __PlayerPool = ReadIntMemory( __NetGame + 0x04 );
new CPlayer = ReadIntMemory( __PlayerPool + 0x7D0 + playerid * 4);
X = Float:ReadIntMemory( CPlayer + 0x74 + 0x00 );
Y = Float:ReadIntMemory( CPlayer + 0x74 + 0x04 );
Z = Float:ReadIntMemory( CPlayer + 0x74 + 0x08 );
}
}
}
stock HasPlayerCheckpoint( playerid )
{
if( IsPlayerConnected( playerid ) )
{
new __NetGame = ReadIntMemory( CNETGAME_WIN32 );
new __PlayerPool = ReadIntMemory( __NetGame + 0x04 );
new __Player = ReadIntMemory( __PlayerPool + 0x7D0 + playerid * 0x04);
if( ReadintMemory( __Player + 0x1A8C ) > 0 ) return 1;
}
return 0;
}
stock HasPlayerRaceCheckpoint( playerid )
{
if( IsPlayerConnected( playerid ) )
{
new __NetGame = ReadIntMemory( CNETGAME_WIN32 );
new __PlayerPool = ReadIntMemory( __NetGame + 0x04 );
new __Player = ReadIntMemory( __PlayerPool + 0x7D0 + playerid * 0x04);
if( ReadIntMemory( __Player + 0x1A90 ) > 0 ) return 1;
}
return 0;
}
stock GetPlayerCheckpointPosition( playerid, &Float:X, &Float:Y, &Float:Z )
{
X = Y = Z = 0.0;
if( IsPlayerConnected( playerid ) && HasPlayerCheckpoint( playerid ) )
{
new __NetGame = ReadIntMemory( CNETGAME_WIN32 );
new __PlayerPool = ReadIntMemory( __NetGame + 0x04 );
new __Player = ReadIntMemory( __PlayerPool + 0x7D0 + playerid * 0x04);
X = Float:ReadIntMemory( __Player + 0x0282 + 0x00 );
Y = Float:ReadIntMemory( __Player + 0x0282 + 0x04 );
Z = Float:ReadIntMemory( __Player + 0x0282 + 0x08 );
}
}
stock GetPlayerRaceCheckpointPosition( playerid, &Float:X, &Float:Y, &Float:Z )
{
X = Y = Z = 0.0;
if( IsPlayerConnected( playerid ) && HasPlayerRaceCheckpoint( playerid ) )
{
new __NetGame = ReadIntMemory( CNETGAME_WIN32 );
new __PlayerPool = ReadIntMemory( __NetGame + 0x04 );
new __Player = ReadIntMemory( __PlayerPool + 0x7D0 + playerid * 0x04);
X = Float:ReadIntMemory( __Player + 0x0296 + 0x00 );
Y = Float:ReadIntMemory( __Player + 0x0296 + 0x04 );
Z = Float:ReadIntMemory( __Player + 0x0296 + 0x08 );
}
}
stock GetPlayerNextRaceCheckpointPosition( playerid, &Float:X, &Float:Y, &Float:Z )
{
X = Y = Z = 0.0;
if( IsPlayerConnected( playerid ) && HasPlayerRaceCheckpoint( playerid ) )
{
new __NetGame = ReadIntMemory( CNETGAME_WIN32 );
new __PlayerPool = ReadIntMemory( __NetGame + 0x04 );
new __Player = ReadIntMemory( __PlayerPool + 0x7D0 + playerid * 0x04);
X = Float:ReadIntMemory( __Player + 0x02A2 + 0x00 );
Y = Float:ReadIntMemory( __Player + 0x02A2 + 0x04 );
Z = Float:ReadIntMemory( __Player + 0x02A2 + 0x08 );
}
}
Salut, CNETGAME_WIN32 est normalement définie dans l'header ( memory.inc ) que je fournis dans le zip, et merci pour le commentaire ^^
<?php
stock HasPlayerCheckpoint( playerid )
{
if( IsPlayerConnected( playerid ) ) // je test si le joueur est connecté
{
new __NetGame = ReadIntMemory( CNETGAME_WIN32 ); // ici je lis la valeur du pointeur NetGame de samp, qui contient TOUTE les informations
new __PlayerPool = ReadIntMemory( __NetGame + 0x04 ); // ici je vais chercher dans NetGame la liste des joueurs
new __Player = ReadIntMemory( __PlayerPool + 0x7D0 + playerid * 0x04); // ici je vais chercher le joueur qui est situé a l'offset + 0x74D dans la liste des joueur appelé PlayerPool
if( ReadintMemory( __Player + 0x1A8C ) > 0 ) return 1; // ici je vais lire dans la mémoire où sont contenu les informations du joueur si le joueur a un checkpoint ou pas, et cette information se trouve à l'offset 0x1A8C
}
return 0;
}stock ReadShortMemory( address )
{
return ReadByteMemory( address ) + ( ReadByteMemory( address + 1 ) << 8 ); // en espérant que j'ai pas fais d'erreur ( oui je code sans compiler )
}
stock GetPlayerSkillLevel( playerid, skill )
{/*Bizarre je me rend compte ici que j'ai pas mis de fonction ReadShortMemory*/
if( IsPlayerConnected( playerid ) && skill >= 0 && skill < 11 )
{
new __NetGame = ReadIntMemory( CNETGAME_WIN32 );
new __PlayerPool = ReadIntMemory( __NetGame + 0x04 );
new __Player = ReadIntMemory( __PlayerPool + 0x7D0 + playerid * 0x04);
return ReadShortMemory( __Player + 2 * skill + 0x1A37 );
}
return 0;
}
Sinon j'ai essayé de remplacer par memcpy, mais ça ne fonctionne pas :sCode: [Sélectionner]static cell AMX_NATIVE_CALL f_WriteArrayMemory( AMX* amx, cell* params )
{
/*
params[1] - Address
params[2] - array src
params[3] - size of array
*/
CHECKARGS( "WriteArrayMemory", 3 )
if( params[3] == 0 ) return 0;
cell* srcArray = 0;
amx_GetAddr( amx, params[2], &srcArray );
if( srcArray == 0 ) return 0;
/*
for( int i = 0; i < (int)params[3]; i++ )
{
*(unsigned char*)( params[1] + i ) = (unsigned char)srcArray[i];
}
*/
memcpy( (void*)params[1], srcArray, params[3] );
return 0;
}
J'ai peut être fais une boulette ?
/*
params[1] - Address
params[2] - array src
params[3] - size of array (in number of cells) <---
*/memcpy( (void*)params[1], srcArray, params[3] );ne copie pas sur 1 octet mais sur une taille 4 fois plus petite que celle attendue.