PDA

Просмотр полной версии : [Мануал] Система выговоров[MySQL](Для модов State99/DRP и подобных)



telekt
03.01.2015, 15:03
Система писалась под мод Diamond Role Play/State99. При копировании в другие моды возможны ошибки.
В enum PDATA добавим:

pTWarn

Далее в базе данных создадим строку TWarn.
http://s7.hostingkartinok.com/uploads/images/2014/08/7bfbbfe9cef8a2714ea980bf02d9d3e9.png (http://hostingkartinok.com/show-image.php?id=7bfbbfe9cef8a2714ea980bf02d9d3e9)
после чего нажимаем "OK"
http://s7.hostingkartinok.com/uploads/images/2014/08/8809ffa2739489d479163f6f7137f4f7.png (http://hostingkartinok.com/show-image.php?id=8809ffa2739489d479163f6f7137f4f7)
После чего нажимаем "Сохранить"


Далее ко всем командам для выдачи предупреждений:


if(!strcmp(cmd,"/twarn",true))
{
if(!IsALeader(playerid)) return SendClientMessage(playerid, CBLUE,"Вам не доступна эта функция");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp) || !isNumeric(tmp)) return SendClientMessage(playerid,CGRAY,"/twarn [ID игрока] [Причина]");
new id = strval(tmp);
if(!IsPlayerConnected(id) || IsKicked(id)) return SendClientMessage(playerid,CGRAY,"Неверный ID");
if(pData[id][pFraction] != pData[playerid][pFraction] || pData[id][pSubfraction] != pData[playerid][pSubfraction]) return SendClientMessage(playerid,CGRAY,"Игрок не состоит в вашей организации");
if(id == playerid) return SendClientMessage(playerid,CGRAY,"Нельзя указывать свой ID");
if(!pData[id][pMysqlID]) return SendClientMessage(playerid,CGRAY,"Этот игрок не зарегистрирован");
tmp = strrest(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid,CGRAY,"/twarn [ID игрока] [Причина]");
new mes[128];
pData[id][pTWarn] = pData[id][pTWarn]+1;
new koll = pData[id][pTWarn];
if(koll < 3) format(mes,sizeof(mes),"[F]%s выдал выговор %s [%d/3]. Причина: %s",pData[playerid][pNickname],pData[id][pNickname],koll,tmp);
SendFMes(pData[playerid][pFraction],COLOR_LIGHTRED, mes);
pData[id][pTWarn] = koll;
UpdatePlayerData(id,"TWarn",pData[id][pTWarn]);
if(koll == 3)
{
pData[id][pTWarn] = 0;
UpdatePlayerData(id,"TWarn",pData[id][pTWarn]);
new query[128];
format(query,sizeof(query),"UPDATE `accounts` SET `fraction` = '0', `rank` = '0', `fractionskin` = '0', `subfraction` = '0' WHERE `id` = '%d'",pData[id][pMysqlID]);
sql_query(zConn, query, QUERY_THREADED);
SetPlayerArmourEx(id, 0);
ResetPlayerWeaponsEx(id);
pData[id][pFraction] = 0;
pData[id][pRank] = 0;
pData[id][pFractionSkin] = 0;
pData[id][pSubfraction] = 0;
ResetPlayerWeaponsEx(id);
SetPlayerColor(id,0xFFFFFF11);
new houseid = pData[id][pHouse]-1;
if(!(houseid+1) || ((houseid+1) > 0 && pData[id][pMysqlID] != gHouses[houseid][houseOwnerID])) SetPlayerSkin(id,pData[id][pSkin]);
else if(!gHouses[houseid][houseImprove][3]) SetPlayerSkin(id,pData[id][pSkin]);
else
{
for(new x; x < 3; x ++) {
if(!gHouses[houseid][houseSkin]) continue;
pData[id][pSkin] = gHouses[houseid][houseSkin];
if(GetPlayerSkin(id) == gHouses[houseid][houseSkin][3]) SetPlayerSkin(id,pData[id][pSkin]);
}
gHouses[houseid][houseSkin][3] = 0;

UpdateHouseDress(houseid);
}
SetPlayerSkin(id,pData[id][pSkin]);
format(mes,sizeof(mes),"[F]%s выдал выговор %s [3/3]. Причина: %s [Сотрудник уволен]",pData[playerid][pNickname],pData[id][pNickname],tmp);
SendFMes(pData[playerid][pFraction],COLOR_LIGHTRED, mes);
SendClientMessage(id, COLOR_LIGHTRED,"* Вы были уволены из организации!");
}

}

Команда для снятия


if(!strcmp(cmd,"/untwarn",true))
{
if(!IsALeader(playerid)) return SendClientMessage(playerid, CBLUE,"Вам не доступна эта функция");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp) || !isNumeric(tmp)) return SendClientMessage(playerid,CGRAY,"/untwarn [ID игрока]");
new id = strval(tmp);
if(!IsPlayerConnected(id)) return SendClientMessage(playerid,CGRAY,"Неверный ID");
if(!pData[id][pMysqlID]) return SendClientMessage(playerid,CGRAY,"Этот игрок не зарегистрирован");
if(pData[id][pFraction] != pData[playerid][pFraction] || pData[id][pSubfraction] != pData[playerid][pSubfraction]) return SendClientMessage(playerid,CGRAY,"Игрок не состоит в вашей организации");
if(id == playerid) return SendClientMessage(playerid,CGRAY,"Нельзя указывать свой ID");
if(!pData[id][pTWarn]) return SendClientMessage(playerid,CGRAY,"У этого игрока нет выговоров");
pData[id][pTWarn] -= 1;
UpdatePlayerData(id,"TWarn",pData[id][pWarn]);
new mes[128];
format(mes,sizeof(mes),"[F]%s снял выговор %s[%d/3]",pData[playerid][pNickname],pData[id][pNickname],pData[id][pTWarn]);
SendFMes(pData[playerid][pFraction],COLOR_LIGHTRED, mes);
}
Так же необходимо поставить обнуление предупреждений при увольнении в различных случаях. В строке обращения к базе данных добавьте:

, `TWarn` = '0'
И, если увольнение происходит во время того, как игрок находится в игре добавьте:

pData[actplayerid][pTWarn] = 0;
Лично у меня в коде кол-во предупреждений можно посмотреть в /showall
Скину свою версию /showall, необходимо добавить эту команду с заменой или придумать свою реализацию.


if(!strcmp(cmd, "/showall", true))
{
if(!pData[playerid][pFraction]) return SendClientMessage(playerid,CGRAY,"Вы не состоите во организации");
new query[2046];
if(pData[playerid][pSubfraction]) {
if(pData[playerid][pRank] < gFractionRankCount[pData[playerid][pFraction]-1]-1) return SendClientMessage(playerid,CGRAY,"Команда доступна только лидеру организации.");
format(query, sizeof(query), "SELECT `nickname`,`rank`,`level`,`TWarn` FROM `accounts` WHERE `fraction` = %d AND `subfraction` = %d ORDER BY `rank`", pData[playerid][pFraction], pData[playerid][pSubfraction]);
}
else {
if(pData[playerid][pRank] < gFractionRankCount[pData[playerid][pFraction]-1]) return SendClientMessage(playerid,CGRAY,"Команда доступна только лидеру организации.");
format(query, sizeof(query), "SELECT `nickname`,`rank`,`level`,`TWarn` FROM `accounts` WHERE `fraction` = %d AND `subfraction` = 0 ORDER BY `rank`", pData[playerid][pFraction], pData[playerid][pSubfraction]);
}
new Result:r = sql_query(zConn, query, QUERY_CACHED);
if(sql_num_rows(r)) {
format(query, sizeof(query), "Уровень\tИмя игрока\tРанг[Кол-во выговоров]\n\n");
new nn[MAX_PLAYER_NAME], rank, lvl, TWarn;
for(new i; i<sql_num_rows(r); i++)
{
sql_get_field_ex(r, i, 0, nn);
rank = sql_get_field_int_ex(r, i, 1);
lvl = sql_get_field_int_ex(r, i, 2);
TWarn = sql_get_field_int_ex(r, i, 3);
format(query, sizeof(query), "%s\t%d\t%s\t\t%d[%d/3]\n",query, lvl,nn, rank, TWarn);
}
ShowPlayerDialog(playerid, 0000, 0, "Список сотрудников:",query,"Ок", "");
}
else SendClientMessage(playerid, CGRAY, "Произошла ошибка базы данных");
sql_free_result(r);
return 1;
}

На этом все. Спасибо за внимание