Простая система уровня для ДМ сервера
Лист обновлений
Код:
version 0.1
version 0.2
version 0.3
version 0.3.1
version 0.3.2 new
Благодарю $continue$ с помощью в версии 0.3.1
Благодарю Daniel_Cortez с помощью в версии 0.3.2
Система функционирует с версии 0.3z!
Пояснение:
Количество очков игрока (p_score) набирается за счет попадания в определенную часть тела противника и только с огнестрельного оружия. После чего, тебя перекидывает на следующий уровень и результат(p_score) обнуляется. И так далее до 99 уровня. Выше этого уровня вы не можете набрать. Чтобы определить, с какого уровня игрок может перейти на следующий, укажите в макросе TO_NEXT_LEVEL количество очков, с которого он перейдет на следующий уровень.
Важно:
Использую foreach.INC
Начнем.
Все это в начало мода
PHP код:
#define TO_NEXT_LEVEL (1337) // Лимит до следующего уровня
new
p_kill[MAX_PLAYERS], // Убийства
p_die[MAX_PLAYERS], // Смерти
p_score[MAX_PLAYERS], // Очки опыта (бонус за попадание)
p_level[MAX_PLAYERS char], // Уровень
PlayerText:TD_show_score[MAX_PLAYERS], // TD
score_text[11*3+6+1]; // Для форматирования :)
// Вычитаемое ХП за попадание в противника
static const bodypart_damage[] =
{
0.0, 0.0, 0.0, // --
50.0, // BODY_PART_TORSO
35.0, // BODY_PART_GROIN
20.0, // BODY_PART_LEFT_ARM
20.0, // BODY_PART_RIGHT_ARM
20.0, // BODY_PART_LEFT_LEG
20.0, // BODY_PART_RIGHT_LEG
90.0, // BODY_PART_HEAD
};
// Получаемый бонус за попадание в противника
static const hit_bonus_points[] =
{
0, 0, 0, // --
1, // BODY_PART_TORSO
2, // BODY_PART_GROIN
3, // BODY_PART_LEFT_ARM
3, // BODY_PART_RIGHT_ARM
3, // BODY_PART_LEFT_LEG
3, // BODY_PART_RIGHT_LEG
5 // BODY_PART_HEAD
};
Это в OnPlayerConnect
PHP код:
LoadPlayerTextDraw(playerid);
Это в OnPlayerDeath
PHP код:
if(killerid != INVALID_PLAYER_ID) p_kill[killerid]++;
p_die[playerid]++;
PlayerTextDrawShow(playerid, TD_show_score[playerid]);
Это в OnPlayerTakeDamage. Если нету, то создайте.
PHP код:
if(issuerid == INVALID_PLAYER_ID) return 0;
if(19 <= GetPlayerWeapon(issuerid) <= WEAPON_SNIPER || GetPlayerWeapon(issuerid) == WEAPON_MINIGUN)
{
new Float:health;
GetPlayerHealth(playerid, health);
SetPlayerHealth(playerid, health - bodypart_damage[bodypart]);
p_score[issuerid] += hit_bonus_points[bodypart];
}
Это в односекундый таймер. Не знаете как его создать? Можете посмотреть пример из темы Londlem
PHP код:
UpdatePlayerLevel(p);
format(score_text, sizeof(score_text), "%d / %d / %d", p_score[p], p_kill[p], p_die[p]);
PlayerTextDrawSetString(TD_show_score[p], score_text);
Это в любое удобное для вас место. Например в конец мода.
PHP код:
stock UpdatePlayerLevel(playerid)
{
if(p_score[playerid] >= TO_NEXT_LEVEL)
{
GameTextForPlayer(playerid, "level ~g~up", 3*1000, 5);
p_level{playerid}++;
p_score[playerid] = 0;
if(p_level{playerid} > 99) p_level{playerid} = 99;
SetPlayerScore(playerid, p_level{playerid});
}
}
stock LoadPlayerTextDraw(playerid)
{
TD_show_score[playerid] = CreatePlayerTextDraw(8.199967, 435.400024, "_");
PlayerTextDrawLetterSize(TD_show_score[playerid], 0.249999, 1.053125);
PlayerTextDrawAlignment(TD_show_score[playerid], 1);
PlayerTextDrawColor(TD_show_score[playerid], -1);
PlayerTextDrawSetShadow(TD_show_score[playerid], 0);
PlayerTextDrawSetOutline(TD_show_score[playerid], 0);
PlayerTextDrawBackgroundColor(TD_show_score[playerid], 255);
PlayerTextDrawFont(TD_show_score[playerid], 2);
PlayerTextDrawSetProportional(TD_show_score[playerid], 1);
}
Чтобы показать ТД игроку, используйте. Вставляйте в любое удобное для вас место. Например при спавне :3
PHP код:
PlayerTextDrawShow(playerid, TD_show_score[playerid]);
Далее обнулим переменные. В OnPlayerConnect и в OnPlayerDisconnect вставляем
PHP код:
p_kill[playerid] = 0;
p_die[playerid] = 0;
p_score[playerid] = 0;
p_level[playerid] = 0;