PDA

Просмотр полной версии : [Мануал] Система достижений с картинкой



Bren
21.01.2020, 21:38
Решил выложить свою систему достижений из старого мода.
Немного переделал, поправил моментами, так вот держите

Скриншот

https://i.imgur.com/NSCpS6K.png
https://i.imgur.com/JNS3Vjf.png


Нужен sscanf2

Ну так приступим.

Ко всем new


#define MAX_ADVANCE 2 //количество достижений

new Achievements[MAX_PLAYERS][MAX_ADVANCE], AchievementsCheck[MAX_PLAYERS], Text:AchievementsT[MAX_PLAYERS][5];


Теперь добавляем сам текст, тоже где-то сверху

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 и обнуление переменной


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 что вам угодно


if(AchievementsCheck[i] != 0 && AchievementsCheck[i] < gettime())//Закрытие TextDraw после открытия
{
AchievementsCheck[i] = 0;
for(new x; x < 5; x ++) TextDrawHideForPlayer(i, AchievementsT[i][x]);
}



В конец мода добавляем stock или ко всем stock


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


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


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 вызова диалога


cmd:advance(playerid, params[])
{
SetDialogResponse(playerid, 1);
return 1;
}


Теперь добавляем функция вызова достижения в OnVehicleRespray


if(color1 == 126 || color2 == 126) AchievementsInfo(0, playerid);//Достижение Перевозчик фламинго



И также в OnPlayerStateChange добавляем


switch(newstate)
{
case PLAYER_STATE_DRIVER, PLAYER_STATE_PASSENGER:
{
new vehicleid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(vehicleid)== 402) AchievementsInfo(1, playerid);//Достижение Любитель Buffalo
}
}

На этом все, система достижений готова.

Теперь показываю пример создание своего достижения

Покажу пример на создании достижения, погибании персонажа.

Для начала нам нужно увеличить макрос MAX_ADVANCE на плюс один

Теперь идем в AchievementText и добавляем в конец новую строчку

{"", "", "", "0,1", "", "", "{FFFFFF}"}
Что за все отвечает написано сверху.
Если вы захотите удалить достижение не удаляйте всю строку удалите только текст!!!

У меня это будет выглядеть так

{"~n~Character Death", "~n~Character Death", "LD_BUM:bum2", "0,3", "Погибании персонажа", "Убейте своего персонажа больше трёх раз", "{FFFFFF}Убейте своего персонажа больше трёх раз"}

В итоге, у вас должно получится вот так


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}Убейте своего персонажа больше трёх раз"}
};


Теперь идем в OnPlayerDeath, и добавляем следующий код


AchievementsInfo(2, playerid);

Обратите внимание на цифру 2, это номер достижения.

https://i.imgur.com/fykAaSY.png

Если вы добавите ещё одно достижение, то это уже будет цыфра 3, и так плюсуется при добавление нового достижения


И в итоге, у нас получилась очень удобная система достижений!
Легка в добавлении и быстрой настройки


DOWNLOAD (https://drive.google.com/file/d/1al9vE3EmaatPTK8KtTQvWneur9fCf12E/view?usp=sharing)


Автор: Bren
При копировании на другие ресурсы указывайте автора