Zmey_
Новичок
Здравствуйте форумчане! Это мой первый урок в паблике и я выслушаю все претензии по оформлению темы. В этом уроке я попытаюсь наиболее ясно рассказать как сделать VIP аккаунт на определенное время, проведенное в игре (т.е. если игрок купит VIP на 24 часа, то VIP у него будет пока он не проведет 24 часа в игре). Когда мне нужно было сделать такую систему, не где такого урока не нашел, так что если было, не судите строго.
- Автор: Zmey_ (т.е. Я)
Итак, ближе к делу...
1. Введем в PlayerInfo (сохраняемая информация о игроке) две новых переменных (если они у вас уже есть, то пропустите этот пункт):
2. Нам нужно создать 2 forward`а для 2-ух пабликов. Вставляем ко всем "forward" это:
3. Создаем 2 public`а (как правило в конце мода):
4. Создадим действие таймера:
1) Ко всем "new" вставляем:
2) В "public OnGameModeExit()" (в разных модах по разному называют этот паблик. Например на СтрайкАрене "public GameModeExitFunc()") ко всем KillTimer вставляем это:
3) В "public OnGameModeInit()" ко всем таймерам (SetTimer) вставляем это:
Если чего-то не хватает в этом пункте пишите в коменты, добавлю.
Вроде все. Надеюсь урок кому-нибудь то поможет. Жду отзывов. Если какие-то ошибки в уроке или в его оформлении, пишите, исправлю. А так же если у вас что-то не получается и требуется помощь, добавляйтесь в skype, помогу. My skype: Kable_II.
Я походу не туда тему сунул... Приношу извинения! Удалите тему если это так.
- Автор: Zmey_ (т.е. Я)
Итак, ближе к делу...
1. Введем в PlayerInfo (сохраняемая информация о игроке) две новых переменных (если они у вас уже есть, то пропустите этот пункт):
Эти сохранения и т.п. не на MxIni, и не на Dini, а на стандартном a_samp.
1) В "enum pInfo" (массив с данными игрока) вставляем это:
2) В "public OnPlayerRegister(playerid, password[])" вставляем это (вставлять к записям такого же рода, желательно в конец):
3) В "public OnPlayerLogin(playerid,password[])" вставляем это (вставлять к записям такого же рода, желательно в конец):
4) В "public SavePlayer(playerid)" (в разных модах по разному называют этот паблик. Например на СтрайкАрене "public OnPlayerStatsUpdate(playerid)") вставляем это (вставлять к записям такого же рода, желательно в конец):
5) Последний шаг в данном пункте: в "public OnPlayerConnect(playerid)" вставляем следующее:
1) В "enum pInfo" (массив с данными игрока) вставляем это:
PHP:
pDonateRank, // VIP статус игрока (0 - как правило, отсутствие VIP; назвать можете по своему, но приставка "p" нужна)
pDonateRankTime, // Оставшееся время VIP (назвать можете по своему, но приставка "p" нужна)
PHP:
format(var, 32, "DonateRank=%d\n",PlayerInfo[playerid][pDonateRank]);fwrite(hFile, var); // VIP статус игрока (0 - как правило, отсутствие VIP)
format(var, 32, "DonateRankTime=%d\n",PlayerInfo[playerid][pDonateRankTime]);fwrite(hFile, var); // Оставшееся время VIP
PHP:
if(strcmp( key , "DonateRank" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pDonateRank] = strval( val ); } // VIP статус игрока (0 - как правило, отсутствие VIP)
if(strcmp( key , "DonateRankTime" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pDonateRankTime] = strval( val ); } // Оставшееся время VIP
PHP:
format(var, 32, "DonateRank=%d\n",PlayerInfo[playerid][pDonateRank]);fwrite(hFile, var); // VIP статус игрока (0 - как правило, отсутствие VIP)
format(var, 32, "DonateRankTime=%d\n",PlayerInfo[playerid][pDonateRankTime]);fwrite(hFile, var); // Оставшееся время VIP
PHP:
PlayerInfo[playerid][pDonateRank] = 0; // VIP статус игрока (0 - как правило, отсутствие VIP)
PlayerInfo[playerid][pDonateRankTime] = 0; // Оставшееся время VIP
2. Нам нужно создать 2 forward`а для 2-ух пабликов. Вставляем ко всем "forward" это:
PHP:
forward Production(); // "Production" можете назвать по своему
forward TimerOneMinuts(playerid); // "TimerOneMinuts" можете назвать по своему
PHP:
public Production()
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(PlayerInfo[i][pDonateRankTime] >= 1) { PlayerInfo[i][pDonateRankTime] -= 1; } else { PlayerInfo[i][pDonateRankTime] = 0; }
if(PlayerInfo[i][pDonateRankTime] <= 0) { PlayerInfo[i][pDonateRank] = 0; }
}
}
}
public TimerOneMinuts(playerid)
{
Production();
}
1) Ко всем "new" вставляем:
PHP:
new timeroneminuts;
PHP:
KillTimer(timeroneminuts);
PHP:
timeroneminuts= SetTimer("TimerOneMinuts", 60000, 1); // Таймер 1 минута
Все команды находятся в "public OnPlayerCommandText(playerid, cmdtext[])".
PHP:
if(strcmp("/givevip", cmdtext, true) == 0)
{
if(IsPlayerConnected(playerid))
{
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, COLOR_RED, "EROR: /givevip [id] [кол-во минут]");
return 1;
}
new mda;
new viptime;
mda = ReturnUser(tmp);
tmp = strtok(cmdtext, idx);
viptime = strval(tmp);
if (PlayerInfo[playerid][pAdmin] >= 100500) // проверка на админа
{
if(IsPlayerConnected(mda)) // проверка на коннект
{
if(mda != INVALID_PLAYER_ID)
{
new string[256];
PlayerInfo[mda][pDonateRank] = 1;
PlayerInfo[mda][pDonateRankTime] = viptime;
format(string, sizeof(string), "Вам выдан VIP на %d минут.", viptime);
SendClientMessage(mda, COLOR_GREEN, string);
format(string, sizeof(string), "Вы выдали VIP %d ID на %d минут.", mda, viptime);
SendClientMessage(playerid, COLOR_WHITE, string);
}
}
}
else
{
SendClientMessage(playerid, COLOR_WHITE, "Вы не администратор.");
}
}
return true;
}
DonateMoney (в дальнейшем DM) - это что-то вроде голосов вконтакте или золотых монет в онлайн играх, но суть в том что DM можно будет приобрести только за деньги.
Наиболее частая схема работы с DM (или тому подобные названия) на серверах: Перечисляешь деньги админу на счет -> админ дает что-то в игре. Но тут вы сможете выбрать что взять в игре, из предложенных услуг за DM. Думаю суть ясна. Приступим к делу...
Это дополнение будет в двух частях: "Ввод DM в мод" и "Покупка VIP за DM".
Но в дальнейшем вы можете сделать за DM и многое другое (например: покупка VIP авто и т.п.), но это уже ваша фантазия.
1. Вводим DM в мод как обычные переменные. Не чего сложного, это мы уже делали.
Не на MxIni, и не на Dini, а на стандартном a_samp.
1) В "enum pInfo" (массив с данными игрока) вставляем это:
2) В "public OnPlayerRegister(playerid, password[])" вставляем это (вставлять к записям такого же рода, желательно в конец):
3) В "public OnPlayerLogin(playerid,password[])" вставляем это (вставлять к записям такого же рода, желательно в конец):
4) В "public SavePlayer(playerid)" (в разных модах по разному называют этот паблик. Например на СтрайкАрене "public OnPlayerStatsUpdate(playerid)") вставляем это (вставлять к записям такого же рода, желательно в конец):
5) В "public OnPlayerConnect(playerid)" вставляем следующее:
2. Создаем команду для выдачи DM игроку. Все команды находятся в "public OnPlayerCommandText(playerid, cmdtext[])".
Наиболее частая схема работы с DM (или тому подобные названия) на серверах: Перечисляешь деньги админу на счет -> админ дает что-то в игре. Но тут вы сможете выбрать что взять в игре, из предложенных услуг за DM. Думаю суть ясна. Приступим к делу...
Это дополнение будет в двух частях: "Ввод DM в мод" и "Покупка VIP за DM".
Но в дальнейшем вы можете сделать за DM и многое другое (например: покупка VIP авто и т.п.), но это уже ваша фантазия.
1. Вводим DM в мод как обычные переменные. Не чего сложного, это мы уже делали.
Не на MxIni, и не на Dini, а на стандартном a_samp.
1) В "enum pInfo" (массив с данными игрока) вставляем это:
PHP:
pDonateMoney, // DM (DonateMoney)
PHP:
format(var, 32, "DonateMoney=%d\n",PlayerInfo[playerid][pDonateMoney]);fwrite(hFile, var); // DM (DonateMoney)
PHP:
if(strcmp( key , "DonateMoney" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pDonateMoney] = strval( val ); } // DM (DonateMoney)
PHP:
format(var, 32, "DonateMoney=%d\n",PlayerInfo[playerid][pDonateMoney]);fwrite(hFile, var); // DM (DonateMoney)
PHP:
PlayerInfo[playerid][pDonateMoney] = 0; // DM (DonateMoney)
PHP:
if(strcmp("/givedm", cmdtext, true) == 0)
{
if(IsPlayerConnected(playerid))
{
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, COLOR_RED, "EROR: /givedm [id] [кол-во DonateMoney]");
return 1;
}
new mda;
new dm;
mda = ReturnUser(tmp);
tmp = strtok(cmdtext, idx);
dm = strval(tmp);
if (PlayerInfo[playerid][pAdmin] >= 100500) // проверка на админа
{
if(IsPlayerConnected(mda)) // проверка на коннект
{
if(mda != INVALID_PLAYER_ID)
{
new string[256];
PlayerInfo[mda][pDonateMoney] = dm;
format(string, sizeof(string), "Вам выдано %d DM (DonateMoney).", dm);
SendClientMessage(mda, COLOR_GREEN, string);
format(string, sizeof(string), "Вы выдали %d ID %d DM (DonateMoney).", mda, dm);
SendClientMessage(playerid, COLOR_WHITE, string);
}
}
}
else
{
SendClientMessage(playerid, COLOR_WHITE, "Вы не администратор.");
}
}
return true;
}
1. Создадим команду для вызова диалогового окна и назовем ее "/buyvip". Все команды находятся в "public OnPlayerCommandText".
2. Теперь переходим к самим диалоговым окнам и их функциям. Все диалоги находятся в "public OnDialogResponse". Вставляем ко всем диалогам следующее:
Если же вы не вводили в свой мод DM (DonateMoney) по уроку выше, то можете заменить DM обычными деньгами.
PHP:
if(strcmp(cmd, "/buyvip", true) == 0)
{
if(IsPlayerConnected(playerid))
{
ShowPlayerDialog(playerid, 131, DIALOG_STYLE_INPUT, "VIP", "Введите кол-во часов на которое \nхотите приобрести VIP, в окошко:", "OK", "Отмена");
return 1;
}
}
PHP:
else if(dialogid == 131)
{
if(response)
{
new minuts = strval(inputtext);
new chasi = (minuts * 60);
new dm = (minuts * 1); // делаем стоимость 1 часа. Сейчас 1 час равен одному DM.
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 131, DIALOG_STYLE_INPUT, "VIP", "Введите кол-во часов на которое \nхотите приобрести VIP, в окошко:", "OK", "Отмена");
return 1;
}
if(minuts < 1)
{
SendClientMessage(playerid, COLOR_RED, "Не меньше 1!");
return 1;
}
if(PlayerInfo[playerid][pDonateMoney] < dm)
{
SendClientMessage(playerid, COLOR_RED, "Недостаточно DM.");
return 1;
}
PlayerInfo[playerid][pDonateMoney] -= dm;
PlayerInfo[playerid][pDonateRank] = 1;
PlayerInfo[playerid][pDonateRankTime] = chasi;
new s[255];
format(s,sizeof(s),"Вы купили VIP на %d часов, за %d DM.", minuts, dm);
SendClientMessage(playerid, COLOR_GREEN, s);
}
else
{
return 1;
}
}
Практически у всех на сервере есть stats (просмотр статистики игрока). Обычно паблики с ним называются "public ShowStats" или "Stats".
В этом паблике нужно ко всем "new level = PlayerInfo[playerid][pLevel];" и тому подобным добавить:
После добавьте надпись в сам диалог статса. Подробнее объяснить не получается...
В этом паблике нужно ко всем "new level = PlayerInfo[playerid][pLevel];" и тому подобным добавить:
PHP:
new DonateRankTime = PlayerInfo[playerid][pDonateRankTime];
В "public PayDay" (в некоторых модах подругому) после надписей "Текущий баланс в банке" и т.п. добовляем следующее:
PHP:
if(PlayerInfo[i][pDonateRankTime] >= 1)
{
new dranktimeMinut = PlayerInfo[i][pDonateRankTime];
new dranktime4asov = dranktimeMinut / 60;
format(string, sizeof(string), " {FFFFFF}Действие VIP аккаунта закончится через {FF0000}%d{FFFFFF} часов.", dranktime4asov);
SendClientMessage(i, COLOR_WHITE, string);
}
Если чего-то не хватает в этом пункте пишите в коменты, добавлю.
Вроде все. Надеюсь урок кому-нибудь то поможет. Жду отзывов. Если какие-то ошибки в уроке или в его оформлении, пишите, исправлю. А так же если у вас что-то не получается и требуется помощь, добавляйтесь в skype, помогу. My skype: Kable_II.
Я походу не туда тему сунул... Приношу извинения! Удалите тему если это так.
Последнее редактирование:
