Вниз

6 Ноябрь 2011

9

Как добавить уровни в War3FT мод

Всем привет. Прошу прощения за долгий перерыв в обновлениях – не было времени и желания писать.  Но вот сегодня я созрел, и по просьбам решил написать, как увеличить количество уровней в War3FT моде. В последнее время я вообще много работал с этим плагином, и даже достиг некоторых успехов. Впрочем, не будет отходить от темы. Кстати, в соседнем посте есть ссылка на программу для редактирования уровней в War3FT – покопавшись в ней, я заметил некоторые незначительные отличия от оригинала, и они мне не очень понравились. К тому же в ней нет формулы для расчета общего количества уровней, что может привести к неправильной балансировке. Собственно, поэтому я и решил написать этот урок. Итак, нам нужно начать со скачивания оригинала (с нашего сайта, или с сайта самого мода). Далее мы воспользуемся инструкцией некого мудрого Хрома, который любезно объяснил, что и где нужно менять, за что ему огромное спасибо. Чтобы не заставлять Вас ходить по другим форумам, выложу её тут, с некоторыми моими дополнениями. Для того, чтобы Вам было удобно работать с текстовыми файлами, советую скачать AkelPad (с нашего сайта, или со стороннего).

Увеличиваем количество уровней

Открываем файл /addons/amxmodx/scripting/constants.inl, AkelPad`ом (или, если поленились его скачать, блокнотом), и переходим на 240 строку (комбинация CTRL + G) . В ней и меняем 10 на нужное Вам количество уровней

#define MAX_LEVELS 10
Собственно, здесь-то и будет самая закавыка. Дело в том, что в war3ft моде у каждой расы/героя есть 3 прокачиваемых скила, и 1 ульта. И если неправильно выставить количество уровней, то какие-то скилы не получится докачать до конца. Так что я советую прикинуть желаемое количество уровней, потом выбрать ближайшее число, кратное 3 (для тех, кто ещё не прошел в школе: число, которое делится на 3 без остатка), а потом прибавить 1. Таким образом, если Вы хотите, чтобы каждый скил можно было прокачать до 10 уровня, то нужно выставить 3 (вида скилов) * 10 (уровней этих скилов) + 1 (и 1 уровень – для ульты). Для этого урока я выбрал 22 уровня. Итак, меняем количество уровней:
#define MAX_LEVELS 22
Таким же способом открываем файл /addons/amxmodx/scripting/war3ft.inl, и начинаем изменять все места, где есть старое количество уровней – то есть 10. Итак, на 646 строке меняем
if ( p_data[id][P_XP] == 0 && iStartLevel > 0 && iStartLevel <= 10 )
на
if ( p_data[id][P_XP] == 0 && iStartLevel > 0 && iStartLevel <= MAX_LEVELS )
далее ищем строку 721, в ней  меняем
else if ( p_data[id][P_LEVEL] < 10 )
на
else if ( p_data[id][P_LEVEL] < MAX_LEVELS ).
Таким же образом на 755 строке меняем
else if ( p_data[id][P_LEVEL] < 10 )
на
else if ( p_data[id][P_LEVEL] < MAX_LEVELS ).
Строка 969: меняем
else if ( p_data[iTargetID][P_LEVEL] < 10 )
на
else if ( p_data[iTargetID][P_LEVEL] < MAX_LEVELS ).
И последнее в этом файле: в строке 128 меняем
for ( i = 0; i < 11; i++ )
на
for ( i = 0; i < MAX_LEVELS+1; i++ ).
Теперь в файле /addons/amxmodx/scripting/war3ft/xp.inl находим 387 строку, и меняем
if ( iLevel < 0 || iLevel > 10 )
на
if ( iLevel < 0 || iLevel > MAX_LEVELS )
далее – строка 408, меняем
if ( iLevel < 0 || iLevel > 10 )
на
if ( iLevel < 0 || iLevel > MAX_LEVELS )
И наконец, на строке 732 меняем
new Float:iLevelMultiplier = ( fCurrentLevel / 10.0 ) + 1.0;
на
new Float:iLevelMultiplier = ( fCurrentLevel / MAX_LEVELS ) + 1.0;
С этим файлом всё. Теперь в файле /addons/amxmodx/scripting/war3ft/admin.inl ищем 93 строку, и меняем
if ( iLevel < 0 || iLevel >= 11 )
на
if ( iLevel < 0 || iLevel >= MAX_LEVELS+1 )

Распределяем опыт по уровням

Теперь открываем файл /addons/amxmodx/scripting/wa3ft/xp.h (AkelPad`ом или блокнотом), и переходим к самому занудному. Начиная с 48 строки, меняем
new iXPLevelShortTerm[11] = {0,150,300,600,1000,1500,2100,2800,3400,4500,5500};
new iXPLevelSaved[11] = {0,100,200,400,800,1600,3200,6400,12800,25600,51200};
// Amount of XP awarded when killing a user of this level
new iXPGivenShortTerm[11] = {10,15,25,35,40,50,60,70,80,90,95};
new iXPGivenSaved[11] = {6,8,10,12,14,16,18,20,24,28,32};

на

new iXPLevelShortTerm[MAX_LEVELS+1]				= {0,150,300,600,1000,1500,2100,2800,3400,4500,5500};
new iXPLevelSaved[MAX_LEVELS+1]					= {0,100,200,400,800,1600,3200,6400,12800,25600,51200};
// Amount of XP awarded when killing a user of this level
new iXPGivenShortTerm[MAX_LEVELS+1]				= {10,15,25,35,40,50,60,70,80,90,95};
new iXPGivenSaved[MAX_LEVELS+1]					= {6,8,10,12,14,16,18,20,24,28,32};

Здесь расписывается нужное количество опыта для получения каждого уровня. Строка new iXPLevelShortTerm[MAX_LEVELS+1] будет использоваться если опыт не сохраняется, new iXPLevelSaved[MAX_LEVELS+1]- если сохраняется, строки new iXPGivenShortTerm[MAX_LEVELS+1] и new iXPGivenSaved[MAX_LEVELS+1] отвечают за количество выдаваемого XP если опыт сохраняется и не сохраняется соотвественно. Обычно опыт на серверах сохраняют, поэтому нам нужно будет заполнить строки new iXPLevelSaved[MAX_LEVELS+1] и new iXPGivenSaved[MAX_LEVELS+1]. Итак, эти странные числа в фигурных скобках – количество опыта для получения уровня. К примеру, 0,100,200,400,800,1600,3200,6400,12800,25600,51200 значит, что если у игрока 0 опыта – то у него 0 уровень, если 100 – то первый, если 200 – то второй, если 400 – то третий, и так до десятого уровня. Теперь нам нужно по такому же принципу расписать свои параметры. Это очень важный пункт, потому что от этого будут зависеть уровни игроков, а значит, и их эффективность. Если с самого начала делать большие пробелы между уровнями, то это приведет к тому, что новичкам будет очень тяжело играть с другими, поэтому я советую первые 10 уровней сделать легкодоступными. Вот, например, распределение нужного опыта для 22 уровней:

new iXPLevelSaved[MAX_LEVELS+1]	= {0, 50, 100, 150, 250, 400, 700, 1000, 1400, 1800, 2500, 4000, 6000, 10000, 15000, 25000, 40000, 80000, 130000, 200000, 500000, 750000, 1500000}

Для удобства я выделил 5, 10, 15 и 20 уровни жирным. Первые 10 уровней можно будет заработать за полчасика, если хорошо играть, а до 22 придётся качаться долго. Аналогично нужно поступить с параметром new iXPGivenSaved[MAX_LEVELS+1]. Мой пример:

new iXPGivenSaved[MAX_LEVELS+1] = {8,10,12,14,16,18,20,24,28,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80}

Здесь, как видим, я не стал всё усложнять, и сделал всё в арифметической прогрессии. Если Вы не будете использовать быстрый режим игры (когда опыт не сохраняется, но зарабатывается легче), то нужные для этого параметры даже не нужно заполнять. Хотя будет всё-таки правильней, если Вы просто сделаете их такими же, как и параметры для сохраняемого опыта.

Расписываем прокачку скилов

Это – самое сложное и нудное, и не менее ответственное. Для начала расскажу, как вычислить параметр MAX_SKILLS. Скажу честно, я так и не разобрался, что он обозначает. Судя по названию – количество скилов. Изначально в моде 36 скилов: по 3 у каждой из 8 рас, ещё отдельно – 8 ультимейтов, и 4 пассивных скила (о них – ниже). Далее на каждом уровне должно прибавляться по 4 скила. В общем, путаница какая-то, поэтому я лишь приведу формулу для его расчета: 36 + («ваш максимальный уровень» – 10) * 4. То есть для 22 уровней мы получим: 36 + (22 – 10) *4 = 36 + 12*4 = 36 + 48 = 86. Не забывайте, что по правилам нужно сначала умножать/делить, а потом уже складывать/вычитать. Для вычисления   MAX_SKILLS и MAX_SKILL_LEVEL  нужно отнять от количества уровней 1 и разделить на 3. Например,  (22-1)/3 = 7. Итак, откроем файл /addons/amxmodx/scripting/war3ft/constants.inl. Начиная с 544 строки меняем

#define MAX_SKILLS				36
#define MAX_RACE_SKILLS				3
#define MAX_SKILL_LEVEL				3
#define MAX_ULTIMATE_LEVEL			1

на

#define MAX_SKILLS				86
#define MAX_RACE_SKILLS				7
#define MAX_SKILL_LEVEL				7
#define MAX_ULTIMATE_LEVEL			1

Теперь перейдем к самим скилам. Вот пример первого скила расы Undead:

new const Float:p_vampiric[3] =		{0.10,0.20,0.30}	// Vampiric Aura (skill 1) 

Разберем все части по отдельности:

1. Float:p_vampiric[3] - здесь 3 в скобках значит максимальный уровень скила, нужно заменить на MAX_SKILL_LEVEL, и получить:
Float:p_vampiric[MAX_SKILL_LEVEL].

2. {0.10,0.20,0.30}- здесь числа означают коэффициент мощности этого скила. поскольку у нас в моде будет 7 уровней для скила, нам нужно прописать ещё 4 числа для ещё 4 уровней, и получить

{0.05,0.1,0.15,0.2,0.25,0.3,0.4}.

Тогда на 7 уровне Undead будет получать 40% нанесенного урона обратно как здоровье. Если Вы опубликуете для игроков подобную информацию, у них будет хороший стимул качаться до максимального уровня. 3. // Vampiric Aura (skill 1) – это просто комментарий к скилу, для удобства. менять не нужно (хотя можете для себя перевести) В конце концов, строка с этим скилом должна выглядеть так: new const Float:p_vampiric[MAX_SKILL_LEVEL] = {0.05,0.1,0.15,0.2,0.25,0.3,0.4} // Vampiric Aura (skill 1)Кстати, знаете, чем отличаются расы (Нежить, Люди, Орки, и Эльфы) от героев (Маг, Шпион, Охотник, и Лорд Мертвых)? Тем, что у последних есть ещё и пассивные скилы, которые прокачиваются сами на каждом уровне. Вот пример такого скила: new const Float:p_resistant[11] = {0.02, 0.04, 0.08, 0.12, 0.16, 0.20, 0.24, 0.28, 0.32, 0.36, 0.40} // Resistant Skin (Skill 4) В этом случае нужно заменить new const Float:p_resistant[11] на new const Float:p_resistant[MAX_LEVELS+1], и прописать значения для всех уровней, начиная с нулевого. У нас получится 23 параметра. К счастью, пассивных скилов только 4 – по одному у каждого героя. Теперь нам нужно сделать то же самое со всеми скилами, включая пассивные. 8 персонажей, по 3 обычных скила  у каждого – это 24, и ещё 4 героя с пассивными скилами – итого 28 параметров. Немного отличаются следующие скилы: new const p_devotion = 15 // Devotion Aura – здесь число обозначает прибавляемое на каждом уровне HP (2 скил у Human`а). Так, если Вы оставите его таким же, на 7 уровне у Human`а будет 100 + 7*15 = 205 HP. Многовато, не находите? Поэтому стоит немного уменьшить этот параметр, например до 10. Тогда с каждым уровнем скила будет прибавляться 10 HP. new const Float:p_heal[3] = {6.0,4.0,2.0} // Healing Wave (skill 1) – по умолчанию этот скил делает «Волну здоровья» каждые 6, 4, и 2 секунды на 1, 2 и 3 уровне соответственно. Поскольку секунду наш сервер поделить не сможет, нет смысла выставлять нецелые значения (2.5, и т.д.)

Создаём спрайты

Теперь нам осталось только создать спрайты, без которых сервер просто не запустится. Они используются если кто-то вводит в чат /icons – тогда над тиммейтами он увидит их расу и уровень. Поскольку создание этих самых спрайтов с нуля – это отдельный урок, я покажу лишь самый простой способ: нужно просто скопировать спрайт десятого уровня (/sprites/warcraft3/level/a_level_10.spr) в какую-нибудь отдельную папку, и там его переименовать в a_level_11.spr, и повторять это пока не сделаете нужное количество спрайтов. Ниже есть ссылка на спрайты до 22 уровня.

Компилируем

Ну и последний шаг – это компиляция плагина. Для этого нужно скачать компилятор, и распаковать его в папку /addons/amxmodx/scripting. После этого нам нужно выделить папку /addons/amxmodx/scripting/war3ft и файл /addons/amxmodx/scripting/war3ft.sma, и перенести их на compile.exe, который должен находиться там же. В результате запустится компилятор, и нужно будет подождать, пока плагин соберется. На старом компьютере с процессором Intel в 2 ГГц этот процесс занимал у меня полторы минуты, на новом, с процессором Intel core i3 – 12 секунд. Готовый плагин будет лежать в папке /addons/amxmodx/scripting/compilled. Осталось только закинуть все файлы мода на сервер, включить нужные модули, и мы можем наслаждаться собственным War3FT сервером.

Бонусы

Раз Вам всё равно нужно будет компилировать плагин, предлагаю сразу исправить и косяк с выдачей опыта. Открываем файл /scripting/admin.inl, и переходим на 499 строку. Там мы видим:
get_time( "L %m/%d/%Y %H:%M:%:", szCurrentTime, 31 );
Стоит нам добавить после M:% символ S, чтобы получилось
get_time( "L %m/%d/%Y %H:%M:%S:", szCurrentTime, 31 );
и скомпилировать плагин, как эта досадная ошибка исчезнет.
А ещё, как и обещал выше, выкладываю спрайты с 11 по 22 уровни.
Если Вам лень самому увеличивать количество уровней в War3FT, Вы можете воспользоваться нашим CS 1.6 хостингом, который предоставляет свои собственные плагины, в список которых входит и отлично сбалансированный War3FT плагин на 34 уровня. А также в нём изменены некоторые скилы, которые отлично подходят к обновленному моду.

Похожие уроки

  1. Установка плагинов на сервер – часть 2
  2. War3 мод для CS 1.6 сервера
