Ну как не мог? Отдавать приказ идти или стоять? Триггерно отлавливай приказы и отдавай еще раз нужный если игрок отдал не тот приказ.
С мемхаком можно вовсе исключить контроль, юнит будет выбираться, все кнопки на карте команд будут тыкаться но ничего происходить не будет, юнит не будет управятся игроком.
ScopteRectuS, нет, таймед лайф это своего рода бафф, он сам следит есть ли юнит. Если юнит сдохнет бафф самовыпилится самостоятельно, так что нет. Смотри баффы иллюзий и волков, они не проигрывают анимации смерти. Подбираешь бафф и все, анимации смерти невидно.
Хайдить тоже можно, под хайдом юнит нормально умирает и разлагается.
ScopteRectuS, а вот хрен его знает, пытайся повторить фатал, бери героя, юзай его способности по кд, пока не фатальнет, пиши лог.
Тогда станет понятно наверняка.
ScopteRectuS, а зачем тебе создавать героя ? Делать нефиг? Если это только анимация, создавай модель и проигрывай ей анимацию мемхаком или делай даммика с моделью героя, создание довольно ресурсозатрано если что.
Demon127, ну а что тебе мешает поставить такой союз между игроком пехотинка и игроком героя? ALLIANCE_TYPE_RESCUED или как то так называется, кароче внимательно смотрите настройки союзов!
Нука попробуй добавить в action функцию с аргументами!
Хз, мб какой какая то конструкция юзает действия триггеров, или это своего рода массив code, т.к мы не можем обьявить массивом code, а следовательно хранить массив функций тоже нельзя...
Ну тут кондишены и экшены триггера этакий массив, Condtion(function) еще примечателен тем, что он не вызывает утечку типа triggercondition т.к акшин триггера навсегда остаётся висеть в боллекспре, triggeraction же нужно обязательно удалять, иначе будут утечки.
Это в том случаи если триггеры создаются и удаляются динамически.
Не было тогда еще мемхака, а о ретунд баге знали очень мало, а так же что он ненадежен (его пофиксят).
Сейчас вовсе можно без этих методов обойтись и передать инт в функцию, к примеру как тут.
TriggerEvalute наследует поток из которого запущен, а так же проверяет условие триггера, возвращая результат.
Мб. так было проще передавать аргумент. т.к триггер и поток из которого мы запустили триггер один, т.е работают GetTriggUnit\GetExpiredTimer и так далее.
ScopteRectuS, нет. Явного ограничения нету, но все упирается в память.
Миллионы триггеров ненормально! У вас что то нетак, подумайте над этим на досуге.
Дело именно в количестве триггеров а не в их начинки и назначении, создавать триггеры динамически по мере надобности в гуях нельзя, так что переходите на jass.
GRESHNIK1, все ваши красивые гуи - переводятся в jass интерпретатором в момент сохранения карты, все триггеры - это такие обьекты, как к примеру юниты которых вы видите, триггеры нужно сначала создать, потом добавить в них события и дейсвия, а их овер дофига.
Для инициализации гуи триггеров используется отдельная функция InitCustomTriggers( ), в нее записываются все триггеры которые нужно создать, перед стартом игры, в момент когда загрузка почти завершилась. В jass есть лимит операций, когда в одной функции очень много действий, которые превышают этот лимит, функция считается зависшей, и движок перестает её выполнять. Вот почему триггеры перестали работать - да их просто не создали.
Потом вопрос зачем вам столько триггеров?
Есть лимит операций, а так же кривое гуи.
Вы превысили лимит операций напихав 100500 триггеров которые, функция инициализации которых уходит в обрыв потока, т.к превышает лимит операций потока.
Выход, подумывать о переходе на jass или более правильно использовать триггеры, не создавая овер 100500 штук.
Darknessay, Канал не чанеллистя в предметах и точка, это могут лишь некоторые абилки.
Пробуй юзнуть Звездопад (Starfall ), Вейты не юзай, иначе ничего работать не будет никогда!
Способность это не обязательно кнопка на карте команд, 100500 способностей не имеют кнопки на карте команд, если вам так хочется это исправить - делайте пустышку с иконкой из любой другой способности, у которой есть такой параметр. Т.к у каждой способности в игре описаны все взаимодействия, включая кнопку на карте комманд, тип цели и прочее, а еще писалось это разными людьми и в разное время - универсального способа нет!
Darknessay, оно и неудивительно. Где триггер с событием юнит завершает применение способности, юнит начинает применять способность, триггер время истекло.
Все вейты нафиг удаляем, это никогда не будет работать...
Необходимо отловить начало каста, потом следить сбили ли каст и найти ближайшее здание возле точки телепорта, если время вышло и юниту не сбили телепорт, переместить юнита в ближашую точку возде здания, иначе ничего не делать...
код свитка из доты
//Calls:
// M7I
// Q3I
//Functions as argument:
// ZWO
function ZXO takes nothing returns boolean
local trigger t = GetTriggeringTrigger()
local integer MDI = GetHandleId(t)
local unit MJI = LoadUnitHandle(XY, MDI, 14)
local unit TFI = LoadUnitHandle(XY, MDI, 17)
local real x = LoadReal(XY, MDI, 6)
local real y = LoadReal(XY, MDI, 7)
local unit ZHO = LoadUnitHandle(XY, MDI, 448)
local unit ZZO = LoadUnitHandle(XY, MDI, 447)
local ubersplat O11 = LoadUbersplatHandle(XY, MDI, 131)
local integer M4I = LoadInteger(XY, MDI, 34)
local real BH1 = LoadReal(XY, MDI, 57)
local real EJ1 = LoadReal(XY, MDI, 442)
local integer id = GetPlayerId(GetOwningPlayer(MJI))
local boolean ZVO = false
local integer i = 0
local integer CS1
if GetTriggerEventId() == EVENT_UNIT_SPELL_ENDCAST then
if GetSpellAbilityId() == 'A231' then
call DestroyEffect(LoadEffectHandle(XY, MDI, 175))
call DestroyEffect(LoadEffectHandle(XY, MDI, 176))
call DestroyEffect(LoadEffectHandle(XY, MDI, 177))
call SaveInteger(XY, GetHandleId(MJI), 4256, 2)
call KillUnit(ZHO)
call KillUnit(ZZO)
call DestroyUbersplat(O11)
call FlushChildHashtable(XY, MDI)
call M7I(t)
call UnitRemoveType(TFI, UNIT_TYPE_PEON)
endif
elseif GetTriggerEventId() == EVENT_UNIT_DEATH then
call DestroyEffect(LoadEffectHandle(XY, MDI, 175))
call DestroyEffect(LoadEffectHandle(XY, MDI, 176))
call DestroyEffect(LoadEffectHandle(XY, MDI, 177))
call UnitRemoveType(TFI, UNIT_TYPE_PEON)
call SaveInteger(XY, GetHandleId(MJI), 4256, 2)
call KillUnit(ZHO)
call KillUnit(ZZO)
call DestroyUbersplat(O11)
call FlushChildHashtable(XY, MDI)
call M7I(t)
else
call DestroyEffect(LoadEffectHandle(XY, MDI, 175))
call DestroyEffect(LoadEffectHandle(XY, MDI, 176))
call DestroyEffect(LoadEffectHandle(XY, MDI, 177))
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTarget.mdl", GetUnitX(MJI), GetUnitY(MJI)))
call SaveInteger(XY, GetHandleId(MJI), 4256, 2)
call KillUnit(ZHO)
call KillUnit(ZZO)
call DestroyUbersplat(O11)
call FlushChildHashtable(XY, MDI)
call M7I(t)
call UnitRemoveType(TFI, UNIT_TYPE_PEON)
call Q3I(GetUnitX(TFI) - 1, GetUnitY(TFI) - 1, 240)
call SetUnitX(MJI, GetUnitX(TFI) - 1)
call SetUnitY(MJI, GetUnitY(TFI) - 1)
call PauseUnit(MJI, true)
call PauseUnit(MJI, false)
set CK = MJI
call ExecuteFunc("ZWO")
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTarget.mdl", GetUnitX(MJI), GetUnitY(MJI)))
endif
set t = null
set MJI = null
set ZHO = null
set ZZO = null
set O11 = null
set TFI = null
return false
endfunction
//Calls:
// N7I
// ZAO
// PII
// R1I
// R5I
// Z5O
// Z6O
// Z4O
// Z3O
// QAI
// I51
//Functions as argument:
// ZGO
function ZYO takes nothing returns nothing
local unit MJI = GetTriggerUnit()
local unit TFI = GetSpellTargetUnit()
local location l
local real x
local real y
local real a
local trigger t
local integer MDI
local unit ZHO
local unit ZZO
local ubersplat O11
local integer id = GetPlayerId(GetOwningPlayer(MJI))
local integer M4I
local real ZJO
set t = CreateTrigger()
set MDI = GetHandleId(t)
call SaveInteger(XY, GetHandleId(MJI), 4256, 1)
if TFI == null then
set l = GetSpellTargetLoc()
set x = GetLocationX(l)
set y = GetLocationY(l)
if x == LU0[id] and y == M00[id] then
if N7I(GetOwningPlayer(MJI)) then
set x = GetUnitX(LQ)
set y = GetUnitY(LQ)
else
set x = GetUnitX(BF0)
set y = GetUnitY(BF0)
endif
endif
set TFI = ZAO(MJI, x, y)
call RemoveLocation(l)
else
set x = GetUnitX(TFI)
set y = GetUnitY(TFI)
endif
if PII(x, y, GetUnitX(TFI), GetUnitY(TFI)) > M50 then
set a = Atan2(y - GetUnitY(TFI), x - GetUnitX(TFI))
set x = GetUnitX(TFI) + M50 * Cos(a)
set y = GetUnitY(TFI) + M50 * Sin(a)
elseif PII(x, y, GetUnitX(TFI), GetUnitY(TFI)) < 50 then
set a = Atan2(y - GetUnitY(TFI), x - GetUnitX(TFI))
set x = GetUnitX(TFI) + 120 * Cos(a)
set y = GetUnitY(TFI) + 120 * Sin(a)
endif
if IsPointInRegion(XN, x, y) == true then
set a = Atan2(y - GetUnitY(TFI), x - GetUnitX(TFI))
set x = GetUnitX(TFI) + 200 * Cos(a)
set y = GetUnitY(TFI) + 200 * Sin(a)
endif
set x = R1I(x)
set y = R5I(y)
if (IsUnitAlly(MJI, GetLocalPlayer()) and GetLocalPlayer() != GetOwningPlayer(MJI)) or (C2 and (GetLocalPlayer() == D10 or GetLocalPlayer() == DO0)) then
call PingMinimapEx(x, y, 3, 255, 255, 255, false)
endif
set ZZO = CreateUnit(GetOwningPlayer(MJI), Z5O(id), x, y, 0)
set ZHO = CreateUnit(GetOwningPlayer(MJI), Z6O(id), GetUnitX(MJI), GetUnitY(MJI), 0)
set O11 = CreateUbersplat(GetUnitX(MJI), GetUnitY(MJI), "SCTP", 255, 255, 255, 255, false, false)
if IsUnitVisible(MJI, GetLocalPlayer()) == true then
call SetUbersplatRenderAlways(O11, true)
else
call SetUbersplatRenderAlways(O11, false)
endif
set M4I = Z4O(GetPlayerId(GetOwningPlayer(MJI)), x, y)
set ZJO = 3
if M4I > 0 then
set ZJO = 4.5 + 0.5 * M4I
endif
call Z3O(GetPlayerId(GetOwningPlayer(MJI)), x, y)
if M4I > 0 then
call SetUnitAnimationByIndex(ZHO, 2)
call SetUnitAnimationByIndex(ZZO, 2)
endif
call TriggerRegisterTimerEvent(t, ZJO - 3, false)
call TriggerRegisterTimerEvent(t, ZJO, false)
call TriggerRegisterUnitEvent(t, MJI, EVENT_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(t, Condition(function ZGO))
call QAI(GetOwningPlayer(MJI), ZJO, x, y, 200)
call SaveUnitHandle(XY, MDI, 447, ZZO)
call SaveUnitHandle(XY, MDI, 448, ZHO)
call SaveReal(XY, MDI, 6, (x * 1.0))
call SaveReal(XY, MDI, 7, (y * 1.0))
call SaveReal(XY, MDI, 442, (TimerGetElapsed(M) * 1.0))
call SaveReal(XY, MDI, 57, (ZJO * 1.0))
call SaveUbersplatHandle(XY, MDI, 131, O11)
call SaveUnitHandle(XY, MDI, 14, MJI)
call SaveInteger(XY, MDI, 34, 0)
call I51(MJI, XF, x, y, 2400)
set MJI = null
set TFI = null
set ZHO = null
set ZZO = null
set l = null
set t = null
set O11 = null
endfunction
//Calls:
// N7I
// ZFO
// QAI
// I51
//Functions as argument:
// ZXO
function ZKO takes nothing returns nothing
local unit MJI = GetTriggerUnit()
local unit TFI = GetSpellTargetUnit()
local location l
local real x
local real y
local real a
local trigger t
local integer MDI
local unit ZHO
local unit ZZO
local ubersplat O11
local integer id = GetPlayerId(GetOwningPlayer(MJI))
local integer M4I
local real ZJO
set t = CreateTrigger()
set MDI = GetHandleId(t)
if TFI == null then
set l = GetSpellTargetLoc()
set x = GetLocationX(l)
set y = GetLocationY(l)
if x == LU0[id] and y == M00[id] then
if N7I(GetOwningPlayer(MJI)) then
set x = GetUnitX(LQ)
set y = GetUnitY(LQ)
else
set x = GetUnitX(BF0)
set y = GetUnitY(BF0)
endif
endif
set TFI = ZFO(MJI, x, y)
call RemoveLocation(l)
endif
call SaveInteger(XY, GetHandleId(MJI), 4256, 1)
set x = GetUnitX(TFI)
set y = GetUnitY(TFI)
if (IsUnitAlly(MJI, GetLocalPlayer()) and GetLocalPlayer() != GetOwningPlayer(MJI)) or (C2 and (GetLocalPlayer() == D10 or GetLocalPlayer() == DO0)) then
call PingMinimapEx(x, y, 3, 255, 255, 255, false)
endif
set O11 = CreateUbersplat(GetUnitX(MJI), GetUnitY(MJI), "SCTP", 255, 255, 255, 255, false, false)
if IsUnitVisible(MJI, GetLocalPlayer()) == true then
call SetUbersplatRenderAlways(O11, true)
else
call SetUbersplatRenderAlways(O11, false)
endif
set ZJO = 3
call UnitAddType(TFI, UNIT_TYPE_PEON)
call TriggerRegisterTimerEvent(t, ZJO, false)
call TriggerRegisterUnitEvent(t, MJI, EVENT_UNIT_SPELL_ENDCAST)
call TriggerRegisterUnitEvent(t, TFI, EVENT_UNIT_DEATH)
call TriggerAddCondition(t, Condition(function ZXO))
call QAI(GetOwningPlayer(MJI), ZJO, x, y, 200)
call SaveReal(XY, MDI, 6, (x * 1.0))
call SaveReal(XY, MDI, 7, (y * 1.0))
call SaveReal(XY, MDI, 442, (TimerGetElapsed(M) * 1.0))
call SaveReal(XY, MDI, 57, (ZJO * 1.0))
call SaveUbersplatHandle(XY, MDI, 131, O11)
call SaveUnitHandle(XY, MDI, 14, MJI)
call SaveUnitHandle(XY, MDI, 17, TFI)
call SaveInteger(XY, MDI, 34, 0)
call SaveEffectHandle(XY, MDI, 175, AddSpecialEffectTarget("Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTo.mdl", MJI, "origin"))
call SaveEffectHandle(XY, MDI, 176, AddSpecialEffectTarget("Abilities\\Spells\\Human\\MassTeleport\\MassTeleportCaster.mdl", MJI, "origin"))
call SaveEffectHandle(XY, MDI, 177, AddSpecialEffectTarget("Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTo.mdl", TFI, "origin"))
call I51(MJI, XF, x, y, 2400)
set MJI = null
set TFI = null
set ZHO = null
set ZZO = null
set l = null
set t = null
set O11 = null
endfunction
//Calls:
// STI
// ZYO
// ZKO
function ZLO takes nothing returns nothing
if GetSpellAbilityId() == 'A1R5' and STI(GetTriggerUnit()) == false then
call ZYO()
endif
if GetSpellAbilityId() == 'A231' then
call ZKO()
endif
endfunction
» WarCraft 3 / Как сделать так чтоб игрок не мог видеть/управлять юнитом?
С мемхаком можно вовсе исключить контроль, юнит будет выбираться, все кнопки на карте команд будут тыкаться но ничего происходить не будет, юнит не будет управятся игроком.
» WarCraft 3 / Искусственный интеллект крипов
Ред. quq_CCCP
» WarCraft 3 / Определить юнита под курсором (MemHack)
RMem[Rmem[gamedll+AB4F80]+1B4]+14
Кстати вроде же была тема с похожим вопросом.
» WarCraft 3 / Фаталит карта
Хайдить тоже можно, под хайдом юнит нормально умирает и разлагается.
» WarCraft 3 / Фаталит карта
» WarCraft 3 / Высота Z
» WarCraft 3 / как сделать из обычного юнита героя
» WarCraft 3 / Фаталит карта
Тогда станет понятно наверняка.
» WarCraft 3 / Фаталит карта
» WarCraft 3 / Фаталит карта
Это вовсе странно нахрена делать в коде то что, изи делается в РО?
» WarCraft 3 / Фаталит карта
» WarCraft 3 / как сделать так что бы при приближении к юниту он поменял владел
» WarCraft 3 / Строение структур
Хз, мб какой какая то конструкция юзает действия триггеров, или это своего рода массив code, т.к мы не можем обьявить массивом code, а следовательно хранить массив функций тоже нельзя...
Ну тут кондишены и экшены триггера этакий массив, Condtion(function) еще примечателен тем, что он не вызывает утечку типа triggercondition т.к акшин триггера навсегда остаётся висеть в боллекспре, triggeraction же нужно обязательно удалять, иначе будут утечки.
Это в том случаи если триггеры создаются и удаляются динамически.
Не было тогда еще мемхака, а о ретунд баге знали очень мало, а так же что он ненадежен (его пофиксят).
Сейчас вовсе можно без этих методов обойтись и передать инт в функцию, к примеру как тут.
» WarCraft 3 / как сделать так что бы при приближении к юниту он поменял владел
» WarCraft 3 / Строение структур
» WarCraft 3 / Строение структур
Мб. так было проще передавать аргумент. т.к триггер и поток из которого мы запустили триггер один, т.е работают GetTriggUnit\GetExpiredTimer и так далее.
» WarCraft 3 / Есть ли ограничение по числу триггеров, областей или переменных?
Миллионы триггеров ненормально! У вас что то нетак, подумайте над этим на досуге.
» WarCraft 3 / Поиск именных структур
» WarCraft 3 / Есть ли ограничение по числу триггеров, областей или переменных?
» WarCraft 3 / Есть ли ограничение по числу триггеров, областей или переменных?
Для инициализации гуи триггеров используется отдельная функция InitCustomTriggers( ), в нее записываются все триггеры которые нужно создать, перед стартом игры, в момент когда загрузка почти завершилась. В jass есть лимит операций, когда в одной функции очень много действий, которые превышают этот лимит, функция считается зависшей, и движок перестает её выполнять. Вот почему триггеры перестали работать - да их просто не создали.
Потом вопрос зачем вам столько триггеров?
» WarCraft 3 / Есть ли ограничение по числу триггеров, областей или переменных?
Вы превысили лимит операций напихав 100500 триггеров которые, функция инициализации которых уходит в обрыв потока, т.к превышает лимит операций потока.
Выход, подумывать о переходе на jass или более правильно использовать триггеры, не создавая овер 100500 штук.
» WarCraft 3 / Как сделать свиток телепорта из доты?
Пробуй юзнуть Звездопад (Starfall ), Вейты не юзай, иначе ничего работать не будет никогда!
» WarCraft 3 / как зафиксировать время суток в редакторе варкрафта 3
» WarCraft 3 / Иконки способностей для предметов
Т.к у каждой способности в игре описаны все взаимодействия, включая кнопку на карте комманд, тип цели и прочее, а еще писалось это разными людьми и в разное время - универсального способа нет!
Ред. quq_CCCP
» WarCraft 3 / Как сделать свиток телепорта из доты?
Все вейты нафиг удаляем, это никогда не будет работать...
Необходимо отловить начало каста, потом следить сбили ли каст и найти ближайшее здание возле точки телепорта, если время вышло и юниту не сбили телепорт, переместить юнита в ближашую точку возде здания, иначе ничего не делать...