Доброго времени суток! В серии уроков "Создание мода с нуля" я расскажу вам о том, как создать мод с нуля.
Обратите внимание!
Если вы не читали мой первый урок - обязательно прочтите!
В прошлом уроке мы создали мод и работали над скинами и спавном пользователей. В этом уроке я более подробно расскажу о пользователях.
mxINI.inc
В нашем моде находим:
#include <a_samp>
После этого пишем:
#include <mxINI>
forward OnPlayerRegister(playerid, password[]);
forward OnPlayerLogin(playerid,password[]);
enum pInfo
{
pPass[64],
pAdmin,
};
new Player[MAX_PLAYERS][pInfo];
new PAccount[MAX_PLAYERS];
Далее в public OnPlayerConnect:
new playername[MAX_PLAYER_NAME];// Массив для имени игрока
new string[128];// Путь до папки с именем игрока
GetPlayerName(playerid,playername,sizeof(playername));// Узнаём имя игрока
format(string,sizeof(string),"users/%s.ini", playername);// Путь к файлу с аккаунтом
if(fexist(string))// Проверка на файл, если он есть то выполняется следующее действие.
{
PAccount[playerid] = 1;// Аккаунт есть
}
else// Если файла с именем нет, то выполняется это действие.
{
PAccount[playerid] = 0;// Аккаунта нет
}
if(PAccount[playerid] == 1) // аккаунт есть
{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог
}
else // если нет аккаунта в папке
{
ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// Показываем диалог регистрации.
}
В public OnPlayerDisconnect:
SavePlayer(playerid);
В public OnDialogResponse:
if(dialogid == 2)// Ид диалога Для Логина
{
if(response)// Если игрок нажал первую кнопку входа
{
if(!strlen(inputtext))// Если окно ввода пустое, выводим диалог снова
{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог
return 1;
}
new pass[64];// Массив с паролем
strmid(pass,inputtext,0,strlen(inputtext),64);// считывание текста с диалога
OnPlayerLogin(playerid,pass);// Паблик входа
}
else// Если игрок нажал Escape,то покажем ему диалог
{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог
}
}
if(dialogid == 3)// Ид диалога для регистрации
{
if(response)// Если игрок нажал первую кнопку
{
if(!strlen(inputtext))// Если игрок не написал ничего,то выводим диалог снова
{
ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// Показываем диалог регистрации
return 1;
}
new pass[64];// Массив с паролем
strmid(pass,inputtext,0,strlen(inputtext),64);// Считываем текст с диалога
OnPlayerRegister(playerid,pass);// Запускаем паблик регистрации
}
else// Если игрок нажал Escape
{
ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// Показываем диалог регистрации
}
}
В конец мода:
public OnPlayerRegister(playerid, password[])// Паблик регистрации
{
if(IsPlayerConnected(playerid))
{
new string[64];// Массив с путём для файла
new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока
GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
format(string,sizeof(string), "users/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения
new iniFile = ini_createFile(string);// Создаём файл с именем игрока в папке players
if(iniFile < 0)// Если Файла нет
{
iniFile = ini_openFile(string);// Открываем
}
if(iniFile >= 0)// Если файл есть
{
strmid(Player[playerid][pPass],password,0,strlen(password),255);// Присваиваем массиву pPass, значение password[]
ini_setString(iniFile,"Pass",Player[playerid][pPass]);// Записываем пароль игрока в файл
ini_setInteger(iniFile, "Admin", 0); // Это не Администратор
ini_closeFile(iniFile);// Закрываем файл
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог
}
}
return 1;
}
stock SavePlayer(playerid)
{
new string[64];// Массив с путём для файла
new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока
GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
format(string, sizeof(string), "users/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения
new iniFile = ini_openFile(string);// Открываем файл по тому пути который указали.
ini_setString(iniFile,"Pass",Player[playerid][pPass]);// Записываем пароль игрока в файл
ini_setInteger(iniFile, "Admin",Player[playerid][pAdmin]); // Сохраняем админ/не админ
ini_closeFile(iniFile);// Закрываем файл
}
public OnPlayerLogin(playerid,password[])
{
if(IsPlayerConnected(playerid))// Проверка на подключение игрока
{
new string[64];// Массив с путём для файла
new pass[64];// Массив с паролем
new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока
GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
format(string,sizeof(string), "users/%s.ini", playername);// Добавляем имя игрока, в путь для загрузки
new iniFile = ini_openFile(string);// Открываем файл
ini_getString(iniFile,"Pass",pass,64);// Загружаем пароль
if(strcmp(pass,password,true) == 0)// Если введённый пароль, соответствует паролю при регистрации, то загружаем акк
{
ini_getString(iniFile,"Pass",Player[playerid][pPass],64);// Загружаем пароль
ini_getInteger(iniFile, "Admin", Player[playerid][pAdmin]); // Проверяем на Администратора
ini_closeFile(iniFile);// Закрываем файл
}
else// Если пароль не верен..
{
ini_closeFile(iniFile);// Закрываем файл
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог
return 1;
}
SendClientMessage(playerid,green,"Добро пожаловать на наш сервер");// Выводим игрок сообщение
}
return 1;
}
Это сохранит админку и пароль. Если хорошо подумать, надо сделать сохранение денег, score, киллов, оружия и т.п.
В enum pInfo:
pKills,
pCash,
pScore,
В public OnPlayerRegister (после строки ini_setInteger(iniFile, "Admin", 0); // Это не админитсратор):
ini_setInteger(iniFile, "Score", 0);
ini_setInteger(iniFile, "Kills", 0);
ini_setInteger(iniFile, "Cash", 500);
В stock SavePlayer (после строки ini_setInteger(iniFile, "Admin", Player[playerid][pAdmin]); // Сохраняем админку):
ini_getInteger(iniFile,"Score",Player[playerid][pScore]);
ini_getInteger(iniFile,"Kills",Player[playerid][pKills]);
ini_getInteger(iniFile, "Cash",Player[playerid][pCash]);
В public OnPlayerLogin (после строки ini_setInteger(iniFile, "Admin", Player[playerid][pAdmin]); // Провераяем на Администратора):
ini_getInteger(iniFile,"Score",Player[playerid][pScore]);
ini_getInteger(iniFile,"Kills",Player[playerid][pKills]);
ini_getInteger(iniFile, "Cash",Player[playerid][pCash]);
GivePlayerMoney(playerid,Player[playerid][pCash]);
SetPlayerScore(playerid, Player[playerid][pScore]);
Ну вот, теперь у нас есть пользователи. Теперь приступим к Админ-Центру.
P.S. Для создания этой части урока пользовался мануалом .
Muted,
Jailed,
SpecID[MAX_PLAYERS],
SpecType[MAX_PLAYERS],
Freeze,
Zhertva,
Spawned,
В public OnPlayerCommandText:
if(strcmp(cmdtext,"/spec-off",true) == 0)
{
TogglePlayerSpectating(playerid, 0);
Player[playerid][SpecID] = INVALID_PLAYER_ID;
Player[playerid][SpecType] = SPEC_TYPE_NONE;
SendClientMessage(playerid,0x33AAFFAA,"Слежка отключена");
return 1;
}
В public OnPlayerClickPlayer:
if(Player[playerid][pAdmin] == 1)
{
ShowPlayerDialog(playerid,1,DIALOG_STYLE_LIST,"Администраторский раздел","Пнуть\nУбить\nВзорвать\nЗаткнуть\nKикнуть\nЗабанить\nТП к игроку\nТП игрока к себе\nПосадить\nСледить\nЗамарозить\n","Применить","Отмена");
Player[playerid][Zhertva] = clickedplayerid;
}
В public OnDialogResponse:
if(dialogid == 4)
{
if(response)
{
new zherid = Player[playerid][Zhertva];
new Float:X,Float:Y,Float:Z,pname[40],gname[40],string[256];
GetPlayerName(playerid,pname,sizeof(pname));
GetPlayerName(zherid,gname,sizeof(gname));
if(listitem == 0)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
GetPlayerPos(zherid,X,Y,Z);
SetPlayerPos(zherid,X,Y,Z+10);
format(string,sizeof(string),"Aдминистратор %s пнул игрока %s",pname,playerid,gname,zherid);
SendClientMessageToAll(0x099DE0F6,string);
}
if(listitem == 1)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
SetPlayerHealth(zherid,0.0);
format(string,sizeof(string),"Aдминистратор %s убил игрока %s",pname,playerid,gname,zherid);
SendClientMessageToAll(0x099DE0F6,string);
}
if(listitem == 2)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
GetPlayerPos(zherid,X,Y,Z);
CreateExplosion(X,Y,Z,10,0);
CreateExplosion(X,Y,Z,10,0);
CreateExplosion(X,Y,Z,10,0);
format(string,sizeof(string),"Aдминистратор %s убил игрока %s",pname,playerid,gname,zherid);
SendClientMessageToAll(0x099DE0F6,string);
}
if(listitem == 3)
{
if(Player[zherid][Muted] == 0)
{
Player[zherid][Muted] = 1;
format(string,sizeof(string),"Aдминистратор %s заткнул игрока %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
}
else
{
Player[zherid][Muted] = 0;
format(string,sizeof(string),"Aдминистратор %s разрешил писать в чат игроку %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
}
}
if(listitem == 4)
{
format(string,sizeof(string),"Aдминистратор %s кинул игрока %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
Kick(zherid);
}
if(listitem == 5)
{
format(string,sizeof(string),"Aдминистратор %s забанил игрока %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
Ban(zherid);
}
if(listitem == 6)
{
if(playerid != zherid)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
GetPlayerPos(zherid,X,Y,Z);
if(IsPlayerInAnyVehicle(playerid))
{
SetVehiclePos(GetPlayerVehicleID(playerid),X+1,Y,Z);
}
else
{
SetPlayerPos(playerid,X+1,Y,Z);
}
SetPlayerInterior(playerid,GetPlayerInterior(zherid));
format(string,sizeof(string),"Вы телепортировались к игроку %s",gname);
SendClientMessage(playerid,0x099DE0F6,string);
format(string,sizeof(string),"Aдминистратор %s куда-то телепортировался... (к вам)",pname);
SendClientMessage(zherid,0x099DE0F6,string);
}
else
{
SendClientMessage(playerid,0xB30400EF,"Вы телепортировали к cебе игрока Админ");
SendClientMessage(playerid,0xB30400EF,"Aдминистратор %s телепортировал вас к себе");
}
}
if(listitem == 7)
{
if(playerid != zherid)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
GetPlayerPos(playerid,X,Y,Z);
if(IsPlayerInAnyVehicle(zherid))
{
SetVehiclePos(GetPlayerVehicleID(zherid),X+1,Y,Z);
}
else
{
SetPlayerPos(zherid,X+1,Y,Z);
}
SetPlayerInterior(zherid,GetPlayerInterior(playerid));
format(string,sizeof(string),"Вы телепортировали к cебе игрока %s",gname);
SendClientMessage(playerid,0x099DE0F6,string);
format(string,sizeof(string),"Aдминистратор %s телепортировал вас к себе",pname);
SendClientMessage(zherid,0x099DE0F6,string);
}
else
{
SendClientMessage(playerid,0xB30400EF,"Вы не можете телепортировать себя");
}
}
if(listitem == 8)
{
if(playerid != zherid)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
if(Player[zherid][Jailed] == 0)
{
Player[zherid][Jailed] = 1;
SetPlayerInterior(zherid,3);
SetPlayerPos(zherid,2574.1096,-2413.3933,21.5356);
format(string,sizeof(string),"Aдминистратор %s посадил %s в тюрьму...",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
}
else
{
Player[zherid][Jailed] = 0;
SetPlayerInterior(zherid,0);
SpawnPlayer(zherid);
format(string,sizeof(string),"Aдминистратор %s освободил игрока %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
}
}
else
{
SendClientMessage(playerid,0xB30400EF,"Вы не можете сажать себя в тюрьму");
}
}
if(listitem == 9)
{
if(playerid != zherid)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
TogglePlayerSpectating(playerid,1);
PlayerSpectatePlayer(playerid,zherid);
SetPlayerInterior(playerid,GetPlayerInterior(zherid));
Player[playerid][SpecID] = zherid;
Player[playerid][SpecType] = 1;
format(string,sizeof(string),"Bы следите за %s.",gname);
SendClientMessage(playerid,0x099DE0F6,string);
SendClientMessage(playerid,0x099DE0F6,"Чтобы отключить слежку, введите: \"/spec-off\"");
}
}
if(listitem == 10)
{
if(playerid != zherid)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
if(Player[zherid][Freeze] == 0)
{
TogglePlayerControllable(zherid,0);
format(string,sizeof(string),"Aдминистратор %s заморозил игрока %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
Player[zherid][Freeze] = 1;
}
else
{
TogglePlayerControllable(zherid,1);
format(string,sizeof(string),"Aдминистратор %s разморозил игрока %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
Player[zherid][Freeze] = 0;
}
}
}
}
else
{
}
}
На сегодня всё.
Итог работы:
Обратите внимание!
Если вы не читали мой первый урок - обязательно прочтите!
В прошлом уроке мы создали мод и работали над скинами и спавном пользователей. В этом уроке я более подробно расскажу о пользователях.
Вход и регистрация
Пользователи будут на mxINI. Качаем инклуд mxINI:mxINI.inc
В нашем моде находим:
#include <a_samp>
После этого пишем:
#include <mxINI>
forward OnPlayerRegister(playerid, password[]);
forward OnPlayerLogin(playerid,password[]);
enum pInfo
{
pPass[64],
pAdmin,
};
new Player[MAX_PLAYERS][pInfo];
new PAccount[MAX_PLAYERS];
Далее в public OnPlayerConnect:
new playername[MAX_PLAYER_NAME];// Массив для имени игрока
new string[128];// Путь до папки с именем игрока
GetPlayerName(playerid,playername,sizeof(playername));// Узнаём имя игрока
format(string,sizeof(string),"users/%s.ini", playername);// Путь к файлу с аккаунтом
if(fexist(string))// Проверка на файл, если он есть то выполняется следующее действие.
{
PAccount[playerid] = 1;// Аккаунт есть
}
else// Если файла с именем нет, то выполняется это действие.
{
PAccount[playerid] = 0;// Аккаунта нет
}
if(PAccount[playerid] == 1) // аккаунт есть
{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог
}
else // если нет аккаунта в папке
{
ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// Показываем диалог регистрации.
}
В public OnPlayerDisconnect:
SavePlayer(playerid);
В public OnDialogResponse:
if(dialogid == 2)// Ид диалога Для Логина
{
if(response)// Если игрок нажал первую кнопку входа
{
if(!strlen(inputtext))// Если окно ввода пустое, выводим диалог снова
{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог
return 1;
}
new pass[64];// Массив с паролем
strmid(pass,inputtext,0,strlen(inputtext),64);// считывание текста с диалога
OnPlayerLogin(playerid,pass);// Паблик входа
}
else// Если игрок нажал Escape,то покажем ему диалог
{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог
}
}
if(dialogid == 3)// Ид диалога для регистрации
{
if(response)// Если игрок нажал первую кнопку
{
if(!strlen(inputtext))// Если игрок не написал ничего,то выводим диалог снова
{
ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// Показываем диалог регистрации
return 1;
}
new pass[64];// Массив с паролем
strmid(pass,inputtext,0,strlen(inputtext),64);// Считываем текст с диалога
OnPlayerRegister(playerid,pass);// Запускаем паблик регистрации
}
else// Если игрок нажал Escape
{
ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// Показываем диалог регистрации
}
}
В конец мода:
public OnPlayerRegister(playerid, password[])// Паблик регистрации
{
if(IsPlayerConnected(playerid))
{
new string[64];// Массив с путём для файла
new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока
GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
format(string,sizeof(string), "users/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения
new iniFile = ini_createFile(string);// Создаём файл с именем игрока в папке players
if(iniFile < 0)// Если Файла нет
{
iniFile = ini_openFile(string);// Открываем
}
if(iniFile >= 0)// Если файл есть
{
strmid(Player[playerid][pPass],password,0,strlen(password),255);// Присваиваем массиву pPass, значение password[]
ini_setString(iniFile,"Pass",Player[playerid][pPass]);// Записываем пароль игрока в файл
ini_setInteger(iniFile, "Admin", 0); // Это не Администратор
ini_closeFile(iniFile);// Закрываем файл
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог
}
}
return 1;
}
stock SavePlayer(playerid)
{
new string[64];// Массив с путём для файла
new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока
GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
format(string, sizeof(string), "users/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения
new iniFile = ini_openFile(string);// Открываем файл по тому пути который указали.
ini_setString(iniFile,"Pass",Player[playerid][pPass]);// Записываем пароль игрока в файл
ini_setInteger(iniFile, "Admin",Player[playerid][pAdmin]); // Сохраняем админ/не админ
ini_closeFile(iniFile);// Закрываем файл
}
public OnPlayerLogin(playerid,password[])
{
if(IsPlayerConnected(playerid))// Проверка на подключение игрока
{
new string[64];// Массив с путём для файла
new pass[64];// Массив с паролем
new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока
GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
format(string,sizeof(string), "users/%s.ini", playername);// Добавляем имя игрока, в путь для загрузки
new iniFile = ini_openFile(string);// Открываем файл
ini_getString(iniFile,"Pass",pass,64);// Загружаем пароль
if(strcmp(pass,password,true) == 0)// Если введённый пароль, соответствует паролю при регистрации, то загружаем акк
{
ini_getString(iniFile,"Pass",Player[playerid][pPass],64);// Загружаем пароль
ini_getInteger(iniFile, "Admin", Player[playerid][pAdmin]); // Проверяем на Администратора
ini_closeFile(iniFile);// Закрываем файл
}
else// Если пароль не верен..
{
ini_closeFile(iniFile);// Закрываем файл
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Вход","Аккаунт зарегистрирован, введите пароль","Вход","");// показываем диалог
return 1;
}
SendClientMessage(playerid,green,"Добро пожаловать на наш сервер");// Выводим игрок сообщение
}
return 1;
}
Это сохранит админку и пароль. Если хорошо подумать, надо сделать сохранение денег, score, киллов, оружия и т.п.
В enum pInfo:
pKills,
pCash,
pScore,
В public OnPlayerRegister (после строки ini_setInteger(iniFile, "Admin", 0); // Это не админитсратор):
ini_setInteger(iniFile, "Score", 0);
ini_setInteger(iniFile, "Kills", 0);
ini_setInteger(iniFile, "Cash", 500);
В stock SavePlayer (после строки ini_setInteger(iniFile, "Admin", Player[playerid][pAdmin]); // Сохраняем админку):
ini_getInteger(iniFile,"Score",Player[playerid][pScore]);
ini_getInteger(iniFile,"Kills",Player[playerid][pKills]);
ini_getInteger(iniFile, "Cash",Player[playerid][pCash]);
В public OnPlayerLogin (после строки ini_setInteger(iniFile, "Admin", Player[playerid][pAdmin]); // Провераяем на Администратора):
ini_getInteger(iniFile,"Score",Player[playerid][pScore]);
ini_getInteger(iniFile,"Kills",Player[playerid][pKills]);
ini_getInteger(iniFile, "Cash",Player[playerid][pCash]);
GivePlayerMoney(playerid,Player[playerid][pCash]);
SetPlayerScore(playerid, Player[playerid][pScore]);
Ну вот, теперь у нас есть пользователи. Теперь приступим к Админ-Центру.
P.S. Для создания этой части урока пользовался мануалом .
Администраторский раздел
Теперь нам нужен администраторский раздел. Сделаем его через TAB. В enum pInfo:Muted,
Jailed,
SpecID[MAX_PLAYERS],
SpecType[MAX_PLAYERS],
Freeze,
Zhertva,
Spawned,
В public OnPlayerCommandText:
if(strcmp(cmdtext,"/spec-off",true) == 0)
{
TogglePlayerSpectating(playerid, 0);
Player[playerid][SpecID] = INVALID_PLAYER_ID;
Player[playerid][SpecType] = SPEC_TYPE_NONE;
SendClientMessage(playerid,0x33AAFFAA,"Слежка отключена");
return 1;
}
В public OnPlayerClickPlayer:
if(Player[playerid][pAdmin] == 1)
{
ShowPlayerDialog(playerid,1,DIALOG_STYLE_LIST,"Администраторский раздел","Пнуть\nУбить\nВзорвать\nЗаткнуть\nKикнуть\nЗабанить\nТП к игроку\nТП игрока к себе\nПосадить\nСледить\nЗамарозить\n","Применить","Отмена");
Player[playerid][Zhertva] = clickedplayerid;
}
В public OnDialogResponse:
if(dialogid == 4)
{
if(response)
{
new zherid = Player[playerid][Zhertva];
new Float:X,Float:Y,Float:Z,pname[40],gname[40],string[256];
GetPlayerName(playerid,pname,sizeof(pname));
GetPlayerName(zherid,gname,sizeof(gname));
if(listitem == 0)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
GetPlayerPos(zherid,X,Y,Z);
SetPlayerPos(zherid,X,Y,Z+10);
format(string,sizeof(string),"Aдминистратор %s пнул игрока %s",pname,playerid,gname,zherid);
SendClientMessageToAll(0x099DE0F6,string);
}
if(listitem == 1)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
SetPlayerHealth(zherid,0.0);
format(string,sizeof(string),"Aдминистратор %s убил игрока %s",pname,playerid,gname,zherid);
SendClientMessageToAll(0x099DE0F6,string);
}
if(listitem == 2)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
GetPlayerPos(zherid,X,Y,Z);
CreateExplosion(X,Y,Z,10,0);
CreateExplosion(X,Y,Z,10,0);
CreateExplosion(X,Y,Z,10,0);
format(string,sizeof(string),"Aдминистратор %s убил игрока %s",pname,playerid,gname,zherid);
SendClientMessageToAll(0x099DE0F6,string);
}
if(listitem == 3)
{
if(Player[zherid][Muted] == 0)
{
Player[zherid][Muted] = 1;
format(string,sizeof(string),"Aдминистратор %s заткнул игрока %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
}
else
{
Player[zherid][Muted] = 0;
format(string,sizeof(string),"Aдминистратор %s разрешил писать в чат игроку %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
}
}
if(listitem == 4)
{
format(string,sizeof(string),"Aдминистратор %s кинул игрока %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
Kick(zherid);
}
if(listitem == 5)
{
format(string,sizeof(string),"Aдминистратор %s забанил игрока %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
Ban(zherid);
}
if(listitem == 6)
{
if(playerid != zherid)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
GetPlayerPos(zherid,X,Y,Z);
if(IsPlayerInAnyVehicle(playerid))
{
SetVehiclePos(GetPlayerVehicleID(playerid),X+1,Y,Z);
}
else
{
SetPlayerPos(playerid,X+1,Y,Z);
}
SetPlayerInterior(playerid,GetPlayerInterior(zherid));
format(string,sizeof(string),"Вы телепортировались к игроку %s",gname);
SendClientMessage(playerid,0x099DE0F6,string);
format(string,sizeof(string),"Aдминистратор %s куда-то телепортировался... (к вам)",pname);
SendClientMessage(zherid,0x099DE0F6,string);
}
else
{
SendClientMessage(playerid,0xB30400EF,"Вы телепортировали к cебе игрока Админ");
SendClientMessage(playerid,0xB30400EF,"Aдминистратор %s телепортировал вас к себе");
}
}
if(listitem == 7)
{
if(playerid != zherid)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
GetPlayerPos(playerid,X,Y,Z);
if(IsPlayerInAnyVehicle(zherid))
{
SetVehiclePos(GetPlayerVehicleID(zherid),X+1,Y,Z);
}
else
{
SetPlayerPos(zherid,X+1,Y,Z);
}
SetPlayerInterior(zherid,GetPlayerInterior(playerid));
format(string,sizeof(string),"Вы телепортировали к cебе игрока %s",gname);
SendClientMessage(playerid,0x099DE0F6,string);
format(string,sizeof(string),"Aдминистратор %s телепортировал вас к себе",pname);
SendClientMessage(zherid,0x099DE0F6,string);
}
else
{
SendClientMessage(playerid,0xB30400EF,"Вы не можете телепортировать себя");
}
}
if(listitem == 8)
{
if(playerid != zherid)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
if(Player[zherid][Jailed] == 0)
{
Player[zherid][Jailed] = 1;
SetPlayerInterior(zherid,3);
SetPlayerPos(zherid,2574.1096,-2413.3933,21.5356);
format(string,sizeof(string),"Aдминистратор %s посадил %s в тюрьму...",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
}
else
{
Player[zherid][Jailed] = 0;
SetPlayerInterior(zherid,0);
SpawnPlayer(zherid);
format(string,sizeof(string),"Aдминистратор %s освободил игрока %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
}
}
else
{
SendClientMessage(playerid,0xB30400EF,"Вы не можете сажать себя в тюрьму");
}
}
if(listitem == 9)
{
if(playerid != zherid)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
TogglePlayerSpectating(playerid,1);
PlayerSpectatePlayer(playerid,zherid);
SetPlayerInterior(playerid,GetPlayerInterior(zherid));
Player[playerid][SpecID] = zherid;
Player[playerid][SpecType] = 1;
format(string,sizeof(string),"Bы следите за %s.",gname);
SendClientMessage(playerid,0x099DE0F6,string);
SendClientMessage(playerid,0x099DE0F6,"Чтобы отключить слежку, введите: \"/spec-off\"");
}
}
if(listitem == 10)
{
if(playerid != zherid)
{
if(!IsPlayerSpawned(zherid))
{
SendClientMessage(playerid,0xB30400EF,"Игрок еще не заспавнен");
return 1;
}
if(Player[zherid][Freeze] == 0)
{
TogglePlayerControllable(zherid,0);
format(string,sizeof(string),"Aдминистратор %s заморозил игрока %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
Player[zherid][Freeze] = 1;
}
else
{
TogglePlayerControllable(zherid,1);
format(string,sizeof(string),"Aдминистратор %s разморозил игрока %s",pname,gname);
SendClientMessageToAll(0x099DE0F6,string);
Player[zherid][Freeze] = 0;
}
}
}
}
else
{
}
}
На сегодня всё.
Итог работы:
- Создана регистрация
- Создан вход
- Создано сохранение игроков
- Создан Администраторский раздел
- Название мода
- Спавн игроков
- Скины при входе
- Регистрация
- Вход
- Сохранение игроков
- Меню сервера
- Пользовательские команды