Понравился урок? Поделись со всеми!
  1. 12 Ноя 2011

    Вопрос такой.
    Откуда в варике эта формула?
    Она не верна.
    В варике всего 36 скилов и больше просто нет.

    #define MAX_SKILLS 86 – значение неверно.
    У вас это значение будет гонять плагин в холостую.
    Плюс ко всему создаст в базе кучу не нужных абсолютно полей.
    Это самое простое.


    Когда-то я сам применял эту супер формулу,пока в коде не поковырялся как следует.
    В варе нет ни каких формул и не будет если сами не добавите.

    Ответить
  2. 12 Ноя 2011

    да я и сам не разобрался в ней. но во всех инструкциях она написана, я решил не убирать её.
    на днях, если не забуду, попробую оставить 36, и посмотреть, как себя поведет плагин.

    Ответить
  3. Марик
    3 Янв 2012

    блеадь я хотел зделать себе 16 лвл а одна ошыбка что делать.
    может здесь ошыбка.а?
    // Constants for Abilities
    new const Float:p_vampiric[5] = {0.10,0.20,0.30,0,40,0,50} // Vampiric Aura (skill 1)
    new Float:p_unholy[5] = {265.0,285.0,300.0,315,0,330} // Unholy Aura (skill 2)
    new Float:p_unholy_dod[5] = {33.3,66.6,100.0,133,3,166} // Unholy Aura (skill 2)
    new const Float:p_levitation[5] = {0.8,0.6,0.4,0,2,0,0} // Levitation (skill 3)

    new const p_invisibility[5] = {200,175,150,125,100} // Invisibility (skill 1)
    new const p_devotion = 5 // Devotion Aura (skill 2)
    new const Float:p_bash[5] = {0.10,0.20,0.30,0,40,0,50} // Bash (skill 3)

    new const Float:p_critical[5] = {0.25,0.50,0.75,0,100,0,125} // Critical Strike (skill 1)
    new const Float:p_grenade[5] = {2.0,3.0,4.0,5,0,6} // Critical Grenade (skill 2)
    new const Float:p_ankh[5] = {0.333,0.666,0,999.0,999,0,1332} // Equipment reincarnation (skill 3)

    new const Float:p_evasion[5] = {0.1,0.175,0.25,0,150,0,200} // Evasion (skill 1)
    new const Float:p_thorns[5] = {0.05,0.1,0.15,0,2,0,25} // Thorns Aura (skill 2)
    new const Float:p_trueshot[5] = {0.1,0.2,0.3,0,4,0,5} // Trueshot Aura (skill 3)

    new const Float:p_phoenix[5] = {0.333,0.666,0,999.0,999,0,1332} // Phoenix (skill 1)
    new const p_phoenix_dod[5] = {300,600,900,1200,1500} // Phoenix – DOD (skill 1)
    new const Float:p_banish[5] = {0.05,0.10,0.15,0,2,0,25} // Banish (skill 2)
    new const Float:p_mana[5] = {0.02,0.04,0.08,0,16,0,24} // Siphon Mana (skill 3)
    new const Float:p_resistant[16] = {0.02, 0.04, 0.08, 0.12, 0.16, 0.20, 0.24, 0.28, 0.32, 0.36, 0.40, 0.44, 0.48, 0.52, 0.56, 0.58, 0.60} // Resistant Skin (Skill 4)

    new const Float:p_heal[5] = {6.0,4.0,2.0,0,0,0} // Healing Wave (skill 1)
    new const Float:p_hex[5] = {0.05,0.10,0.15,0,2,0,25} // Hex (skill 2)
    new const p_serpent[5] = {1,2,3,4,5} // Serpent Ward (skill 3)
    new const Float:p_concoction[16] = {0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10, 0.15, 0.20, 0.25,0.30, 0.35, 0.40, 0.45} // Unstable Concoction (Skill 4)

    new const Float:p_fan[5] = {0.05,0.10,0.15,0,20,0,25,} // Fan of Knives (skill 1)
    new const Float:p_blink[5] = {0.333,0.666,0,999.0,999,0,1332} // Blink (skill 2)
    new const Float:p_shadow[5] = {0.05,0.10,0.15,0,20,0,25} // Shadow Strike (skill 3)
    new const Float:p_harden[16] = {0.03, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80} // Hardened Skin (Skill 4)

    new const Float:p_impale[5] = {0.05,0.1,0.15,0,20,0,25} // Impale (skill 1)
    new const Float:p_spiked[5] = {0.05,0.1,0.15,20,0,25} // Spiked Carapace (skill 2)
    new const Float:p_carrion[5] = {0.05,0.10,0.15,20,0,25} // Carrion Beetle (skill 3)
    new const Float:p_orb[16] = {0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45} // Orb of Annihilation (Skill 4)

    Ответить
  4. 3 Янв 2012

    new const Float:p_vampiric[5] = {0.10,0.20,0.30,0,40,0,50} // Vampiric Aura (skill 1)

    десятичные деления обозначаются точкой, неужели так трудно заметить?

    Ответить
  5. 29 Янв 2012

    Дайте исходник на 270лвл плиз)

    Ответить
  6. Dmitry
    15 Фев 2012

    Лююддиии подскажите плизз, как мне исправить две вещи

    1) Как мне исправить – как заходишь на сервер сразу становишься 133 лвл… а не 1

    2) мага не убить… у него реген ппц

    у него всего 100хп с awp бьёшь 649 урона, ему хоть бы что…..

    сколько бы хп небыло его не убить…. (только орк с грены)

    ПОМОГИТЕ – Skype – peldulum

    Ответить
    • 15 Фев 2012

      судя по всему, мод неслабо изменен через ту самую прогу. проще будет обратиться к автору – SMaster его ник. можно найти на сайте http://perfect-soft.at.ua

      Ответить
  7. fsd
    28 Мар 2012

    а если нету файла constants.in то что делать пожалуйста помогите =) заранее спасибо

    Ответить
  8. Slava17
    9 Апр 2012

    уже 10 раз сервер переустонавливаю(((!!!
    сделал всё что на инструкции а выбивает ошибку когда серв запускаю!

    Ответить

Поделись своими мыслями!

(обязательно)
(обязательно)

Почтовые адреса не публикуются.

Подпишись на комментарии

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: