-
Similar Content
-
By shane
Salut. M-am apucat si eu de scriptat si am facut un gm "de la 0" cum se zice din cate am inteles.
M-am gandit sa postez update-uri la el cand am timp de pierdut, deci daca printr-o minune se gandeste cineva sa il descarce si sa-l foloseasca, 'stai gianâ pi el' cum ar zice Speak. Voi incerca sa il fac cat mai diferit de ce s-a mai vazut prin romania, nu neaparat la sisteme, ci si pe design.
Numele gamemodeului l-am pus doar asa ca mi-am amintit de zeroping (hostu) si nu stiam cum sa-i spun ca era obligatoriu ca sa pot posta, iar 'gamemode shane' e prea asa parca.
Cu ce mi-am petrecut timpul pana acum?
- ma realizat momentan doar sistemul de inregistrare/logare (parola, email, varsta si alegerea skinului in functie de sex/gender). La logare am adaugat si loguri in cazul in care cel care se conecteaza reuseste sa intre pe cont sau nu.
- la faza cu alegerea skinului m-am inspirat de la un server rus, mi s-a parut misto ideea. Ai de ales intre 4 regiuni (european, afro american, asian si latino), cu cate 8 skinuri pentru fiecare regiune, 4 pentru barbati adv si 4 pentru domnisoare si doamne.
- am adaugat cateva functii pe care le-am folosit pe parcurs, precum detectarea numelui, actualizarea in baza si alte nebunii, sub alta forma fata de ce mai gasiti prin gamemode-uri cred, n-am mai descarcat de mult un gm sa vad ce-au mai facut baietii in ultimii 2 ani :)).
- am adaugat o comanda prin care sa poti seta admin unui jucator (/setadmin), impreuna cu loguri pentru aceasta.
- am folosit cele mai noi 'tehnologii', pe care o sa le enumar aici: crashdetect 4.20, sscanf 2.10.2, mysql r41-4, pawncmd 3.3.3, iar pe partea de include-uri, am folosit cea mai recenta versiune YSI (5.4) si easyDialogs pentru dialoguri, desigur.
- am adaugat si o camera de apartament pentru logare / selectarea skinului si sexului (gender), lafel, inspirata de pe serverul respectiv. Mapa nu e facuta de mine, am luat-o si eu de la cineva, dar pana la urma, daca tot e pe net, dc sa nu ne folosim de resursele altora, pentru asta au fost postate.
* textdraw-urile de la selectarea skinului *
Download: https://bit.ly/2Nq6Q4Q
VirusTotal: https://bit.ly/3aKRMr6 (am lasat si fisierele .exe de la sa-mp, de asta apare warninguri)
* baza de date se afla in arhiva / accept si sfaturi sa stiti ca nus perfect
-
By buNNy
Disponibilitate: Scripter , Mapper , Webdeveloper
Servicii: Editez paneluri/gamemodeuri, instalez forumuri/teme, creez paneluri/gamemodeuri de la 0 etc, launchere pentru samp...
Cunostinte: HTML,CSS,C++,C#,SQL,PAWN,LUA,PHP,JS,putin Laravel,putin NodeJS, PhotoShop
Alte Detalii: Pentru alte detalii ma contactati mai jos.
Modalitati de plata:
Paypal Skrill Steam Paysafe Transfer bancar Altele, vedem. Pagina de FB: https://www.facebook.com/BunnyDeveloper/
Pagina personala: https://www.bunny-script.cf/
Dovezi de la cateva afaceri: https://imgur.com/a/Qa3eRYb
DACA E DATI SI VOI UN UP!
-
By Jiust
Buna ziua, eu ma numesc aLuNa.
Eu ofer Servicii Mapping!
-> Nu eu le pun pe gamemode-ul tau
-> Dupa ce ti-am trimis codul il voi sterge din calculatorul meu
-> Preturi pentru toata lumea
-> Calitate
-> Detin proiecte
-> Sunt la inceput dar am experienta
-> Daca doresti sa ma contactezi da-mi add pe discord: aLuNa#0026
-> Daca doresti sa iti prezint proiectele mele ma contactezi.
-
By Jiust
Buna ziua, eu ofer servicii de mapping profesionale. Eu am o experienta doar de 9 luni dar pot spune ca sunt foarte priceput. Preturile la mine sunt de buzunarul tuturor.
-Pot face insule, etc.
-Va pot modifica spawnul.
-Mai multe detalii pe discord
-Discordul meu: aLuNa#0026
-
By AlexandruBHD
Bun deci lucrez la un gm de la 0 si am intampiat erorile astea, si sunt la inceput cu scripting-ul...
C:\Users\Acer\Desktop\GamemodeDeLa0\gamemodes\eureka.pwn(530) : error 037: invalid string (possibly non-terminated string)
C:\Users\Acer\Desktop\GamemodeDeLa0\gamemodes\eureka.pwn(530) : error 017: undefined symbol "Admin"
C:\Users\Acer\Desktop\GamemodeDeLa0\gamemodes\eureka.pwn(530) : error 017: undefined symbol "level"
C:\Users\Acer\Desktop\GamemodeDeLa0\gamemodes\eureka.pwn(530) : fatal error 107: too many error messages on one line
Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
4 Errors.
Gamemode
// Tranium RPG - Summer Project
// Started on: 01.06.2017 (by AlexandruBHD)
// Edited by -
/*
===================================================================
----------------------- Informations -----------------------
===================================================================
// Group Types
type 1: Police
type 2: Hitman
type 3: Gangs
*/
#define MAILER_URL "l0k3d-demo.tk/mail.php"
#include <a_samp>
#include <a_mysql>
#include <fixes>
#include <foreach>
#include <sscanf2>
#include <streamer>
#include <regex>
#include <YSI\y_master>
#include <YSI\y_commands>
#include <YSI\y_timers>
#include <YSI\y_iterate>
#include <YSI\y_stringhash>
#include <YSI\y_bit>
#include <define>
#include <fly>
#include <sendmail>
#include <mSelection>
// Natives
native WP_Hash(buffer[], len, const str[]);
// MySQL Configuration
new handle, rows, fields;
new
BitArray:pLogged<MAX_PLAYERS>,
BitArray:flyingStatus<MAX_PLAYERS>,
loginTries[MAX_PLAYERS],
playerHashedPass[MAX_PLAYERS][129],
enteredCode[MAX_PLAYERS]
;
new
para,
para2,
strPara[30],
gMsg[128]
;
new
Text:Logo[2],
PlayerText:SkinLogo[MAX_PLAYERS],
Text:ClockTime, Text:ClockDate
;
new
Iterator:Admins<MAX_PLAYERS>
;
enum playerInfo {
pSQLID, pName[MAX_PLAYER_NAME + 1], pPassword[130], pSerialCode[41],
pSkin,
pLevel,
pAdmin,
pAge, pSex, pEmail[100],
pCash, pBank,
pMember, pRank
};
new pInfo[MAX_PLAYERS][playerInfo];
enum groupInfo {
gID,
gName[50],
gMotd[128],
Float:geX,
Float:geY,
Float:geZ,
Float:giX,
Float:giY,
Float:giZ,
gRankname1[20],
gRankname2[20],
gRankname3[20],
gRankname4[20],
gRankname5[20],
gRankname6[20],
gRankname7[20],
gType,
gInterior,
gDoor,
gLeadskin,
gPickup,
Text3D:gLabel
};
new gInfo[MAX_GROUPS][groupInfo];
enum vehInfo {
vID,
vModel,
vGroup,
vColor1,
vColor2,
vCarPlate[11],
Float:vX,
Float:vY,
Float:vZ,
Float:vA
};
new vInfo[MAX_VEHICLES][vehInfo], vehID[MAX_VEHICLES];
main() {
print("\n----------------------------------");
print(" Tranium RPG Gamemode by AlexandruBHD ");
print("----------------------------------\n");
}
//timers
task OneSecond[1000]() {
new hour, minutes, seconds, day, month, year, mstr[20];
gettime(hour, minutes, seconds), getdate(year, month, day);
format(gMsg, 128,"%02d:%02d", hour, minutes), TextDrawSetString(ClockTime, gMsg);
switch(month) { case 1: mstr="january"; case 2: mstr="february"; case 3: mstr="march"; case 4: mstr="april"; case 5: mstr="may"; case 6: mstr="june"; case 7: mstr="iuly"; case 8: mstr="august"; case 9: mstr="september"; case 10: mstr="octomber"; case 11: mstr="november"; case 12: mstr="december"; }
format(gMsg, 128,"%02d %s %02d", day, mstr, year), TextDrawSetString(ClockDate, gMsg);
foreach(new x: Player) {
ResetPlayerMoney(x), GivePlayerMoney(x, pInfo[x][pCash]);
}
}
task FiveMinutes[1000 * (60*5)]() {
for(new v; v < MAX_VEHICLES; v++) { if(vInfo[v][vID] > 0 ) { saveVeh(v); } }
for(new i; i < MAX_GROUPS; i++) { saveGroup(i); }
foreach(new p : Player) {
saveAccount(p);
}
sendAdmins(COLOR_RED, "AdmData: "WHITE"Toate datele server-ului au fost salvate.");
}
timer kickTimer[500](playerid) {
Kick(playerid);
}
timer securityKick[1000 * 120](playerid) {
if(enteredCode[playerid] == 0) { Kick(playerid); }
}
timer setVehicleZAngle[700](vehicleid) {
SetVehicleZAngle(vehicleid, vInfo[vehID[vehicleid]][vA]);
}
public OnGameModeInit() {
handle = mysql_connect("localhost", "root", "eureka", "");
if(handle && mysql_errno(handle) == 0) { print("[MYSQL] Baza de date sa conectat cu succes!"); }
else print("[MYSQL] Connection not found.");
mysql_tquery(handle, "SELECT * FROM `groups`", "loadGroups", "");
mysql_tquery(handle, "SELECT * FROM `cars`", "loadCars", "");
EnableStuntBonusForAll(0);
ShowPlayerMarkers(0);
UsePlayerPedAnims();
DisableInteriorEnterExits();
SendRconCommand("language English");
SetGameModeText("E:RPG v1");
Logo[0] = TextDrawCreate(638.400085, 431.573303, "tranium");
TextDrawLetterSize(Logo[0], 0.354799, 1.704532);
TextDrawAlignment(Logo[0], 3);
TextDrawColor(Logo[0], -1);
TextDrawSetShadow(Logo[0], 0);
TextDrawSetOutline(Logo[0], 1);
TextDrawBackgroundColor(Logo[0], 51);
TextDrawFont(Logo[0], 3);
TextDrawSetProportional(Logo[0], 1);
Logo[1] = TextDrawCreate(602.000915, 423.359893, "rpg");
TextDrawLetterSize(Logo[1], 0.161597, 0.975287);
TextDrawAlignment(Logo[1], 1);
TextDrawColor(Logo[1], -1);
TextDrawSetShadow(Logo[1], 0);
TextDrawSetOutline(Logo[1], 1);
TextDrawBackgroundColor(Logo[1], 51);
TextDrawFont(Logo[1], 2);
TextDrawSetProportional(Logo[1], 1);
ClockTime = TextDrawCreate(577.599548, 21.653348, "23:45");
TextDrawLetterSize(ClockTime, 0.449999, 1.600000);
TextDrawAlignment(ClockTime, 2);
TextDrawColor(ClockTime, -1);
TextDrawSetShadow(ClockTime, 0);
TextDrawSetOutline(ClockTime, 1);
TextDrawBackgroundColor(ClockTime, 51);
TextDrawFont(ClockTime, 3);
TextDrawSetProportional(ClockTime, 1);
ClockDate = TextDrawCreate(579.200256, 7.466676, "23 octombrie 2017");
TextDrawLetterSize(ClockDate, 0.177200, 1.712000);
TextDrawAlignment(ClockDate, 2);
TextDrawColor(ClockDate, -1);
TextDrawSetShadow(ClockDate, 0);
TextDrawSetOutline(ClockDate, 1);
TextDrawBackgroundColor(ClockDate, 51);
TextDrawFont(ClockDate, 2);
TextDrawSetProportional(ClockDate, 1);
return 1;
}
public OnGameModeExit() {
for(new v; v < MAX_VEHICLES; v++) { if(vInfo[v][vID] > 0 ) { saveVeh(v); } }
for(new i; i < MAX_GROUPS; i++) { saveGroup(i); }
foreach(new p : Player) {
saveAccount(p);
}
mysql_close(handle);
return 1;
}
public OnPlayerRequestClass(playerid, classid) {
SetPlayerPos(playerid, -1410.8655,-298.9116,14.1484);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
return 1;
}
public OnPlayerConnect(playerid) {
new query[128];
mysql_format(handle, query, 128, "SELECT * FROM `players` WHERE `username` = '%e'", GetName(playerid));
mysql_tquery(handle, query, "accountCheck", "i", playerid);
// create td
SkinLogo[playerid] = CreatePlayerTextDraw(playerid, 532.599975, 405.319976, "LD_SPAC:white");
PlayerTextDrawLetterSize(playerid, SkinLogo[playerid], 0.000000, 0.000000);
PlayerTextDrawTextSize(playerid, SkinLogo[playerid], 110.0, 110.0);
PlayerTextDrawBoxColor(playerid, SkinLogo[playerid], 0xFFFFFF00);
PlayerTextDrawBackgroundColor(playerid, SkinLogo[playerid], 0xFFFFFF00);
PlayerTextDrawAlignment(playerid, SkinLogo[playerid], 1);
PlayerTextDrawColor(playerid, SkinLogo[playerid], -1);
PlayerTextDrawSetShadow(playerid, SkinLogo[playerid], 0);
PlayerTextDrawSetOutline(playerid, SkinLogo[playerid], 0);
PlayerTextDrawFont(playerid, SkinLogo[playerid], TEXT_DRAW_FONT_MODEL_PREVIEW);
PlayerTextDrawSetPreviewRot(playerid, SkinLogo[playerid], 0.000000, 0.000000, -340.000000, 1.000000);
PlayerTextDrawSetPreviewModel(playerid, SkinLogo[playerid], SPAWN_SKIN);
//show td
PlayerTextDrawShow(playerid, SkinLogo[playerid]);
TextDrawShowForPlayer(playerid, Logo[0]), TextDrawShowForPlayer(playerid, Logo[1]);
TextDrawShowForPlayer(playerid, ClockTime), TextDrawShowForPlayer(playerid, ClockDate);
SetSpawnInfo(playerid, 0, 0, 725.6906,-1450.2246,17.6953, 359.4464, 0,0,0,0, 0, 0 );
InitFly(playerid);
return 1;
}
public OnPlayerDisconnect(playerid, reason) {
// iterate
if(pInfo[playerid][pAdmin] > 0) {
Iter_Remove(Admins, playerid);
}
saveAccount(playerid);
resetData(playerid);
return 1;
}
// Login
forward accountCheck(playerid);
public accountCheck(playerid) {
TogglePlayerSpectating(playerid, 1);
cache_get_data(rows, fields, handle);
if(rows) {
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "SERVER: Login", ""SYN"Bine ai revenit pe "CREM"Tranium RPG"SYN"!\n\nAcest cont este inregistrat deja.\nIntrodu parola pentru a te loga pe contul tau.", "Login", "Cancel");
GameTextForPlayer(playerid, "~y~CONT INREGISTRAT", 5000, 4);
}
else {
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "SERVER: Register", ""SYN"Bine ai venit pe "CREM"Tranium RPG"SYN"!\n\nAcest cont nu este inregistrat, introdu parola pentru a te inregistra pe server.", "Register", "Cancel");
GameTextForPlayer(playerid, "~y~CONT NEINREGISTRAT", 5000, 4);
}
InterpolateCameraPos(playerid, 2062.878906, 988.830627, 11.947507, 2022.668579, 1397.960937, 27.489007, 20000);
InterpolateCameraLookAt(playerid, 2063.091552, 993.787048, 12.570880, 2022.038208, 1402.912109, 27.785707, 10000);
return 1;
}
forward accountLogin(playerid);
public accountLogin(playerid) {
cache_get_data(rows, fields, handle);
if(rows) {
pInfo[playerid][pSQLID] = cache_get_field_content_int(0, "ID");
cache_get_field_content(0, "username", pInfo[playerid][pName], handle, MAX_PLAYER_NAME + 1);
cache_get_field_content(0, "SerialCode", pInfo[playerid][pSerialCode], handle, 41);
cache_get_field_content(0, "password", pInfo[playerid][pPassword], handle, 129);
cache_get_field_content(0, "Email", pInfo[playerid][pEmail], handle, 100);
pInfo[playerid][pLevel] = cache_get_field_content_int(0, "Level");
pInfo[playerid][pAdmin] = cache_get_field_content_int(0, "AdminLevel");
pInfo[playerid][pCash] = cache_get_field_content_int(0, "Cash");
pInfo[playerid][pAge] = cache_get_field_content_int(0, "Age");
pInfo[playerid][pSex] = cache_get_field_content_int(0, "Sex");
pInfo[playerid][pBank] = cache_get_field_content_int(0, "Bank");
pInfo[playerid][pMember] = cache_get_field_content_int(0, "Member");
pInfo[playerid][pRank] = cache_get_field_content_int(0, "Rank");
pInfo[playerid][pSkin] = cache_get_field_content_int(0, "Skin");
Clearchat(playerid, 20), SCM(playerid, COLOR_LIGHT, "SERVER: "WHITE"Bine ai revenit, distractie placuta!");
if(pInfo[playerid][pMember]) { SCMEx(playerid, COLOR_TEAL, "Group motd: "GREY"%s", gInfo[pInfo[playerid][pMember]][gMotd]); }
if(pInfo[playerid][pAdmin] > 0) { Iter_Add(Admins, playerid); }
new serial[41], query[100];
gpci(playerid, serial, 41);
if(strcmp(pInfo[playerid][pSerialCode], serial, false)) {
new str[200], randCod[10];
format(randCod, 10, randomString(10));
mysql_format(handle, query, 256, "INSERT INTO `accounts_blocked` (`playerID`, `time`, `securityCode`) VALUES ('%d', '%d', '%e')", pInfo[playerid][pSQLID], GetTickCount(), randCod);
mysql_tquery(handle, query, "", "");
format(str, 384, "Hello %s!\nYou received this email because you logged in on your account from a different location.\nUse this code to continue the game: %s", GetName(playerid), randCod);
SendMail(pInfo[playerid][pEmail], "[email protected]", "Tranium RPG", "Security code!", str);
ShowPlayerDialog(playerid, DIALOG_BLOCK, DIALOG_STYLE_PASSWORD, "SERVER: Account blocked",
""SYN"This account is "DRED"blocked "SYN"because you are logged in from a different location.\n\nTo unblock your account you need to use a security cod, sended to your email.\nYou have "CREM"2 minutes "SYN"to use it.", "Proceed", "Cancel");
defer securityKick(playerid);
}
Bit_Set(pLogged, playerid, true);
TogglePlayerSpectating(playerid, 0);
SetPlayerScore(playerid, pInfo[playerid][pLevel]);
SpawnPlayer(playerid);
}
else {
if(2-loginTries[playerid] != 0) {
loginTries[playerid] ++;
SCMEx(playerid, COLOR_DRED, "You have %d attempts to login, otherwise you will be kicked from the server.", 3-loginTries[playerid]);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "SERVER: Login", ""SYN"Bine ai revenit pe "CREM"Tranium RPG"SYN"!\n\nAcest cont este deja inregistrat.\nTe rugam sa introduci parola "DRED"corecta"SYN" pentru a te loga pe contul tau.", "Login", "Cancel");
} else ShowPlayerDialog(playerid, DIALOG_GENERAL, DIALOG_STYLE_MSGBOX, "SERVER: Parola Gresita", "Ai primit kick deoarece ai gresit parola de 3 ori.", "Okay", ""), defer kickTimer(playerid);
}
return 1;
}
// Load Data
forward loadGroups();
public loadGroups() {
cache_get_data(rows, fields);
if(rows) {
new id, pickup;
for(new i; i < rows; i++) {
id = cache_get_field_content_int(i, "id");
gInfo[id][gID] = id;
cache_get_field_content(i, "Name", gInfo[id][gName], handle, 50);
cache_get_field_content(i, "Motd", gInfo[id][gMotd], handle, 128);
cache_get_field_content(i, "rankName1", gInfo[id][gRankname1], handle, 20);
cache_get_field_content(i, "rankName2", gInfo[id][gRankname2], handle, 20);
cache_get_field_content(i, "rankName3", gInfo[id][gRankname3], handle, 20);
cache_get_field_content(i, "rankName4", gInfo[id][gRankname4], handle, 20);
cache_get_field_content(i, "rankName5", gInfo[id][gRankname5], handle, 20);
cache_get_field_content(i, "rankName6", gInfo[id][gRankname6], handle, 20);
cache_get_field_content(i, "rankName7", gInfo[id][gRankname7], handle, 20);
gInfo[id][geX] = cache_get_field_content_float(i, "eX");
gInfo[id][geY] = cache_get_field_content_float(i, "eY");
gInfo[id][geZ] = cache_get_field_content_float(i, "eZ");
gInfo[id][giX] = cache_get_field_content_float(i, "iX");
gInfo[id][giY] = cache_get_field_content_float(i, "iY");
gInfo[id][giZ] = cache_get_field_content_float(i, "iZ");
gInfo[id][gType] = cache_get_field_content_int(i, "Type");
gInfo[id][gInterior] = cache_get_field_content_int(i, "Interior");
gInfo[id][gDoor] = cache_get_field_content_int(i, "Door");
gInfo[id][gLeadskin] = cache_get_field_content_int(i, "leadSkin");
format(gMsg, 128, "{FF6347}%s`s HQ\n{D2B48C}(%s)", gInfo[id][gName], (gInfo[id][gDoor]) ? ("closed") : ("opened"));
if(gInfo[id][gType] == 1) { pickup = 1247; }
else if(gInfo[id][gType] == 2) { pickup = 1254; }
else { pickup = 1239; }
gInfo[id][gPickup] = CreateDynamicPickup(pickup, 1, gInfo[id][geX], gInfo[id][geY], gInfo[id][geZ], -1, -1, -1, 20.0);
gInfo[id][gLabel] = CreateDynamic3DTextLabel(gMsg, COLOR_YELLOW, gInfo[id][geX], gInfo[id][geY], gInfo[id][geZ], 100, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, -1, -1, -1, 20.0);
}
}
else print("No groups.");
return 1;
}
forward loadCars();
public loadCars() {
cache_get_data(rows, fields, handle);
if(rows) {
for(new x = 0; x < rows; x++) {
new i = cache_get_field_content_int(x, "id");
vInfo[vID] = i;
vInfo[vModel] = cache_get_field_content_int(x, "Model");
vInfo[vGroup] = cache_get_field_content_int(x, "Group");
vInfo[vX] = cache_get_field_content_float(x, "pX");
vInfo[vY] = cache_get_field_content_float(x, "pY");
vInfo[vZ] = cache_get_field_content_float(x, "pZ");
vInfo[vA] = cache_get_field_content_float(x, "pA");
cache_get_field_content(x, "CarPlate", vInfo[vCarPlate], handle, 11);
vInfo[vColor1] = cache_get_field_content_int(x, "Color1");
vInfo[vColor2] = cache_get_field_content_int(x, "Color2");
new car = CreateVehicle(vInfo[vModel], vInfo[vX], vInfo[vY], vInfo[vZ], vInfo[vA], vInfo[vColor1], vInfo[vColor2], -1);
vehID[car] = vInfo[vID];
SetVehicleNumberPlate(car, vInfo[vCarPlate]);
}
}
else print("No cars.");
return 1;
}
forward saveGroup(id);
public saveGroup(id) {
new query[500];
mysql_format(handle, query, 500,
"UPDATE `groups` SET `Name` = '%s', `Motd` = '%s', `eX` = '%f', `eY` = '%f', `eZ` = '%f', `iX` = '%f', `iY` = '%f', `iZ` = '%f', `rankName1` = '%s', `rankName2` = '%s', `rankName3` = '%s', `rankName4` = '%s', `rankName5` = '%s', `rankName6` = '%s', `rankName7` = '%s', `Type` = '%d', `Interior` = '%d', `Door` = '%d', `leadSkin` = '%d' WHERE `id` = '%d'",
gInfo[id][gName], gInfo[id][gMotd], gInfo[id][geX], gInfo[id][geY],gInfo[id][geZ], gInfo[id][giX], gInfo[id][giY], gInfo[id][giZ], gInfo[id][gRankname1], gInfo[id][gRankname2], gInfo[id][gRankname3], gInfo[id][gRankname4], gInfo[id][gRankname5], gInfo[id][gRankname6], gInfo[id][gRankname7], gInfo[id][gType], gInfo[id][gInterior], gInfo[id][gDoor], gInfo[id][gLeadskin], id);
mysql_tquery(handle, query, "", "");
return 1;
}
forward saveVeh(car);
public saveVeh(car) {
new query[500];
mysql_format(handle, query, 500, "UPDATE `cars` SET `Model` = '%d', `Group` = '%d', `CarPlate` = '%e', `pX` = '%f', `pY` = '%f', `pZ` = '%f', `pA` = '%f', `Color1` = '%d', `Color2` = '%d' WHERE `id` = '%d'",
vInfo[car][vModel], vInfo[car][vGroup], vInfo[car][vCarPlate], vInfo[car][vX], vInfo[car][vY], vInfo[car][vZ], vInfo[car][vA], vInfo[car][vColor1], vInfo[car][vColor2], car);
mysql_tquery(handle, query, "", "");
return 1;
}
forward saveAccount(playerid);
public saveAccount(playerid) {
new query[500];
// mysql_format(handle, query, 500, "UPDATE `players` SET `username` = '%e', `Level` = '%d', `Email` = '%e', `AdminLevel` = '%d', `Member` = '%d', `Rank` = '%d', `Skin` = '%d' WHERE `ID` = '%d'",
// pInfo[playerid][pName], pInfo[playerid][pLevel], pInfo[playerid][pEmail], pInfo[playerid][pAdmin], pInfo[playerid][pMember], pInfo[playerid]
mysql_format(handle, query, 500, "UPDATE `players` SET `username` = '%e', `Level` = '%d', `Email` = '%e', `AdminLevel` = '%d', `Member` = '%d', `Rank` = '%d', `Skin` = '%d', `Cash` = '%d', `Bank` = '%d' WHERE `ID` = '%d'",
pInfo[playerid][pName], pInfo[playerid][pLevel], pInfo[playerid][pEmail], pInfo[playerid][pAdmin], pInfo[playerid][pMember], pInfo[playerid][pRank], pInfo[playerid][pSkin], pInfo[playerid][pCash], pInfo[playerid][pBank], pInfo[playerid][pSQLID]);
mysql_tquery(handle, query, "", "");
return 1;
}
forward securityCodeCheck(playerid);
public securityCodeCheck(playerid) {
cache_get_data(rows, fields, handle);
if(rows) { SCM(playerid, COLOR_LIGHTRED, "You have entered the correct code, now you can play!"), enteredCode[playerid] = 1; }
else ShowPlayerDialog(playerid, DIALOG_BLOCK, DIALOG_STYLE_PASSWORD, "SERVER: Account blocked",
""SYN"You used a "DRED"incorrect code"SYN", try again.\n\nTo unblock your account you need to use a security cod, sended to your email.\nYou have "CREM"2 minutes "SYN"to use it.", "Proceed", "Cancel");
return 1;
}
public OnPlayerSpawn(playerid) {
if(Bit_Get(pLogged, playerid) == true) {
SetPlayerHealth(playerid, 99.00);
SetPlayerArmour(playerid, 00.00);
SetPlayerSkin(playerid, pInfo[playerid][pSkin]);
if(pInfo[playerid][pMember] == 0) {
SetPlayerPos(playerid, 725.6906,-1450.2246,17.6953), SetPlayerFacingAngle(playerid, 359.4464);
SetPlayerInterior(playerid, 0), SetPlayerVirtualWorld(playerid, 0), SetCameraBehindPlayer(playerid);
}
else {
new i = pInfo[playerid][pMember];
SetPlayerPos(playerid, gInfo[giX], gInfo[giY], gInfo[giZ]);
SetPlayerInterior(playerid, gInfo[gInterior]);
SetPlayerVirtualWorld(playerid, i+1);
SetCameraBehindPlayer(playerid);
}
}
return 1;
}
public OnPlayerDeath(playerid, killerid, reason) {
return 1;
}
public OnVehicleSpawn(vehicleid) {
if(vInfo[vehID[vehicleid]][vID] > 0) {
ChangeVehicleColor(vehicleid, vInfo[vehID[vehicleid]][vColor1],vInfo[vehID[vehicleid]][vColor2]);
SetVehiclePos(vehicleid, vInfo[vehID[vehicleid]][vX], vInfo[vehID[vehicleid]][vY], vInfo[vehID[vehicleid]][vZ]);
defer setVehicleZAngle(vehicleid);
}
return 1;
}
public OnVehicleDeath(vehicleid, killerid) {
return 1;
}
public OnPlayerText(playerid, text[]) {
format(gMsg, 128, "%s: %s", GetName(playerid), text);
SendClientMessageToAll(-1, gMsg);
SetPlayerChatBubble(playerid, text, COLOR_GREY, 10.0, 10000);
return 0;
}
public OnPlayerCommandPerformed(playerid, cmdtext[], success) {
if (success) return 1;
if(!success) return SCMEx(playerid, COLOR_LIGHT, "SERVER: This command ("TEAL"%s"SYN") does not exist.", cmdtext);
return 0;
}
YCMD:ah(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 1) return adminOnly(playerid, 1);
SCM(playerid, COLOR_TEAL, "----------------------------- Admins Commands-----------------------------");
SCM(playerid, -1, "Admin level 1: /a /vr /vehinfo /gotoveh /gotohq /gotopoint /fly /stopfly /gotods /tbox");
SCM(playerid, -1, "Admin level 2: /moveveh");
SCM(playerid, -1, "Admin level 3: /setleader /groupveh /modelveh /colorveh");
SCM(playerid, -1, "Admin level 4: /sethqint /sethqext");
SCM(playerid, -1, "Admin level 5: /none);
SCM(playerid, -1, "Admin level 6: /addvehicle /setadmin ");
SCM(playerid, COLOR_TEAL, "---------------------------------------------------------------------------");
return 1;
}
YCMD:pset(playerid, params[], help) {
if(sscanf(params, "us[30]i", para, strPara, para2)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/pset [playerid] [item] [value]"), SCM(playerid, -1, "Items: rank, group, money, bank (moeny)");
switch(YHash(strPara)) {
case _H<rank>: {
if(para2 < 0 || para2 > 7) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/pset [playerid] [rank] [0-7]");
format(gMsg, 128, "/pset: Admin %s changed %s`s rank to %d.", GetName(playerid), GetName(para), para2), sendAdmins(COLOR_YELLOW, gMsg);
SCMEx(playerid, COLOR_LORANGE, "Admin %s changed your rank to %d.", GetName(para), para2);
pInfo[para][pRank] = para2;
}
case _H<group>: {
if(gInfo[para2][gID] == 0 && para2 != 0) return SCM(playerid, COLOR_LIGHT, "Error: Invalid group id.");
format(gMsg, 128, "/pset: Admin %s changed %s`s group to %s (id: %d).", GetName(playerid), GetName(para), gInfo[para2][gName], para2), sendAdmins(COLOR_YELLOW, gMsg);
SCMEx(playerid, COLOR_LORANGE, "Admin %s changed your group to %s.", GetName(para), gInfo[para2][gName]);
pInfo[para][pMember] = para2, pInfo[para][pRank] = (para2 == 0) ? (0) : (1);
}
case _H<money>: {
format(gMsg, 128, "/pset: Admin %s changed %s`s money to $%s.", GetName(playerid), GetName(para), FormatNumber(para2)), sendAdmins(COLOR_YELLOW, gMsg);
SCMEx(playerid, COLOR_LORANGE, "Admin %s changed your money to $%s.", GetName(para), FormatNumber(para2));
pInfo[para][pCash] = para2;
}
case _H<bank>: {
format(gMsg, 128, "/pset: Admin %s changed %s`s bank money to $%s.", GetName(playerid), GetName(para), FormatNumber(para2)), sendAdmins(COLOR_YELLOW, gMsg);
SCMEx(playerid, COLOR_LORANGE, "Admin %s changed your bank money to $%s.", GetName(para), FormatNumber(para2));
pInfo[para][pBank] = para2;
}
default: { SCM(playerid, COLOR_GREY, "Error: Wrong item."); }
}
return 1;
}
YCMD:vr(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 1) return adminOnly(playerid, 1);
if(IsPlayerInAnyVehicle(playerid)) {
SetVehicleToRespawn(GetPlayerVehicleID(playerid));
SCMEx(playerid, -1, ""NON"You succesfull respawned vehicle #%d.", GetPlayerVehicleID(playerid));
}
else {
if(sscanf(params, "i", para)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/vr [vehicle id]");
SetVehicleToRespawn(para);
SCMEx(playerid, -1, ""NON"You succesfull respawned vehicle #%d.", para);
}
return 1;
}
YCMD:addvehicle(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 6) return adminOnly(playerid, 6);
new str[284], Cache:cache_i;
if(GetPVarInt(playerid, "AddVehicle") > 0) {
new Float:x, Float:y, Float:z, Float:a;
GetVehiclePos(GetPVarInt(playerid, "AddVehicle"), x, y, z), GetVehicleZAngle(GetPVarInt(playerid, "AddVehicle"), a);
mysql_format(handle, str, 284, "INSERT INTO `cars` (`Model`, `Group`, `CarPlate`, `pX`, `pY`, `pZ`, `pA`, `Color1`, `Color2`) VALUES ('%d', '0', 'Null', '%f', '%f', '%f', '%f', '-1', '-1')", GetVehicleModel(GetPVarInt(playerid, "AddVehicle")), x, y, z, a);
cache_i = mysql_query(handle, str);
new id = cache_insert_id();
GetVehiclePos(GetPVarInt(playerid, "AddVehicle"), x, y, z), GetVehicleZAngle(GetPVarInt(playerid, "AddVehicle"), a);
vInfo[id][vID] = id;
vInfo[id][vModel] = GetVehicleModel(GetPVarInt(playerid, "AddVehicle"));
vInfo[id][vX] = x, vInfo[id][vY] = y, vInfo[id][vZ] = z, vInfo[id][vA] = a;
vInfo[id][vGroup] = 0;
vInfo[id][vColor1] = vInfo[id][vColor2] = -1;
format(vInfo[id][vCarPlate], 11, "Null");
vehID[GetPVarInt(playerid, "AddVehicle")] = id;
SetVehicleToRespawn(GetPVarInt(playerid, "AddVehicle")), DeletePVar(playerid, "AddVehicle");
cache_delete(cache_i);
format(str, 100, ""ORANGE"/addvehicle: Admin %s added a new vehicle on server.", GetName(playerid));
sendAdmins(COLOR_WHITE, str);
}
else {
if(IsPlayerInAnyVehicle(playerid)) return SCM(playerid, COLOR_GREY, "You can use this command because you are in a vehicle.");
if(sscanf(params, "i", para)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/addvehicle [model]");
if(para < 400 || para > 612) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/addvehicle [400-612]");
new Float:x, Float:y, Float:z, Float:a;
GetPlayerPos(playerid, x, y, z), GetPlayerFacingAngle(playerid, a);
new vehicle = CreateVehicle(para,x, y, z, a, -1, -1, -1);
PutPlayerInVehicle(playerid, vehicle, 0);
SetPVarInt(playerid, "AddVehicle", vehicle);
}
return 1;
}
YCMD:colorveh(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 3) return adminOnly(playerid, 3);
if(sscanf(params, "ii", para, para2)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/colorveh ");
new i = GetPlayerVehicleID(playerid);
if(i) {
if((para < 0 || para > 256) || (para2 < 0 || para2 > 256)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/colorveh ");
vInfo[vehID][vColor1] = para, vInfo[vehID][vColor2] = para2;
ChangeVehicleColor(i, para, para2);
SCMEx(playerid, -1, ""NON"You succesfull changed vehicle colors to %d and %d (for vehicle #%d).", para, para2, i);
}
else SCM(playerid, -1, "You are not in a vehicle.");
return 1;
}
YCMD:modelveh(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 3) return adminOnly(playerid, 3);
if(sscanf(params, "i", para)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/modelveh [model]");
new i = GetPlayerVehicleID(playerid);
if(i) {
if(para < 400 || para > 612) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/modelveh [400-612]");
vInfo[vehID][vModel] = para;
DestroyVehicle(i);
i = CreateVehicle(vInfo[vehID][vModel], vInfo[vehID][vX], vInfo[vehID][vY], vInfo[vehID][vZ], vInfo[vehID][vA], vInfo[vehID][vColor1], vInfo[vehID][vColor2], -1);
PutPlayerInVehicle(playerid, i, 0);
SCMEx(playerid, -1, ""NON"You succesfull changed vehicle model (for vehicle #%d).", i);
}
else SCM(playerid, -1, "You are not in a vehicle.");
return 1;
}
YCMD:groupveh(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 3) return adminOnly(playerid, 3);
new veh = GetPlayerVehicleID(playerid);
if(veh) {
if(sscanf(params, "i", para)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/groupveh [group id]");
if(gInfo[para][gID] == 0) return SCM(playerid, COLOR_GREY, "Error: Invalid group id.");
vInfo[vehID[veh]][vGroup] = para;
SetVehicleToRespawn(veh);
SCMEx(playerid, COLOR_NON, "Now, this %s (id: %d) its %s`s vehicle.", vehName[GetVehicleModel(veh) - 400], veh, gInfo[para][gName]);
}
else SCM(playerid, -1, "You are not in a vehicle.");
return 1;
}
YCMD:moveveh(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 2) return adminOnly(playerid, 2);
new veh = GetPlayerVehicleID(playerid);
if(veh) {
GetVehiclePos(veh, vInfo[vehID[veh]][vX], vInfo[vehID[veh]][vY], vInfo[vehID[veh]][vZ]);
GetVehicleZAngle(veh, vInfo[vehID[veh]][vA]);
SetVehicleToRespawn(veh);
SCMEx(playerid, COLOR_NON, "You succesfull moved this %s (id: %d)!", vehName[GetVehicleModel(veh) - 400], veh);
}
else SCM(playerid, -1, "You are not in a vehicle.");
return 1;
}
YCMD:vehinfo(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 1) return adminOnly(playerid, 1);
if(sscanf(params, "i", para)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/vehinfo [veh id]");
SCMEx(playerid, COLOR_TEAL, ""TEAL"Model: "WHITE"%d | "TEAL"Carplate: "WHITE"%s | "TEAL"Group: "WHITE"%d | "TEAL"Colors: "WHITE"%d, %d",
vInfo[vehID[para]][vModel], vInfo[vehID[para]][vCarPlate], vInfo[vehID[para]][vGroup], vInfo[vehID[para]][vColor1], vInfo[vehID[para]][vColor2]);
return 1;
}
YCMD:fly(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 1) return adminOnly(playerid, 1);
StartFly(playerid), SetPlayerHealth(playerid, 999999.00);
Bit_Set(flyingStatus, playerid, true);
return 1;
}
YCMD:stopfly(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 1) return adminOnly(playerid, 1);
StopFly(playerid), SetPlayerHealth(playerid, 99.00);
Bit_Set(flyingStatus, playerid, false);
return 1;
}
YCMD:gotoveh(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 1) return adminOnly(playerid, 1);
if(sscanf(params, "i", para)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/gotoveh [vehicle id]");
new Float:x, Float:y, Float:z;
GetVehiclePos(para, Float:x, Float:y, Float:z), SetPlayerPos(playerid, x, y, z+5), SetPlayerVirtualWorld(playerid, GetVehicleVirtualWorld(para));
return 1;
}
YCMD:gotopoint(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 1) return adminOnly(playerid, 1);
new Float:x, Float:y, Float:z;
if(sscanf(params, "fffi", x, y, z, para)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/gotopoint [x] [y] [z] [interior]");
SetPlayerPos(playerid, x, y, z), SetPlayerInterior(playerid, para), SetCameraBehindPlayer(playerid);
return 1;
}
YCMD:gotohq(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 1) return adminOnly(playerid, 1);
if(sscanf(params, "i", para)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/gotohq [id]");
SetPlayerPos(playerid, gInfo[para][geX], gInfo[para][geY], gInfo[para][geZ]);
SetPlayerInterior(playerid, 0);
SetCameraBehindPlayer(playerid);
SCMEx(playerid, -1, "You have teleported to %s`s headquarter.", gInfo[para][gName]);
return 1;
}
YCMD:setadmin(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 6) return adminOnly(playerid, 6);
if(sscanf(params, "ui", para, para2)) return SCM(playerid, COLOR_LIGHT, "(SERVER): "WHITE"/setadmin [playerid] [level]");
if(para == INVALID_PLAYER_ID) return SCM(playerid, COLOR_GREY, "Error: Invalid player id.");
if(pInfo[para][pAdmin] < para2) { SCMEx(para, -1, ""NON"Felicitari! Ai fost promovat/a la admin %d, de catre adminul %s.", para2, GetName(para)); }
else if(pInfo[para][pAdmin] > para2 && para2 != 0) { SCMEx(para, -1, ""NON"Adminul %s ti-a dat rank-down la admin %d.", para2, GetName(para)); }
else { SCMEx(para, -1, ""NON"You have been removed from Staff Team (administrators), by %s", GetName(para)); }
// iterators
if(pInfo[para][pAdmin] == 0 && para2 > 0) { Iter_Add(Admins, para); }
else if(pInfo[para][pAdmin] > 0 && para2 == 0) { Iter_Remove(Admins, para); }
pInfo[para][pAdmin] = para2;
SCMEx(playerid, -1, "You have changed %s`s admin level to %d.", GetName(para), para2);
return 1;
}
YCMD:sethqext(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 4) return adminOnly(playerid, 4);
if(sscanf(params, "i", para)) return SCM(playerid, COLOR_LIGHT, "(SERVER): "WHITE"/sethqext [group id]");
if(gInfo[para][gID] == 0) return SCM(playerid, COLOR_GREY, "Error: Invalid group ID.");
GetPlayerPos(playerid, gInfo[para][geX], gInfo[para][geY], gInfo[para][geZ]);
DestroyDynamicPickup(gInfo[para][gPickup]);
DestroyDynamic3DTextLabel(gInfo[para][gLabel]);
format(gMsg, 128, "{FF6347}%s`s HQ\n{D2B48C}(%s)", gInfo[para][gName], (gInfo[para][gDoor]) ? ("closed") : ("opened"));
new pickup;
if(gInfo[para][gType] == 1) { pickup = 1247; }
else if(gInfo[para][gType] == 2) { pickup = 1254; }
else { pickup = 1239; }
gInfo[para][gPickup] = CreateDynamicPickup(pickup, 1, gInfo[para][geX], gInfo[para][geY], gInfo[para][geZ], -1, -1, -1, 20.0);
gInfo[para][gLabel] = CreateDynamic3DTextLabel(gMsg, COLOR_YELLOW, gInfo[para][geX], gInfo[para][geY], gInfo[para][geZ], 100, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, -1, -1, -1, 20.0);
SCMEx(playerid, COLOR_TEAL, "(!) "WHITE"The exterior of %s (#%d) was changed successfully.", gInfo[para][gName], para);
saveGroup(para);
return 1;
}
YCMD:sethqint(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 4) return adminOnly(playerid, 4);
if(sscanf(params, "i", para)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/sethqint [group id]");
if(gInfo[para][gID] == 0) return SCM(playerid, COLOR_GREY, "Error: Invalid group ID.");
GetPlayerPos(playerid, gInfo[para][giX], gInfo[para][giY], gInfo[para][giZ]), gInfo[para][gInterior] = GetPlayerInterior(playerid);
SCMEx(playerid, COLOR_TEAL, "(!) "WHITE"The interior of %s (#%d) was changed successfully.", gInfo[para][gName], para);
saveGroup(para);
return 1;
}
YCMD:auninvite(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 2) return adminOnly(playerid, 2);
if(sscanf(params, "us[30]", para, strPara)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/auninvite [playerid] [reason: max 30 characters]");
if(para == INVALID_PLAYER_ID) return SCM(playerid, COLOR_GREY, "Error: Invalid player id.");
if(pInfo[para][pMember] == 0) return SCM(playerid, COLOR_GREY, "You can not use this command on civilians.");
format(gMsg, 128, "%s was uninvited by Admin %s from %s, reason: %s", GetName(para), GetName(playerid), gInfo[pInfo[para][pMember]][gName], strPara);
sendGroup(COLOR_LIGHT, pInfo[para][pMember], gMsg);
format(gMsg, 128, "Admin uninvite: %s was uninvited by Admin %s from %s, reason: %s", GetName(para), GetName(playerid), gInfo[pInfo[playerid][pMember]][gName], strPara);
sendAdmins(COLOR_DRED, gMsg);
format(gMsg, 128, "You got uninvited by Admin %s from %s, reason: %s", GetName(playerid), gInfo[pInfo[playerid][pMember]][gName], strPara);
ShowPlayerDialog(para, DIALOG_GENERAL, DIALOG_STYLE_MSGBOX, "SERVER: Uninvite", gMsg, "Close", "");
pInfo[para][pMember] = pInfo[para][pRank] = 0;
pInfo[para][pSkin] = SPAWN_SKIN, SetPlayerSkin(para, SPAWN_SKIN);
return 1;
}
YCMD:setleader(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 3) return adminOnly(playerid, 3);
new p;
if(sscanf(params, "ui", p, para)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/setleader [playerid] [group id]");
if(p == INVALID_PLAYER_ID) return SCM(playerid, COLOR_GREY, "Error: Invalid player id.");
if(pInfo[p][pMember] > 0) return SCM(playerid, COLOR_GREY, "This player is already in a faction, you need to use /auninvite first.");
if(gInfo[para][gID] == 0 && para != 0) return SCM(playerid, COLOR_GREY, "Error: Invalid group id.");
pInfo[p][pMember] = para, pInfo[p][pRank] = 7;
SCMEx(playerid, -1, "You have set %s`s leader to %s.", GetName(p), gInfo[para][gName]), SCMEx(p, -1, ""NON"You have been promoted to %s`s leader by %s. Good job!", gInfo[para][gName], GetName(playerid));
SetPlayerSkin(p, gInfo[para][gLeadskin]), pInfo[p][pSkin] = gInfo[para][gLeadskin];
return 1;
}
YCMD:a(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 1) return adminOnly(playerid, 1);
if(isnull(params)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/a [message]");
format(gMsg, 128, "(/a) %s: %s", GetName(playerid), params);
sendAdmins(COLOR_ACHAT, gMsg);
return 1;
}
///////////////////////////////////////
YCMD:invite(playerid, params[], help) {
if(pInfo[playerid][pRank] < 6 || pInfo[playerid][pMember] == 0) return SCM(playerid, COLOR_GREY, "You are not allowed to use this command.");
if(sscanf(params, "u", para)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/invite [playerid]");
if(para == INVALID_PLAYER_ID) return SCM(playerid, COLOR_GREY, "Error: Invalid player id.");
if(para == playerid) return SCM(playerid, COLOR_GREY, "You can not invite yourself.");
if(pInfo[para][pMember] > 0) return SCM(playerid, COLOR_GREY, "You can invite in your group only civilians.");
if(GetPVarInt(para, "inviteGroup") == pInfo[playerid][pMember]) return SCM(playerid, COLOR_GREY, "This player is already invited to your group.");
SetPVarInt(para, "inviteGroup", pInfo[playerid][pMember]), SetPVarString(para, "inviteName", pInfo[playerid][pName]);
SCMEx(playerid, COLOR_NON, "%s was invited, please wait...", GetName(para));
SCMEx(para, COLOR_NON, "You have been invited by %s to join in %s. Type /accept invite to accept.", GetName(playerid), gInfo[pInfo[playerid][pMember]][gName]);
return 1;
}
YCMD:admins(playerid, params[], help) {
SCM(playerid, COLOR_TEAL, "---------------------------------------------------------");
foreach(new i : Admins)
{
SCMEx(playerid, -1, "(%d) %s - admin level %d", i, GetName(i), pInfo[pAdmin]);
}
SCMEx(playerid, -1, "There are %d %s online. If you have a problem, use report.", Iter_Count(Admins), (Iter_Count(Admins) == 1) ? ("admin") : ("admins"));
SCM(playerid, COLOR_TEAL, "---------------------------------------------------------");
return 1;
}
YCMD:accept(playerid, params[], help) {
if(sscanf(params, "s[30]", strPara)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/accept [item]"), SCM(playerid, -1, "Items: invite");
switch(YHash(strPara)) {
case _H<invite>: {
if(GetPVarInt(playerid, "inviteGroup") == 0) return SCM(playerid, COLOR_GREY, "You haven`t been invited in any group.");
new name[MAX_PLAYER_NAME];
pInfo[playerid][pMember] = GetPVarInt(playerid, "inviteGroup");
pInfo[playerid][pRank] = 1, DeletePVar(playerid, "inviteGroup");
pInfo[playerid][pSkin] = gInfo[pInfo[playerid][pMember]][gLeadskin], SetPlayerSkin(playerid, gInfo[pInfo[playerid][pMember]][gLeadskin]);
format(gMsg, 128, "%s is now your teammate, invited by %s.", GetName(playerid), GetPVarString(playerid, "inviteName", name, MAX_PLAYER_NAME));
sendGroup(COLOR_LIGHT, pInfo[playerid][pMember], gMsg);
format(gMsg, 128, "Congratulations! Now you are %s`s member.", gInfo[pInfo[playerid][pMember]][gName]);
ShowPlayerDialog(playerid, DIALOG_GENERAL, DIALOG_STYLE_MSGBOX, "SERVER: Invitation", gMsg, "Close", "");
DeletePVar(playerid, "inviteName");
}
default: {
SCM(playerid, COLOR_GREY, "Error: Wrong item.");
}
}
return 1;
}
YCMD:f(playerid, params[], help) {
if(pInfo[playerid][pMember] && (gInfo[pInfo[playerid][pMember]][gType] == 3 || gInfo[pInfo[playerid][pMember]][gType] == 2)) {
if(isnull(params)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/f(action) [message]");
switch(pInfo[playerid][pRank]) {
case 1: format(gMsg, 128, "* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname1], GetName(playerid), params); case 2: format(gMsg, 128, "* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname2], GetName(playerid), params); case 3: format(gMsg, 128, "* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname3], GetName(playerid), params);
case 4: format(gMsg, 128, "* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname4], GetName(playerid), params); case 5: format(gMsg, 128, "* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname5], GetName(playerid), params); case 6: format(gMsg, 128, "{1BA6C2}* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname6], GetName(playerid), params);
case 7: format(gMsg, 128, "{1BA6C2}* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname7], GetName(playerid), params);
}
sendGroup(COLOR_FCHAT, pInfo[playerid][pMember], gMsg);
}
return 1;
}
YCMD:r(playerid, params[], help) {
if(pInfo[playerid][pMember] && gInfo[pInfo[playerid][pMember]][gType] == 1) {
if(isnull(params)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/r(adio) [message]");
switch(pInfo[playerid][pRank]) {
case 1: format(gMsg, 128, "* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname1], GetName(playerid), params); case 2: format(gMsg, 128, "* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname2], GetName(playerid), params); case 3: format(gMsg, 128, "* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname3], GetName(playerid), params);
case 4: format(gMsg, 128, "* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname4], GetName(playerid), params); case 5: format(gMsg, 128, "* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname5], GetName(playerid), params); case 6: format(gMsg, 128, "* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname6], GetName(playerid), params);
case 7: format(gMsg, 128, "* %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname7], GetName(playerid), params);
}
sendGroup(COLOR_RCHAT, pInfo[playerid][pMember], gMsg);
}
return 1;
}
YCMD:d(playerid, params[], help) {
if(pInfo[playerid][pMember] && gInfo[pInfo[playerid][pMember]][gType] == 1) {
if(isnull(params)) return SCM(playerid, COLOR_LIGHT, "Syntax: "WHITE"/d(epartments) [message]");
switch(pInfo[playerid][pRank]) {
case 1: format(gMsg, 128, "** %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname1], GetName(playerid), params); case 2: format(gMsg, 128, "** %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname2], GetName(playerid), params); case 3: format(gMsg, 128, "** %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname3], GetName(playerid), params);
case 4: format(gMsg, 128, "** %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname4], GetName(playerid), params); case 5: format(gMsg, 128, "** %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname5], GetName(playerid), params); case 6: format(gMsg, 128, "** %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname6], GetName(playerid), params);
case 7: format(gMsg, 128, "** %s %s: %s", gInfo[pInfo[playerid][pMember]][gRankname7], GetName(playerid), params);
}
sendgType(COLOR_DCHAT, gInfo[pInfo[playerid][pMember]][gType], gMsg);
}
return 1;
}
YCMD:stats(playerid, params[], help) {
showStats(playerid, playerid);
return 1;
}
YCMD:tbox(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 1) return adminOnly(playerid, 1);
SetPlayerPos(playerid, 2127.3901,2337.2629,10.8203);
SendClientMessage(playerid, -1, "Ai fost teleportat cu succes la giftbox.");
return 1;
}
YCMD:gotods(playerid, params[], help) {
if(pInfo[playerid][pAdmin] < 1) return adminOnly(playerid, 1);
SetPlayerPos(playerid, 328.4269,-1513.5961,36.0391);
SendClientMessage(playerid, -1, "(/gotods) Ai fost teleportat cu succes la dealership.");
return 1;
}
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) {
if((vInfo[vehID[vehicleid]][vGroup] > 0 && pInfo[playerid][pMember] != vInfo[vehID[vehicleid]][vGroup]) && pInfo[playerid][pAdmin] == 0) {
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z), SetPlayerPos(playerid, x, y, z+2);
SCMEx(playerid, COLOR_GREY, "This %s can be used only be %s`s members!", vehName[GetVehicleModel(vehicleid) - 400], gInfo[vInfo[vehID[vehicleid]][vGroup]][gName]);
}
return 1;
}
public OnPlayerExitVehicle(playerid, vehicleid) {
return 1;
}
public OnPlayerStateChange(playerid, newstate, oldstate) {
new veh = GetPlayerVehicleID(playerid);
if(newstate == PLAYER_STATE_DRIVER) {
new vehicleName[30], rand = random(3);
switch(rand) {
case 0: { format(vehicleName, 30, "~g~%s", vehName[GetVehicleModel(veh) - 400]); }
case 1: { format(vehicleName, 30, "~y~%s", vehName[GetVehicleModel(veh) - 400]); }
case 2: { format(vehicleName, 30, "~r~~h~%s", vehName[GetVehicleModel(veh) - 400]); }
}
GameTextForPlayer(playerid, vehicleName, 3000, 1);
if((vInfo[vehID[veh]][vGroup] > 0 && pInfo[playerid][pMember] != vInfo[vehID[veh]][vGroup]) && pInfo[playerid][pAdmin] == 0) {
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z), SetPlayerPos(playerid, x, y, z+2);
SCMEx(playerid, COLOR_GREY, "This %s can be used only be %s`s members!", vehName[GetVehicleModel(veh) - 400], gInfo[vInfo[vehID[veh]][vGroup]][gName]);
}
}
if(newstate != PLAYER_STATE_DRIVER && GetPVarInt(playerid, "AddVehicle") > 0 && veh != GetPVarInt(playerid, "AddVehicle")) {
DestroyVehicle(GetPVarInt(playerid, "AddVehicle"));
SCMEx(playerid, COLOR_LIGHTRED, "Vehicle #%d was destroyed because you left it.", GetPVarInt(playerid, "AddVehicle")), DeletePVar(playerid, "AddVehicle");
}
return 1;
}
public OnPlayerEnterCheckpoint(playerid) {
return 1;
}
public OnPlayerLeaveCheckpoint(playerid) {
return 1;
}
public OnPlayerEnterRaceCheckpoint(playerid) {
return 1;
}
public OnPlayerLeaveRaceCheckpoint(playerid) {
return 1;
}
public OnRconCommand(cmd[]) {
return 1;
}
public OnPlayerRequestSpawn(playerid) {
return 1;
}
public OnObjectMoved(objectid) {
return 1;
}
public OnPlayerObjectMoved(playerid, objectid) {
return 1;
}
public OnPlayerPickUpPickup(playerid, pickupid) {
return 1;
}
public OnVehicleMod(playerid, vehicleid, componentid) {
return 1;
}
public OnVehiclePaintjob(playerid, vehicleid, paintjobid) {
return 1;
}
public OnVehicleRespray(playerid, vehicleid, color1, color2) {
return 1;
}
public OnPlayerSelectedMenuRow(playerid, row) {
return 1;
}
public OnPlayerExitedMenu(playerid) {
return 1;
}
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) {
return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) {
if(newkeys & KEY_SECONDARY_ATTACK)
{
new Float: X, Float: Y, Float: Z;
GetPlayerPos(playerid, X, Y, Z);
if(IsPlayerConnected(playerid))
{
for(new i = 0; i < MAX_GROUPS; i++) {
if(IsPlayerInRangeOfPoint(playerid, 2.0, gInfo[geX], gInfo[geY], gInfo[geZ]))
{
if(gInfo[gDoor] == 0 || (pInfo[playerid][pMember] == i && gInfo[gDoor] == 1)) {
SetPlayerPos(playerid, gInfo[giX], gInfo[giY], gInfo[giZ]);
SetPlayerInterior(playerid, gInfo[gInterior]);
SetPlayerVirtualWorld(playerid, i+1);
SetCameraBehindPlayer(playerid);
}
else SCMEx(playerid, -1, "You are not %s`s member.", gInfo[gName]);
}
else if(IsPlayerInRangeOfPoint(playerid, 2.0, gInfo[giX], gInfo[giY], gInfo[giZ]))
{
SetPlayerPos(playerid, gInfo[geX], gInfo[geY], gInfo[geZ]);
SetPlayerInterior(playerid, 0);
SetPlayerVirtualWorld(playerid, 0);
SetCameraBehindPlayer(playerid);
}
}
}
}
if((newkeys & KEY_WALK) && (newkeys & KEY_FIRE)) {
if(Bit_Get(flyingStatus, playerid) == true) {
StopFly(playerid), SetPlayerHealth(playerid, 99.00);
Bit_Set(flyingStatus, playerid, false);
GameTextForPlayer(playerid, "~~Flying mode off", 4500, 3);
}
}
return 1;
}
public OnRconLoginAttempt(ip[], password[], success) {
return 1;
}
public OnPlayerUpdate(playerid) {
return 1;
}
public OnPlayerStreamIn(playerid, forplayerid) {
return 1;
}
public OnPlayerStreamOut(playerid, forplayerid) {
return 1;
}
public OnVehicleStreamIn(vehicleid, forplayerid) {
return 1;
}
public OnVehicleStreamOut(vehicleid, forplayerid) {
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
new query[354];
switch(dialogid) {
case DIALOG_REGISTER: {
if(response) {
new serialCode[41];
WP_Hash(playerHashedPass[playerid], 129, inputtext);
gpci(playerid, serialCode, 41);
mysql_format(handle, query, 354, "INSERT INTO `players` (`username`, `password`, `SerialCode`, `Skin`) VALUES ('%e', '%e', '%e', '%d')", GetName(playerid), playerHashedPass[playerid], serialCode, SPAWN_SKIN);
mysql_tquery(handle, query, "", "" );
Clearchat(playerid, 20);
SCM(playerid, COLOR_LIGHT, "REGISTER: "WHITE"Your account was been created! You need to finish all registration steps, otherwise it will be deleted.");
ShowPlayerDialog(playerid, DIALOG_SEX, DIALOG_STYLE_MSGBOX, "SERVER: Select your character", ""SYN"Please select your "CREM"character"SYN"!", "Male", "Female");
}
else Kick(playerid);
}
case DIALOG_LOGIN: {
if(response) {
new hashed[129];
WP_Hash(hashed, 129, inputtext );
mysql_format(handle, query, 256, "SELECT * FROM `players` WHERE `username` = '%e' AND `password` = '%e'", GetName(playerid), hashed);
mysql_tquery(handle, query, "accountLogin", "i", playerid);
}
else Kick(playerid);
}
case DIALOG_SEX: {
if(response) {
pInfo[playerid][pSex] = 1;
SCM(playerid, COLOR_LIGHT, "GENDER: "WHITE"Thanks, now we know that you are a boy. How old are you?");
}
else {
pInfo[playerid][pSex] = 2;
SCM(playerid, COLOR_LIGHT, "GENDER: "WHITE"Thanks, now we know that you are a girl. How old are you?");
}
ShowPlayerDialog(playerid, DIALOG_AGE, DIALOG_STYLE_INPUT, "SERVER: Age", ""SYN"It`s important for us to know how "CREM"old"SYN" are you!", "Proceed", "Cancel");
}
case DIALOG_AGE: {
if(response) {
new age = strval(inputtext);
if(age > 0 && age < 50) {
new y, m, d;
getdate(y, m, d);
pInfo[playerid][pAge] = age;
SCMEx(playerid, COLOR_LIGHT, "AGE: "WHITE"Ok, you was born in %d. Now, sets the corectly email address.", y-age);
ShowPlayerDialog(playerid, DIALOG_EMAIL, DIALOG_STYLE_INPUT, "SERVER: Email", ""SYN"If you lose your account you can use your "CREM"email address "SYN"to recover your account.", "Set", "Cancel");
}
else ShowPlayerDialog(playerid, DIALOG_AGE, DIALOG_STYLE_INPUT, "SERVER: Age", ""SYN"It`s important for us to know how "CREM"old"SYN" are you!", "Male", "Female");
}
else Kick(playerid);
}
case DIALOG_EMAIL: {
if(response) {
if(IsMail(inputtext)) {
format(pInfo[playerid][pEmail], 100, inputtext);
mysql_format(handle, query, 284, "UPDATE `players` SET `Sex` = '%d', `Age` = '%d', `Email` = '%e' WHERE `username` = '%e'", pInfo[playerid][pSex], pInfo[playerid][pAge], pInfo[playerid][pEmail], GetName(playerid));
mysql_tquery(handle, query, "", "");
mysql_format(handle, query, 256, "SELECT * FROM `players` WHERE `username` = '%e' AND `password` = '%e'", GetName(playerid), playerHashedPass[playerid]);
mysql_tquery(handle, query, "accountLogin", "i", playerid);
new Cache:count, sCode[41], pIP[16];
gpci(playerid, sCode, 41), GetPlayerIp(playerid, pIP, 16);
mysql_format(handle, query, 200, "SELECT * FROM `players` WHERE `serialCode` = '%e'", sCode);
count = mysql_query(handle, query), cache_get_data(rows, fields, handle);
format(gMsg, 128, "New account - %s (%d) // %d accounts, ip: %s.", GetName(playerid), playerid, rows, pIP), sendAdmins(COLOR_DRED, gMsg);
cache_delete(count);
}
else ShowPlayerDialog(playerid, DIALOG_EMAIL, DIALOG_STYLE_INPUT, "SERVER: Email", ""DRED"Error: Invalid email format.\n\n"SYN"If you lose your account you can use your "CREM"email address "SYN"to recover your account.", "Set", "Cancel");
}
else Kick(playerid);
}
case DIALOG_BLOCK: {
if(response) {
mysql_format(handle, query, 284, "SELECT * FROM `accounts_blocked` WHERE `playerID` = '%d' AND `securityCode` = '%e' ORDER BY `id` DESC LIMIT 1", pInfo[playerid][pSQLID], inputtext);
mysql_tquery(handle, query, "securityCodeCheck", "i", playerid);
}
else Kick(playerid);
}
}
return 1;
}
public OnPlayerClickPlayer(playerid, clickedplayerid, source) {
return 1;
}
// stocks
stock resetData(playerid) {
loginTries[playerid] = 0;
SetPVarInt(playerid, "AddVehicle", 0);
Bit_Set(pLogged, playerid, false);
return 1;
}
stock showStats(playerid, tid) {
new groupName[50];
SCM(playerid, COLOR_TEAL, "-----------------------------------------------------------------");
SCMEx(playerid, -1, "(%d) %s | Level: %d | Money: %s | Bank money: %s", tid, GetName(tid), pInfo[tid][pLevel], FormatNumber(pInfo[tid][pCash]), FormatNumber(pInfo[tid][pBank]));
SCMEx(playerid, -1, "Age: %d | Gender: %s | Email address: %s ", pInfo[tid][pAge], (pInfo[tid][pSex] == 1) ? ("Male") : ("Female"), pInfo[tid][pEmail]);
format(groupName, 50, "%s, rank %d",gInfo[pInfo[tid][pMember]][gName], pInfo[tid][pRank]);
SCMEx(playerid, -1, "Group: %s", (pInfo[tid][pMember]) ? (groupName) : ("No-one"));
SCM(playerid, COLOR_TEAL, "-----------------------------------------------------------------");
return 1;
}
stock FormatNumber(iNum, const szChar[] = ",") { // source: sa-mp.com forum
new szStr[16];
format(szStr, sizeof(szStr), "%d", iNum);
for(new iLen = strlen(szStr) - 3; iLen > 0; iLen -= 3) { strins(szStr, szChar, iLen); }
return szStr;
}
stock IsMail(const string[]) { // source: sa-mp.com forum
static RegEx:mail;
if(!mail) {
mail = regex_build("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");
}
return regex_match_exid(string, mail);
}
stock randomString(lenght) {
new randomChar[][] = {
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"
};
new string[20], rand;
for(new i; i < lenght; i++)
{
rand = random(sizeof(randomChar));
strcat(string, randomChar[rand]);
}
return string;
}
stock sendAdmins(color, msg[]) {
foreach(new i : Player) {
if(pInfo[pAdmin] >= 1) { SCMEx(i, color, msg); }
}
return 1;
}
stock sendGroup(color, group, msg[]) {
for(new i, j = GetPlayerPoolSize(); i <= j; i++) {
if(pInfo[pMember] == group) {
SCMEx(i, color, msg);
}
}
return 1;
}
stock sendgType(color, type, msg[]) {
foreach(new i : Player) {
if(pInfo[pMember] && gInfo[pInfo[pMember]][gType] == type) {
SCMEx(i, color, msg);
}
}
return 1;
}
stock adminOnly(playerid, admin) {
SCMEx(playerid, COLOR_GREY, ""GREY"You need to have admin level "ORANGE"%d+"GREY" to use this command.", admin);
return 1;
}
stock SCMEx(playerid, color, fstring[], {Float, _}:...) { // source: sa-mp.com forum
#if defined DEBUG
printf("[debug] SCM(%d,%d,%s,...)",playerid,color,fstring);
#endif
new n = numargs() * 4;
if (n == 3 * 4) {
return SendClientMessage(playerid, color, fstring);
}
else {
new message[255];
new arg_start;
new arg_end;
new i = 0;
#emit CONST.pri fstring
#emit ADD.C 0x4
#emit STOR.S.pri arg_start
#emit LOAD.S.pri n
#emit ADD.C 0x8
#emit STOR.S.pri arg_end
for (i = arg_end; i >= arg_start; i -= 4)
{
#emit LCTRL 5
#emit LOAD.S.alt i
#emit ADD
#emit LOAD.I
#emit PUSH.pri
}
#emit PUSH.S fstring
#emit PUSH.C 128
#emit PUSH.ADR message
#emit PUSH.S n
#emit SYSREQ.C format
i = n / 4 + 1;
while (--i >= 0) {
#emit STACK 0x4
}
return SendClientMessage(playerid, color, message);
}
}
stock GetName(playerid) {
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
return name;
}
stock Clearchat(player, lines) {
for(new l; l <= lines; l++) { SCM(player, -1, " "); }
return 1;
}
-
-
Recently Browsing 0 members
No registered users viewing this page.
Question
Kobo 0
Stie cineva ce ID are acest obiect?
https://imgur.com/RovFho0
Link to post
Share on other sites
2 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.