Korisne skripte i kodovi

Započeo Correlli, Mart 10, 2010, 20:26:26 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 16 gostiju pregledaju ovu temu.

Citat: Gagi_Corleone poslato Avgust 10, 2011, 15:58:06 POSLE PODNE
Citat: [CRP] Pacijent_ poslato Avgust 10, 2011, 15:34:03 POSLE PODNE
Znaci mesto "public nesto()" ide "funkcija nesto()"

I obrisem forwarde?
Da jer ti funkicija sadrzi taj public i forward. Tacnije ovako nesto
funkcija nesto()
E ona ti je jednaka kao i
foraward nesto();
public nesto()

Tako sam ja skontao

Dobro si skonto :)
Trenutno radim novi DeathMatch server... Trazim ljude koji mogu pomoc na bio koji nacin.. Za vise info PM ;)

Citat: _Stranger poslato Avgust 10, 2011, 20:51:46 POSLE PODNE
[H]265 stvarno mi nije jasno kako za to mozes da kazes da je tvoje, ti mozes reci da si je ti vamo postavio i preimenova + nemoj mi sad s*ati kako si je ti napisao pre seifa ili bilo koga jer to nije tacno , nismo vamo svi [cenzura]i pa da mislis da mozes da se kitis tudjim kodama i jos napises da si ti napravio -.-

Da se tu ne prepucavam imas PM, nadam se da si shvatio ;)

#define randomEx(%1,%0) \
                    ((random((%0)-(%1))+(%1)))
// by [H]265


primjer:

GivePlayerMoney(playerid, randomEx(500,100)); // Igrac ce dobiti minimalno 100, a maximlano 500 $$$ ili nesto izmedu

Evo jedne funkcije sigurno su je svi zatrebali, randomEx(max,min) sto vam je super kada dajete random pickup 'novaca' sada mozete odrediti minimalnu vrjednost i maximalnu :)
Poslednja Izmena: Avgust 11, 2011, 23:38:33 POSLE PODNE od [H]265
Kristijan Stipić

#define YesNo(%0) ((%0) == (1)) ? ("Yes") : ("No") // by [03]Garisno

new example = random(500);
printf("Is RCON admin: %s", YesNo(IsPlayerAdmin(playerid)));

Ako je igrac bio admin reci ce: Is RCON admin: Yes
u drugom slucaju (igrac nije bio admin) reci ce: Is RCON admin: No

------------------------------

#define Answer(%0,%1,%2) (%0) == (1) ? (%1) : (%2) //by [03]Garisno
// Ista upotreba kao i YesNo samo ovdije ima vise odgovora,,

new example = random(500);
printf("Is RCON admin: %s", Answer(IsPlayerAdmin(playerid), "Da, on je Admin.", "Ne,on nije Admin."));
// ako je igrac bio admin reci ce: Is RCON admin: Da, on je Admin.
// drugacije ce reci: Is RCON admin: Ne,on nije Admin.
Trenutno radim novi DeathMatch server... Trazim ljude koji mogu pomoc na bio koji nacin.. Za vise info PM ;)

- nevaljano.
Poslednja Izmena: Avgust 16, 2011, 23:03:29 POSLE PODNE od [H]265
Kristijan Stipić

@h Ovo neće raditi...

Recimo da server ima 3 igrača sa ID-evima: 5,9,11...
A tvoj loop će izvrtiti "3" što nije nijedan igračev ID...
Poslednja Izmena: Avgust 16, 2011, 22:37:08 POSLE PODNE od BloodMaster

lol da imaš pravo nisam se uopce sjetio toga ^^ sve jedno se vracamo na to da moram koristiti normalan loop sa for petljom, ako necu koristiti static loping, a ne ovim cache - om
Ma iskreno nisam se ni zamarao puno nego sam samo htio napraviti taj cache ne znam dal ce ovo dobro compileati jer sam pisao ovdje kad sam stisnuo 'nova poruka' ^^ sve u svemu editao sam ;)

Rjesenje problema bi bila static syntaxa ali neda mi se sada jeb*at s time tako da cu jednostavno maknuti
Poslednja Izmena: Avgust 16, 2011, 23:07:13 POSLE PODNE od [H]265
Kristijan Stipić

Evo pošto me zanimalo kako bi se to dalo izvesti, pošto sam vidio kode tu, preformulirao sam ideju u nešto kompliciranije. Molio bih nekoga da testira jer nisam jos testirao, radio sam sve napamet :S
Ako ne valja, lako se pobrise post >.<


#include "YSI\y_hooks"

new PLAYER_CACHE; // use -  u loopu slotova
new CONNECTED[MAX_PLAYERS char]; // use - loop playeridova kroz slotove

#define hloop(%0) for(new %0 = 0; %0 < PLAYER_CACHE; %0++) if(CONNECTED{%0} == 0) continue; %0 = CONNECTED{%0}-1;

Hook:C1_OnPlayerConnect(playerid) return CONNECTED{PLAYER_CACHE} = playerid+1, PLAYER_CACHE++;
Hook:C2_OnPlayerDisconnect(playerid, reason) return CONNECTED{FindCacheValue(playerid)} = 0, ReduceCheck();

stock FindCacheValue(value) // pronalazi slot cija je vrijednost jednaka (=) value, ('value-1' radimo zbog onplayerconnecta)
{
for(new a = 0; a < PLAYER_CACHE; a++) if(CONNECTED{a} == value-1) return a;
}

stock ReduceCheck() // pronalazi slot koji se ne koristi, uvrstava zadnji slot (zadnji connectani) u taj prazni, i smanjuje broj slotova za 1
{
for(new a = 0; a < PLAYER_CACHE; a++) if(CONNECTED{a} == 0) CONNECTED{a} = CONNECTED[PLAYER_CACHE-1], break;
PLAYER_CACHE--;
return 1;
}


for loop je malo kompliciran za shvatit, ako vrijednost slota (PLAYER_CACHE) iznosi 0 onda loop preskace izvrsavanje loopa za tu vrijednost varijable (varijabla se u loopovima povecava). Zatim, ako vrijednost slota ne iznosi 0, onda se vrijednosna varijabla pretvara u playerid odnosno id igraca koji je konektan na serveru (pojavio se - onplayerconnect, a nije izasao - onplayerdisconnect).
Respekt: [H]265, John, [03]Garsino, LordShigi, Dujma, Carlsson, Randy, Jacobs, Hu5o, Toni, Lukas, Curtis, Ivo, Hawks, Jack, Koksildo, gonss

Haha OMG => http://zaslike.com/files/9rd5urq94yqagvdsx3i.png [ovo nema nigdje]

Mislim da ce to dobro raditi jedino mora se paziti da loop ide OD -1 pa  nadalje jer '0' je valjani ID, nisam testirao kod ali mi se svida nacin... Takoder koristis char varijablu (MAX 255), a u slucaju da bude vise od 255 online?

Ja nisam razmisljao o takvoj izvedbi nego malo jednostavnijoj a to je sa static syntaxom sto automatski krece sa loopom, ali nema veze zasto raditi nesto sto vec postoji a bolje od toga ne moze (yless xd)

stock intFloat(Float:var, const index[], integ) { /* [H]265 */
if(index[0] == '/' || index[0] == ':') return \
                          floatround(integ/var);
else if(index[0] == '*' || index[0] == 'x') return \
                          floatround(integ*var);
else if(index[0] == '+') return \
                                 floatround(integ+var);
else if(index[0] == '-') return \
                                 floatround(integ-var);
return false;
}


Evo jedne korisne funkcije kojom mozete djeliti/mnoziti/zbrjati/oduzimati integer sa floatom i na kraju returna integer

Primjer:

new
    Float:var0 = 1.5,
    var1 = 1800;

printf("1800 / 1.5 = %d ",intFloat(var0, "/", var1)); // isprat ce 1200
printf("1800 : 1.5 = %d ",intFloat(var0, ":", var1)); // isprat ce 1200 (primjer sa : )


Posto returna integer zaokruzje CIJELI broj, a ne float 1. nesto pa nije bas korisno za + ili - floata ali eto ja sam stavio...
U principu ova funkcija nema nikakve druge koristi jer sve sto napravite ovdje mozete i ovako

new Float:ok = 1.5;
printf("1800 : 1.5 = %d",floatround(1800/ok); // return 1200


Samo je stvar sto kada koristiti enumatore morate prvo spremiti u 'new' pa zatim raditi u floatround naredbi, ovako samo koristite jer je prefix Float: stavljen... ^^


statement's

/ ili : = podjeli
* ili x = pomnozi
+ = zbroji
- = oduzmi
Poslednja Izmena: Avgust 17, 2011, 08:43:27 PRE PODNE od [H]265
Kristijan Stipić

Citat: [H]265 poslato Avgust 17, 2011, 08:39:37 PRE PODNE
Mislim da ce to dobro raditi jedino mora se paziti da loop ide OD -1 pa  nadalje jer '0' je valjani ID, nisam testirao kod ali mi se svida nacin... Takoder koristis char varijablu (MAX 255), a u slucaju da bude vise od 255 online?

Pa na isto ti doÄ'e otprilike, ako krene od 0 a ID ne postoji, onda ce ga samo preskociti i nastaviti dalje.
Koristim char jer sam navikao koristit prema svom serveru, a na njemu mi sigurno preko 255 nece trebat >.<

Ja vjerujem da je ovo relativno brza izvedba loopa kroz igrace, ali nisam siguran... na sličnu je 'foru' foreach.
Respekt: [H]265, John, [03]Garsino, LordShigi, Dujma, Carlsson, Randy, Jacobs, Hu5o, Toni, Lukas, Curtis, Ivo, Hawks, Jack, Koksildo, gonss

Haha OMG => http://zaslike.com/files/9rd5urq94yqagvdsx3i.png [ovo nema nigdje]

Pa da to se zove 'cache' nacin tj. hvatanje samo ONLINE igraca. Posto ja koristim MySQL meni ne treba ali inace dobro bi bilo za koristiti cache za loop baze
Inace postoji i nesto puno bolje od 'char' - a, to je rBit INC od Rydera, podrzava 16, 8, 4, 2, 1 bit verziju, a char je 8 bitni i naravno to je puno bolji paket od YSI ovog ybit'sa koji podrzava samo 1 bit varijabl
Kristijan Stipić

Citat: [H]265 poslato Avgust 17, 2011, 11:25:53 PRE PODNE
Pa da to se zove 'cache' nacin tj. hvatanje samo ONLINE igraca. Posto ja koristim MySQL meni ne treba ali inace dobro bi bilo za koristiti cache za loop baze
Inace postoji i nesto puno bolje od 'char' - a, to je rBit INC od Rydera, podrzava 16, 8, 4, 2, 1 bit verziju, a char je 8 bitni i naravno to je puno bolji paket od YSI ovog ybit'sa koji podrzava samo 1 bit varijabl

Meni to u suÅ¡tini doÄ'e na poprilično isto, Å¡tednja na memoriji se zapravo svodi samo na to. Brzina je ista (obicne i char varijable imaju istu brzinu [testirao])... stoga, viÅ¡e treba gledati varijable s velikim brojem čelija nego da gledaÅ¡ kako ćeÅ¡ uÅ¡tediti sa varijablom sa 50 ili 100 čelija. Ipak, brzina je po meni važna i glavna stvar.. zato jer se sve svodi na brzinu pri velikom broj igrača ili pri velikom broju provjera u timerima (loopovi itd.).
Respekt: [H]265, John, [03]Garsino, LordShigi, Dujma, Carlsson, Randy, Jacobs, Hu5o, Toni, Lukas, Curtis, Ivo, Hawks, Jack, Koksildo, gonss

Haha OMG => http://zaslike.com/files/9rd5urq94yqagvdsx3i.png [ovo nema nigdje]

Evo jedna funkcija, ne sjecam se odakle sam je nabavio, ali moze posluziti ( smanjuje .amx size, jer se ne koristi CreateDynamicObject, itd.... )
Funkcija je namjestena za Incognitov streamer plugin...
stock LoadMtaMap(file[])
{
if (!fexist(file)) return 0;
new File:MapFile=fopen(file);
new n, string[400];
new Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz;
new modelid, paintjob, interior, world;
while(fread(MapFile, string))
{
    if (!sscanf(string, "p<\">'object''model='d'interior='d'dimension='d'posX='f'posY='f'posZ='f'rotX='f'rotY='f'rotZ='f", modelid, interior, world, x, y, z, rx, ry, rz))
    {
        n++;
        //modelid x y z rx ry rz interior world
        CreateDynamicObject(modelid, x, y, z, rx, ry, rz);
    }
    else if (!sscanf(string, "p<\">'vehicle''paintjob='d'model='d'interior='d'dimension='d'posX='f'posY='f'posZ='f'rotZ='f", paintjob, modelid, interior, world, x, y, z, rz))
    {
        n++;
       
        new col1, col2, colors[20];
        sscanf(string, "p<\">'color='s[20] ", colors);
        sscanf(colors, "p<,>dd", col1, col2);
        new mods[80], mod[MAX_MODS];
        sscanf(string, "p<\">'upgrades='s[80] ", mods);
        sscanf(mods, "p<,>A<d>(0)["#MAX_MODS"]", mod);
       
        //modelid x y z rz col1 col2 paintjob interior world
new vehicleid = CreateVehicle(modelid, x, y, z, rz, col1, col2, -1);
for (new i; i < MAX_MODS; i++) if (mod[i]) AddVehicleComponent(vehicleid, mod[i]);
            ChangeVehiclePaintjob(vehicleid, paintjob);
            LinkVehicleToInterior(vehicleid, interior);
            SetVehicleVirtualWorld(vehicleid, world);
    }
}
fclose(MapFile);
printf("%d objekata ucitano iz mape '%s'", n, file);
return n;
}
Just one more time.

Citat: [ED] ZicMortal poslato Avgust 17, 2011, 16:18:06 POSLE PODNE
Meni to u suÅ¡tini doÄ'e na poprilično isto, Å¡tednja na memoriji se zapravo svodi samo na to. Brzina je ista (obicne i char varijable imaju istu brzinu [testirao])... stoga, viÅ¡e treba gledati varijable s velikim brojem čelija nego da gledaÅ¡ kako ćeÅ¡ uÅ¡tediti sa varijablom sa 50 ili 100 čelija. Ipak, brzina je po meni važna i glavna stvar.. zato jer se sve svodi na brzinu pri velikom broj igrača ili pri velikom broju provjera u timerima (loopovi itd.).

Memorija nije problem dok se ne odlucis siriti svoj mod na malo vecu granicu sto znaci da ako ne pazis na memoriju moze doci 'Out of memory' sto znaci da si uzeo svu dozvoljenu memoriju PAWNCC kompajlera zato je pametno stediti memoriju dok mozes tako da ako imas priliku, koristi rBits
Kristijan Stipić

stock IgraciUInterioru(interior)
{
    new inti;
    foreach(Player, i)
    {
        if(GetPlayerInterior(i) == interior)
        {
           inti++;
        }
    }
    return inti;
}


Nesto od mene.. Jednostavan stock, da ozivim temu :)
Poslednja Izmena: Avgust 29, 2011, 00:37:22 PRE PODNE od [GG] LuKsA
Aequam memento rebus in arduis servare mentem.

stock _HOOK_SetPlayerPos(playerid, Float:X, Float:Y, Float:Z, Float:Angle, interior, vw, bool:teleVeh)
{
    SetPlayerPos(playerid, X, Y, Z); SetPlayerFacingAngle(playerid, Angle);
    SetPlayerInterior(playerid, interior); SetPlayerVirtualWorld(playerid, vw);
   
    if(teleVeh == true)
{
   if(IsPlayerInAnyVehicle(playerid))
   {
           LinkVehicleToInterior(GetPlayerVehicleID(playerid), interior);
           SetVehicleVirtualWorld(GetPlayerVehicleID(playerid), vw);
   SetVehiclePos(GetPlayerVehicleID(playerid), X, Y, Z);
    }
    }
    return true;
}

#if defined _ALS_SetPlayerPos
   #undef SetPlayerPos
#else
   #define _ALS_SetPlayerPos
#endif

#define SetPlayerPos _HOOK_SetPlayerPos


Nista posebno ali sam htio da vidite (oni koji ne znaju) kako se hooka jer je bzvz raditi novi header npr.

stock SetPlayerPosEx.... ili nes drugo pa ako vec radite ovako nes onda hookajte vec postojece funkcije
Kristijan Stipić