prog, я тоже так делал, но эффекты не видны в тумане войны. Это выглядит ужасно, когда раскрывается туман войны и декорации начинают прорисовываться. Пришлось делать на разрушаемых объектах.
PrincePhoenix, разве уклонения не складываются? По-моему они складываются. Если есть две способности увернуться с шансом 50%, то общая вероятность уклонения равняется 75%.
50% + 50% = 75%
crusader556, можно сделать, чтобы целью была постройка, которая ещё не построена. Но на гуи я вряд ли помогу. Нужно сделать функцию, которая будет возвращать постройку игрока.
Стоит добавить хук функции InitBlizzard, так можно будет хукать не только InitGlobals, но и InitCustomTriggers, RunTriggerInitialization, CreateAllUnits и т.д.
TeX13, с точки зрения оптимизации станет лишь хуже, потому что события также будут создаваться для всех 24 игроков, но только это будет делаться через ForForce( ), которая будет создавать те же события для каждого игрока, запуская для каждого отдельный поток. А если делать через GUI, то еще и утечки подъедут.
Нельзя, когда заносите новые данные просто сохраняйте новую длину в другой переменной. Также учитывайте, что максимальный размер массива для патча 1.29+ = 32768, для 1.29- = 8192.
Можно, создаёте все 24 события лива для одного тригоера. А в действии триггера узнаете ливнувшего игрока с помощью функций: GetTriggeringPlayer(), GetLeavingPlayer().
NazarPunk, нет, там суть была в том, что противники могут сбить процесс вокрешения, чтобы воскрешающие начинали процесс воскрешения с самого начала. Если посмотрите мой код, там идёт постоянная проверка на то, что могила ремонтируется, в случае прерывания воскрешения весь прогресс сбрасывается. А способность ремонта, вроде, можно настроить на то, чтобы он работал только на могилы.
Знаю весьма интересный способ воскрешения героев, который обычно используется во всяких ивентах от вальв в дота 2. Суть заключается в том, что после смерти героя, на месте умершего героя появляется крест перерождения. Если союзные герои нажимают ПКМ по кресту перерождения, то герой начинает воскрешаться. Естесственно процесс можно ускорить, если будут воскрешать мертвого героя сразу несколько союзных героев. В случае, когда процесс воскрешения прерывается, прогресс воскрешения так же обнуляется.
Сделал для своей карты такую же систему. Крест сделан из обычного здания, который ремонтируют союзные герои. В течении всей жизни креста тикает таймер, который проверяет здоровье креста, если он фуловый, то воскрешаем героя и удаляем крест перерождения.
Код
-----------------------------------------------------------------------------
-- H E R O E S : R E V I V E --
-----------------------------------------------------------------------------
function RestoreHero( player )
if hero[ player ] ~= nil then
if UnitAlive( hero[ player ] ) then
SetUnitState( hero[ player ], UNIT_STATE_LIFE, GetUnitState( hero[ player ], UNIT_STATE_MAX_LIFE ) )
SetUnitState( hero[ player ], UNIT_STATE_MANA, GetUnitState( hero[ player ], UNIT_STATE_MAX_MANA ) )
else
ShowUnit( grave[ player ], false )
ReviveHero( hero[ player ], GetUnitX( hero[ player ] ), GetUnitY( hero[ player ] ), true )
SetUnitState( hero[ player ], UNIT_STATE_LIFE, GetUnitState( hero[ player ], UNIT_STATE_MAX_LIFE ) )
SetUnitState( hero[ player ], UNIT_STATE_MANA, GetUnitState( hero[ player ], UNIT_STATE_MAX_MANA ) )
if IsUnitSelected( grave[ player ], GetLocalPlayer( ) ) then
SelectUnit( grave[ player ], false )
SelectUnit( hero[ player ], true )
end
PauseTimer( heroReviveTimer[ player ] )
end
end
end
function InitHeroRevive( )
grave = { }
graveLife = { }
heroReviveTimer = { }
ForForce( HEROES_FORCE,
function( )
local enumPlayer = GetEnumPlayer( )
grave[ enumPlayer ] = CreateUnit( enumPlayer, BUILDING_GRAVE, HIDDEN_X, HIDDEN_Y, 0.0 )
heroReviveTimer[ enumPlayer ] = CreateTimer( )
ShowUnit( grave[ enumPlayer ], false )
SetUnitPathing( grave[ enumPlayer ], false )
end
)
TriggerRegisterForceUnitEvent( CreateTrigger( ), HEROES_FORCE, EVENT_PLAYER_UNIT_DEATH, nil,
function( )
if IsUnitHero( GetDyingUnit( ) ) then
local player = GetOwningPlayer( GetDyingUnit( ) )
graveLife[ player ] = 1.0
SetWidgetLife( grave[ player ], graveLife[ player ] )
SetUnitX( grave[ player ], GetUnitX( hero[ player ] ) )
SetUnitY( grave[ player ], GetUnitY( hero[ player ] ) )
ShowUnit( grave[ player ], true )
if IsUnitSelected( hero[ player ], GetLocalPlayer( ) ) then
SelectUnit( hero[ player ], false )
SelectUnit( grave[ player ], true )
end
TimerStart( heroReviveTimer[ player ], 0.1, true,
function( )
if GetWidgetLife( grave[ player ] ) > graveLife[ player ] and GetWidgetLife( grave[ player ] ) < 100.0 then
graveLife[ player ] = GetWidgetLife( grave[ player ] )
elseif GetWidgetLife( grave[ player ] ) <= graveLife[ player ] and GetWidgetLife( grave[ player ] ) < 100.0 then
graveLife[ player ] = 1.0
SetWidgetLife( grave[ player ], graveLife[ player ] )
elseif GetWidgetLife( grave[ player ] ) >= 100.0 then
RestoreHero( hero[ player ] )
end
end
)
end
end
)
end
Yury13, что значит изображение? Плавающий текст - это объект. У которого имеются такие параметры как: текст, размер, расположение на карте, цвет, видимость и т. д.
а родная функция редактора "Уничтожить последний созданный текст"
Совершенно верно. Данная функция удаляет текстаг. Также тексттагу можно задать время жизни, как указал NazarPunk. После истечении указанного времени тексттаг самоуничтожится, главное не забудьте обнулить переменную, если работаете в jass.
NazarPunk, чтобы получить урон героя, по-моему, нужно к базовому урону еще добавить основную характеристику героя. А зелёный бонус еще нельзя определить.
do
Ability.DeathCoil = { }
Ability.DeathCoil.id = FourCC( "A00I" ) -- < обязательная переменная для работы системы.
function Ability.DeathCoil.onSpellCast( )
end
function Ability.DeathCoil.onSpellEffect( )
end
function Ability.DeathCoil.onInit( )
-- preload...
end
end
вызов функций:
function InitAllAbilities( )
for key, value in pairs( Ability ) do
if type( value ) == "table" then
if value.onInit and type( value.onInit ) == "function" then value.onInit( ) end
end
end
local trigger = CreateTrigger( )
TriggerRegisterAnyUnitEventBJ( trigger, EVENT_PLAYER_UNIT_SPELL_EFFECT )
TriggerAddAction( trigger,
function( )
local abilityId = GetSpellAbilityId( )
for key, value in pairs( Ability ) do
if type( value ) == "table" then
if value.id and value.id == abilityId then
if value.onSpellEffect and type( value.onSpellEffect ) == "function" then value.onSpellEffect ( ) end
end
end
end
end
)
end
» WarCraft 3 / Как снять ограничение
Ред. scopterectus
» WarCraft 3 / Отменить эффект стана
» WarCraft 3 / Огненный Дракон
Ред. scopterectus
» WarCraft 3 / Создать декорацию гуи или jass
» WarCraft 3 / О критических ударах и уклонениях...
50% + 50% = 75%
» WarCraft 3 / variable ot is uninitillized
замените на
local timer ot = CreateTimer( )
Ред. scopterectus
» WarCraft 3 / Триггерный приказ каста "массовой телепортации"
Ред. scopterectus
» WarCraft 3 / Триггерный приказ каста "массовой телепортации"
» WarCraft 3 / [Lua] Инжект функций
» WarCraft 3 / Событие - игрок ливает
» WarCraft 3 / Событие - игрок ливает
» WarCraft 3 / Длина массива.
Ред. PT153
» WarCraft 3 / Длина массива.
Ред. scopterectus
» WarCraft 3 / Событие - игрок ливает
» WarCraft 3 / Событие - игрок ливает
Ред. scopterectus
» WarCraft 3 / вопрос по LIA - LIfe In Arena (ЖНА - Жизнь На Арене)
Ред. scopterectus
» WarCraft 3 / [lua] Воскрешаем героя
» WarCraft 3 / [lua] Воскрешаем героя
» WarCraft 3 / [lua] Дамми каст
Ред. scopterectus
» WarCraft 3 / Утекает ли плавающий текст?
» WarCraft 3 / Утекает ли плавающий текст?
Ред. scopterectus
» WarCraft 3 / [lua] Двигаем снаряды
» WarCraft 3 / Lua: функции в таблице
» WarCraft 3 / Lua: функции в таблице
Ред. scopterectus
» WarCraft 3 / Lua: функции в таблице