GTA-Center.com » Forum http://www.gta-center.com/forums/ |
|
[ARG] Funzioni utili http://www.gta-center.com/forums/viewtopic.php?f=41&t=211 |
Pagina 1 di 2 |
Autore: | Angelo [ 04/11/2010, 20:10 ] |
Oggetto del messaggio: | [ARG] Funzioni utili |
Raga qua potrete postare delle funzioni create da voi o da altri (Mettendo i crediti) inizio con alcune mie funzioni IsPlayerInWater By me and Peppe951 Il IsPlayerInWater serve per gettare se un player è in acqua Codice: stock IsPlayerInWater(playerid) { new index = GetPlayerAnimationIndex(playerid); return ((index >= 1538 && index <= 1541) || index == 1544); } uso Codice: if(IsPlayerInWater(playerid)) { // Funzione } GetPlayerIPFromID Il GetPlayerIPFromID serve per gettare l'id di un player avendo il suo IP Codice: stock GetPlayerIPFromID(ip[]) { new IP[16]; for(new i = 0; i < MAX_PLAYERS; i++) { if(IsPlayerConnected(i)) { GetPlayerIP(i, IP, sizeof(IP)); if(strcmp(ip, IP, true)==0) return i; } } return INVALID_PLAYER_ID; } Uso Codice: public OnRconLoginAttempt(ip[], password[], success) { new playerid = GetPlayerIPFromID(ip); if(!success) { new string[128], nome[24]; GetPlayerName(playerid, nome, 24); format(string, 128, "Il Player %s ha sbagliato il Rcon Login", nome); SendClientMessageToAll(COLOR_RED, string); } return 1; } BanTag(tag[]) Il BanTag serve per bannare tutti coloro che hanno quella Tag Codice: BanTag(tag[]) { new nome[24], str[10]; format(str, sizeof(str), "[%s]" , tag); for(new i = 0; i < MAX_PLAYERS; i++) { if(IsPlayerConnected(i)) { GetPlayerName(i, nome, 24); if(strfind(nome, str, true)==0) { Ban(i); } } } return 1; } Uso Codice: BanTag("TLK"); Bannerà tutti coloro che avranno la Tag TLK E infine posto il mio GetVehicleSpeed(vehicleid, type) Il GetVehicleSpeed server per gettare la velocità di un veicolo in Kmh o Mph Codice: GetVehicleSpeed(vehicleid, type) { new Float: Vel[3]; GetVehicleVelocity(vehicleid, Vel[0], Vel[1], Vel[2]); if(type == 1 || type > 2 || type < 1) type = floatround(floatsqroot(Vel[0]*Vel[0] + Vel[1]*Vel[1] + Vel[2]*Vel[2])*200, floatround_floor); else if(type == 2) type = floatround(floatsqroot(Vel[0]*Vel[0] + Vel[1]*Vel[1] + Vel[2]*Vel[2])*200 / 1.609344, floatround_floor); return type; } Uso Codice: new Kmh = GetVehicleSpeed(vehicleid, 1); Con 1 gettate la velocità in Kmh mentre con 2 quella in Mph, se invece mettete un numero diverso la velocità sarà sempre in Kmh Io finisco con queste 4 funzioni, ora postate voi le vostre |
Autore: | barletheking [ 04/11/2010, 20:54 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
bravo angelo, anche io ho fatto appena quando è uscita la 0.3b PlayerInAcqua(playerid), così tramite GetPlayerAnimationIndex che è stato aggiunto in 0.3b puoi vedere se nel player è applicata un animazione, in questo caso quella del nuoto =D. |
Autore: | Angelo [ 04/11/2010, 23:55 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
eh si è utilissimo, pensa che l'ho voluto creare x sistemare il fatto che quando cadi in acqua c'è sempre il anti fall off bike, all'inizio era semplicemente uno script che diceva che se la coordinata Z era minore 0 allora era in acqua, però alcuni interior sono sotto terra e così Peppe951 mi spiegò il funzionamento di GetPlayerAnimationIndex xD |
Autore: | Angelo [ 05/11/2010, 21:05 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
Posto la funzione "GetPlayerID(nome[])" la quale prende l'id del player attraverso il suo nome Codice: GetPlayerID(nome[]) { new name[24]; for(new i = 0; i < MAX_PLAYERS; i++) { if(IsPlayerConnected(i)) { GetPlayerName(i, name, 24); if(strcmp(nome, name, true)==0) return i; } } return INVALID_PLAYER_ID; } Uso: Codice: new playerid = GetPlayerID("Angelo");
|
Autore: | Lee_Zarock [ 05/11/2010, 21:26 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
il GetPlayerAnimationIndex è utilissimo, bisogna solo saperlo sfruttare |
Autore: | Angelo [ 05/11/2010, 21:32 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
eh si, io ci ho fatto il IsPlayerShooting: Codice: stock IsPlayerShooting(playerid) { new index = GetPlayerAnimationIndex(playerid); return(index == 1167 || index == 363); } getta solo se sta sparando con un'arma da fuoco |
Autore: | barletheking [ 07/11/2010, 23:23 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
ottimo, per me è bene continuare questo topic mettendo le funzioni utili e renderlo importante |
Autore: | SNaKe_OlD [ 08/11/2010, 16:53 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
Codice: stock IsPlayerInCube(playerid, Float:xmin, Float:ymin, Float:zmin, Float:xmax, Float:ymax, Float:zmax) { new Float:cx, Float:cy, Float:cz; GetPlayerPos(playerid, cx, cy, cz); if(cx > xmin && cy > ymin && cz > zmin && cx < xmax && cy < ymax && cz < zmax)return 1; return 1; } L'ho trovato in una mia vecchia gamemode. Questo script forma un cubo dove SOLO in quel cubo si possono fare determinate funzioni. |
Autore: | Peppe [ 08/11/2010, 17:02 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
GivePlayerWeapons(playerid, params) Codice: GivePlayerWeapons(playerid, ...) { new start = 1, num = numargs(); for(new i = start; i < num; i++) { GivePlayerWeapon(playerid, getarg(i), getarg(i++)); } return 1; } Questa funzione da delle armi al player ma a differenza del normale GivePlayerWeapon si possono dare più armi con la stessa funzione. Esempio: Codice: GivePlayerWeapons(playerid, 24, 250, 30, 250, 34, 250); In questo caso la struttura dei params è questa: weapon (deagle), ammo (250), weapon (AK-47), ammo (250), weapon (Sniper), ammo (250), IsPlayerInWater>(playerid) Codice: stock IsPlayerInWater(playerid) { new index = GetPlayerAnimationIndex(playerid); return (1538 <= index <= 1541 || index == 1544); } Funzione creata su idea di Angelo95 che mi ha dato gli id delle animazioni, returna 1 se un player è in acqua altrimenti returna 0. Funzioni/Macro binarie Nel pawn ogni cella è costituita di default da 32 bit, ovvero delle cifre che possono assumere il valore di 1 o 0. Utilizzando gli operatori bitwise sono riuscito a creare delle funzioni che modificano il valore del bit di una cella di una variabile o agiscono su questi. In poche parole utilizzando una sola variabile con queste funzioni potete inserire fino a 32 valori che possono essere true o false (booleani). Codice: #define bit(%1) (1 << %1) #define setBit(%1,%2) %1 |= bit(%2) #define unsetBit(%1,%2) %1 &= ~bit(%2) #define getBit(%1,%2) ((%1 & bit(%2)) != 0) #define setAllBits(%1) %1 = cellmax #define unsetAllBits(%1) %1 = 0 stock encodeBits({bool}:...) { new result = getarg(0), num = numargs(), arg; while(++arg < num) { if(getarg(arg)) { setBit(result, arg); } } return result; } La macro "bit" è utilizzata privatamente nelle altre funzioni, quindi non vi serve. Ecco a cosa servono le altre funzioni: setBit(var, slot) Setta il valore di un bit della variabile a true. La variabile var è la variabile in cui memorizzare i bit mentre slot è il numero del bit, che va da 0 a 31. unsetBit(var, slot) Setta il valore di un bit della variabile a false. La variabile var è la variabile in cui memorizzare i bit mentre slot è il numero del bit, che va da 0 a 31. getBit(var, slot) Returna true o false a seconda di ciò che è stato settato nella variabile di bit. setAllBits(var) Setta il valore di tutti i bit della variabile var a true. unsetAllBits(var) Setta il valore di tutti i bit della variabile var a false. Esempi: Codice: enum { Connected, Logged, Spawned, Dead } new pBools[MAX_PLAYERS]; OnPlayerDeath(playerid, killerid, reason) { unsetBit(pBools[playerid], Spawned); setBit(pBools[playerid], Dead); return 1; } OnPlayerRequestSpawn(playerid) { if(!getBit(pBools[playerid], Logged)) return 0; return 1; } OnPlayerSpawn(playerid) { if(getBit(pBools[playerid], Dead)) { SendClientMessage(playerid, COLOR_WHITE, "Eri morto"); unsetBit(pBools[playerid], Dead); } setBit(pBools[playerid], Spawned); return 1; } OnPlayerConnect(playerid) { setBit(pBools[playerid], Connected); return 1; } OnPlayerDisconnect(playerid, reason) { unsetAllBits(pBools[playerid]); return 1; } // Cosi abbiamo memorizzato quattro valori booleani in un unica variabile, risparmiando memoria encodeBits({Bool:}...) Returna un set di bit secondo i valori dati tra le parentesi (infiniti), che possono essere true o false. Questa funzione ad esempio può essere utilizzata al posto di quelle dell'UpdateVehicleDamageStatus, come encode_tires, encode_panels o altre, ed è anche "universale", ovvero non dovete usare più funzioni. PS: Necessita delle mie macro binarie precedentemente elencate. Esempio: Codice: new panels, doors, lights, tires; GetVehicleDamageStatus(vehicleid, panels, doors, lights, tires); UpdateVehicleDamageStatus(vehicleid, panels, doors, lights, encodeBits(true, true, false, true)); SendClientMessage(playerid, color, message[, params]) SendClientToAll(color, message[, params]) Codice: new SFM_tmpString[128]; #define SendClientMessage(%1,%2,%3,%4) \ format(SFM_tmpString, 128, %3, %4); \ SendClientMessage(%1, %2, SFM_tmpString) #define SendClientMessageToAll(%1,%2,%3) \ format(SFM_tmpString, 128, %2, %3); \ SendClientMessageToAll(%1, SFM_tmpString) Modifica del SendClientMessage(ToAll), con la quale se si inseriscono dei parametri dopo il messaggio ci sarà un format automatico. Attenzione: lo script non spreca memoria/velocità se non si inseriscono parametri dopo il messaggio, perché interviene solo se i parametri sono più di 3 nel SendClientMessage o più di 2 nel SendClientMessageToAll. ForeachPVar(playerid, varName[], varType); Codice: #define ForeachPVar(%1,%2,%3) \ for(new _index = 0, _numVars = GetPVarsUpperIndex(playerid); _index < _numVars; _index++) \ { \ GetPVarNameAtIndex(%1, _index, %2, sizeof(%2)); \ %3 = GetPVarType(%1, %2); \ } Esegue un ciclo con tutte le PVar di un player, dando alla stringa varName il nome della PVar e all'intero varType l'id corrispondente al tipo della PVar (1 = intero, 2 = stringa, 3 = float). Utile ad esempio per agire su tutte le PVar di un player senza fare una o più righe di codice per ogni PVar... Esempio: Codice: public OnPlayerSpawn(playerid) { //Porta a dei valori prestabiliti tutte le PVar di un player new varName[128], varType; ForeachPVar(playerid, varName, varType) { switch(varType) { case 1: { SetPVarInt(playerid, varName, 2); } case 2: { SetPVarString(playerid, varName, "LoL"); } case 3: { SetPVarFloat(playerid, varName, 0.255); } } } return 1; } Un altro esempio pratico sarebbe quello di usare questa macro per salvare tutte le PVar di un player in un file... Naturalmente potrete escludere delle particolari PVar dal ciclo in vari modi, ad esempio usando lo strcmp per vedere se il varName corrisponde a quello della PVar da escludere. _sleep(interval, bool:seconds = false) Codice: _sleep(interval, bool:seconds = false) { new _start = tickcount(), _interval = seconds ? 1000*interval : interval; intervalCheck: if(tickcount() - _start < _interval) goto intervalCheck; } Ho fatto questa funzione per provare delle funzioni del pawno che ho sempre ignorato... In pratica lo scopo di questa funzione è fermare una parte di codice per determinati millisecondi/secondi per poi continuare ad eseguire il codice. Per usare la funzione mettete nella parte di codice interessata così: Codice: _sleep(intervallo); in questo caso l'intervallo è in millisecondi... se volete invece mettere un intervallo in secondi fate cosi: Codice: _sleep(intervallo, true); Quindi l'intervallo è definito in secondi. Esempio pratico: Codice: public OnFilterScriptInit() { print("3"); _sleep(1, true); print("2"); _sleep(1, true); print("1"); _sleep(1, true); print("FS Caricato con successo ù.ù") return 1; } In questo caso quando viene avviato l'fs: - Digita "1" nella console; - C'è una pausa di un secondo; - Digita "2" nella console; - C'è una pausa di un secondo; - Digita "1" nella console; - C'è una pausa di un secondo; - Digita "FS Caricato con successo ù.ù" nella console; - Returna 1. PS: nel pawno c'è già la funzione predefinita "sleep(millisecondi)" ma funziona solo nel main() a differenza della mia... PPS: utilizzando questa funzione tutto lo script generale si fermerà fino a quando questa non è stata completata. Quindi non serve a molto xD. |
Autore: | barletheking [ 08/11/2010, 17:59 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
Ottimo |
Autore: | Peppinux AKA Peppe_Stasu [ 08/11/2010, 20:32 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
Codice: pName(playerid)
{ new playerName[24]; GetPlayerName(playerid, playerName 24); return playerName; } |
Autore: | Angelo [ 08/11/2010, 20:41 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
Codice: stock SetPlayerPosWithVehicle(playerid, Float:x, Float:y, Float:z, Float:Angle, interior, virtualworld) { if(IsPlayerInAnyVehicle(playerid)) { new vehicleid = GetPlayerVehicleID(playerid); SetVehiclePos(vehicleid, x, y, z); SetVehicleZAngle(vehicleid, Angle); LinkVehicleToInterior(vehicleid, interior); SetVehicleVirtualWorld(vehicleid, virtualworld); SetPlayerPos(playerid, x, y, z); PutPlayerInVehicle(playerid, vehicleid, 1); } } Utile funzione che teletrasporta il player con tutto il veicolo (Non c'è bisogno di vedere se il player è nel veicolo); |
Autore: | Peppinux AKA Peppe_Stasu [ 08/11/2010, 21:02 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
Angelo ha scritto: Codice: stock SetPlayerPosWithVehicle(playerid, Float:x, Float:y, Float:z, Float:Angle, interior, virtualworld) { if(IsPlayerInAnyVehicle(playerid)) { new vehicleid = GetPlayerVehicleID(playerid); SetVehiclePos(vehicleid, x, y, z); SetVehicleZAngle(vehicleid, Angle); LinkVehicleToInterior(vehicleid, interior); SetVehicleVirtualWorld(vehicleid, virtualworld); SetPlayerPos(playerid, x, y, z); PutPlayerInVehicle(playerid, vehicleid, 1); } } Utile funzione che teletrasporta il player con tutto il veicolo (Non c'è bisogno di vedere se il player è nel veicolo); Migliorato: Codice: stock SetPlayerPosWithVehicle(playerid, Float:x, Float:y, Float:z, Float:angle = 90.0, interior = 0, virtualworld = 0)
{ if(IsPlayerInAnyVehicle(playerid)) { if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER) { new vehicleid = GetPlayerVehicleID(playerid); SetVehiclePos(vehicleid, x, y, z); if(angle != 90) SetVehicleZAngle(vehicleid, angle); if(interior != 0) LinkVehicleToInterior(vehicleid, interior); if(virtualworld != 0) SetVehicleVirtualWorld(vehicleid, virtualworld); PutPlayerInVehicle(playerid, vehicleid, 0); } } } |
Autore: | Angelo [ 08/11/2010, 21:11 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
hai ragione ho dimenticato il PLAYER_STATE_DRIVER |
Autore: | Peppinux AKA Peppe_Stasu [ 08/11/2010, 21:51 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
Dimenticavo. Sarebbe meglio che se il player non è in nessun veicolo viene richiamata la funzione normale SetPlayerPos. Correggi tu |
Autore: | Angelo [ 09/11/2010, 10:44 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
Codice: SetPlayerPosEx(playerid, Float:x, Float:y, Float:angle, interior, world) { SetPlayerInterior(playerid, interior); SetPlayerVirtualWorld(playerid, world); if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER) { new vehicleid = GetPlayerVehicleID(playerid); SetVehiclePos(vehicleid, x, y, z); SetPlayerPos(playerid, x, y, z); SetVehicleZAngle(vehicleid, angle); LinkVehicleToInterior(vehicleid, interior); SetVehicleVirtualWorld(vehicleid, world); } else { SetPlayerPos(playerid, x, y, z); SetPlayerFacingAngle(playerid, angle); } } Credo che così vada meglio basta mettere SetPlayerPosEx(playerid, x, y, z, angle, interior, world); e fa tutto da solo |
Autore: | Peppe [ 09/11/2010, 15:44 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
Angelo ha scritto: Codice: SetPlayerPosEx(playerid, Float:x, Float:y, Float:angle, interior, world) { SetPlayerInterior(playerid, interior); SetPlayerVirtualWorld(playerid, world); if(GetPlayerState(playerid) &PLAYER_STATE_DRIVER) { new vehicleid = GetPlayerVehicleID(playerid); SetVehiclePos(vehicleid, x, y, z); SetPlayerPos(playerid, x, y, z); SetVehicleZAngle(vehicleid, angle); LinkVehicleToInterior(vehicleid, interior); SetVehicleVirtualWorld(vehicleid, world); } else if(GetPlayerState(playerid) &PLAYER_STATE_ONFOOT) { SetPlayerPos(playerid, x, y, z); SetPlayerFacingAngle(playerid, angle); } } Credo che così vada meglio basta mettere SetPlayerPosEx(playerid, x, y, z, angle, interior, world); e fa tutto da solo L'operatore & non centra niente qui, usa ==, inoltre mettere l'if che controlla se un player a piedi è inutile, anzi, non setterebbe la pos dei player passeggeri. |
Autore: | Angelo [ 09/11/2010, 15:50 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
modificato |
Autore: | Angelo [ 30/01/2011, 14:01 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
Codice: forward Float:GetDistance(Float:x1, Float:x2, Float:y1, Float:y2); Float:GetDistance(Float:x1, Float:x2, Float:y1, Float:y2) { return floatsqroot(floatpower(floatsub(x1, x2), 2) + floatpower(floatsub(y1, y2), 2)); } Semplice funzione che returna la distanza tra due punti, basterà prendere le coordinate di questi due punti e sistemare la coordinata x del primo e quella del secondo al posto di x1, x2 (se le metterte al contrario non cambia niente) la stessa cosa fatela con le coordinate y. Codice: forward Float:GetPlayersDistance(playerid, pid); Float:GetDistance(playerid, pid) { if(IsPlayerConnected(playerid) && IsPlayerConnected(pid)) { if(playerid != INVALID_PLAYER_ID && pid != INVALID_PLAYER_ID) { new Float:Pos[6]; GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]); GetPlayerPos(pid, Pos[3], Pos[4], Pos[5]); return floatsqroot(floatpower(floatsub(Pos[0], Pos[3]), 2) + floatpower(floatsub(Pos[1], Pos[4]), 2)); } } } Il GetPlayersDistance returna la distanza tra due players Codice: forward Float:GetVehiclesDistance(vehicleid, vehicleid2); Float:GetDistance(vehicleid, vehicleid2) { if(vehicleid != INVALID_VEHICLE_ID && vehicleid2 != INVALID_VEHICLE_ID) { new Float:Pos[6]; GetVehiclePos(vehicleid, Pos[0], Pos[1], Pos[2]); GetVehiclePos(vehicleid2, Pos[3], Pos[4], Pos[5]); return floatsqroot(floatpower(floatsub(Pos[0], Pos[3]), 2) + floatpower(floatsub(Pos[1], Pos[4]), 2)); } } Il GetVehiclesDistance returna la distanza tra due veicoli. Codice: forward Float:GetObjectsDistance(obj1, obj2); Float:GetDistance(obj1, obj2) { if(obj1 != INVALID_OBJECT_ID && obj2 != INVALID_OBJECT_ID) { new Float:Pos[6]; GetObjectPos(obj1, Pos[0], Pos[1], Pos[2]); GetObjectPos(obj2, Pos[3], Pos[4], Pos[5]); return floatsqroot(floatpower(floatsub(Pos[0], Pos[3]), 2) + floatpower(floatsub(Pos[1], Pos[4]), 2)); } } Il GetObjectsDistance returna la distanza tra due objects |
Autore: | Peppinux AKA Peppe_Stasu [ 25/02/2011, 16:23 ] |
Oggetto del messaggio: | Re: [ARG] Funzioni utili |
sendInfoMessage(playerid, bool:color, message[]) Codice: sendInfoMessage(playerid, bool:color, message[]) { new string[128]; if(color == true) format(string, 128, "{00FF00}INFO: {AFAFAF}%s", message); else format(string, 128, "{F60000}INFO: {AFAFAF}%s", message), SendClientMessage(playerid, -1, string); } -playerid: L'ID del Player a cui deve essere mandato il messaggio di INFO. -bool:color: Il colore che deve avere "INFO:" nel messaggio. true = verde; false = rosso. -message[]: Testo del messaggio di INFO. sendErrorMessage(playerid, message[]) Codice: sendErrorMessage(playerid, message[]) { new string[128]; format(string, 128, "{F60000}ERRORE: {AFAFAF}%s", message), SendClientMessage(playerid, -1, string); } -playerid: L'ID del Player a cui deve essere mandato il messaggio di ERRORE. -message[]: Testo del messaggio di ERRORE. |
Pagina 1 di 2 | Tutti gli orari sono UTC + 1 ora [ ora legale ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |