Оказалось, что многие карты в паке не запускаются. Запускаются те, что на небольшое количество игроков, и некоторые большие карты. Пока непонятно, почему так произошло. Сорян. Скоро будет версия 0.9.1, где все карты будут запускаться.
Герои кампании получают 11 уровень и легендарный ультимейт.
Доработаны Огры и Наги.
Добавлены: раса Высших Эльфов, новые герои, новые войска.
ДОПОЛНИТЕЛЬНЫЕ ИЗМЕНЕНИЯ
Теперь раса выбирается сразу, в холле, перед появлением рабочих.
Самые сильные герои кампании, такие как Архимонд и Кенариус, на 11 уровне имеют Divine тип защиты. Этот тип защиты по канонам игры пробивается только типом атаки Chaos. В MCH против Divine можно внести небольшой импакт типами атаки Hero и Magic, а также с помощью Спеллов.
Бонус к скорости и регенерации наг на воде.
Поддержка игры за все новые расы игроками-компьютерами. ИИ выбирает их самостоятельно и случайно. Также ИИ может играть за Cenarius, и в будущих обновлениях сможет играть за остальных героев.
Исправлены все известные баги, фризы и недоработки предыдущей версии.
ПОДРОБНЫЕ ИЗМЕНЕНИЯ
ЭКСТРА УЛЬТИМЕЙТЫ героев кампании на 11 уровне:
Артес - Взять Frostmourne - могущественный облик с мечом. Тип атаки: Chaos, дополнительный урон, и лечение при убийстве врагов;
Антонидос - Magic Field - создать огромное магическое поле, в котором враги получают урон до тех пор, пока герой не умрёт, выйдет за пределы, или закончится действие заклинания;
Гром - Fel Form - герой и орда преобразуются в Fel форму, получая тип атаки chaos. Гром получает способность Lunge - прыгнуть на жертву, нанеся ей урон, в зависимости от расстояния и высоты, откуда был начат прыжок;
Тралл - Hammer Throw - бросок молота, который создаёт взрыв по достижении цели; Lightning Strike - удар молниями по области;
Артес (злой) - Lich King Form - стать королём-личем, с Divine защитой и Chaos атакой, возможностью вызвать Sindragosa и управлять всеми мертвецами на карте;
Кел-Тузед - Lich Form - получение способностей лича и возможность призиывать Infernals или Fel Stalkers;
Архимонд - Divine Form - могущественный облик с Chaos атакой и Divine защитой, и способностью призывать Dooms;
Тиренд - Вызвать отряд Беорнов, имеющих Fel атакую;
Фарион - Wisp Attack - призвать светлячков из ближайших живых деревьев, которые летят на цель и взрываются;
Кенариус - Demigod Form - увеличение здоровья, Chaos атака, Divine защита, усиление способностей; восстановление срубленных деревьев при использовании Tranquility;
Иллидан - Demon Form перманентно; Portal - создаёт портал в указанной точке на карте. Любой может туда войти и выйти в течение 60 секунд; Dimensional Gate - призвать врата, из которых появляются демоны и сражаются на стороне Иллидана;
Рексар - Ogron - призвать до 2-х сильных монстров;
Имеют Sun Wells, на которых армия восстанавливает здоровье.
Мана колодцев и здоровье войск восстанавливаются только днём.
В лавке есть предмет изменения времени суток.
Основные юниты - Archer, Spell Breaker и Cavalry (наездники на жар птицах);
Спелл кастеры - Priest, Sorceress, (Spell Breaker);
Воздушные - Pegasus, Dragonhawk;
Артиллерия - Баллиста.
Герои
Elf Paladin. Способности: Health Restoration - постепенное восстановление здоровья союзника, или сжигание здоровья у нежити; Holy Shield - купол с защитой от стрел и магии, под которым можно укрыть союзников; Elven Step - ускорение союзников; Guardian Angel - призывает ангела.
Elven Mage. Способности: Mana Gain - наделить маной или забрать её; Flash - оглушение в указанной области; Mana Drain Aura - пассивное высасывание маны; Return - телепортация любых видимых войск к герою.
Рабочие огров теперь могут надевать броню во время защиты базы.
Сделан сильный дисбалансный шаг в сторону изменения потребления пищи у огров и их скорости. Теперь все двухголовые юниты, включая основных, потребляют от 4 единиц пищи, и имеют соответствующую цену и боевую мощь. Конечно, это неправильно с т.з. баланса варкрафта, но логически обосновано, потому что огр мощнее орка, и заслуживает дополнительную единицу пищи. Бонусом, количество юнитов в армии огра уменьшается раза в 2, и ими легче управлять игрокам с плохим микроконтролем. Кроме того, ограм можно провести исследование, увеличивающее их базовую скорость до 350, какой она была в WarCraft II.
Герои
Ogre Warlock. Способности: Carrion Swarm, Raise Dead Ogre - навсегда создать скелета из трупа огра или орка, либо временно призвать скелета из обычного трупа, Life Drain и Death and Decay.
Ogre Lord. Имеет стандартные способности. Ульт - вызов Red Dragon - дракона 10 уровня.
Ogre Alchemist со стандартными способностями. Герой перемещён из таверны в расу огров.
Beastmaster со стандартными способностями. Также перемещён.
Войска
Ogre Magi - спеллкастер имеет ближний бой с возможностью прокачки в дальний. Способности: Bloodlust, Killgrogg's Eye и Cripple.
Регенерируют только в воде, на базе и под дождём; а также имеют повышенню скорость перемещения;
Марголы знахари умеют ставить варды только на воде.
Герои
Hydra - растёт с каждым уровнем и увеличивает дальность атаки. Способности: War Stomp, Regeneration (пассивная) - ускоренная до 25 раз регенерация собственного здоровья, Poison (пассивная) - отравление при атаке и Hydra's Lives - создание гидры после смерти.
Snake. Способности: Venomous Strike - как отравленный нож, Tidal Wyrms - призыв червей из трупов, Hypnosis - пассивное замедление врагов и увороты, Caustic Submerge - временная неуязвимость и создание вокруг себя едкой отравляющей области.
Naga Royal Guard. Способности: Crushing Wave, Frost Bolt, Thorns, Parade of Elementals - вызов большого количества водных элементалей.
Королева змей. Стандартные способности. Перемещена из таверны.
Нежить
Обновлены способности Кел-Тузада: Raise of Tombstones - восстание могил, окружающих врагов, Raise Dead - призвать скелетов из нескольких трупов, Dark Ritual - превратить здоровье союзника в ману, Plague Cloud - чумное облако, которое заражает живых.
Артесу и героям-демонам добавлена телепортация как в кампании;
Ультимейт Артеса Animate Dead был изменён на оригинальную способность из RoC: продолжительность жизни мертвецов увеличена, убрана неуязвимость.
Архимонд, изменены способности: Огненный Дождь, Гончие, Перст Смерти и Earthquake.
Новые герои
Markshader в Таверне. Имеет способности: Throw Axe - оглушение врага, Miner - вызов до 6 рабочих, способных сражаться и добывать увеличенное количество ресурсов, Aura of Pillage - грабёж враждебных войск во время битвы и Prospecting - разработка месторождения нового рудника.
Шандриса у Ночных Эльфов. Имеет способности: Volley - град стрел по области, Smoke - оглушение по области, Penetrating Shot - узкая линия огромного урона и Stab - отравленный нож с большим уроном.
Прочие фитчи
Изменена система выбора рас. Теперь вы выбираете расу в ратуше в начале игры.
Убраны юниты из кампании, которые раньше нанимались в казармах.
У Альянса покупка лошадей перенесена в конюшни, которые можно построить, если достроить Farm.
Добавлены соундсеты для Archimonde, Antonidas.
ИИ умеет покупать Шредеры.
ИИ умеет пользоваться Зеппелинами.
ИИ умеет покупать камни затмения и его аналоги.
Добавлена возможность передачи войск союзнику.
Лишения
Убраны некоторые герои кампании. Но они вернутся в следующих обновлениях более проработанными и без багов.
Известные проблемы
Если не все игроки выбрали расу, то в центре карты могут быть слышны посторонние звуки. Возможно будет исправлено в следующем обновлении.
IzobretatelBoom, я создал дополнительную логическую переменную, которая проверяет был ли создан погодный эффект. Если да, то эффект удаляется. Вроде от некоторых фризов это избавило. Но всё равно глобально вызывание погодного эффекта создаёт фриз, ничего не сделать как я понимаю.
Функция Wait у меня создана, потому что если удалить и создать эффект одновременно, возникнет баг звука. И звук погодного эффекта может остаться навсегда.
Нашёл в чём ещё была проблема. В редакторе ИИ я неверно указал последовательность строительства войск и апгрейдов. А когда ИИ не видит возможность выполнить приказ, он начинает жёстко фризить. Поэтому он фризит если в списке целей у него есть покупка дирижаблей.
ShadowNinja, в общем собрал такой же ИИ. И точно такой же баг. На этот раз сразу после создания Замка. Непонятно в чём дело. Варкрафт задолбал. В нём ничего никогда не работает.
EugeAl, не сбивает. Я включил ложный путь для ИИ скрипта. ИИ ничего не делал, только способности автоматически использовал. Но он не уводил назад раненых. Но если это сбивает приказ, то и не нужно. Хотя бы придумать как активировать автокаст способностей. Если включить ИИ для человека, он не активируется никак.
ApEJI, вся проблема только в том, что эффект должен быть привязан к герою. А в редакторе объектов масштаб эффектов способностей не масштабируется. Ну что ж, придётся вернуться к функции move unit.
Уважаемый автор, мне очень понравилась твоя модель. Я создал способность огненного купола для эльфийского паладина. Все, кто находится в куполе, имеют невосприимчивость к дальнобойному урону и магии. Я создал 3 уровня способности, и чем выше уровень, тем больше становится купол. Изначально я создал даммика, который каждые 0.01 секунды телепортируется к герою. Но в целях оптимизации, я решил сделать 3 версии эффекта разного размера, и прикреплять его к герою. С помощью ME я кривыми ручками просто увеличил масштаб, и получил такой артефакт:
Скажи, можно ли как-то через ME добиться масштабирования 0.9, 1.35 и 1.85 для этой модели? Или иными оптимизированными путями добаиться адекватного скейлинга? Или может тебе не трудно дополнительно залить разные версии масштабирования?
Но выбор юнитов в группу на гуи будет в любом случае утечен из-за необнуления локалки в одной из функций в коде
rsfghd, а если я эту группу использую одноразово, и затем удаляю через Destroy (в кастомном редакторе варика эта функция есть)?
Если всё равно утечка, то получается, мне через гуи остаётся только создать перманентную группу, которую просто периодически очищать, и добавлять туда юнитов по одному (например при реакции на какое-то событие)?
Вообще это проблема. У меня в карте несколько периодичных триггеров для ауры, которые постоянно создают-удаляют группу. Если будут играть 24 игрока героями, юзающими эти триггеры, то фризы обеспечены. Похоже, придётся через джасс это делать.
Выходит, что у нас массив по-умолчанию = 1, и если я переназначу переменную с индексом = 1 через Create Group, то будет утечка группы, которая была создана при инициализации карты?
rsfghd, можно ли это как-то оптимизировать? Если указать массив = 1, но в триггерах указать группу через Set Variable например индекс 24, у меня создастся 24 группы или останется только 1-ая и 24-ая?
Ещё вопрос, на случай если ответ - групп будет две:
А если я буду через условия перебирать индекс от 1 до 24, у меня не будут в результате проверки создаваться группы?
Infernall, ого! Большое спасибо, не ожидал, да ещё и так оперативно. Сейчас буду пробовать поменять масштаб. Подскажите, какие параметры крутить у аттача?
Каким образом в этой программе редактировать поворот кости? Даётся 4 параметра для редактирования. Не совсем понятно что это за параметры, и нигде не написано что это за оси. Допустим, первые 2 это X и Y. Тогда остальные 2 что значат?
Исправьте пожалуйста модель, чтобы к Chest можно было прикрепить нормально броню. Я ковырялся в ME, так и не смог этого добиться. Например, меняю поворот - меняется масштаб. Меняю масштаб - ничего не происходит. И т.д. В общем я не шарю в этом. Авторство укажу!
Нашёл в чём была причина. Она оказалась не в скрипте. Дело в том, что в моей карте использовался ежесекундный реплейсмент зданий. И почему-то при создании холла нежити, оно издавало звук, но не в месте его создания, а в центре карты. Ещё какой-то из холлов создавал звук сотворения водного элема. Это было трудно отследить, потому что после выбора расы, триггер прекращал действовать, и звуки исчезали. Но если кто-то из игроков её не выбирал, звуки продолжались.
EugeAl, нет, на пустой карте такой баг не встречается. Но именно активация скрипта инициализирует баг. (Полный код в посте ниже.) Может какие-то переменные перекликаются. Но я прочёл код, и хотя плохо разбираюсь в jass, не нашёл ничего что могло бы вызывать эти звуки. Буду разбираться.
Makeba, да, точно, верное замечание. Действительно, у меня в корне карты есть этот код. Я делал это давно, и уже забыл. Запомнил что автор когда говорил что он сделан Blizzard, и мне запомнилось что он вшит в игру, но оказалось это не так. Вот изменённый код автора, который у меня в карте:
//===========================================================================
// Counts key structures owned by a player and his or her allies, including
// structures currently upgrading or under construction.
//
// Key structures: Town Hall, Great Hall, Tree of Life, Necropolis
//
function LivingPlayerHallsFilter takes nothing returns boolean
return (IsUnitAliveBJ(GetFilterUnit()) and IsUnitType(GetFilterUnit(),UNIT_TYPE_TOWNHALL))
endfunction
function CountLivingPlayerTownHalls takes player whichPlayer returns integer
local group g
local integer matchedCount
local boolexpr b=Filter(function LivingPlayerHallsFilter)
set g = CreateGroup()
call GroupEnumUnitsOfPlayer(g, whichPlayer, b)
set matchedCount = CountUnitsInGroup(g)
call DestroyGroup(g)
call DestroyBoolExpr(b)
set b=null
set g=null
return matchedCount
endfunction
function Custom_MeleeGetAllyKeyStructureCount takes player whichPlayer returns integer
local integer playerIndex
local player indexPlayer
local integer keyStructs
// Count the number of buildings controlled by all not-yet-defeated co-allies.
set keyStructs = 0
set playerIndex = 0
loop
set indexPlayer = Player(playerIndex)
if (PlayersAreCoAllied(whichPlayer, indexPlayer)) then
set keyStructs = keyStructs + CountLivingPlayerTownHalls(indexPlayer)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "townhall", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "greathall", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "treeoflife", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "necropolis", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "custom_h030", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "custom_h01C", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "custom_h012", true, true)
// set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "custom_h013", true, true)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h013',indexPlayer)//Never use group functions for this, just count living units for player. Much better idea.
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h014',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h015',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h01C',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h01E',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h01F',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h012',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h02F',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h02J',indexPlayer)
// set keyStructs = keySructs + CountLivingPlayerUnitsOfTypeId('h030',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h000',indexPlayer)//Non-modded human custom ids
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h00D',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('h00E',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('o00C',indexPlayer)//Non-modded orc custom ids
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('o00D',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('o00E',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('e00M',indexPlayer)//Non-modded night elf custom ids
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('e00N',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('e00O',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('u00C',indexPlayer)//Non-modded undead custom ids
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('u00D',indexPlayer)
// set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId('u00E',indexPlayer)
endif
set playerIndex = playerIndex + 1
exitwhen playerIndex == bj_MAX_PLAYERS
endloop
return keyStructs
endfunction
//===========================================================================
function Custom_MeleePlayerIsCrippled takes player whichPlayer returns boolean
local integer allyStructures = MeleeGetAllyStructureCount(whichPlayer)
local integer allyKeyStructures = Custom_MeleeGetAllyKeyStructureCount(whichPlayer)
// Dead teams are not considered to be crippled.
return (allyStructures > 0) and (allyKeyStructures <= 0)
endfunction
//===========================================================================
// Test each player to determine if anyone has become crippled.
//
function Custom_MeleeCheckForCrippledPlayers takes nothing returns nothing
local integer playerIndex
local player indexPlayer
local force crippledPlayers = CreateForce()
local boolean isNowCrippled
local race indexRace
// The "finish soon" exposure of all players overrides any "crippled" exposure
if bj_finishSoonAllExposed then
return
endif
// Check each player to see if he or she has been crippled or uncrippled.
set playerIndex = 0
loop
set indexPlayer = Player(playerIndex)
set isNowCrippled = Custom_MeleePlayerIsCrippled(indexPlayer)
if (not bj_playerIsCrippled[playerIndex] and isNowCrippled) then
// Player became crippled; start their cripple timer.
set bj_playerIsCrippled[playerIndex] = true
call TimerStart(bj_crippledTimer[playerIndex], bj_MELEE_CRIPPLE_TIMEOUT, false, function MeleeCrippledPlayerTimeout)
if (GetLocalPlayer() == indexPlayer) then
// Use only local code (no net traffic) within this block to avoid desyncs.
// Show the timer window.
call TimerDialogDisplay(bj_crippledTimerWindows[playerIndex], true)
// Display a warning message.
call DisplayTimedTextToPlayer(indexPlayer, 0, 0, bj_MELEE_CRIPPLE_MSG_DURATION, "|cffffcc00"+udg_RevealWarning+"|r")
endif
elseif (bj_playerIsCrippled[playerIndex] and not isNowCrippled) then
// Player became uncrippled; stop their cripple timer.
set bj_playerIsCrippled[playerIndex] = false
call PauseTimer(bj_crippledTimer[playerIndex])
if (GetLocalPlayer() == indexPlayer) then
// Use only local code (no net traffic) within this block to avoid desyncs.
// Hide the timer window for this player.
call TimerDialogDisplay(bj_crippledTimerWindows[playerIndex], false)
// Display a confirmation message if the player's team is still alive.
if (MeleeGetAllyStructureCount(indexPlayer) > 0) then
if (bj_playerIsExposed[playerIndex]) then
call DisplayTimedTextToPlayer(indexPlayer, 0, 0, bj_MELEE_CRIPPLE_MSG_DURATION, GetLocalizedString("CRIPPLE_UNREVEALED"))
else
call DisplayTimedTextToPlayer(indexPlayer, 0, 0, bj_MELEE_CRIPPLE_MSG_DURATION, GetLocalizedString("CRIPPLE_UNCRIPPLED"))
endif
endif
endif
// If the player granted shared vision, deny that vision now.
call MeleeExposePlayer(indexPlayer, false)
endif
set playerIndex = playerIndex + 1
exitwhen playerIndex == bj_MAX_PLAYERS
endloop
endfunction
//===========================================================================
// Determine if the lost unit should result in any defeats or victories.
//
function Custom_MeleeCheckLostUnit takes unit lostUnit returns nothing
local player lostUnitOwner = GetOwningPlayer(lostUnit)
// We only need to check for mortality if this was the last building.
if (GetPlayerStructureCount(lostUnitOwner, true) <= 0) then
call MeleeCheckForLosersAndVictors()
endif
// Check if the lost unit has crippled or uncrippled the player.
// (A team with 0 units is dead, and thus considered uncrippled.)
call Custom_MeleeCheckForCrippledPlayers()
endfunction
//===========================================================================
// Determine if the gained unit should result in any defeats, victories,
// or cripple-status changes.
//
function Custom_MeleeCheckAddedUnit takes unit addedUnit returns nothing
local player addedUnitOwner = GetOwningPlayer(addedUnit)
// If the player was crippled, this unit may have uncrippled him/her.
if (bj_playerIsCrippled[GetPlayerId(addedUnitOwner)]) then
call Custom_MeleeCheckForCrippledPlayers()
endif
endfunction
//===========================================================================
function Custom_MeleeTriggerActionConstructCancel takes nothing returns nothing
call Custom_MeleeCheckLostUnit(GetCancelledStructure())
endfunction
//===========================================================================
function Custom_MeleeTriggerActionUnitDeath takes nothing returns nothing
if (IsUnitType(GetDyingUnit(), UNIT_TYPE_STRUCTURE)) then
call Custom_MeleeCheckLostUnit(GetDyingUnit())
endif
endfunction
//===========================================================================
function Custom_MeleeTriggerActionUnitConstructionStart takes nothing returns nothing
call Custom_MeleeCheckAddedUnit(GetConstructingStructure())
endfunction
//===========================================================================
function Custom_MeleeTriggerActionAllianceChange takes nothing returns nothing
call MeleeCheckForLosersAndVictors()
call Custom_MeleeCheckForCrippledPlayers()
endfunction
//===========================================================================
function MeleeInitVictoryDefeatCustomized takes nothing returns nothing
local trigger trig
local integer index
local player indexPlayer
// Create a timer window for the "finish soon" timeout period, it has no timer
// because it is driven by real time (outside of the game state to avoid desyncs)
set bj_finishSoonTimerDialog = CreateTimerDialog(null)
// Set a trigger to fire when we receive a "finish soon" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig , EVENT_GAME_TOURNAMENT_FINISH_SOON)
call TriggerAddAction(trig , function MeleeTriggerTournamentFinishSoon)
// Set a trigger to fire when we receive a "finish now" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig , EVENT_GAME_TOURNAMENT_FINISH_NOW)
call TriggerAddAction(trig , function MeleeTriggerTournamentFinishNow)
// Set up each player's mortality code.
set index = 0
loop
set indexPlayer = Player(index)
// Make sure this player slot is playing.
if ( GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING ) then
set bj_meleeDefeated[index]=false
set bj_meleeVictoried[index]=false
// Create a timer and timer window in case the player is crippled.
set bj_playerIsCrippled[index]=false
set bj_playerIsExposed[index]=false
set bj_crippledTimer[index]=CreateTimer()
set bj_crippledTimerWindows[index]=CreateTimerDialog(bj_crippledTimer[index])
call TimerDialogSetTitle(bj_crippledTimerWindows[index] , MeleeGetCrippledTimerMessage(indexPlayer))
// Set a trigger to fire whenever a building is cancelled for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig , indexPlayer , EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL , null)
call TriggerAddAction(trig , function Custom_MeleeTriggerActionConstructCancel)
// Set a trigger to fire whenever a unit dies for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig , indexPlayer , EVENT_PLAYER_UNIT_DEATH , null)
call TriggerAddAction(trig , function Custom_MeleeTriggerActionUnitDeath)
// Set a trigger to fire whenever a unit begins construction for this player
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig , indexPlayer , EVENT_PLAYER_UNIT_CONSTRUCT_START , null)
call TriggerAddAction(trig , function Custom_MeleeTriggerActionUnitConstructionStart)
// Set a trigger to fire whenever this player defeats-out
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig , indexPlayer , EVENT_PLAYER_DEFEAT)
call TriggerAddAction(trig , function MeleeTriggerActionPlayerDefeated)
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig , indexPlayer , EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig , function MeleeTriggerActionPlayerLeft)
// Set a trigger to fire whenever this player changes his/her alliances.
set trig = CreateTrigger()
call TriggerRegisterPlayerAllianceChange(trig , indexPlayer , ALLIANCE_PASSIVE)
call TriggerRegisterPlayerStateEvent(trig , indexPlayer , PLAYER_STATE_ALLIED_VICTORY , EQUAL , 1)
call TriggerAddAction(trig , function Custom_MeleeTriggerActionAllianceChange)
else
set bj_meleeDefeated[index]=true
set bj_meleeVictoried[index]=false
// Handle leave events for observers
if ( IsPlayerObserver(indexPlayer) ) then
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig , indexPlayer , EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig , function MeleeTriggerActionPlayerLeft)
endif
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
// Test for victory / defeat at startup, in case the user has already won / lost.
// Allow for a short time to pass first, so that the map can finish loading.
call TimerStart(CreateTimer() , 2.0 , false , function Custom_MeleeTriggerActionAllianceChange)
endfunction
Осталось только понять, что может вызывать этот баг. Буду пробовать решить. Если найду причину - оставлю здесь пост.
» WarCraft 3 / Перезапуск Warcraft III?
» WarCraft 3 / SharpCraft XGM Addon
» Melee Campaign Heroes / Melee Campaign Heroes 0.9.7 Warships
» Melee Campaign Heroes / Melee Campaign Heroes 0.9.7 Warships
Прокрутить к ресурсу
Доработаны Огры и Наги.
Добавлены: раса Высших Эльфов, новые герои, новые войска.
Самые сильные герои кампании, такие как Архимонд и Кенариус, на 11 уровне имеют Divine тип защиты. Этот тип защиты по канонам игры пробивается только типом атаки Chaos. В MCH против Divine можно внести небольшой импакт типами атаки Hero и Magic, а также с помощью Спеллов.
Бонус к скорости и регенерации наг на воде.
Поддержка игры за все новые расы игроками-компьютерами. ИИ выбирает их самостоятельно и случайно. Также ИИ может играть за Cenarius, и в будущих обновлениях сможет играть за остальных героев.
Исправлены все известные баги, фризы и недоработки предыдущей версии.
Мана колодцев и здоровье войск восстанавливаются только днём.
В лавке есть предмет изменения времени суток.
Основные юниты - Archer, Spell Breaker и Cavalry (наездники на жар птицах);
Спелл кастеры - Priest, Sorceress, (Spell Breaker);
Воздушные - Pegasus, Dragonhawk;
Артиллерия - Баллиста.
Сделан сильный дисбалансный шаг в сторону изменения потребления пищи у огров и их скорости. Теперь все двухголовые юниты, включая основных, потребляют от 4 единиц пищи, и имеют соответствующую цену и боевую мощь. Конечно, это неправильно с т.з. баланса варкрафта, но логически обосновано, потому что огр мощнее орка, и заслуживает дополнительную единицу пищи. Бонусом, количество юнитов в армии огра уменьшается раза в 2, и ими легче управлять игрокам с плохим микроконтролем. Кроме того, ограм можно провести исследование, увеличивающее их базовую скорость до 350, какой она была в WarCraft II.
Марголы знахари умеют ставить варды только на воде.
» WarCraft 3 / Почему удаление несуществующего погодного эффекта удаляет другой погодный эффект?
Ред. WilliamBz
» WarCraft 3 / Почему удаление несуществующего погодного эффекта удаляет другой погодный эффект?
» WarCraft 3 / Фризы при ИИ с кастомной расой
Ред. WilliamBz
» Stormgate / Аллен Диллинг вкатился в Stormgate
» WarCraft 3 / Почему ИИ не делает кастомный апгрейд?
Ред. WilliamBz
» WarCraft 3 / Включить ИИ для игрока-человека
» WarCraft 3 / Почему ИИ не делает кастомный апгрейд?
» WarCraft 3 / Надо ли очищать группу перед уничтожением
» WarCraft 3 / Огненный купол
» WarCraft 3 / Огненный купол
Ред. WilliamBz
» WarCraft 3 / Можно ли использовать универсальные переменные?
Ред. WilliamBz
» WarCraft 3 / Можно ли использовать универсальные переменные?
Ред. WilliamBz
» WarCraft 3 / Можно ли использовать универсальные переменные?
» WarCraft 3 / Можно ли использовать универсальные переменные?
» WarCraft 3 / Нужна модель? - Вам сюда!
Ред. WilliamBz
» WarCraft 3 / Нужна модель? - Вам сюда!
» WarCraft 3 / War3 Model Editor 1.07 (RU)
Ред. WilliamBz
» WarCraft 3 / Нужна модель? - Вам сюда!
Ред. WilliamBz
» WarCraft 3 / Replace холла создаёт посторонние звуки в центре карты
» WarCraft 3 / Replace холла создаёт посторонние звуки в центре карты
Ред. WilliamBz
» WarCraft 3 / Replace холла создаёт посторонние звуки в центре карты