- Регистрация
- 17 Янв 2014
- Сообщения
- 255
- Лучшие ответы
- 0
- Репутация
- 39
Решил выложить свою систему достижений из старого мода.
Немного переделал, поправил моментами, так вот держите
Немного переделал, поправил моментами, так вот держите
Скриншот
Нужен sscanf2
Ну так приступим.
Ко всем new
PHP:
#define MAX_ADVANCE 2 //количество достижений
new Achievements[MAX_PLAYERS][MAX_ADVANCE], AchievementsCheck[MAX_PLAYERS], Text:AchievementsT[MAX_PLAYERS][5];
Теперь добавляем сам текст, тоже где-то сверху
PHP:
new AchievementText[MAX_ADVANCE][7][] =
{/*
XX - 1 - отвечает за скрытность достижения (0 открыто | 1 скрыто) | 2 - сколько раз нужно выполнить задание для получение достижения
название TD ENG название TD RUS картинка XX текст текст 2 подробный текст*/
{"~n~transporter~n~flamingo", "~n~transporter~n~flamingo", "LD_TATT:5cross3", "1,1", "Перевозчик фламинго", "Покрасить автомобиль в розовый цвет", "{FFFFFF}Ну фламинго так фламинго"},
{"~n~I love this car", "~n~I love this car", "LD_OTB2:Ric5", "0,5", "Любитель Buffalo", "Сесть 5 раз в Buffalo", "{FFFFFF}Найди эту машину и испытай её!"}
};
В OnPlayerConnect добавляем сам TextDraw и обнуление переменной
PHP:
AchievementsCheck[playerid] = 0;
AchievementsT[playerid][0] = TextDrawCreate(535.0, 401.0, "_");
TextDrawLetterSize(AchievementsT[playerid][0], 0.25, 1.0);
TextDrawUseBox(AchievementsT[playerid][0], 1);
TextDrawBoxColor(AchievementsT[playerid][0], 170);
TextDrawTextSize(AchievementsT[playerid][0], 640.0, 0.0);
TextDrawSetSelectable(AchievementsT[playerid][0], 0);
AchievementsT[playerid][1] = TextDrawCreate(535.0, 401.0, "_");
TextDrawLetterSize(AchievementsT[playerid][1], 0.25, 4.65);
TextDrawUseBox(AchievementsT[playerid][1], 1);
TextDrawBoxColor(AchievementsT[playerid][1], 102);
TextDrawTextSize(AchievementsT[playerid][1], 640.0, 0.0);
TextDrawSetSelectable(AchievementsT[playerid][1], 0);
AchievementsT[playerid][2] = TextDrawCreate(587.0, 401.0, "_");
TextDrawAlignment(AchievementsT[playerid][2], 2);
TextDrawBackgroundColor(AchievementsT[playerid][2], 255);
TextDrawFont(AchievementsT[playerid][2], 2);
TextDrawLetterSize(AchievementsT[playerid][2], 0.19, 0.9);
TextDrawColor(AchievementsT[playerid][2], -1);
TextDrawSetOutline(AchievementsT[playerid][2], 1);
TextDrawSetProportional(AchievementsT[playerid][2], 1);
TextDrawSetSelectable(AchievementsT[playerid][2], 0);
AchievementsT[playerid][3] = TextDrawCreate(570.0, 415.0, "_");
TextDrawBackgroundColor(AchievementsT[playerid][3], 255);
TextDrawFont(AchievementsT[playerid][3], 2);
TextDrawLetterSize(AchievementsT[playerid][3], 0.21, 0.9);
TextDrawColor(AchievementsT[playerid][3], -1);
TextDrawSetOutline(AchievementsT[playerid][3], 1);
TextDrawSetProportional(AchievementsT[playerid][3], 1);
TextDrawSetSelectable(AchievementsT[playerid][3], 0);
AchievementsT[playerid][4] = TextDrawCreate(536.0, 414.0, "_");
TextDrawBackgroundColor(AchievementsT[playerid][4], 255);
TextDrawFont(AchievementsT[playerid][4], 4);
TextDrawLetterSize(AchievementsT[playerid][4], 0.5, 0.0);
TextDrawColor(AchievementsT[playerid][4], -86);
TextDrawUseBox(AchievementsT[playerid][4], 1);
TextDrawBoxColor(AchievementsT[playerid][4], 119);
TextDrawTextSize(AchievementsT[playerid][4], 30.0, 28.0);
TextDrawSetSelectable(AchievementsT[playerid][4], 0);
Теперь создайте секундный таймер или добавьте уже в созданный таймер этот код.
Здесь вы должны использовать include foreach, или обыкновенный цыкл for что вам угодно
PHP:
if(AchievementsCheck[i] != 0 && AchievementsCheck[i] < gettime())//Закрытие TextDraw после открытия
{
AchievementsCheck[i] = 0;
for(new x; x < 5; x ++) TextDrawHideForPlayer(i, AchievementsT[i][x]);
}
В конец мода добавляем stock или ко всем stock
PHP:
stock AchievementsInfo(room, playerid, lang = 0, message = 1)
{
/* room - номер достижения
lang - тип языка (0 ENG | 1 RUS)
message - 1 показывать только TD | 2 показывать TD и сообщение в чат | 3 показывать только сообщение в чат*/
new info[2];
sscanf(AchievementText[room][3], "p<,>a<d>[2]", info);
if(AchievementsCheck[playerid] != 0 || Achievements[playerid][room] >= info[1]) return 1;
Achievements[playerid][room] ++;
if(Achievements[playerid][room] >= info[1])
{
if(message <= 2)
{
for(new x; x < 5; x ++) TextDrawShowForPlayer(playerid, AchievementsT[playerid][x]);
TextDrawSetString(AchievementsT[playerid][2], "achievement unlocked");
TextDrawSetString(AchievementsT[playerid][3], AchievementText[room][lang]);
TextDrawSetString(AchievementsT[playerid][4], AchievementText[room][2]);
PlayerPlaySound(playerid, 6801, 0.0, 0.0, 0.0);
AchievementsCheck[playerid] = gettime()+6;
}
if(message >= 2)
{
new string[80];
format(string, sizeof(string), "Получено новое достижение: {4FDF24}%s{FFFFFF}.", AchievementText[room][4]);
SendClientMessage(playerid, -1, string);
PlayerPlaySound(playerid, 6801, 0.0, 0.0, 0.0);
}
}
/*new string[50+9+ 6*MAX_ADVANCE], str[6*MAX_ADVANCE], str1[6];// пример SAVE Mysql
for(new x; x < MAX_ADVANCE; x ++)
{
format(str1, sizeof(str1), "%d,", Achievements[playerid][x]);
strcat(str, str1);
}
mysql_format(MysqlConnectID, string, sizeof(string), "UPDATE profile SET achievements='%s' WHERE id=%d", str);
mysql_tquery(MysqlConnectID, string);*/
return 1;
}
И всё один stock
PHP:
stock SetDialogResponse(playerid, slo)
{
switch(slo)
{
case 1:
{
new string[80*9 +22], str[80], slot[3], info[2];
for(new idx = 10*GetPVarInt(playerid, "AchievementList[0]"); idx < 10*GetPVarInt(playerid, "AchievementList[0]")+11; idx ++)
{
if(slot[0] <= 9)
{
sscanf(AchievementText[idx][3], "p<,>a<d>[2]", info);
if(Achievements[playerid][idx] >= info[1]) format(str, sizeof(str), "{61dd61}%s{FFFFFF}\t%s\n", AchievementText[idx][4], AchievementText[idx][5]);
else
{
if(info[0] == 0)
{
if(info[1] == 1) format(str, sizeof(str), "%s\t%s\n", AchievementText[idx][4], AchievementText[idx][5]);
else format(str, sizeof(str), "%s\t%s (%d/%d)\n", AchievementText[idx][4], AchievementText[idx][5], Achievements[playerid][idx], info[1]);
}
else format(str, sizeof(str), "Скрытое достижение\t\n");
}
strcat(string, str);
format(str, sizeof(str), "AchievementLine[%d]", idx);
SetPVarInt(playerid, str, idx+1);
if(idx >= MAX_ADVANCE-1)
{
if(GetPVarInt(playerid, "AchievementList[0]") >= 1)
{
slot[1] = 1;
strcat(string, "< Назад\n");
SetPVarInt(playerid, "AchievementList[1]", slot[0]+2);
}
break;
}
}
slot[0] ++;
if(slot[0] >= 11)
{
slot[1] = 1;
strcat(string, "> Дальше\n");
if(GetPVarInt(playerid, "AchievementList[0]") >= 1) strcat(string, "< Назад\n");
break;
}
}
if(GetPVarInt(playerid, "AchievementList[0]") >= 1 && slot[1] == 0)
{
strcat(string, "< Назад\n");
SetPVarInt(playerid, "AchievementList[1]", slot[0]+1);
}
for(new x; x < MAX_ADVANCE; x ++)
{
sscanf(AchievementText[x][3], "p<,>a<d>[2]", info);
if(Achievements[playerid][x] >= info[1]) slot[2] += 1;
}
format(str, sizeof(str), "Достижения | {88AA88}Открыто %d из %d", slot[2], MAX_ADVANCE);
return ShowPlayerDialog(playerid, 77, DIALOG_STYLE_TABLIST, str, string, "Выбрать", "Назад");
}
}
return 1;
}
В OnDialogResponse
PHP:
case 77:
{
if(response == 0)
{
DeletePVar(playerid, "AchievementList[0]");
return DeletePVar(playerid, "AchievementList[1]");
}
switch(listitem)
{
case 10:
{
if(GetPVarInt(playerid, "AchievementList[1]") >= 1 && GetPVarInt(playerid, "AchievementList[1]") == listitem+1 && GetPVarInt(playerid, "AchievementList[0]") >= 1)
{
SetPVarInt(playerid, "AchievementList[0]", GetPVarInt(playerid, "AchievementList[0]")-1);
DeletePVar(playerid, "AchievementList[1]");
return SetDialogResponse(playerid, 1);
}
SetPVarInt(playerid, "AchievementList[0]", GetPVarInt(playerid, "AchievementList[0]")+1);
SetDialogResponse(playerid, 1);
}
case 11:
{
if(GetPVarInt(playerid, "AchievementList[0]") >= 1) SetPVarInt(playerid, "AchievementList[0]", GetPVarInt(playerid, "AchievementList[0]")-1);
SetDialogResponse(playerid, 1);
}
default:
{
if(GetPVarInt(playerid, "AchievementList[1]") >= 1 && GetPVarInt(playerid, "AchievementList[1]") == listitem+1 && GetPVarInt(playerid, "AchievementList[0]") >= 1)
{
SetPVarInt(playerid, "AchievementList[0]", GetPVarInt(playerid, "AchievementList[0]")-1);
DeletePVar(playerid, "AchievementList[1]");
return SetDialogResponse(playerid, 1);
}
new str[22], info[2];
format(str, sizeof(str), "AchievementLine[%d]", listitem);
new slot = GetPVarInt(playerid, str)-1 +10*GetPVarInt(playerid, "AchievementList[0]");
sscanf(AchievementText[slot][3], "p<,>a<d>[2]", info);
if(info[0] == 1 && Achievements[playerid][slot] != info[1]) return ShowPlayerDialog(playerid, 78, DIALOG_STYLE_MSGBOX, "Неизвестно", "{FFFFFF}Разгадайте тайну данного достижения.", "Назад", "Закрыть");
return ShowPlayerDialog(playerid, 78, DIALOG_STYLE_MSGBOX, AchievementText[slot][4], AchievementText[slot][6], "Назад", "Закрыть");
}
}
return 1;
}
case 78:
{
if(response == 0)
{
DeletePVar(playerid, "AchievementList[0]");
return DeletePVar(playerid, "AchievementList[1]");
}
return SetDialogResponse(playerid, 1);
}
Сама команда Pawn.CMD вызова диалога
PHP:
cmd:advance(playerid, params[])
{
SetDialogResponse(playerid, 1);
return 1;
}
Теперь добавляем функция вызова достижения в OnVehicleRespray
PHP:
if(color1 == 126 || color2 == 126) AchievementsInfo(0, playerid);//Достижение Перевозчик фламинго
И также в OnPlayerStateChange добавляем
PHP:
switch(newstate)
{
case PLAYER_STATE_DRIVER, PLAYER_STATE_PASSENGER:
{
new vehicleid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(vehicleid)== 402) AchievementsInfo(1, playerid);//Достижение Любитель Buffalo
}
}
Теперь показываю пример создание своего достижения
Покажу пример на создании достижения, погибании персонажа.
Для начала нам нужно увеличить макрос MAX_ADVANCE на плюс один
Теперь идем в AchievementText и добавляем в конец новую строчку
Что за все отвечает написано сверху.
Если вы захотите удалить достижение не удаляйте всю строку удалите только текст!!!
У меня это будет выглядеть так
В итоге, у вас должно получится вот так
Теперь идем в OnPlayerDeath, и добавляем следующий код
Обратите внимание на цифру 2, это номер достижения.
Если вы добавите ещё одно достижение, то это уже будет цыфра 3, и так плюсуется при добавление нового достижения
Для начала нам нужно увеличить макрос MAX_ADVANCE на плюс один
Теперь идем в AchievementText и добавляем в конец новую строчку
PHP:
{"", "", "", "0,1", "", "", "{FFFFFF}"}
Если вы захотите удалить достижение не удаляйте всю строку удалите только текст!!!
У меня это будет выглядеть так
PHP:
{"~n~Character Death", "~n~Character Death", "LD_BUM:bum2", "0,3", "Погибании персонажа", "Убейте своего персонажа больше трёх раз", "{FFFFFF}Убейте своего персонажа больше трёх раз"}
PHP:
new AchievementText[MAX_ADVANCE][7][] =
{/*
XX - 1 - отвечает за скрытность достижения (0 открыто | 1 скрыто) | 2 - сколько раз нужно выполнить задание для получение достижения
название TD ENG название TD RUS картинка XX текст текст 2 подробный текст*/
{"~n~transporter~n~flamingo", "~n~transporter~n~flamingo", "LD_TATT:5cross3", "1,1", "Перевозчик фламинго", "Покрасить автомобиль в розовый цвет", "{FFFFFF}Ну фламинго так фламинго"},
{"~n~I love this car", "~n~I love this car", "LD_OTB2:Ric5", "0,5", "Любитель Buffalo", "Сесть 5 раз в Buffalo", "{FFFFFF}Найди эту машину и испытай её!"},
{"~n~Character Death", "~n~Character Death", "LD_BUM:bum2", "0,3", "Погибании персонажа", "Убейте своего персонажа больше трёх раз", "{FFFFFF}Убейте своего персонажа больше трёх раз"}
};
PHP:
AchievementsInfo(2, playerid);
И в итоге, у нас получилась очень удобная система достижений!
Легка в добавлении и быстрой настройки
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Автор: Bren
При копировании на другие ресурсы указывайте автора
Последнее редактирование: