PDA

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



Desulaid
14.04.2015, 02:05
Лист обновлений


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

Начнем.

Все это в начало мода


#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 (http://wiki.sa-mp.com/wiki/OnPlayerConnect)


LoadPlayerTextDraw(playerid);

Это в OnPlayerDeath (http://wiki.sa-mp.com/wiki/OnPlayerDeath)


if(killerid != INVALID_PLAYER_ID) p_kill[killerid]++;
p_die[playerid]++;
PlayerTextDrawShow(playerid, TD_show_score[playerid]);

Это в OnPlayerTakeDamage (http://wiki.sa-mp.com/wiki/OnPlayerTakeDamage). Если нету, то создайте.


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 (http://pro-pawn.ru/showthread.php?4362-%D0%9E%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8-%D0%BD%D0%B0-%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8E-%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8E)


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);

Это в любое удобное для вас место. Например в конец мода.


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);
}

Чтобы показать ТД игроку, используйте. Вставляйте в любое удобное для вас место. Например при спавне (http://wiki.sa-mp.com/wiki/OnPlayerSpawn) :3


PlayerTextDrawShow(playerid, TD_show_score[playerid]);

Далее обнулим переменные. В OnPlayerConnect (http://wiki.sa-mp.com/wiki/OnPlayerConnect) и в OnPlayerDisconnect (http://wiki.sa-mp.com/wiki/OnPlayerDisconnect)вставляем


p_kill[playerid] = 0;
p_die[playerid] = 0;
p_score[playerid] = 0;
p_level[playerid] = 0;

L0ndl3m
14.04.2015, 17:56
Было (http://pro-pawn.ru/showthread.php?5256) же.

Desulaid
14.04.2015, 20:01
Было (http://pro-pawn.ru/showthread.php?5256) же.

То есть может быть только один вид систему уровня по фрагам? К тому же это пока, так скажем, бета версия, я пока в раздумьях, что можно добавить :)

Mazzilla
15.04.2015, 08:14
Причём здесь только один вид? В указанной теме те же текстдравы, та же система полностью. Зачем две одинаковые темы в разных разделах? Бета-версия? Что?

Desulaid
15.04.2015, 19:54
Причём здесь только один вид? В указанной теме те же текстдравы, та же система полностью. Зачем две одинаковые темы в разных разделах? Бета-версия? Что?

Я пока ее доделываю, думаю добавить еще пару комманд, расширенная статистика, переосмыслить саму систему, а точнее начисление очков и т.д.
Ps. других вариантов реализации таковой системы я не знаю. Если есть варианты, то прошу..

Mazzilla
16.04.2015, 07:58
Я пока ее доделываю, думаю добавить еще пару комманд, расширенная статистика, переосмыслить саму систему, а точнее начисление очков и т.д.
Ps. других вариантов реализации таковой системы я не знаю. Если есть варианты, то прошу..
Когда доделаете, тогда и выкладывайте. В чем проблема? Кому нужны недоделанные системы, к тому же, уже имеющиеся на портале?

Desulaid
19.04.2015, 10:49
Обновил!

Desulaid
12.08.2015, 22:34
Очередная переделка :3

L0ndl3m
13.08.2015, 00:16
if(playerid != INVALID_PLAYER_ID) p_kill[killerid]++;
wut?!

Desulaid
13.08.2015, 09:28
if(playerid != INVALID_PLAYER_ID) p_kill[killerid]++;
wut?!
Ой:D

$continue$
13.08.2015, 14:48
GetPlayerHealth вынести за оператор switch, религия не позволяет?

Daniel_Cortez
13.08.2015, 16:01
GetPlayerHealth вынести за оператор switch, религия не позволяет?
SetPlayerHealth тоже можно, оставив в кейсах вычитание значений из health.

Desulaid
13.08.2015, 21:33
Переделал :3

- - - Добавлено - - -

Не все, но переделал.

Daniel_Cortez
14.08.2015, 16:59
Переместил тему в подраздел для непроверенных мануалов, т.к. там ещё много чего стоило бы изменить.
Например, для ID оружий есть константы.
Для частей тела тоже, хоть куй и забыл объявить их:


#if !defined BODY_PART_TORSO
enum
{
BODY_PART_TORSO = 3,
BODY_PART_GROIN,
BODY_PART_LEFT_ARM,
BODY_PART_RIGHT_ARM,
BODY_PART_LEFT_LEG,
BODY_PART_RIGHT_LEG,
BODY_PART_HEAD
};
#endif


Обнулить ячейки массивов в OnPlayerConnect/Disconnect тоже забыли.

Для текстдравов, индивидуальных для каждого игрока, отведён отдельный тип PlayerText (http://wiki.sa-mp.com/wiki/CreatePlayerTextDraw), у глобальных текстдравов и без того лимит.

От switch можно вообще избавиться и брать значения из двух массивов. Ячейки с индексами 0, 1 и 2 оставить пустыми (0.00 и 0 соответственно), а начиная с 3-й записать кол-во отнимаемого ХП и кол-во очков за попадание.
И да, как по-вашему логичнее назвать свойство игрока: "убийство" или "убийства"? Это я про названия массивов p_kill и p_death.

Desulaid
14.08.2015, 17:27
Переместил тему в подраздел для непроверенных мануалов, т.к. там ещё много чего стоило бы изменить.
Например, для ID оружий есть константы.
Для частей тела тоже, хоть куй и забыл объявить их:


#if !defined BODY_PART_TORSO
enum
{
BODY_PART_TORSO = 3,
BODY_PART_GROIN,
BODY_PART_LEFT_ARM,
BODY_PART_RIGHT_ARM,
BODY_PART_LEFT_LEG,
BODY_PART_RIGHT_LEG,
BODY_PART_HEAD
};
#endif


Обнулить ячейки массивов в OnPlayerConnect/Disconnect тоже забыли.

Для текстдравов, индивидуальных для каждого игрока, отведён отдельный тип PlayerText (http://wiki.sa-mp.com/wiki/CreatePlayerTextDraw), у глобальных текстдравов и без того лимит.

От switch можно вообще избавиться и брать значения из двух массивов. Ячейки с индексами 0, 1 и 2 оставить пустыми (0.00 и 0 соответственно), а начиная с 3-й записать кол-во отнимаемого ХП и кол-во очков за попадание.
И да, как по-вашему логичнее назвать свойство игрока: "убийство" или "убийства"? Это я про названия массивов p_kill и p_death.

Все исправим, все поправим :3

$continue$
14.08.2015, 23:40
Все исправим, все поправим :3

Чем то фраза напомнила:

http://www.youtube.com/watch?v=OIwANgsgg-w
:grin:

Desulaid
14.08.2015, 23:41
Чем то фраза напомнила:

http://www.youtube.com/watch?v=OIwANgsgg-w
:grin:

Ахахаахахахахахахахх, супер.

Desulaid
15.08.2015, 15:12
Упдате! :blum3: