• Страница 1 из 1
  • 1
Делаем VIP по времени проведенном в игре
Дмитрий Дата: Понедельник, 30.07.2012, 11:39 | Сообщение # 1 | Сообщить о нерабочей теме


Аватар для Дмитрий

Здравствуйте форумчане! Это мой первый урок в паблике и я выслушаю все претензии по оформлению темы. В этом уроке я попытаюсь наиболее ясно рассказать как сделать VIP аккаунт на определенное время, проведенное в игре (т.е. если игрок купит VIP на 24 часа, то VIP у него будет пока он не проведет 24 часа в игре). Когда мне нужно было сделать такую систему, не где такого урока не нашел, так что если было, не судите строго.

- Автор: Zmey_

Итак, ближе к делу...

1. Введем в PlayerInfo (сохраняемая информация о игроке) две новых переменных (если они у вас уже есть, то пропустите этот пункт):

[spoiler="Введение новых переменных:"]
Эти сохранения и т.п. не на MxIni, и не на Dini, а на стандартном a_samp.
1) В "enum pInfo" (массив с данными игрока) вставляем это:
Code
pDonateRank, // VIP статус игрока (0 - как правило, отсутствие VIP; назвать можете по своему, но приставка "p" нужна)
pDonateRankTime, // Оставшееся время VIP (назвать можете по своему, но приставка "p" нужна)  

2) В "public OnPlayerRegister(playerid, password[])" вставляем это (вставлять к записям такого же рода, желательно в конец):
Code
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  

3) В "public OnPlayerLogin(playerid,password[])" вставляем это (вставлять к записям такого же рода, желательно в конец):
Code
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

4) В "public SavePlayer(playerid)" (в разных модах по разному называют этот паблик. Например на СтрайкАрене "public OnPlayerStatsUpdate(playerid)") вставляем это (вставлять к записям такого же рода, желательно в конец):
Code
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  

5) Последний шаг в данном пункте: в "public OnPlayerConnect(playerid)" вставляем следующее:
Code
PlayerInfo[playerid][pDonateRank] = 0; // VIP статус игрока (0 - как правило, отсутствие VIP)
PlayerInfo[playerid][pDonateRankTime] = 0; // Оставшееся время VIP  

[/spoiler]
2. Нам нужно создать forward для паблика. Вставляем ко всем "forward" это:
Code
forward Production(); // "Production" можете назвать по своему  

3. Создаем public (как правило в конце мода):
Code
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; }
         }
     }
}  


4. Создадим действие таймера:

1) Ко всем "new" вставляем:

Code
new productiontimer;   


2) В "public OnGameModeExit()" (в разных модах по разному называют этот паблик. Например на СтрайкАрене "public GameModeExitFunc()") ко всем KillTimer вставляем это:

Code
KillTimer(productiontimer);  


3) В "public OnGameModeInit()" ко всем таймерам (SetTimer) вставляем это:

Code
productiontimer = SetTimer("Production", 60000, 1); // Таймер 1 минута  


From Russia With Love!
Дмитрий Дата: Понедельник, 30.07.2012, 11:44 | Сообщение # 2 | Сообщить о нерабочей теме


Аватар для Дмитрий

[spoiler="5. Дополнения:"]
[spoiler="Создадим команду для выдачи VIP на время:"]Все команды находятся в "public OnPlayerCommandText(playerid, cmdtext[])".
Code
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;
     }  

[/spoiler]
[spoiler="DM (или DonateMoney):"]
DonateMoney (в дальнейшем DM) - это что-то вроде голосов вконтакте или золотых монет в онлайн играх, но суть в том что DM можно будет приобрести только за деньги.

Наиболее частая схема работы с DM (или тому подобные названия) на серверах: Перечисляешь деньги админу на счет -> админ дает что-то в игре. Но тут вы сможете выбрать что взять в игре, из предложенных услуг за DM. Думаю суть ясна. Приступим к делу...

Это дополнение будет в двух частях: "Ввод DM в мод" и "Покупка VIP за DM".
Но в дальнейшем вы можете сделать за DM и многое другое (например: покупка VIP авто и т.п.), но это уже ваша фантазия.

1. Вводим DM в мод как обычные переменные. Не чего сложного, это мы уже делали.
Не на MxIni, и не на Dini, а на стандартном a_samp.

1) В "enum pInfo" (массив с данными игрока) вставляем это:
Code
pDonateMoney, // DM (DonateMoney)  


2) В "public OnPlayerRegister(playerid, password[])" вставляем это (вставлять к записям такого же рода, желательно в конец):

Code
format(var, 32, "DonateMoney=%d\n",PlayerInfo[playerid][pDonateMoney]);fwrite(hFile, var); // DM (DonateMoney)  


3) В "public OnPlayerLogin(playerid,password[])" вставляем это (вставлять к записям такого же рода, желательно в конец):

Code
if(strcmp( key , "DonateMoney" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pDonateMoney] = strval( val ); } // DM (DonateMoney)  


4) В "public SavePlayer(playerid)" (в разных модах по разному называют этот паблик. Например на СтрайкАрене "public OnPlayerStatsUpdate(playerid)") вставляем это (вставлять к записям такого же рода, желательно в конец):

Code
format(var, 32, "DonateMoney=%d\n",PlayerInfo[playerid][pDonateMoney]);fwrite(hFile, var); // DM (DonateMoney)  


5) В "public OnPlayerConnect(playerid)" вставляем следующее:

Code
PlayerInfo[playerid][pDonateMoney] = 0; // DM (DonateMoney)  


2. Создаем команду для выдачи DM игроку. Все команды находятся в "public OnPlayerCommandText(playerid, cmdtext[])".

Code
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;
     }  

[/spoiler]
[spoiler="Покупка VIP за DM (в диалоговых окнах):"]
1. Создадим команду для вызова диалогового окна и назовем ее "/buyvip". Все команды находятся в "public OnPlayerCommandText".
Code
if(strcmp(cmd, "/buyvip", true) == 0)
     {
         if(IsPlayerConnected(playerid))
         {
              ShowPlayerDialog(playerid, 131, DIALOG_STYLE_INPUT, "VIP", "Введите кол-во часов на которое \nхотите приобрести VIP, в окошко:", "OK", "Отмена");
             return 1;
         }
     }  

2. Теперь переходим к самим диалоговым окнам и их функциям. Все диалоги находятся в "public OnDialogResponse". Вставляем ко всем диалогам следующее:
Code
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;
         }
     }  

Если же вы не вводили в свой мод DM (DonateMoney) по уроку выше, то можете заменить DM обычными деньгами.
[/spoiler]
[spoiler="Добавление в stats:"]
Практически у всех на сервере есть stats (просмотр статистики игрока). Обычно паблики с ним называются "public ShowStats" или "Stats".
В этом паблике нужно ко всем "new level = PlayerInfo[playerid][pLevel];" и тому подобным добавить:
Code
new DonateRankTime = PlayerInfo[playerid][pDonateRankTime];  

После добавьте надпись в сам диалог статса. Подробнее объяснить не получается...
[/spoiler]
[spoiler="Добавление к PayDay (З.П. каждый час):"]
В "public PayDay" (в некоторых модах подругому) после надписей "Текущий баланс в банке" и т.п. добовляем следующее:
Code
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);
                     }  

[/spoiler]
Если чего-то не хватает в этом пункте пишите в коменты, добавлю.
[/spoiler]
Вроде все. Надеюсь урок кому-нибудь то поможет.


From Russia With Love!
  • Страница 1 из 1
  • 1
Поиск: