Üzenetek megjelenítése

Ez a szekció lehetővé teszi a felhasználó által írt összes hozzászólás megtekintését. Vedd figyelembe, hogy csak azokba a fórumokba írt hozzászólásokat látod, amelyekhez hozzáférésed van.


Témák - kurta999

Oldalak: 1 2 3 [4] 5 6 ... 12
46
Fórum Archívum (Témák/Fórumok) / Re:YSF - 0.3d R2-800p Windows
« Dátum: 2012. Január 22. - 18:24:01 »
Megpróbálhatom :D
A 0.2-es verzióban van, ha sikerül, megcsinálom azszerint.
Amúgy Y_Less meg azért nem újítja, mivel ez szabályellenes.
Benne van a SAMP Licenseben, hogy tilos hamis adatot küldeni a kliesnek és ezt pont azt csinálja. De engem aztán nagyon érdekel az a szabályzat..

47
Hangszerek és előadók / MC Hawer és a Tekknõ
« Dátum: 2012. Január 22. - 12:04:47 »
Gondolom errõl nemkell sokat írnom, mivel mindenki ismeri.
The best :D
Eddig 8 albumot adtak ki, itt van belõle pár szám.
Most csinálják a 2011-es albumot, amit kb. tavasszal fognak kiadni.
2000 - Bye-bye lány
2001 - Táncolj cigánylány!
2002 - Mikor a vodka a fejembe szá
2003 - Kimegyek a temetöbe
2004 - Ma este mulatunk!
2005 - Állati nagy slágérég
2006 - Aki minket nem szeret
2007 - A börtön ablakában
 

 

 

 

 

 

 
48
Rengeteg helyen észreveszem, hogy a beírt ID-t IsPlayerConnected() el ellenõrzik le.
Ez pedig felesleges, mivel az sscanf-nél ha az \"u\" paramétert használod, akkor az automatikusan leellenõrzni, hogy a játékos csatlakozva-e van. Ha nincs, akkor 0xFFFF-el fog visszatérni = (65535 = INVALID_PLAYER_ID).
Tehát elég lenne ennyit is csinálni:
[pawn]   if(sscanf(params, \"ui\", player1, score)) return SendClientMessage(playerid, COLOR_RED, \"HASZNÁLAT: /setscore <Játékos ID/Név> <Pont>\");
if(player1 == INVALID_PLAYER_ID) return SendClientMessage(playerid, COLOR_RED, \"HIBA: Játékos nincs csatlakozva!\");
[/pawn]

49
Segítségkérés / Bath command linux alatt? Hova hogyan miképp?
« Dátum: 2012. Január 04. - 20:08:21 »
Valaki letudná nekem írni, hogy linuxon hogy a fas-zomba tudom ezeket a parancsokat lefuttatni?
Lassan két órája ezzel baszakodok, és arra ne jöttem rá, hova a ... -ba kell beírni egy ... parancsot.
Úgy, mint windowson pl: Windows Gomb + R ( Futtatás ) és ide beírod, h shutdown.
Nade linuxon ezt hova kell?
SA-MP Wiki-n a Putty-val kapcsolatba írt valamit, de az is kur.va nagy segítség, mivel annak is csak a forráskdját találtam a neten..

50
Pluginok és Programok / YSF - kurta999\'s version
« Dátum: 2011. December 18. - 21:19:15 »
YSF - kurta999\'s version
 
Eredeti téma:
http://forum.sa-mp.com/showthread.php?t=513499
Nem fogom nonstop itt is frissíteni a hozzászólást, úgyhogy ha az új dolgokra vagy kiváncsi, nézz be ide is.
Sok frissítés után az angol fórumon rá kényszerültem, hogy nyissak a YSF-nek egy saját témát, hogy tudjam szerkeszteni a fõposztot. Névnek megtartom a YSF-et, mivel már mindenki ezt ismeri és énis megszoktam. A régi YSF-et itt érheted el.
Dokumentációt a funkciókhoz megtalálod itt. Köszönet iFarbod-nak.
Változtatások a régi YSF-he képest:
- Támatogatja a következõ samp verziókat SA-MP 0.3z, 0.3z R2-2, 0.3z R3 és 0.3z R4 - 1000p verziókra nincs támogatás, de ha valakinek szüksége lenne rá, megcsinálom
- Plugin akkor is befog töltõdni, ha ismeretlen a szerver verzió, csak a memória hacket használó funkciók nem fognak mûködni
- Majdnem minden lehetséges dologhoz hozzáférsz a samp pool-okból, amikhez alapból nem volt lehetõséged
- Hozzáadva a következõ eljárás OnPlayerEnterGangZone, OnPlayerLeaveGangZone
- Játékos szinrkonizált adatai közül sok hasznos dolgot le tudsz kérni, amit alapból nem, pl sziréna be-e van kapcsolva, vonat sebesség, hydra reactor állása
- Pluginba integrálva a Y_Less\'s Model Sizes függvénykönyvtár.
- Újra hozzáadva a fájl funkciók
- Javítva az AttachPlayerObjectToPlayer és hozzáadva az AttachPlayerObjectToObject
- Javítva a  GetWeaponName, és hozzáadva a követekzõk GetWeaponSlot, GetWeather.
Frissítések
R9
- Támogatja az újonnan megjelent 0.3z R4-et
- Hozzáadva GetServerSettings
- Hozzáadva IsPlayerSpawned
- Hozzáadva IsPickupStreamedIn, Is3DTextLabelStreamedIn
- Hozzáadva GetVehicleCab, IsVehicleOccupied, IsVehicleDead
- Hozzáadva *HasVehicleBeenOccupied, *SetVehicleBeenOccupied
- GetVehicleSpawnPos átnevezve GetVehicleSpawnInfo-ra
- Javítva a laggok a szerverben, amit a YSF okozott
- Javítva a GetPlayerColor(), már nem tér vissza 0-val, ha nem használtad a SetPlayerColor()-t
- Scoreboard funckiók javítva linuxon
Példák
 
  • SetPlayerGravity


SetPlayerGravity(playerid, 0.001);

 
Gravitáció állítása egy megadott játékosnak.
 
  • TextDrawSetPos


TextDrawSetPos(myTextdraw, 320.0, 240.0);
TextDrawShowForAll(myTextdraw);

 
Egy meglévõ textdraw pozíciójának állítása egy sorral, nem kell újra létrehozni, csak felmutatni és át is van rakva. Ugye, hogy milyen egyszerû?
 
  • GetVehicleRespawnTick


new respawn = GetTickCount() - GetVehicleRespawnTick(vehicleid);
new occupied = GetTickCount() - GetVehicleOccupiedTick(vehicleid);

 
Lekéri, hogy mennyi idejde van a jármû lespawnolva és mennyi ideje nem ült benne senki.
További példákért, nézd meg a YSF_examples.pwn-et.
Telepítés:
1.) Le töltöd a legújabb kiadást, ki bontasz mindent a .rar fájlból a szervermappába.
2.) YSF-et belerakod a server.cfg-be
Windows-on, \"plugins YSF.dll\";
Linux-on, \"plugins YSF.so\".
3.) YSF.inc-t belerakod a módba és újrafordítod. FONTOS, ha ezt kihagyod, crashelni fog.
Mód tetejére be rakod a következõt
 
#include <YSF>

 
4.) Mehet a szerver!
Ha a plugin nem töltõdik be, szükséged lesz a  Visual C++ Redistributable 2012 Update 4 x86-ra.
http://www.microsoft.com/en-us/download/details.aspx?id=30679
Ha 64bites operáció rendszered van, akkor a 32bitest szintén fel kell raknod, mivel a samp server 32bites aplikáció és 32bites könyvtárakat igényel.
Letöltés:
https://github.com/kurta999/YSF/releases
(Mindig a legújabb verzió)
Jövõbeli tervek:
- Per-player pickup rendszer
- Load/Unload futás közben
Új funckiók listája:
 

// File functions
native ffind(const pattern[], filename[], len, &idx);
native frename(const oldname[], const newname[]);
// Directory functions
native dfind(const pattern[], filename[], len, &idx);
native dcreate(const name[]);
native drename(const oldname[], const newname[]);
// Server rule and other functions
native SetModeRestartTime(Float:time);
native Float:GetModeRestartTime();
native SetMaxPlayers(maxplayers);
native SetMaxNPCs(maxnpcs);
native SetPlayerAdmin(playerid, bool:admin); // Set player as RCON admin
native LoadFilterScript(scriptname[]); // difference between \"rcon loadfs\": Return -> True if success, false if not
native UnLoadFilterScript(scriptname[]); // ^
native GetFilterScriptCount();
native GetFilterScriptName(id, name[], len = sizeof(name));
#define CON_VARFLAG_DEBUG       1
#define CON_VARFLAG_READONLY    2
#define CON_VARFLAG_RULE        4
#define CON_VARFLAG_UNREMOVABLE 8
native AddServerRule(name[], value[], flags = CON_VARFLAG_RULE);
native SetServerRule(name[], value[]);
native ModifyFlag(name[], flags);
// Server settings
native GetServerSettings(&showplayermarkes, &shownametags, &stuntbonus, &useplayerpedanims, &bLimitchatradius, &disableinteriorenterexits, &nametaglos, &manualvehicleengine, &limitplayermarkers, &vehiclefriendlyfire, &Float:fGlobalchatradius, &Float:fNameTagDrawDistance, &Float:fPlayermarkerslimit);
// Nickname
native IsValidNickName(name[]);
native AllowNickNameCharacter(character, bool:allow);
native IsNickNameCharacterAllowed(character);
// Classes
native GetAvailableClasses();
native GetPlayerClass(classid, &teamid, &modelid, &Float:spawn_x, &Float:spawn_y, &Float:spawn_z, &Float:z_angle, &weapon1, &weapon1_ammo, &weapon2, &weapon2_ammo,& weapon3, &weapon3_ammo);
native EditPlayerClass(classid, teamid, modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:z_angle, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo);
// Timers
native GetActiveTimers();
// Per player things
native SetPlayerGravity(playerid, Float:gravity);
native Float:GetPlayerGravity(playerid);
native SetPlayerTeamForPlayer(forplayerid, playerid, teamid);
native GetPlayerTeamForPlayer(forplayerid, playerid);
native GetPlayerWeather(playerid);
native TogglePlayerWidescreen(playerid, bool:set);
native IsPlayerWidescreenToggled(playerid);
native GetSpawnInfo(playerid, &teamid, &modelid, &Float:spawn_x, &Float:spawn_y, &Float:spawn_z, &Float:z_angle, &weapon1, &weapon1_ammo, &weapon2, &weapon2_ammo,& weapon3, &weapon3_ammo);
native GetPlayerSkillLevel(playerid, skill);
native GetPlayerCheckpoint(playerid, &Float:fX, &Float:fY, &Float:fZ, &Float:fSize);
native GetPlayerRaceCheckpoint(playerid, &Float:fX, &Float:fY, &Float:fZ, &Float:fNextX, &Float:fNextY, &fNextZ, &Float:fSize);
native GetPlayerWorldBounds(playerid, &Float:x_max, &Float:x_min, &Float:y_max, &Float:y_min);
native IsPlayerInModShop(playerid);
native GetPlayerSirenState(playerid);
native GetPlayerLandingGearState(playerid);
native GetPlayerHydraReactorAngle(playerid);
native Float:GetPlayerTrainSpeed(playerid);
native Float:GetPlayerZAim(playerid);
native GetPlayerSurfingOffsets(playerid, &Float:fOffsetX, &Float:fOffsetY, &Float:fOffsetZ);
native GetPlayerRotationQuat(playerid, &Float:w, &Float:x, &Float:y, &Float:z);
native GetPlayerDialogID(playerid);
native GetPlayerSpectateID(playerid);
native GetPlayerSpectateType(playerid);
native SendBulletData(sender, hitid, hittype, Float:fHitOriginX, Float:fHitOriginY, Float:fHitOriginZ, Float:fHitTargetX, Float:fHitTargetY, Float:fHitTargetZ, Float:fCenterOfHitX, Float:fCenterOfHitY, Float:fCenterOfHitZ, forplayerid = -1);
native ShowPlayerForPlayer(forplayerid, playerid);
native HidePlayerForPlayer(forplayerid, playerid);
native IsPlayerSpawned(playerid);
// Scoreboard manipulation
native TogglePlayerScoresPingsUpdate(playerid, bool:toggle);
native TogglePlayerFakePing(playerid, bool:toggle);
native SetPlayerFakePing(playerid, ping);
// Pause functions
native IsPlayerPaused(playerid);
native GetPlayerPausedTime(playerid);
// Objects get - global
native GetObjectModel(objectid);
native Float:GetObjectDrawDistance(objectid);
native SetObjectMoveSpeed(objectid, Float:fSpeed);
native Float:GetObjectMoveSpeed(objectid);
native GetObjectTarget(objectid, &Float:fX, &Float:fY, &Float:fZ);
native GetObjectAttachedData(objectid, &attached_vehicleid, &attached_objectid);
native GetObjectAttachedOffset(objectid, &Float:fX, &Float:fY, &Float:fZ, &Float:fRotX, &Float:fRotY, &Float:fRotZ);
native IsObjectMaterialSlotUsed(objectid, materialindex); // Return values: 1 = material, 2 = material text
native GetObjectMaterial(objectid, materialindex, &modelid, txdname[], txdnamelen = sizeof(txdname), texturename[], texturenamelen = sizeof(texturename), &materialcoor);
native GetObjectMaterialText(objectid, materialindex, text[], textlen = sizeof(text), &materialsize, fontface[], fontfacelen = sizeof(fontface), &fontsize, &bold, &fontcolor, &backcolor, &textalignment);
// Objects get - player
native GetPlayerObjectModel(playerid, objectid);
native Float:GetPlayerObjectDrawDistance(playerid, objectid);
native SetPlayerObjectMoveSpeed(playerid, objectid, Float:fSpeed);
native Float:GetPlayerObjectMoveSpeed(playerid, objectid);
native Float:GetPlayerObjectTarget(playerid, objectid, &Float:fX, &Float:fY, &Float:fZ);
native GetPlayerObjectAttachedData(playerid, objectid, &attached_vehicleid, &attached_objectid);
native GetPlayerObjectAttachedOffset(playerid, objectid, &Float:fX, &Float:fY, &Float:fZ, &Float:fRotX, &Float:fRotY, &Float:fRotZ);
native IsPlayerObjectMaterialSlotUsed(playerid, objectid, materialindex); // Return values: 1 = material, 2 = material text
native GetPlayerObjectMaterial(playerid, objectid, materialindex, &modelid, txdname[], txdnamelen = sizeof(txdname), texturename[], texturenamelen = sizeof(texturename), &materialcolor);
native GetPlayerObjectMaterialText(playerid, objectid, materialindex, text[], textlen = sizeof(text), &materialsize, fontface[], fontfacelen = sizeof(fontface), &fontsize, &bold, &fontcolor, &backcolor, &textalignment);
// special - for attached objects
native GetPlayerAttachedObject(playerid, index, &modelid, &bone, &Float:fX, &Float:fY, &Float:fZ, &Float:fRotX, &Float:fRotY, &Float:fRotZ, &Float:fSacleX, &Float:fScaleY, &Float:fScaleZ, &materialcolor1, &materialcolor2);
//n_ative AttachPlayerObjectToPlayer(objectplayer, objectid, attachplayer, Float:OffsetX, Float:OffsetY, Float:OffsetZ, Float:rX, Float:rY, Float:rZ);
native AttachPlayerObjectToObject(playerid, objectid, attachtoid, Float:OffsetX, Float:OffsetY, Float:OffsetZ, Float:RotX, Float:RotY, Float:RotZ, SyncRotation = 1);
// RakNet ban functions
native ClearBanList();
native IsBanned(ipaddress[]);
// Raknet
native SetTimeoutTime(playerid, time_ms);
native GetMTUSize();
native GetLocalIP(index, localip[], len = sizeof(localip));
// vehicle functions
native GetVehicleSpawnInfo(vehicleid, &Float:fX, &Float:fY, &Float:fZ, &Float:fRot, &color1, &color2);
native GetVehicleColor(vehicleid, &color1, &color2);
native GetVehiclePaintjob(vehicleid);
native GetVehicleInterior(vehicleid);
native GetVehicleNumberPlate(vehicleid, plate[], len = sizeof(plate));
native SetVehicleRespawnDelay(vehicleid, delay);
native GetVehicleRespawnDelay(vehicleid);
native SetVehicleOccupiedTick(vehicleid, ticks);
native GetVehicleOccupiedTick(vehicleid); // GetTickCount() - GetVehicleOccupiedTick(vehicleid) = time passed since vehicle is occupied, in ms
native SetVehicleRespawnTick(vehicleid, ticks);
native GetVehicleRespawnTick(vehicleid); // GetTickCount() - GetVehicleRespawnTick(vehicleid) = time passed since vehicle spawned, in ms
native GetVehicleLastDriver(vehicleid);
native GetVehicleCab(vehicleid);
native HasVehicleBeenOccupied(vehicleid);
native SetVehicleBeenOccupied(vehicleid, occupied);
native IsVehicleOccupied(vehicleid);
native IsVehicleDead(vehicleid);
// Gangzones - Global
native IsValidGangZone(zoneid);
native IsPlayerInGangZone(playerid, zoneid);
native IsGangZoneVisibleForPlayer(playerid, zoneid);
native GangZoneGetColorForPlayer(playerid, zoneid);
native GangZoneGetFlashColorForPlayer(playerid, zoneid);
native IsGangZoneFlashingForPlayer(playerid, zoneid);
native GangZoneGetPos(zoneid, &Float:fMinX, &Float:fMinY, &Float:fMaxX, &Float:fMaxY);
// Gangzones - Player
native CreatePlayerGangZone(playerid, Float:minx, Float:miny, Float:maxx, Float:maxy);
native PlayerGangZoneDestroy(playerid, zoneid);
native PlayerGangZoneShow(playerid, zoneid, color);
native PlayerGangZoneHide(playerid, zoneid);
native PlayerGangZoneFlash(playerid, zoneid, color);
native PlayerGangZoneStopFlash(playerid, zoneid);
native IsValidPlayerGangZone(playerid, zoneid);
native IsPlayerInPlayerGangZone(playerid, zoneid);
native IsPlayerGangZoneVisible(playerid, zoneid);
native PlayerGangZoneGetColor(playerid, zoneid);
native PlayerGangZoneGetFlashColor(playerid, zoneid);
native IsPlayerGangZoneFlashing(playerid, zoneid);
native PlayerGangZoneGetPos(playerid, zoneid, &Float:fMinX, &Float:fMinY, &Float:fMaxX, &Float:fMaxY);
// Textdraw - Global
native IsValidTextDraw(Text:textdrawid);
native IsTextDrawVisibleForPlayer(playerid, Text:textdrawid);
native TextDrawGetString(Text:textdrawid, text[], len = sizeof(text));
native TextDrawSetPos(Text:textdrawid, Float:fX, Float:fY); // You can change textdraw pos with it, but you need to use TextDrawShowForPlayer() after that
native TextDrawGetLetterSize(Text:textdrawid, &Float:fX, &Float:fY);
native TextDrawGetFontSize(Text:textdrawid, &Float:fX, &Float:fY);
native TextDrawGetPos(Text:textdrawid, &Float:fX, &Float:fY);
native TextDrawGetColor(Text:textdrawid);
native TextDrawGetBoxColor(Text:textdrawid);
native TextDrawGetBackgroundColor(Text:textdrawid);
native TextDrawGetShadow(Text:textdrawid);
native TextDrawGetOutline(Text:textdrawid);
native TextDrawGetFont(Text:textdrawid);
native TextDrawIsBox(Text:textdrawid);
native TextDrawIsProportional(Text:textdrawid);
native TextDrawIsSelectable(textdrawid);
native TextDrawGetAlignment(Text:textdrawid);
native TextDrawGetPreviewModel(Text:textdrawid);
native TextDrawGetPreviewRot(Text:textdrawid, &Float:fRotX, &Float:fRotY, &Float:fRotZ, &Float:fZoom);
native TextDrawGetPreviewVehCol(Text:textdrawid, &color1, &color2);
// Textdraw - Player
native IsValidPlayerTextDraw(playerid, PlayerText:textdrawid);
native IsPlayerTextDrawVisible(playerid, PlayerText:textdrawid);
native PlayerTextDrawGetString(playerid, PlayerText:textdrawid, text[], len = sizeof(text));
native PlayerTextDrawSetPos(playerid, PlayerText:textdrawid, Float:fX, Float:fY);
native PlayerTextDrawGetLetterSize(playerid, PlayerText:textdrawid, &Float:fX, &Float:fY);
native PlayerTextDrawGetFontSize(playerid, PlayerText:textdrawid, &Float:fX, &Float:fY);
native PlayerTextDrawGetPos(playerid, PlayerText:textdrawid, &Float:fX, &Float:fY);
native PlayerTextDrawGetColor(playerid, PlayerText:textdrawid);
native PlayerTextDrawGetBoxColor(playerid, PlayerText:textdrawid);
native PlayerTextDrawGetBackgroundCol(playerid, PlayerText:textdrawid);
native PlayerTextDrawGetShadow(playerid, PlayerText:textdrawid);
native PlayerTextDrawGetOutline(playerid, PlayerText:textdrawid);
native PlayerTextDrawGetFont(playerid, PlayerText:textdrawid);
native PlayerTextDrawIsBox(playerid, PlayerText:textdrawid);
native PlayerTextDrawIsProportional(playerid, PlayerText:textdrawid);
native PlayerTextDrawIsSelectable(playerid, PlayerText:textdrawid);
native PlayerTextDrawGetAlignment(playerid, PlayerText:textdrawid);
native PlayerTextDrawGetPreviewModel(playerid, PlayerText:textdrawid);
native PlayerTextDrawGetPreviewRot(playerid, PlayerText:textdrawid, &Float:fRotX, &Float:fRotY, &Float:fRotZ, &Float:fZoom);
native PlayerTextDrawGetPreviewVehCol(playerid, PlayerText:textdrawid, &color1, &color2);
// 3D Text - Global
native IsValid3DTextLabel(Text3D:id);
native Is3DTextLabelStreamedIn(playerid, Text3D:id);
native Get3DTextLabelText(Text3D:id, text[], len = sizeof(text));
native Get3DTextLabelColor(Text3D:id);
native Get3DTextLabelPos(Text3D:id, &Float:fX, &Float:fY, &Float:fZ);
native Float:Get3DTextLabelDrawDistance(Text3D:id);
native Get3DTextLabelLOS(Text3D:id);
native Get3DTextLabelVirtualWorld(Text3D:id);
native Get3DTextLabelAttachedData(Text3D:id, &attached_playerid, &attached_vehicleid);
// 3D Text - Player
native IsValidPlayer3DTextLabel(playerid, PlayerText3D:id);
native GetPlayer3DTextLabelText(playerid, PlayerText3D:id, text[], len = sizeof(text));
native GetPlayer3DTextLabelColor(playerid, PlayerText3D:id);
native GetPlayer3DTextLabelPos(playerid, PlayerText3D:id, &Float:fX, &Float:fY, &Float:fZ);
native Float:GetPlayer3DTextLabelDrawDist(playerid, PlayerText3D:id);
native GetPlayer3DTextLabelLOS(playerid, PlayerText3D:id);
native GetPlayer3DTextLabelVirtualW(playerid, PlayerText3D:id);
native GetPlayer3DTextLabelAttached(playerid, PlayerText3D:id, &attached_playerid, &attached_vehicleid);
// Menu
native IsMenuDisabled(Menu:menuid);
native IsMenuRowDisabled(Menu:menuid, row);
native GetMenuColumns(Menu:menuid);
native GetMenuItems(Menu:menuid, column);
native GetMenuPos(Menu:menuid, &Float:fX, &Float:fY);
native GetMenuColumnWidth(Menu:menuid, column, &Float:fColumn1, &Float:fColumn2);
native GetMenuColumnHeader(Menu:menuid, column, header[], len = sizeof(header));
native GetMenuItem(Menu:menuid, column, itemid, item[], len = sizeof(item));
// Pickups
native IsValidPickup(pickupid);
native IsPickupStreamedIn(playerid, pickupid);
native GetPickupPos(pickupid, &Float:fX, &Float:fY, &Float:fZ);
native GetPickupModel(pickupid);
native GetPickupType(pickupid);
native GetPickupVirtualWorld(pickupid);
// Y_Less\'s model sizes inc
native GetColCount();
native Float:GetColSphereRadius(modelid);
native GetColSphereOffset(modelid, &Float:fX, &Float:fY, &Float:fZ);
// Callbacks
forward OnPlayerEnterGangZone(playerid, zoneid);
forward OnPlayerLeaveGangZone(playerid, zoneid);
forward OnPlayerEnterPlayerGangZone(playerid, zoneid);
forward OnPlayerLeavePlayerGangZone(playerid, zoneid);
forward OnPlayerPauseStateChange(playerid, pausestate);

 
Köszönet
Y_Less,
OrMisicL,
0x688,
Riddick94,
Whitetiger,
iFarbod,
P3ti,
Mellnik

51
Eredeti témát Slice írta a hivatalos fórumon.
A további napok folyamán frissíteni fogom, mert még nincs benne minden, de a fõ rész az benne van.
Fordítási hibák szerintem lehetnek, ezért elnézést!
Több dolog egy statmentben
Néhány helyen szükségünk van arra, hogy egy sorba több dolgot is lefuttassunk.
Visszatérni több értékkel, stb. Ha visszatértsz több értékkel, akkor a return mindig az utolsó értékét fogja visszaadni.
Ezt a következõ képpen tudjuk elvégezni:
[pawn]
stock KickEx( playerid, reason[ ] )
    SendClientMessage( playerid, 0xC00000FF, \"Kickelve lettél!! Indok:\" ), SendClientMessage( playerid, 0xC00000FF, reason ), Kick( playerid );
// Két üzenet elküldése, azátn a játékos kirúgása
stock DoStuff( playerid )
    return DoFirstThing( playerid ), DoSecondThing( playerid ), DoThirdThing( playerid ), DoLastThing( playerid );
// DoStuff a DoLastThing értékével fog visszzatérni
public OnPlayerRequestSpawn( playerid )
{
    if ( !IsPlayerLoggedIn( playerid ) )
        return SendClientMessage( playerid, 0xC00000FF, \"Nem vagy bejelentkezve!\" ), 0;
    // Elküldjük az üzenetet és 0-val térünk vissza.
    return 1;
}
[/pawn]
Egyszerû szám -> bool-ra konvertálása
Néha vannak olyan helyzetek, hogy bool-ra kell konvertálni egy megadott számot.
Ezt a következõ képpen teheted meg a legegyszerûbben:
[pawn]
new myInt = 50;
new bool:myBool = !!myInt;
[/pawn]
Vagy akár mûködik egy funkcióval is:
[pawn]
new
    bool:bResult = !!mysql_query_ex(query),
    iCount;
if(!bResult) return SendClientMessage(playerid, COLOR_RED, \"HIBA: Hibás lekérdezés!\");
[/pawn]
De így is:
[pawn]
#define IsValidVehicle(%1) \\
(!!GetVehicleModel(%1))
[/pawn]


Változó tag figyelmeztetés kiküszöbölése
Ha egy elõtagos funckiónak/változónak akarod az értékét kiírni egy olyan funkcióban, ami nem támogatja azt a tagot, akkor a fordító figyelmeztetni fog, hogy itt valami nincs rendben. Itt nem csináltunk semmit se rosszul, csak ez így nem helyes.
Ilyen esetben kell letörölni a tagot a funkció elõl, és minden jól fog mûködni!
Példa:
[pawn]
new Text3D:t3dTest = Create3DTextLabel( .. ), Text:txTest = TextDrawCreate( .. );
printf( \"DEBUG: %d, %d\", _:t3dTest, _:txTest );
[/pawn]
Egyébként ez a dolog szerintem nagyon is hasznos, fõleg a bit flagoknál.
Vegyük azt, hogy van két változónk, két enum taggal. Ha az elsõ váltózónál valamit próbálunk állítani a második enumból, akkor figyelmeztetni fog, mivel az a másodikhoz tartozik és nem pedig az elsõhöz. Persze ha lehagyjuk a tagokat, akkor nemfog. De ilyenkor a bit flagnál nagy keveredések lehetnek, ezért érdemes ott az elõtagokat használni.


\"Char-tömbök\"
PAWN-ban van egy olyan lehetõség, hogy minden cellának egy bájtot foglal le. Ez a csomagolt string. A legtobb SA-MP függvények sajnos nem támogatják ezt és nagyon sokan még nem is hallottak róla. Egy 4bájtos tömbnek az értékei -2,147,483,648 és 2,147,483,647 között lehetnek.
De ha neked nincs szükséged negatív értékekre és a megadott érték kisebb, mint 255, akkor miért is ne spóroljunk memóriát?
Csomagolt stringekkel 0 és 255 között tárolhatunk számokat. ( Nincsenek negatív számok )
Itt is van róla egy példa:
[pawn]
new bool:g_IsPlayerSomething[MAX_PLAYERS]; // 500 cella * 4 bájt cellánként = 2000 bájt! <4 bájtos tömb>
new bool:g_IsPlayerSomething[MAX_PLAYERS char]; // 500 bájt = .. 500 bytes! <Csomagolt string, itt egy cella egy bájt>
[/pawn]
Ha ezt a megoldást használod 50x a normál 4 bájtos tömbök helyett, akkor megspórolsz 75,000 bájtot (~73 kb).
Vigyázz!
Ezekhez a tömbökhöz kapcsos zárójeleket ( { } ) kell használnod a szögletes helyett. ( [ ] ),
Példa:
[pawn]
public OnPlayerConnect( playerid )
{
    g_IsPlayerSomething{ playerid } = false;
//                     ^          ^
}
public OnPlayerSpawn( playerid )
{
//                          v          v
    if ( g_IsPlayerSomething{ playerid } )
    {
        // ..
    }
}
[/pawn]


Bitmûveletek (Bit-flag)
Tudtad, hogy lehet 32 igaz/hamis értéket tárolni egy változóban?  Ezzel nem csak memóriát takarítasz meg, hanem sokkal átláthatóbb lesz a kód.
Ehhez egyáltalán nem kell megértened, hogy hogyan mûködik a kettes számrendszer, de ajánlott.
Ha van 100 hamis/igaz (bool) változód játékosonként, akkor az 195KB memóriát foglal. Bár, ha 4 tömböt használsz ezzel a megoldással, akkor csak 8KB-ot fog használni. Az eredmény ugyanaz lesz, mintha rendes bool tömbökkel csinálnád, csak megspóroltál 187KB-ot.
 

// BitFlag Makrók
#define BitFlag_Get(%0,%1)            ((%0) & (%1))   // Megnézzük, hogy a flag be-e van kapcsolva. Ha igen, akkor visszatér az értékével*, ha nem, akkor 0-val tér vissza.
#define BitFlag_On(%0,%1)             ((%0) |= (%1))  // Bekapcsoljuk a flagot
#define BitFlag_Off(%0,%1)            ((%0) &= ~(%1)) // Kikapcsoljuk a flagot.
#define BitFlag_Toggle(%0,%1)         ((%0) ^= (%1))  // Kicseréljük a flag értékét. Ha igaz volt, akkor hamis lesz, ha hamis, akkor igaz.
// * A flag értéke nem 1 lesz, hanem az, ami itt ez enumban van.
// Ha PLAYER_BLABLA_3-t beállítottuk neki, akkor g_PlayerFlags[playerid] & PLAYER_BLABLA_3 értéke 00000000000000000000000000100000 (32) lesz.
enum PlayerFlags:(<<= 1) // Ez itt azt jelenti, hogy mennyivel növekedjenek az értékek az enum-ban {
    // Ügyelj arra, hogy ezt (<<<=1) semmi képp ne felejtsd el, külömben minden flagod hamis lesz.
// Az kezdõ érték az enum-ban 1 és ezt eltoja mindig eggyel alrébb balra.
// A következõ képpen fognak mindig növekedni:
    PLAYER_IS_LOGGED_IN = 1,   // 0b00000000000000000000000000000001 | 1
    PLAYER_HAS_GANG,           // 0b00000000000000000000000000000010 | 2
    PLAYER_CAN_BUY_PROPERTIES, // 0b00000000000000000000000000000100 | 4
    PLAYER_BLABLA_1,           // 0b00000000000000000000000000001000 | 8
    PLAYER_BLABLA_2,           // 0b00000000000000000000000000010000 | 16
    PLAYER_BLABLA_3,           // 0b00000000000000000000000000100000 | 32
    PLAYER_BLABLA_4,           // 0b00000000000000000000000001000000 | 64
    PLAYER_BLABLA_5,           // 0b00000000000000000000000010000000 | 128
    PLAYER_BLABLA_6,           // 0b00000000000000000000000100000000 | 256
    PLAYER_BLABLA_7,           // 0b00000000000000000000001000000000 | 512
    PLAYER_BLABLA_8,           // 0b00000000000000000000010000000000 | 1024
    PLAYER_BLABLA_9,           // 0b00000000000000000000100000000000 | 2048
    PLAYER_BLABLA_10,          // 0b00000000000000000001000000000000 | 4096
    PLAYER_BLABLA_11,          // 0b00000000000000000010000000000000 | 8192
    PLAYER_BLABLA_12,          // 0b00000000000000000100000000000000 | stb..
    PLAYER_BLABLA_13,          // 0b00000000000000001000000000000000
    PLAYER_BLABLA_14,          // 0b00000000000000010000000000000000
    PLAYER_BLABLA_15,          // 0b00000000000000100000000000000000
    PLAYER_BLABLA_16,          // 0b00000000000001000000000000000000
    PLAYER_BLABLA_17,          // 0b00000000000010000000000000000000
    PLAYER_BLABLA_18,          // 0b00000000000100000000000000000000
    PLAYER_BLABLA_19,          // 0b00000000001000000000000000000000
    PLAYER_BLABLA_20,          // 0b00000000010000000000000000000000
    PLAYER_BLABLA_21,          // 0b00000000100000000000000000000000
    PLAYER_BLABLA_22           // 0b00000001000000000000000000000000
};
new
    // Létrehozink egy tömböt ugyanazzal a taggal, mint ami az enum.
    PlayerFlags:g_PlayerFlags[MAX_PLAYERS]
;
public OnPlayerConnect(playerid) {
    // 0 - Minden flag kikapcsolva (hamis). A PlayerFlags tag kell, miven nélküle warningozni fog a fordító.
    g_PlayerFlags[playerid] = PlayerFlags:0;
}
public OnPlayerLogIn(playerid) {
    BitFlag_On(g_PlayerFlags[playerid], PLAYER_IS_LOGGED_IN);
//  Makró nélkül:
//  g_PlayerFlags[playerid] |= PLAYER_IS_LOGGED_IN;
}
public OnPlayerJoinGang(playerid) {
    BitFlag_On(g_PlayerFlags[playerid], PLAYER_HAS_GANG);
//  Makró nélkül:
//  g_PlayerFlags[playerid] |= PLAYER_HAS_GANG;
}
public OnPlayerLeaveGang(playerid) {
    BitFlag_Off(g_PlayerFlags[playerid], PLAYER_HAS_GANG);
//  Makró nélkül:
//  g_PlayerFlags[playerid] &= ~PLAYER_HAS_GANG;
}
public OnPlayerUpdate(playerid) {
    // Felcseréljük minden frissítésnél a bit flag értékét
    BitFlag_Toggle(g_PlayerFlags[playerid], PLAYER_BLABLA_19);
    if (BitFlag_Get(g_PlayerFlags[playerid], PLAYER_BLABLA_19)) {
        DoSomething();
    }
//  Makró nélkül:
//  g_PlayerFlags[playerid] ^= PLAYER_BLABLA_19;
//
//  if (g_PlayerFlags[playerid] & PLAYER_BLABLA_19) {
//      DoSomething();
//  }
}

52
Függvények / StopAudioStreamForPlayer( playerid )
« Dátum: 2011. December 04. - 21:55:22 »
StopAudioStreamForPlayer
Megállítja a jelenlegi audio streamet.
Paraméterek:
 
( playerid )

 
playerid    A játékos azonosítója, akinek meg akarod állítani a zenét.
Visszatérés     Ez az funkció nem kezeli a visszatéréseket.
Példa:
[pawn]
public OnPlayerStateChange(playerid, newstate, oldstate)
{
// Ha a játékos kiszáll a kocsiból
if(oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER)
{
    StopAudioStreamForPlayer(playerid); // Akkor megállítjuk neki a zenét
}
return 1;
}
[/pawn]
Kapcsolódó függvények
PlayAudioStreamForPlayer:Lejátszik egy audio streamot
PlayerPlaySound: Lejátszik egy hangot a játékosnak.
Eredeti téma: http://wiki.sa-mp.com/wiki/StopAudioStreamForPlayer
Amúgy bocs a rendezésért, holnap szánok rá idõt és szépen mindent átfogom rendezni, hogy egyformák legyenek.

53
Függvények / PlayAudioStreamForPlayer
« Dátum: 2011. December 04. - 19:52:03 »
PlayAudioStreamForPlayer
Ezzel a funkcióval audiostream-ot tudsz lejátszani a játékosnak url cím alapján. A playerid & url paraméteren kívül az összes csak optionális paraméter.
Megjegyzés: A zene csak akkor fog szólni, ha a rádió hangereje nincs levéve. Akinek lejátszik egy zenét, annak megjelenik a zene URL címe. Ezt az /audiomsg parancsal lehet kikapcsolni.
Paraméterek:
 
( playerid, url[], Float:posX = 0.0, Float:posY = 0.0, Float:posZ = 0.0, Float:distance = 50.0, usepos = 0 )

 
playerid    A játékos azonosítója, akinek le akarjuk játszani a zenét.
url[]   A zene elérési helye (url). Támogatott formátumok mp3 és ogg/vorbis.
Float:PosX   Az X kordináta, ahol a zene szóljon. Default 0.0. Ez csak akkor van hatásssal, ha az usepos 1-re van állítva.
Float:PosY   Az Y kordináta, ahol a zene szóljon. Default 0.0. Ez csak akkor van hatásssal, ha az usepos 1-re van állítva.
Float:PosZ   Az Z kordináta, ahol a zene szóljon. Default 0.0. Ez csak akkor van hatásssal, ha az usepos 1-re van állítva.
Float:distance   A távolság, hogy milyen messzirõl lehessen hallani a zenét. Ez csak akkor van hatásssal, ha az usepos 1-re van állítva.
usepos   Használja-e a 3D-s lejátszást. Ha ezt kikapcsolod, akkor mindig fog szólni a zene, nemcsak a megadott kordinátákon belül. Alapból kivan kapcsolva.
Visszatérés     Ez az funkció nem kezeli a visszatéréseket.
Példa:
[pawn]
public OnPlayerCommandText(playerid, cmdtext[])
{
    if (strcmp(\"/play radio\", cmdtext, true) == 0)
    {
        PlayAudioStreamForPlayer(playerid, \"http://somafm.com/tags.pls\");
        return 1;
    }
    if (strcmp(\"/radio in my pos\", cmdtext, true) == 0)
    {
        new Float:X, Float:Y, Float:Z, Float:Distance = 5.0;
        GetPlayerPos(playerid, X, Y, Z);
   PlayAudioStreamForPlayer(playerid, \"http://somafm.com/tags.pls\", X, Y, Z, Distance, 1);
   return 1;
    }
    return 0;
}[/pawn]
Kapcsolódó függvények
StopAudioStreamForPlayer: Megállítja a jelenleg lejátszott zenét a játékosnak.
PlayerPlaySound: Lejátszik egy hangot a játékosnak.
Eredeti téma: http://wiki.sa-mp.com/wiki/PlayAudioStreamForPlayer

54
OnPlayerClickMap
Ez az eljárás akkor hívódik meg, ha a játékos kijelöl egy pontot a térképen.
Ha nem értenétek, akkor Jobb Egér Gomb-al rákattintott a térképre.
Paraméterek:
 
(playerid, Float:fX, Float:fY, Float:fZ)

 
playerid        - Annak a játékosnak az azonosítója, aki kijelölt magának egy pontot a térképen
Float:fX        - Az X kordináta, ahol a jel van.
Float:fY        - Az Y kordináta, ahol a jel van.
Float:fZ        - Az Z kordináta, ahol a jel van. Ez csak naggyából van kiszámítva. Teleportálásra \"NEM\" alkalmas
Visszatérés     Ez az eljárás nem kezeli a visszatéréseket.
Példa:
Elteleportáljuk oda a játékost, ahova kattintott a térképen.
Jelen esetben jó lesz a Z kordináta, mivel a SetPlayerPosFindZ arra van, hogy megkeresse a legmagasabb pontot a megadott helyen.
[pawn]
public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
{
    SetPlayerPosFindZ(playerid, fX, fY, fZ + 50);
    return 1;
}
[/pawn]
Megjegyzés:
A Z kordináta, amit az eljárás visszaad, az csak naggyából van.
Szóval, ha pontos Z kordinátát szeretlen, akkor használd a MapAndreas plugint, vagy a SetPlayerPosFindZ-t.
Ez a MapAndreas, amit itt belinkeltem, ez újabbik verzió.
Van benne két lehetõség, egyik a nagyon pontos heightmap, amikor minden egyes X, Y kordinátához tartozik egy Z. Ez 72MB ramot igényel.
A másik meg olyan, amikor csak minden harmadik X, Y kordinátához tartozik egy Z. Ez csak ~9MB ramot igényel.
Én a másik módszert használom, ezis pontosan visszaadja a Z kordinátát és még a ramot se eszi annyira.
Eredeti téma: http://wiki.sa-mp.com/wiki/OnPlayerClickMap

55
OnPlayerGiveDamage
Ez az eljárás akkor hívódik meg, amikor egy játékos sérülést okoz egy másik játékosnak
Paraméterek:
 
( playerid, issuerid, Float:amount, weaponid )

 
playerid        - Annak a játékosnak az azonosítója, aki megsérült.
damagedid      - Annak a játékosnak az azonosítója, akinek sérülést okozott
Float:amount         - Az élet + páncél értéke egyben, amennyit sérült.
weaponid        - A fegyver azonosítója ( vagy a sérülés oka ), ami által megsérült. Ez ugyanúgy mûködik, mint az OnPlayerDeath-nál a reason.
Visszatérés     Ez az eljárás nem kezeli a visszatéréseket.
Példa:
[pawn]
public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid)
{
    if(damagedid != INVALID_PLAYER_ID)
    {
        new string[128], victim[MAX_PLAYER_NAME], attacker[MAX_PLAYER_NAME];
        new weaponname[24];
        GetPlayerName(playerid, attacker, sizeof (attacker));
        GetPlayerName(damagedid, victim, sizeof (victim));
        GetWeaponName(weaponid, weaponname, sizeof (weaponname));
        format(string, sizeof(string), \"%s sérülést okozott ( %.0f ) %s nevû játékosnak, fegyver: %s\", attacker, amount, victim, weaponname);
        SendClientMessageToAll(0xFFFFFFFF, string);
    }
    return 1;
}
[/pawn]
Megjegyzés:
TakeDamage és GiveDamage nem egyezik teljesen, ez az eljárás azonnal meghívódik, ahogy egy játékos meglõ egy másik játékost. Tehát a másik játékosnak még le se ment az élete, de a GiveDamage már meghívódott.
GiveDamage segítségével le tudod kérni, ha valaki sérülést okozott egy játékosnak, de a másik játékos nem vesztett semmit az életébõl.
Tehát csak rálõtt, de nem ment le egyáltalán az élete.
Ha a két játékos egy csapatban van, (SetPlayerTeam()-el egy csapatba vannak rakva) ez akkor is meghívódik, elõbb leírtam, hogy miért.
Így mostmár nagyon könnyû azt megoldani, ha valaki rálõ a csapattársára, akkor kiírni neki, hogy ne lõdd a csapattársad!
Ha azzal a játékossal akarsz foglalkozni, aki megsérült, akkor mindenképp a TakeDamage használata az ajánlott!
Eredeti téma: http://wiki.sa-mp.com/wiki/OnPlayerGiveDamage

56
Általános / Interview with Kye
« Dátum: 2011. Október 31. - 00:39:54 »
Ez már nagyon régi, de gondolom nyitok róla témát, mert szerintem nagyon sokan még nem is hallottak róla, vagy nem látták, mint ahogy énsem.
Angol, de szerintem megéri elolvasni, valamit csak megértetek belõle.
http://gtapt.net/forum/index.php?topic=5747.0

57
OnPlayerTakeDamage
Ez az eljárás akkor hívódik meg, ha valaki megsérül. Meglövök, vagy ha egyszerûen magasról leesik.
Paraméterek:
 
( playerid, issuerid, Float:amount, weaponid )

 
playerid        - Annak a játékosnak az azonosítója, aki megsérült.
issuerid      - Annak a játékosnak az azonosítója, aki által megsérült a játékos. Ha leesett valahonnan, akkor INVALID_PLAYER_ID. ( 65535 )
Float:amount         - Az élet + páncél értéke egyben, amennyit sérült.
weaponid        - A fegyver azonosítója ( vagy a sérülés oka ), ami által megsérült. Ez ugyanúgy mûködik, mint az OnPlayerDeath-nál a reason.
Visszatérés     Ez az eljárás nem kezeli a visszatéréseket.
Példa:
Egy lövéstõl meghalsz!
[pawn]
public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid)
{
if(issuerid != INVALID_PLAYER_ID)
{
   SetPlayerHealth(playerid, 0.0);
}
}
[/pawn]
Eredeti téma: http://wiki.sa-mp.com/wiki/OnPlayerTakeDamage

58
SA-MP: Szerverfejlesztés / Anti Mop
« Dátum: 2011. Szeptember 18. - 21:52:20 »
Gondolom mindeki ismeri a híres repülõ seprû cleo scriptet.
A szerveremen már mindeki kezdte túlzásba vinni, és az agyamra ment.
Ezért írtam rá egy scriptet, ami érzékeli ha repülsz a seprûvel és megöl.
Ittvan a \'script\', foreach szükséges hozzá.
[pawn]
#include <a_samp>
#define FILTERSCRIPT
#include <foreach>
new
MopCheckTimer;
public OnFilterScriptInit()
{
MopCheckTimer = SetTimer(\"CheckMop\", 1000, false);
}
public OnFilterScriptExit()
{
KillTimer(MopCheckTimer);
}
forward CheckMop();
public CheckMop()
{
foreach(Player, i)
{
   if(GetPlayerState(i) == PLAYER_STATE_ONFOOT && GetPlayerAnimationIndex(i) == 1058)
   {
      SendClientMessage(i, -1, \"Nincs MOP!\");
      SetPlayerHealth(i, 0);
   }
}
return 1;
}
[/pawn]
Belerakod egy filterscriptbe, betöltöd és megy is!

59
SA-MP: Szerverfejlesztés / Instagib 0.3d
« Dátum: 2011. Szeptember 18. - 18:13:46 »
Hali!
Gyorsan összedobtam egy kódot, aminek már jól kell mûködni, mint ahogy 0.3a elõtt ment.
Csak 0.3d RC5-tõl mûködik!
A lényege az, hogy ha valaki megsebez, akkor rögtön meghalsz.
[pawn]
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid)
{
SetPlayerHealth(damagedid, 0.0);
}
[/pawn]

60
SA-MP: Szerverfejlesztés / pName - Extra gyors játékos név lekérése.
« Dátum: 2011. Augusztus 27. - 21:36:41 »
Látom, hogy rengeteg ember használja ezt a pName funkciót, amivel mindig lekéri a nevét a játékosnak.
Csak itt az a probléma, hogy a GetPlayerName mindig lefut. Ezért megalkottam ezt a kódot, amiben csak EGYSZER fut le ez a függvény, és nempedig minden név lekérésénél.
[pawn]
new
    PlayerNames[sZERVER_SLOTOK_SZAMA_IRD_AT][MAX_PLAYER_NAME + 1]; // Minden játékoshoz tartozó cella, aminek a hossza 25 karakter
#define pName(%1) \\
    PlayerNames[%1]
stock __pName__SetPlayerName(playerid, _name[])
{
new
   retVal = SetPlayerName(playerid, _name);
if(retVal > 0)
{
   format(PlayerNames[playerid], MAX_PLAYER_NAME + 1, _name);
}
return retVal;
}
#if defined _ALS_SetPlayerName
#undef SetPlayerName
#else
#define _ALS_SetPlayerName
#endif
#define SetPlayerName __pName__SetPlayerName
// Használat: printf(\"ID 0 neve: %s\", pName(0));
public OnPlayerConnect(playerid)
{
// Ez a kód mindig lefelül szerepeljen!
GetPlayerName(playerid, PlayerNames[playerid], MAX_PLAYER_NAME); // Belekérjük a játékos nevét a PlayerNames-nél a játékoshoz tartozó cellába.
}
public OnPlayerDisconnect(playerid, reason)
{
// Ez a kód itt mindig legalul szerepeljen!
PlayerNames[playerid][0] = EOS; // EOS = End Of String, azaz nullázzuk
}
[/pawn]

Oldalak: 1 2 3 [4] 5 6 ... 12
SimplePortal 2.3.7 © 2008-2024, SimplePortal