Как добавить уровни в War3FT мод
Всем привет. Прошу прощения за долгий перерыв в обновлениях – не было времени и желания писать. Но вот сегодня я созрел, и по просьбам решил написать, как увеличить количество уровней в War3FT моде. В последнее время я вообще много работал с этим плагином, и даже достиг некоторых успехов. Впрочем, не будет отходить от темы. Кстати, в соседнем посте есть ссылка на программу для редактирования уровней в War3FT – покопавшись в ней, я заметил некоторые незначительные отличия от оригинала, и они мне не очень понравились. К тому же в ней нет формулы для расчета общего количества уровней, что может привести к неправильной балансировке. Собственно, поэтому я и решил написать этот урок. Итак, нам нужно начать со скачивания оригинала (с нашего сайта, или с сайта самого мода). Далее мы воспользуемся инструкцией некого мудрого Хрома, который любезно объяснил, что и где нужно менять, за что ему огромное спасибо. Чтобы не заставлять Вас ходить по другим форумам, выложу её тут, с некоторыми моими дополнениями. Для того, чтобы Вам было удобно работать с текстовыми файлами, советую скачать AkelPad (с нашего сайта, или со стороннего).
Увеличиваем количество уровней
Открываем файл /addons/amxmodx/scripting/constants.inl, AkelPad`ом (или, если поленились его скачать, блокнотом), и переходим на 240 строку (комбинация CTRL + G) . В ней и меняем 10 на нужное Вам количество уровней
#define MAX_LEVELS 10
#define MAX_LEVELS 22
if ( p_data[id][P_XP] == 0 && iStartLevel > 0 && iStartLevel <= 10 )
if ( p_data[id][P_XP] == 0 && iStartLevel > 0 && iStartLevel <= MAX_LEVELS )
else if ( p_data[id][P_LEVEL] < 10 )
на
else if ( p_data[id][P_LEVEL] < MAX_LEVELS ).
else if ( p_data[id][P_LEVEL] < 10 )
else if ( p_data[id][P_LEVEL] < MAX_LEVELS ).
else if ( p_data[iTargetID][P_LEVEL] < 10 )
else if ( p_data[iTargetID][P_LEVEL] < MAX_LEVELS ).
for ( i = 0; i < 11; i++ )
for ( i = 0; i < MAX_LEVELS+1; i++ ).
if ( iLevel < 0 || iLevel > 10 )
if ( iLevel < 0 || iLevel > MAX_LEVELS )
if ( iLevel < 0 || iLevel > 10 )
if ( iLevel < 0 || iLevel > MAX_LEVELS )
new Float:iLevelMultiplier = ( fCurrentLevel / 10.0 ) + 1.0;
new Float:iLevelMultiplier = ( fCurrentLevel / MAX_LEVELS ) + 1.0;
if ( iLevel < 0 || iLevel >= 11 )
if ( iLevel < 0 || iLevel >= MAX_LEVELS+1 )
Распределяем опыт по уровням
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 сервером.
Бонусы
get_time( "L %m/%d/%Y %H:%M:%:", szCurrentTime, 31 );
get_time( "L %m/%d/%Y %H:%M:%S:", szCurrentTime, 31 );
Похожие уроки
Понравился урок? Поделись со всеми!


Вопрос такой.
Откуда в варике эта формула?
Она не верна.
В варике всего 36 скилов и больше просто нет.
#define MAX_SKILLS 86 – значение неверно.
У вас это значение будет гонять плагин в холостую.
Плюс ко всему создаст в базе кучу не нужных абсолютно полей.
Это самое простое.
—
Когда-то я сам применял эту супер формулу,пока в коде не поковырялся как следует.
В варе нет ни каких формул и не будет если сами не добавите.
да я и сам не разобрался в ней. но во всех инструкциях она написана, я решил не убирать её.
на днях, если не забуду, попробую оставить 36, и посмотреть, как себя поведет плагин.
блеадь я хотел зделать себе 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)
new const Float:p_vampiric[5] = {0.10,0.20,0.30,0,40,0,50} // Vampiric Aura (skill 1)
десятичные деления обозначаются точкой, неужели так трудно заметить?
Дайте исходник на 270лвл плиз)
Лююддиии подскажите плизз, как мне исправить две вещи
1) Как мне исправить – как заходишь на сервер сразу становишься 133 лвл… а не 1
2) мага не убить… у него реген ппц
у него всего 100хп с awp бьёшь 649 урона, ему хоть бы что…..
сколько бы хп небыло его не убить…. (только орк с грены)
ПОМОГИТЕ – Skype – peldulum
судя по всему, мод неслабо изменен через ту самую прогу. проще будет обратиться к автору – SMaster его ник. можно найти на сайте http://perfect-soft.at.ua
а если нету файла constants.in то что делать пожалуйста помогите =) заранее спасибо
уже 10 раз сервер переустонавливаю(((!!!
сделал всё что на инструкции а выбивает ошибку когда серв запускаю!