Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Делаем VIP по времени проведенном в игре

Статус
В этой теме нельзя размещать новые ответы.

Zmey_

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

- Автор: Zmey_ (т.е. Я)

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

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

1) В "enum pInfo" (массив с данными игрока) вставляем это:
PHP:
pDonateRank, // VIP статус игрока (0 - как правило, отсутствие VIP; назвать можете по своему, но приставка "p" нужна)
pDonateRankTime, // Оставшееся время VIP (назвать можете по своему, но приставка "p" нужна)
2) В "public OnPlayerRegister(playerid, password[])" вставляем это (вставлять к записям такого же рода, желательно в конец):
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
3) В "public OnPlayerLogin(playerid,password[])" вставляем это (вставлять к записям такого же рода, желательно в конец):
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
4) В "public SavePlayer(playerid)" (в разных модах по разному называют этот паблик. Например на СтрайкАрене "public OnPlayerStatsUpdate(playerid)") вставляем это (вставлять к записям такого же рода, желательно в конец):
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
5) Последний шаг в данном пункте: в "public OnPlayerConnect(playerid)" вставляем следующее:
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" можете назвать по своему
3. Создаем 2 public`а (как правило в конце мода):
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();
}
4. Создадим действие таймера:

1) Ко всем "new" вставляем:
PHP:
new timeroneminuts;
2) В "public OnGameModeExit()" (в разных модах по разному называют этот паблик. Например на СтрайкАрене "public GameModeExitFunc()") ко всем KillTimer вставляем это:
PHP:
KillTimer(timeroneminuts);
3) В "public OnGameModeInit()" ко всем таймерам (SetTimer) вставляем это:
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" (массив с данными игрока) вставляем это:
PHP:
pDonateMoney, // DM (DonateMoney)
2) В "public OnPlayerRegister(playerid, password[])" вставляем это (вставлять к записям такого же рода, желательно в конец):
PHP:
format(var, 32, "DonateMoney=%d\n",PlayerInfo[playerid][pDonateMoney]);fwrite(hFile, var); // DM (DonateMoney)
3) В "public OnPlayerLogin(playerid,password[])" вставляем это (вставлять к записям такого же рода, желательно в конец):
PHP:
if(strcmp( key , "DonateMoney" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pDonateMoney] = strval( val ); } // DM (DonateMoney)
4) В "public SavePlayer(playerid)" (в разных модах по разному называют этот паблик. Например на СтрайкАрене "public OnPlayerStatsUpdate(playerid)") вставляем это (вставлять к записям такого же рода, желательно в конец):
PHP:
format(var, 32, "DonateMoney=%d\n",PlayerInfo[playerid][pDonateMoney]);fwrite(hFile, var); // DM (DonateMoney)
5) В "public OnPlayerConnect(playerid)" вставляем следующее:
PHP:
PlayerInfo[playerid][pDonateMoney] = 0; // DM (DonateMoney)
2. Создаем команду для выдачи DM игроку. Все команды находятся в "public OnPlayerCommandText(playerid, cmdtext[])".
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".
PHP:
	if(strcmp(cmd, "/buyvip", true) == 0)
	{
        if(IsPlayerConnected(playerid))
        {
 			ShowPlayerDialog(playerid, 131, DIALOG_STYLE_INPUT, "VIP", "Введите кол-во часов на которое \nхотите приобрести VIP, в окошко:", "OK", "Отмена");
			return 1;
        }
	}
2. Теперь переходим к самим диалоговым окнам и их функциям. Все диалоги находятся в "public OnDialogResponse". Вставляем ко всем диалогам следующее:
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;
		}
    }
Если же вы не вводили в свой мод DM (DonateMoney) по уроку выше, то можете заменить DM обычными деньгами.
Практически у всех на сервере есть stats (просмотр статистики игрока). Обычно паблики с ним называются "public ShowStats" или "Stats".
В этом паблике нужно ко всем "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.

Я походу не туда тему сунул... Приношу извинения! Удалите тему если это так.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу