Написанная не мною, вырезка из мода Just RP.
Для начала создадим диалог, ко всем дефайнам:
[code]#define D_PROMO 15000
Ко всем forward:
[code]forward ShowDPromo(playerid);
forward ShowAPromo(playerid);
forward ShowBPromo(playerid);
forward CreatePromo(playerid,code[]);
forward DeletePromo(playerid,code[]);
forward CheckPromo(playerid);
forward ActivatePromo(playerid,code[]);
Непосредственно сама команда:
[code]cmd:pmenu(playerid, params[])
{
if(GetString(GetName(playerid), NGA1) || GetString(GetName(playerid), NGA2) || GetString(GetName(playerid), NGA4))
{
ShowPlayerDialog(playerid,D_PROMO,DIALOG_STYLE_LIST,»{43A5DF}Меню промокодов»,»
1. Создать промокод
2. Действующие промокоды
3. Активированные промокоды
4. Заблокированные промокоды
{F66B6D}5. Заблокировать промокод
{F66B6D}6. Удалить промокод»,»Далее»,»Выход»);
}
return true;
}
Ко всем диалогам:
[code]case D_PROMO:
{
if(!response) return 1;
switch(listitem)
{
case 0: ShowPlayerDialog(playerid,D_PROMO+1,DIALOG_STYLE_INPUT,»Создание промокода | {FE6060}Шаг: 1″,»{FFFFFF}Вам необходимо придумать промокод
Длина промокода должна быть 6 символов, состоящая из цифр и букв латинского алфавита
Введите промокод в строчку ниже:»,»Далее»,»Назад»);
case 1: mysql_function_query(dbHandle, «SELECT * FROM `promo` WHERE activate = ‘0’ AND block = ‘0’», true, «ShowDPromo», «i», playerid);
case 2: mysql_function_query(dbHandle, «SELECT * FROM `promo` WHERE activate = ‘1’», true, «ShowAPromo», «i», playerid);
case 3: mysql_function_query(dbHandle, «SELECT * FROM `promo` WHERE block = ‘1’», true, «ShowBPromo», «i», playerid);
case 4: ShowPlayerDialog(playerid,D_PROMO+2,DIALOG_STYLE_INPUT,»{F66B6D}Блокировка промокода»,»{FFFFFF}Введите ниже промокод, который хотите заблокировать:»,»Далее»,»Назад»);
case 5: ShowPlayerDialog(playerid,D_PROMO+3,DIALOG_STYLE_INPUT,»{F66B6D}Удаление промокода»,»{FFFFFF}Введите ниже промокод, который хотите удалить:»,»Далее»,»Назад»);
}
}
case D_PROMO+2:
{
if(!response)
{
return ShowPlayerDialog(playerid,D_PROMO,DIALOG_STYLE_LIST,»{F2E70F}Меню промокодов»,»
1. Создать промокод
2. Действующие промокоды
3. Активированные промокоды
4. Заблокированные промокоды
{F66B6D}5. Заблокировать промокод
{F66B6D}6. Удалить промокод»,»Далее»,»Выход»);
}
new qstring[128];
mysql_format(dbHandle, qstring, sizeof(qstring), «SELECT * FROM `promo` WHERE `name`=’%s'», inputtext);
mysql_tquery(dbHandle, qstring, «BlockPromo», «is», playerid,inputtext);
}
case D_PROMO+3:
{
if(!response)
{
return ShowPlayerDialog(playerid,D_PROMO,DIALOG_STYLE_LIST,»{F2E70F}Меню промокодов»,»
1. Создать промокод
2. Действующие промокоды
3. Активированные промокоды
4. Заблокированные промокоды
{F66B6D}5. Заблокировать промокод
{F66B6D}6. Удалить промокод»,»Далее»,»Выход»);
}
new qstring[128];
mysql_format(dbHandle, qstring, sizeof(qstring), «SELECT * FROM `promo` WHERE `name`=’%s'», inputtext);
mysql_tquery(dbHandle, qstring, «DeletePromo», «is», playerid,inputtext);
}
case D_PROMO+1:
{
if(!response)
{
ShowPlayerDialog(playerid,D_PROMO,DIALOG_STYLE_LIST,»{F2E70F}Меню промокодов»,»
1. Создать промокод
2. Действующие промокоды
3. Активированные промокоды
4. Заблокированные промокоды
{F66B6D}5. Заблокировать промокод
{F66B6D}6. Удалить промокод»,»Далее»,»Выход»);
return 1;
}
new totalstring[712];
if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid,D_PROMO+1,DIALOG_STYLE_INPUT,"Создание промокода | {FE6060}Шаг: 1","{FFFFFF}Вам необходимо придумать промокод
Длина промокода должна быть 3 символов, состоящая из цифр и букв латинского алфавита
Введите промокод в строчку ниже:","Далее","Назад");
SetPVarString(playerid,"PROMO",inputtext);
strcat(totalstring,"{FFFFFF}Теперь необходимо ввести тип приза, количество выигрыша, количество активаций
{4AA9CF}Типы:
");
strcat(totalstring,"{FFFFFF}1. VIP аккаунт
");
strcat(totalstring,"2. Игровая валюта
");
strcat(totalstring,"3. Рубли
");
strcat(totalstring,"Если указан тип '1', то в качестве количества приза - указываете дни, в течении которых будет действовать VIP аккаунт
");
strcat(totalstring,"Если указаны типы '2' и '3', то соответственно указываете количество игровой валюты, и рублей для выигрыша.
");
strcat(totalstring,"{F6F7D8}Указывать все значения нужно через запятую!
");
strcat(totalstring,"Пример: 1,30,10
");
strcat(totalstring,"Где 1 - тип(VIP), 30 - кол-во дней, 10 - число активаций");
ShowPlayerDialog(playerid,D_PROMO+4,DIALOG_STYLE_INPUT,"Создание промокода | {FE6060}Шаг: 2",totalstring,"Далее","Назад");
}
case D_PROMO+4:
{
new totalstring[512];
if(!response)
{
strcat(totalstring,"{FFFFFF}Теперь необходимо ввести тип приза, количество выигрыша, количество активаций
{4AA9CF}Типы:
");
strcat(totalstring,"{FFFFFF}1. VIP аккаунт
");
strcat(totalstring,"2. Игровая валюта
");
strcat(totalstring,"3. Рубли
");
strcat(totalstring,"Если указан тип '1', то в качестве количества приза - указываете дни, в течении которых будет действовать VIP аккаунт
");
strcat(totalstring,"Если указаны типы '2' и '3', то соответственно указываете количество игровой валюты, и рублей для выигрыша.
");
strcat(totalstring,"{F6F7D8}Указывать все значения нужно через запятую!
");
strcat(totalstring,"Пример: 1,30,10
");
strcat(totalstring,"Где 1 - тип приза(VIP), 30 - количество дней, 10 - число доступных активаций промокода");
ShowPlayerDialog(playerid,D_PROMO+4,DIALOG_STYLE_INPUT,"Создание промокода | {FE6060}Шаг: 2",totalstring,"Далее","Назад");
return 1;
}
new numb[3];
if(sscanf(inputtext, "p<,>iii»,numb[0],numb[1],numb[2]))
{
strcat(totalstring,»{FFFFFF}Теперь необходимо ввести тип приза, количество выигрыша, количество активаций
{4AA9CF}Типы:
«);
strcat(totalstring,»{FFFFFF}1. VIP аккаунт
«);
strcat(totalstring,»2. Игровая валюта
«);
strcat(totalstring,»3. Рубли
«);
strcat(totalstring,»Если указан тип ‘1’, то в качестве количества приза — указываете дни, в течении которых будет действовать VIP аккаунт
«);
strcat(totalstring,»Если указаны типы ‘2’ и ‘3’, то соответственно указываете количество игровой валюты, и рублей для выигрыша.
«);
strcat(totalstring,»{F6F7D8}Указывать все значения нужно через запятую!
«);
strcat(totalstring,»Пример: 1,30,10
«);
strcat(totalstring,»Где 1 — тип приза(VIP), 30 — количество дней, 10 — число доступных активаций промокода»);
ShowPlayerDialog(playerid,D_PROMO+4,DIALOG_STYLE_INPUT,»Создание промокода | {FE6060}Шаг: 2″,totalstring,»Далее»,»Назад»);
return 1;
}
SetPVarInt(playerid,»TYPEPROMO»,numb[0]),SetPVarInt(playerid,»AMOUNTPROMO»,numb[1]),SetPVarInt(playerid,»ACTIVATEPROMO»,numb[2]);
new qstring[128],promoname[16];
GetPVarString(playerid, «PROMO», promoname, sizeof(promoname));
mysql_format(dbHandle, qstring, sizeof(qstring), «SELECT * FROM `promo` WHERE `name`=’%s'», promoname);
mysql_tquery(dbHandle, qstring, «CreatePromo», «is», playerid,promoname);
}
case D_PROMO+5:
{
if(!response) return 1;
new qstring[128];
SetPVarString(playerid, «CODE», inputtext);
mysql_format(dbHandle, qstring, sizeof(qstring), «SELECT * FROM `promo_activations` WHERE `account_id` = ‘%d'»,PI[playerid][pID]);
mysql_tquery(dbHandle, qstring, «CheckPromo», «i», playerid);
}
В самый конец мода:
[code]public ShowDPromo(playerid)
{
new rows,fields;
cache_get_data(rows, fields);
if(!rows) return SendClientMessage(playerid, -1, «{2789FA}Ошибка: {FFFFFF}действующих промокодов не обнаружено.»);
new promolist[2000],code[24],priztext[24],string[100],typepriz,amountpriz,activate;
strcat(promolist, «{2789FA}№:t{FFFFFF}Промокод:t{FFFFFF}Тип приза:t{FFFFFF}Количество:t{2789FA}Число активаций:
«);
for(new i = 0; i < rows; i++)
{
cache_get_row(i, 0, code, dbHandle, 24);
typepriz = cache_get_row_int(i, 5, dbHandle);
amountpriz = cache_get_row_int(i, 6, dbHandle);
activate = cache_get_row_int(i, 3, dbHandle);
switch(typepriz)
{
case 1: priztext = "VIP аккаунт", format(string,sizeof string, "%dдней",amountpriz);
case 2: priztext = "Игр. валюта", format(string,sizeof string, "%dруб.",amountpriz);
case 3: priztext = "Рубли", format(string,sizeof string, "%dруб.",amountpriz);
}
format(string,sizeof(string),"{2789FA}%d t{FFFFFF}%s t{FFFFFF}%s t{FFFFFF}%s t{2789FA}%d
", i+1, code, priztext,string, activate);
strcat(promolist, string);
}
ShowPlayerDialog(playerid, D_NULL, DIALOG_STYLE_LIST,"{FFFFFF}Список действующих промокодов", promolist, "Закрыть", "");
return 1;
}
public ShowAPromo(playerid)
{
new rows,fields;
cache_get_data(rows, fields);
if(!rows) return SendClientMessage(playerid, -1, "{2789FA}Ошибка: {FFFFFF}активированных промокодов не обнаружено.");
new promolist[2000],code[24],priztext[24],data[32],string[128],typepriz,amountpriz;
strcat(promolist, "{2789FA}№:t{FFFFFF}Промокод:t{FFFFFF}Тип приза:t{FFFFFF}Количество:t{2789FA}Активирован:
");
for(new i; i < rows; i++)
{
cache_get_row(i, 0, code, dbHandle, 24);
typepriz = cache_get_row_int(i, 5, dbHandle);
amountpriz = cache_get_row_int(i, 6, dbHandle);
cache_get_row(i, 4, data, dbHandle, 32);
switch(typepriz)
{
case 1: priztext = "VIP аккаунт", format(string,sizeof string, "%dдней",amountpriz);
case 2: priztext = "Игр. валюта", format(string,sizeof string, "%dруб.",amountpriz);
case 3: priztext = "Рубли", format(string,sizeof string, "%dруб.",amountpriz);
}
format(string,sizeof(string),"{2789FA}%d t{FFFFFF}%s t{FFFFFF}%s t{FFFFFF}%s t{2789FA}%s
", i+1, code, priztext,string, data);
strcat(promolist, string);
}
ShowPlayerDialog(playerid, D_NULL, DIALOG_STYLE_LIST,"{FFFFFF}Список активированных промокодов", promolist, "Закрыть", "");
return 1;
}
public ShowBPromo(playerid)
{
new rows,fields;
cache_get_data(rows, fields);
if(!rows) return SendClientMessage(playerid, -1, "{43A5DF}Ошибка: {FFFFFF}заблокированных промокодов не обнаружено.");
new promolist[2000],code[24],priztext[24],data[32],string[100],typepriz,amountpriz;
strcat(promolist, "{2789FA}№:t{FFFFFF}Промокод:t{FFFFFF}Тип приза:t{FFFFFF}Количество:t{2789FA}Заблокирован:
");
for(new i; i < rows; i++)
{
cache_get_row(i, 0, code, dbHandle, 24);
typepriz = cache_get_row_int(i, 5, dbHandle);
amountpriz = cache_get_row_int(i, 6, dbHandle);
cache_get_row(i, 4, data, dbHandle, 32);
switch(typepriz)
{
case 1: priztext = "VIP аккаунт", format(string,sizeof string, "%dдней",amountpriz);
case 2: priztext = "Игр. валюта", format(string,sizeof string, "%dруб.",amountpriz);
case 3: priztext = "Рубли", format(string,sizeof string, "%dруб.",amountpriz);
}
format(string,sizeof(string),"{2789FA}%d t{FFFFFF}%s t{FFFFFF}%s t{FFFFFF}%s t{2789FA}%s
", i+1, code, priztext,string, data);
strcat(promolist, string);
}
ShowPlayerDialog(playerid, D_NULL, DIALOG_STYLE_LIST,"{FFFFFF}Список заблокированных промокодов", promolist, "Закрыть", "");
return 1;
}
public CreatePromo(playerid,code[])
{
new rows,fields,string[256],typetext[24];
cache_get_data(rows, fields);
if(rows) return SendClientMessage(playerid,COLOR_ORANGE,"Промокод уже имеется в базе данных. Придумайте другой..");
new type = GetPVarInt(playerid,"TYPEPROMO");
switch(type)
{
case 1: typetext = "VIP аккаунт";
case 2: typetext = "Игровая валюта";
case 3: typetext = "Рубли";
}
new amount = GetPVarInt(playerid,"AMOUNTPROMO");
new totalactivate = GetPVarInt(playerid,"ACTIVATEPROMO");
format(string,sizeof(string),"INSERT INTO `promo` (`name`,`typepriz`,`amountpriz`,`nactivations`) VALUES ('%s','%d','%d','%d')",code,type,amount,totalactivate);
mysql_function_query(dbHandle, string, false, "", "");
format(string,sizeof(string),"{FFFFFF}Промокод {65A0D0}'%s' {FFFFFF}успешно создан
{FFFFFF}Тип выигрыша: {65A0D0}%d (%s)
{FFFFFF}Количество выигрыша/дней: {65A0D0}%d
{FFFFFF}Число доступных активаций: {65A0D0}%d",code,type,typetext,amount,totalactivate);
ShowPlayerDialog(playerid, D_NULL, DIALOG_STYLE_MSGBOX, "Создание промокода | {FE6060}Финал", string, "Закрыть", "");
return DeletePVar(playerid,"TYPEPROMO"),DeletePVar(playerid,"AMOUNTPROMO"),DeletePVar(playerid,"ACTIVATEPROMO"),DeletePVar(playerid,"PROMO");
}
public DeletePromo(playerid,code[])
{
new rows,fields;
cache_get_data(rows, fields);
if(!rows) return SendClientMessage(playerid,-1,"{43A5DF}Ошибка: {FFFFFF}промокода не существует.");
new string[512];
format(string, sizeof(string), "DELETE FROM promo WHERE name = '%s'", code);
mysql_function_query(dbHandle, string, false, "", "");
format(string,sizeof(string),"{FFFFFF}Промокод {65A0D0}'%s' {FFFFFF}успешно удалён.",code);
SendClientMessage(playerid,-1,string);
return 1;
}
forward BlockPromo(playerid,code[]);
public BlockPromo(playerid,code[])
{
new rows,fields;
cache_get_data(rows, fields);
if(!rows) return SendClientMessage(playerid,-1,"{43A5DF}Ошибка: {FFFFFF}промокода не существует.");
new string[256];
new hourss,minn,secc;
gettime(hourss,minn,secc);
format(string,100,"%s / %02d:%02d:%02d",date("%dd.%mm.%yyyy",gettime()),hourss,minn,secc);
format(string, sizeof(string), "UPDATE promo SET `block`='1',`date`='%s' WHERE name='%s'", code, string);
mysql_function_query(dbHandle, string, false, "", "");
format(string,sizeof(string),"{FFFFFF}Промокод {65A0D0}'%s' {FFFFFF}успешно заблокирован.",code);
SendClientMessage(playerid,-1,string);
return 1;
}
public CheckPromo(playerid)
{
//new rows,fields;
//cache_get_data(rows, fields);
//if(rows) return SendClientMessage(playerid,-1,"{43A5DF}Ошибка: {FFFFFF}Вы уже активировали промокод, и не можете сделать это повторно.");
new accid;
accid = cache_get_row_int(0, 0, dbHandle);
if(accid == PI[playerid][pID]) return SendClientMessage(playerid,-1,"{FE0000}Ошибка: {FFFFFF}Вы уже активировали этот промокод, повторная активация невозможна.");
new qstring[128],code[16];
GetPVarString(playerid,"CODE",code,sizeof(code));
mysql_format(dbHandle, qstring, sizeof(qstring), "SELECT * FROM `promo` WHERE `name`='%s'", code);
mysql_tquery(dbHandle, qstring, "ActivatePromo", "is", playerid, code);
return 1;
}
public ActivatePromo(playerid,code[])
{
new rows,fields;
cache_get_data(rows, fields);
printf("Не существует 2");
if(!rows) return SendClientMessage(playerid,-1,"{43A5DF}Ошибка: {FFFFFF}промокода не существует.");
new typepriz,amountpriz,nactivations,string[512],activate,block,data[24],typetext[34],typetext1[24];
new year,month,day;
new current_date = getdate(year, month, day);
for(new i; i < rows; i++)
{
typepriz = cache_get_row_int(i, 5, dbHandle);
amountpriz = cache_get_row_int(i, 6, dbHandle);
nactivations = cache_get_row_int(i, 3, dbHandle);
activate = cache_get_row_int(i, 1, dbHandle);
block = cache_get_row_int(i, 2, dbHandle);
cache_get_row(i, 4, data, dbHandle, 24);
switch(typepriz)
{
case 1: typetext = "VIP аккаунт сроком на",typetext1 = " дней",PI[playerid][pVip] = 1,PI[playerid][pVipTime] = current_date + amountpriz;
case 2: typetext = "Игровая валюта в количестве",typetext1 = " руб",GiveMoney(playerid,amountpriz);
case 3: typetext = "Рубли в количестве",typetext1 = " кр.",PI[playerid][pCredits] += amountpriz;
}
}
if(block > 0) return SendClientMessage(playerid,-1,»{43A5DF}Ошибка: {FFFFFF}промокод заблокирован.»);
if(activate != 0)
{
format(string,sizeof(string),»{FFFFFF}Промокод ‘%s’ {FFFFFF}уже активирован {65A0D0}%s
{FFFFFF}К сожалению, Вы опоздали. Но ничего, получится в другой раз..»,code,data);
ShowPlayerDialog(playerid,D_NULL,DIALOG_STYLE_MSGBOX,»{FE0000}Ошибка»,string,»Закрыть»,»»);
return true;
}
format(string,sizeof(string),»INSERT INTO `promo_activations` (`account_id`,`name_promo`) VALUES (‘%d’,’%s’)»,PI[playerid][pID],code);
mysql_function_query(dbHandle, string, false, «», «»);
SendClientMessage(playerid,COLOR_ORANGE,»Поздравляем! Вы активировали промокод!»);
format(string,sizeof(string),»Промокод содержал: %s %d%s»,typetext,amountpriz,typetext1),SendClientMessage(playerid,COLOR_ORANGE,string);
nactivations—;
format(string, sizeof(string), «UPDATE promo SET `nactivations`=’%d’ WHERE name=’%s'», nactivations, code);
mysql_function_query(dbHandle, string, false, «», «»);
if(nactivations == 0)
{
new hourss,minn,secc;
gettime(hourss,minn,secc);
format(string,100,»%s / %02d:%02d:%02d»,date(«%dd.%mm.%yyyy»,gettime()),hourss,minn,secc);
format(string, sizeof(string), «UPDATE promo SET `activate`=’1′,`date`=’%s’ WHERE name=’%s'», string,code);
mysql_function_query(dbHandle, string, false, «», «»);
//return SendClientMessage(playerid,-1,»{FE0000}Ошибка: {FFFFFF}количество активаций для промокода исчерпано.»);
return true;
}
DeletePVar(playerid,»CODE»);
return 1;
}
И активация промокода в диалоговом окне (создаете сами, можете команду сделать, можете в меню игрока добавить):
[code]new stringer[256];
strcat(stringer,»{FFFFFF}В данном окне, Вы сможете активировать промокод
«);
strcat(stringer,»{F2F195}Возможные призы: VIP, Деньги, Донат
«);
strcat(stringer,»{FFFFFF}Введите полученный промокод в окошко ниже:»);
ShowPlayerDialog(playerid,D_PROMO+5,DIALOG_STYLE_INPUT,»{43A5DF}Активация промокода»,stringer,»Далее»,»Отмена»);
Ну и не забудьте выполнить вот такие SQL-запросы:
[code]CREATE TABLE `promo` (
`name` varchar(24) NOT NULL,
`activate` int(11) NOT NULL,
`block` int(11) NOT NULL,
`nactivations` int(11) NOT NULL,
`date` varchar(32) NOT NULL,
`typepriz` int(11) NOT NULL,
`amountpriz` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
COMMIT;
CREATE TABLE `promo_activations` (
`account_id` int(11) NOT NULL,
`name_promo` varchar(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
COMMIT;
Вот в общем-то и всё, если есть какие-то вопросы задавайте.
Автор данной системы, к сожалению, мне неизвестен.
Табуляцию я думаю выполните сами
Переделал: [b][color=#BF0000]danilasar