Да было много разных замыслов, и какой-нить воин на волке, и друид на олене, и лучница на тигре и т.п. и т.д. Проблема была только в модельках - нужно 3 штуки: сам герой, животное, и их совместная моделька. С дк было полегче - просто на хайве были их разделенные модельки из стандартной вариковской.
Vozmezdie, я хз если честно кто такая калия, на хайве просто модель нашел с названием и скриншот и вовки. За лор слабо шарю. Связаться это только если через дискорд, указал у себя в профиле, ну или тут есть уже встроенный лс.
rsfghd, Для Q искал модельку похожую на аркан взрыв, ничего более подходящего не нашел, модельку на скрине я видел, но думаю оно больше подходит под спел природы. Е вроде ж заюзал, там на видео мана при юзании повышалась и на юните был доп эффект на 6 сек. По поводу W - какой тайм код?
Посмотрел, ну такое хорошо зайдет если игрок управляет только 1 юнитом/героем. Спел ж по идее направлен на 1 юнита, странно будет если игрок захочет другим юнитом поуправлять, или отрядом юнитов, а у него камеру вертит из стороны в сторону. Но смотрится прикольно)
Slonick, хм, тогда наверное лучше уже не через расход хп, а ману. Да и в пример, у того же кентавра 1 скил расходует не ману а хп, при этом зависимостей от лоухп он никаких не имеет.
Slonick, пытался все уместить в небольшой текст чтоб не было простыни здоровой, мб из-за этого не совсем понятно, но на видео в принципе все показано. По поводу синергии не понял, по сути это усиление героя взамен траты его здоровья.
А по поводу IsUnitDead - мб причина в версии редактора, я его скачал году в 13, с тех пор не обновлял, мб в твоем редакторе уже есть эта функция. А то получается что ты редачишь код (удаляешь IsUnitDead) и скидываешь видео что что-то не работает.
nazarpunk, Если код посмотреть там будет видно, что полетка и должна сбиваться приказом, спецом сделано чтоб можно было обратно не лететь.
cJass у меня тоже отключен, но даже так не думаю что он будет ругаться на дубликат если такового нет.
nazarpunk, по поводу UnitAlive - такой нативки мой редактор не видит, у тебя точно 1.26?
Щас чекнул, такая нативка есть, просто она не объялена в common.j
Не вижу проблемы тогда между UnitAlive и ее кастомным аналогом.
По поводу Haunt - я опять же не экстрасенс и по видосам не гадаю, было бы неплохо узнать как ты довел до такого результата где Reality не сработало.
nazarpunk, ну я вижу, ты юзанул полетку, а чё не так? Если обнаружил баг, распиши в чем баг и какие действия к нему привели, я ж не экстрасенс.
Так же у тебя на скрине ругается на дубликат IsUnitDead, такой ошибки у меня не возникает, мб ты добавляешь какие-то свои библиотеки где идёт повторение названий функций.
Чет не понял, как игрок сможет контролить юнита в стане? Да и суть вопроса моего не в этом. Из-за чего в примере перс не дергается при отдаче ему приказа, а в коде что я скинул выше он дергается?
Вот, хотел сделать на подобие ульты спектры, но когда меняешься местами с иллюзией и она продолжает двигаться к своей цели - она будет делать это очень прерывисто если периодик поставить маленький, не 0,25 как сейчас а допустим 0,03.
код
library Haunt initializer Init requires Global
globals
// ====================
private constant integer SkillId = 'A003' // ID of skill
private constant integer SkillRealityId = 'A004' // ID of Reality skill
private constant integer DummyId = 'h000' // ID of dummy caster
private constant integer DummyCastId = 'S000' // ID of dummy Illusion ability
private constant integer DummyCastOrder = 852274 // Order of dummy Illusion ability
// ====================
private constant integer MAXLVL = 3 // Levels of skill
private constant real array IllusionDuration[MAXLVL] // Illusion duration
endglobals
// ===============================================================
globals
public key SkillKey
// ====================
private real TEMP_X
private real TEMP_Y
private real TEMP_Distance
private unit TEMP_Illusion
private unit TEMP_Caster
private trigger TEMP_Trigger
endglobals
struct Haunt_illusion
unit Target
unit Illusion
private trigger Trigger
private static method Function takes nothing returns boolean
local thistype this = LoadInteger(Global_Hash, GetHandleId(GetTriggeringTrigger()), SkillKey)
if GetTriggerEventId() == EVENT_UNIT_SUMMON then
set .Illusion = GetSummonedUnit()
call SetUnitPathing(.Illusion, false)
call SetUnitMoveSpeed(.Illusion, 400)
call SetUnitX(.Illusion, GetUnitX(.Target))
call SetUnitY(.Illusion, GetUnitY(.Target))
call IssueTargetOrder(.Illusion, "attack", .Target)
call SaveInteger(Global_Hash, GetHandleId(.Illusion), SkillKey, this)
call TriggerRegisterTimerEvent(.Trigger, 0.025, true)
call TriggerRegisterUnitEvent(.Trigger, .Illusion, EVENT_UNIT_DEATH)
call TriggerRegisterUnitEvent(.Trigger, .Illusion, EVENT_UNIT_ISSUED_ORDER)
call TriggerRegisterUnitEvent(.Trigger, .Illusion, EVENT_UNIT_ISSUED_TARGET_ORDER)
call TriggerRegisterUnitEvent(.Trigger, .Illusion, EVENT_UNIT_ISSUED_POINT_ORDER)
elseif GetTriggerEventId() == EVENT_GAME_TIMER_EXPIRED or GetTriggerEventId() == EVENT_UNIT_ISSUED_ORDER or GetTriggerEventId() == EVENT_UNIT_ISSUED_TARGET_ORDER or GetTriggerEventId() == EVENT_UNIT_ISSUED_POINT_ORDER then
call DisableTrigger(.Trigger)
call IssueTargetOrder(.Illusion, "attack", .Target)
call EnableTrigger(.Trigger)
else
this.destroy()
endif
return false
endmethod
method executeReality takes unit c returns nothing
local real x = GetUnitX(c)
local real y = GetUnitY(c)
call SetUnitX(c, GetUnitX(.Illusion))
call SetUnitY(c, GetUnitY(.Illusion))
call SetUnitX(.Illusion, x)
call SetUnitY(.Illusion, y)
call IssueTargetOrder(c, "attack", .Target)
endmethod
static method create takes unit c, unit t, trigger trg returns thistype
local thistype this = thistype.allocate()
local unit dummy
set .Target = t
// ====================
set dummy = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), DummyId, GetUnitX(.Target), GetUnitY(.Target), 0)
set .Trigger = CreateTrigger()
call SaveInteger(Global_Hash, GetHandleId(.Trigger), SkillKey, this)
call TriggerAddCondition(.Trigger, Condition(function thistype.Function))
call TriggerRegisterUnitEvent(.Trigger, .Target, EVENT_UNIT_DEATH)
call TriggerRegisterUnitEvent(.Trigger, dummy, EVENT_UNIT_SUMMON)
call TriggerRegisterUnitEvent(trg, dummy, EVENT_UNIT_SUMMON)
call UnitAddAbility(dummy, DummyCastId)
call SetUnitAbilityLevel(dummy, DummyCastId, GetUnitAbilityLevel(c, SkillId))
call IssueTargetOrderById(dummy, DummyCastOrder, c)
call UnitApplyTimedLife(dummy, 0, 1)
set dummy = null
return this
endmethod
method destroy takes nothing returns nothing
call DisableTrigger(.Trigger)
call FlushChildHashtable(Global_Hash, GetHandleId(.Trigger))
call DestroyTrigger(.Trigger)
set .Trigger = null
// ====================
call KillUnit(.Illusion)
set .Target = null
set .Illusion = null
call this.deallocate()
endmethod
endstruct
struct Haunt
unit Caster
group GroupIllusion
private trigger Trigger
private static method Function takes nothing returns boolean
local thistype this = LoadInteger(Global_Hash, GetHandleId(GetTriggeringTrigger()), SkillKey)
local Haunt_illusion h_i
if GetTriggerEventId() == EVENT_UNIT_SPELL_EFFECT then
if GetSpellAbilityId() == SkillRealityId then
set TEMP_X = GetSpellTargetX()
set TEMP_Y = GetSpellTargetY()
set TEMP_Distance = 99999
set TEMP_Illusion = null
call ForGroup(.GroupIllusion, function thistype.NearbyIllusionEnum)
if TEMP_Illusion != null then
set h_i = LoadInteger(Global_Hash, GetHandleId(TEMP_Illusion), SkillKey)
call h_i.executeReality(.Caster)
endif
endif
elseif GetTriggerEventId() == EVENT_UNIT_SUMMON then
call SetUnitOwner(GetSummonedUnit(), GetOwningPlayer(.Caster), true)
call GroupAddUnit(.GroupIllusion, GetSummonedUnit())
else
this.destroy()
endif
return false
endmethod
private static method NearbyIllusionEnum takes nothing returns nothing
local real d = DistanceBetweenWidgetAndCoords(GetEnumUnit(), TEMP_X, TEMP_Y)
if not IsUnitDead(GetEnumUnit()) and d <= TEMP_Distance then
TEMP_Distance = d
TEMP_Illusion = GetEnumUnit()
endif
endmethod
private static method IllusionForTargetFilter takes nothing returns boolean
if IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(TEMP_Caster)) then
call Haunt_illusion.create(TEMP_Caster, GetFilterUnit(), TEMP_Trigger)
endif
return false
endmethod
static method create takes unit c returns thistype
local thistype this = thistype.allocate()
set .Caster = c
set .GroupIllusion = CreateGroup()
// ====================
set .Trigger = CreateTrigger()
call SaveInteger(Global_Hash, GetHandleId(.Trigger), SkillKey, this)
call TriggerAddCondition(.Trigger, Condition(function thistype.Function))
call TriggerRegisterTimerEvent(.Trigger, IllusionDuration[GetUnitAbilityLevel(.Caster, SkillId)], false)
call TriggerRegisterUnitEvent(.Trigger, .Caster, EVENT_UNIT_SPELL_EFFECT)
set TEMP_Caster = .Caster
set TEMP_Trigger = .Trigger
call GroupEnumUnitsInRect(Global_TempGroup, bj_mapInitialPlayableArea, Condition(function thistype.IllusionForTargetFilter))
return this
endmethod
method destroy takes nothing returns nothing
call DisableTrigger(.Trigger)
call FlushChildHashtable(Global_Hash, GetHandleId(.Trigger))
call DestroyTrigger(.Trigger)
set .Trigger = null
// ====================
call DestroyGroup(.GroupIllusion)
set .Caster = null
set .GroupIllusion = null
call this.deallocate()
endmethod
endstruct
private function SkillAction_EFFECT takes nothing returns nothing
call Haunt.create(GetTriggerUnit())
endfunction
private function SkillCondition_EFFECT takes nothing returns boolean
return GetSpellAbilityId() == SkillId
endfunction
private function SkillAction_LEARN takes nothing returns nothing
call UnitAddAbility(GetTriggerUnit(), SkillRealityId)
call SetUnitAbilityLevel(GetTriggerUnit(), SkillRealityId, GetLearnedSkillLevel())
call UnitMakeAbilityPermanent(GetTriggerUnit(), true, SkillRealityId)
endfunction
private function SkillCondition_LEARN takes nothing returns boolean
return GetLearnedSkill() == SkillId
endfunction
private function Init takes nothing returns nothing
local trigger trg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(trg, Condition(function SkillCondition_LEARN))
call TriggerAddAction(trg, function SkillAction_LEARN)
set trg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(trg, Condition(function SkillCondition_EFFECT))
call TriggerAddAction(trg, function SkillAction_EFFECT)
set trg = null
// ====================
set IllusionDuration[1] = 4
set IllusionDuration[2] = 5
set IllusionDuration[3] = 6
endfunction
endlibrary
» WarCraft 3 / Пак способностей - Mercenary Harpy
» WarCraft 3 / Пак способностей - Death Rider
» WarCraft 3 / Пак способностей - Death Rider
» WarCraft 3 / Пак способностей - Death Rider
» WarCraft 3 / Пак способностей - Archmage
» WarCraft 3 / Пак способностей - Archmage
» WarCraft 3 / Пак способностей - Archmage
» WarCraft 3 / Пак способностей - Aberration Knight
» WarCraft 3 / Пак способностей - Aberration Knight
Ред. OVOgenez
» WarCraft 3 / Игнор приказов игрока
» WarCraft 3 / Пак способностей - Banshee
Удалил IsUnitDead, заменил на нативную UnitAlive
Поменял порядок методов в структурах (спасибо Vlod)
Ред. OVOgenez
» WarCraft 3 / Пак способностей - Banshee
» WarCraft 3 / Пак способностей - Banshee
Всё равно спс, буду знать про эту нативку.
Ред. OVOgenez
» WarCraft 3 / Пак способностей - Banshee
cJass у меня тоже отключен, но даже так не думаю что он будет ругаться на дубликат если такового нет.
Не вижу проблемы тогда между UnitAlive и ее кастомным аналогом.
» WarCraft 3 / Пак способностей - Banshee
Ред. OVOgenez
» WarCraft 3 / Пак способностей - Banshee
» WarCraft 3 / Пак способностей - Banshee
» WarCraft 3 / Пак способностей - Banshee
» WarCraft 3 / Пак способностей - Banshee
» WarCraft 3 / Пак способностей - Banshee
» WarCraft 3 / Игнор приказов игрока
» WarCraft 3 / Игнор приказов игрока
» WarCraft 3 / Игнор приказов игрока
» WarCraft 3 / Игнор приказов игрока
» WarCraft 3 / Игнор приказов игрока