Дмитрий |
Дата: Понедельник, 30.07.2012, 11:39 | Сообщение # 1 | Сообщить о нерабочей теме
|
Регистрация: | 03.12.2011
|
Страна: | Российская Федерация |
Репутация: |
14
|
Сообщений: | 1421 |
Награды: |
4
+
|
Статус: |
|
| Здравствуйте форумчане! Это мой первый урок в паблике и я выслушаю все претензии по оформлению темы. В этом уроке я попытаюсь наиболее ясно рассказать как сделать 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" вставляем:
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 | Сообщить о нерабочей теме
|
Регистрация: | 03.12.2011
|
Страна: | Российская Федерация |
Репутация: |
14
|
Сообщений: | 1421 |
Награды: |
4
+
|
Статус: |
|
| [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!
|
|
|
|