Administrator system
Dobrovece svima danas cu vam pokazati kako napraviti jedan jednostavan administratorski system za vas server, pa da pocnemo.
Potrebne stvari za da radi ovaj tutorijal su:
-Sistem zacuvljavanju:Y_INI
-Procesor komande:ZCMD
-Sscanf 2
Korak 1.Kreiranje EnumaPrvo sto radimo je kreiranje Enuma i varijablu za Admina.
To izgleda ovako:
enum pInfo
{
pAdmin
};
new PlayerInfo[MAX_PLAYERS][pInfo];
Kreirali smo enum i dodali smo varijablu pAdmin, sad mozemo na drugi korak.
Korak 2.Kreiranje na zacuvljavanje na admina pri DisconnectSad kreiramo public od gde cemo da ucitujemo data.
forward LoadUser_data(playerid,name[],value[]);
public LoadUser_data(playerid,name[],value[])
{
INI_Int("Admin",PlayerInfo[playerid][pAdmin]);
return 1;
}
Onda dodajemo ovaj stock:
stock UserPath(playerid)
{
new file[200],playername[MAX_PLAYER_NAME];
GetPlayerName(playerid,playername,sizeof(playername));
format(file,sizeof(file),PATH,playername);
return file;
}
I onda u delu za logiranje neznam kod vas kako je, kod mene je u dijalog dodajemo ovo za ucitavanje podataka:
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
Kad zavrsimo sa ucitavanje sad sledi zacuvljavanje podatke.
stock SavePlayer(playerid)
{
new INI:File =INI_Open(UserPath(playerid));
INI_WriteInt(File, "Admin",PlayerInfo[playerid][pAdmin]);
INI_Close(File);
return 1;
}
Kad dodate ovaj stock, pod OnPlayerDisconnect dodajte ovo:
SavePlayer(playerid);
Sa ovim smo zavrsili ucitavanje i zacuvljavanje admina, sad idemo na sledeci korak.
Korak 3.Kreiranje komanda za davanje admina.CMD:postaviadmina(playerid, params[])
{
if(PlayerInfo[playerid][pAdmin] >= 1338 || IsPlayerAdmin(playerid)) //Ovde proveravamo dali je igrac sta zeli da koristi ovu komandu je admin
{
new player, alevel, string[256]; //ovde definisemo string,level i igrac sta zelimo da mu damo admina
if(sscanf(params, "ud", player, alevel)) return SendClientMessage(playerid, -1, "/postaviadmina [ID/] [Level (1-1338)]"); //ovde proveravamo dali sve parametre su ispunjenje
if(!IsPlayerConnected(player)) return SCM(playerid, -1,"Igrac nije konektovan!"); //Ovde proveravamo dali taj ID je ili Igrac je konektiran na serveru
if(alevel < 0 || alevel > 6) return SendClientMessage(playerid, -1, "Admin Level ne moze biti manji od 0 i veci od 1338!"); //Ovde proveravamo koji pod koji ili nad koji level nemoze da mu se postavi
PlayerInfo[player][pAdmin] = alevel; //Ovde se upisuje level Admina
format(string, sizeof(string), "Admin %s vi je postavio %d Admin Level.", GetName(playerid), level); //Tu formatiramo porku
SendClientMessage(player, -1, string); //A ovde je ispisujemo
format(string, sizeof(string), "Postavili ste %s Admin Level %d.", GetName(player), level); //Isti postupak kao ove iznad
SendClientMessage(playerid, -1, string); //isti postupak kao ovo iznad
}
else
{
SendClientMessage(playerid, -1, "Nemozete koristiti ovu komandu!"); //Ako igrac nije admin ovde mu ispisuje da nemoze koristiti komandu
}
return 1;
}
Zavrsili smo so komandu za postavjanje admina sad cemo uraditi komandu za igrace da vidu koj je admin na serveru.
Korak 4.Kreiranje komanda /adminsCMD:admins(playerid, params[])
{
SendClientMessage(playerid, -1, " ");
SendClientMessage(playerid, -1, "-| Online Administratori |-");
for(new i = 0; i < MAX_PLAYERS; i++) //Ovde proveravamo sve igrace da vidimo koji je sve admin
{
if(IsPlayerConnected(i))
{
if(PlayerInfo[i][pAdmin] >= 1 && PlayerInfo[i][pAdmin] < 1339)
{
new admtext[64], sendername[MAX_PLAYER_NAME], string[128];
if(PlayerInfo[i][pAdmin] == 1338) { admtext = "Owner"; }
else if(PlayerInfo[i][pAdmin] == 1337) { admtext = "Head Admin"; }
else if(PlayerInfo[i][pAdmin] == 4) { admtext = "Leader Admin"; }
else if(PlayerInfo[i][pAdmin] == 3) { admtext = "Admin Level 3"; }
else if(PlayerInfo[i][pAdmin] == 2) { admtext = "Admin Level 2"; }
else if(PlayerInfo[i][pAdmin] == 1) { admtext = "Admin Level 1"; }
else { admtext = "Admin Level 1"; }
GetPlayerName(i, sendername, sizeof(sendername));
sendername[strfind(sendername,"_")] = ' ';
if(AdminDuty[i] == 0) //Ovde proveravamo dali je admin na duznosti
{
format(string, 128, "%s: %s (AdminDuty: Ne)", admtext, sendername);
SendClientMessage(playerid, -1, string);
}
else
{
format(string, 128, "%s: %s (AdminDuty: Da)", admtext, sendername);
SendClientMessage(playerid, -1, string);
}
}
}
}
return 1;
}
Naredno sta cu uraditi je Admin Chat i komanda za duznost.
Korak 5.Kreiranje komande /adminchat i /admindutySad cemo kreirati komandu za admine da mogu da komuniciraju a da to ne vide ostali igraci.
CMD:a(playerid, params[])
{
new sendername[MAX_PLAYER_NAME], string[160]; //tu definiramo admin sta posalje text i string
if(!(PlayerInfo[playerid][pAdmin] >= 1)) return SendClientMessage(playerid,-1,"[INFO]Nemozete koristi ovu komandu."); //Ovde proveravamo dali igrac sta koristi komandu je admin
if(isnull(params)) return SCM(playerid,-1,"/a [text]"); //Ovde proveravamo dali si ispunjenje uslove
GetPlayerName(playerid,sendername,sizeof(sendername)); //ovde dobijamo ime na onaj sta pise text
sendername[strfind(sendername,"_")] = ' ';
format(string,160,"*%d Admin %s: %s",PlayerInfo[playerid][pAdmin],sendername,params); //ovde formatiramo text
SendAdminMessage(-1, string); //I ovde ga posajemo
return 1;
}
Da bi ova komanda radila potrebno je da kreiramo jedan publik.
forward SendAdminMessage(color, string[]);
public SendAdminMessage(color, string[])
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(PlayerInfo[i][pAdmin] >= 1)
{
SendClientMessage(i, color, string);
}
}
}
}
Sada na red je admin duznost, da bi komanda radila normalno potrebno je dodadi ovo pri vrh
new AdminDuty[MAX_PLAYERS];
i ovo pod public OnPlayerConnect
AdminDuty[playerid] = 0;
Sad idemo na komandu:
CMD:adminduty(playerid, params[])
{
if(PlayerInfo[playerid][pAdmin] == 0) return SCM(playerid, -1, "Nemozes koristiti ovu komandu");
new string[256];
if(AdminDuty[playerid] == 0)
{
format(string,sizeof(string),"Administrator %s je na duznosti",GetName(playerid));
SendClientMessageToAll(-1,string);
AdminDuty[playerid] = 1;
SetPlayerArmour(playerid, 99.0);
SetPlayerHealth(playerid, 99.0);
}
else if(AdminDuty[playerid] == 1)
{
SetPlayerArmour(playerid, 0);
SetPlayerHealth(playerid, 99.0);
format(string,sizeof(string),"Administrator %s vise nije na duznost",GetName(playerid));
SendClientMessageToAll(-1,string);
AdminDuty[playerid] = 0;
}
return 1;
}
Kraj
To bi bilo to u ovaj tutorijal potrudio sam se da objasnim koliko mogu, negde sam kratio objasnjene zbog limita. Ukoliko imate neku ideju ili vidite neku gresku molim vas obavjestite me da ispravim to.
Mogao si te komanda jos dosta krace napisati..
I ovo si samo copy/paste iz nekog moda, jer da si sam radio sigurno ne bi koristio:
for(new i = 0; i < MAX_PLAYERS; i++)
IsPlayerConnected
Takodje i izvedena funkcija GetName nije nigdje napisana, ma copy/paste. :D
IsPlayerConnected je nepotrebna funkcija jer nema logike da to proveravas.
jednostavno if(konstruktor == INVALID_PLAYER_ID)
jer nemozes dobiti id ako nisi povezan na server.
Ok Ok tocno je da sam uzeo komandu /postaviadmina iz up moda jer nisam ima vremena da radim novu, a ovu za foreach mislio sam da radim uradim jos neke komande a onda sam skratio i sam zaboravio da popravim to, sad je popravjeno. Mozda bi i malo pokazali pocit jer sam nasao malo vremena da napisem neki tutorijal a vi celi dan tu ste i nista neradite osven sta spamate po glavnom razgovoru ?