Clamp, ну мне дико некомфортно писать под это всё дело бд с учётом того сколько какой бафф жрёт или плюсует процентов к мс юнита и не превысит ли лимит добавляемые мной цифры, чтобы потом их отнимать опять же ориентируясь на бд, ботинок тупо дал забрал, никаких проблем
TechnoViking, тю, ну если хочешь без периодика то ставь области где они должны бегать ускоренно, когда входят выдаёшь абилку, когда выходят - отбираешь
Я уже делал подобное, тоже играл в донт старв, вариковскими функциями изменять скорость передвижения попросту нельзя, оно такое кривое шо жуть, надо выдавать абилку ботинок. Периодическим таймером выбираем всех юнитов в группу при условии что они находятся на почве и не имеют абилку ускорения, выдаём им ускорение. Другим действием выбираем всех юнитов в этой группе при условии что они находятся не на почве и удаляем абилку
Заказчик: Roy Mustang Способность: Come over here Выполнено: Да
Инструкция по импорту:
Копируешь библиотеку mylib (в шапке карты) куда угодно и переименовываешь если нужно. Копируешь первые 3 триггера - каст абилки, регистрация получения юнитом урона и реагирование на получение урона (2 последних для своих действий, если ты не планируешь ничего добавлять (спецэффекты к примеру), то можешь удалить эти триггеры). По коду, в самом верху mylib, нужно вписать равкоды ауры и её заклинания, выбрать свободную ячейку хэш-таблицы для юнита и указать периодичность таймера истечения ауры, так же указать равкод неиспользуемого предмета. Если у тебя уже есть хэш-таблица с названием H, можешь стереть строку с инициализацией хэш-таблицы. Если нужна будет дополнительная помощь или что-то не работает/работает не так, как хотел - пиши
Текущие настройки:
Периодичность
Скорость эффекта от точки каста
Скорость эффекта к точке каста (притяжение)
Задержка появления притягивания
Дистанция прохождения эффекта от кастера
Радиус
Урон
Дистанция начала эффекта от кастера
Сила расталкивания
Точка начала притягивания от кастера
Дистанция прохождения эффекта к кастеру
Время замедления
Тип атаки
Тип урона
Кол-во притягиваемых юнитов
Значение переменной TF для своих действий
Эффекты (дамми)
Кого притягивать
Кого расталкивать
Отдавать ли приказ "стоп"
Код:
library mylib initializer init
globals
private constant hashtable H = InitHashtable()
private constant group TempG = CreateGroup()
private constant group TempG1 = CreateGroup()
private constant integer ItemID = 'spsh' // любой нигде не использующийся предмет (для проверки проходимости точки)
private constant integer UnitH = 0 // свободная ячейка юнита для ауры
private constant integer AbilityID = 'A001'// равкод ауры
private constant integer AbilityID1 = 'BOae'// равкод заклинания ауры
private constant real TimerPeriodic = 1.00 // периодичность таймера для ауры
private boolean TempB
private integer TempI
private attacktype At
private damagetype Dt
private group TempG2
private group TempG3
private item TempIt
private unit CUEX
private real TempR
private real TempR1
private real MaxX
private real MinX
private real MaxY
private real MinY
endglobals
private function DBC takes real x, real y, real x1, real y1 returns real
return SquareRoot((x-x1)*(x-x1)+(y-y1)*(y-y1))
endfunction
private function SetUnitPositionEx1 takes unit u, real x, real y returns nothing
if x < MinX then
set x = MinX
elseif x > MaxX then
set x = MaxX
endif
if y < MinY then
set y = MinY
elseif y > MaxY then
set y = MaxY
endif
call SetUnitX(u,x)
call SetUnitY(u,y)
endfunction
private function SetUnitPositionEx takes unit u, real x, real y returns nothing
call SetItemPosition(TempIt,x,y)
call SetItemVisible(TempIt,false)
if DBC(x,y,GetItemX(TempIt),GetItemY(TempIt)) > 10 then
set x = GetItemX(TempIt)
set y = GetItemY(TempIt)
endif
call SetUnitX(u,x)
call SetUnitY(u,y)
endfunction
private function CreateUnitEx takes player id, integer unitid, real x, real y, real face returns unit
set CUEX = CreateUnit(id,unitid,x,y,face*bj_RADTODEG)
call UnitAddAbility(CUEX,'Arav')
call SetUnitPathing(CUEX,false)
call SetUnitPositionEx1(CUEX,x,y)
return CUEX
endfunction
function CopyGroup takes group g returns group
set bj_groupAddGroupDest = CreateGroup()
call ForGroup(g, function GroupAddGroupEnum)
return bj_groupAddGroupDest
endfunction
private function GetDirection takes unit u, unit targ returns boolean
local real alpha = GetUnitFacing(u)
local real gamma = bj_RADTODEG * Atan2(GetUnitY(targ)-GetUnitY(u), GetUnitX(targ)-GetUnitX(u))
if gamma < 0 then
set gamma = 360. + gamma
endif
if (alpha < 180. and not(gamma > alpha and gamma < alpha + 180.)) or (alpha > 180. and gamma > alpha - 180. and gamma < alpha) then
return false
else
return true
endif
endfunction
private struct First
unit dummy
real a
real x
real y
real speed
real dist
endstruct
private struct ComeOverHereInfo
unit caster
unit dummy
real a
real x
real y
real dist
real periodic
boolean on
boolean b2
boolexpr b
boolexpr b1
group g
real radius
real damage
integer AttackType
integer DamageType
integer count
integer count1 = 0
integer tf
integer tf1
integer tf2
integer tf3
real speed
real speed1
real time
endstruct
private function FirstMove takes nothing returns nothing
local timer t = GetExpiredTimer()
local First A = LoadInteger(H,GetHandleId(t),0)
set A.dist = A.dist-A.speed
set A.x = A.x+A.speed*Cos(A.a)
set A.y = A.y+A.speed*Sin(A.a)
call SetUnitPositionEx1(A.dummy,A.x,A.y)
if A.dist <= 0 then
call FlushChildHashtable(H,GetHandleId(t))
call PauseTimer(t)
call DestroyTimer(t)
call KillUnit(A.dummy)
set A.dummy = null
call A.destroy()
endif
set t = null
endfunction
private function mycond takes nothing returns boolean
return not IsUnitInGroup(GetFilterUnit(),TempG2)
endfunction
private function MoveSide takes nothing returns nothing
local unit u = GetEnumUnit()
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real a
if GetDirection(CUEX,u) then
set a = TempR+(90*bj_DEGTORAD)
else
set a = TempR-(90*bj_DEGTORAD)
endif
call SetUnitPositionEx(u,x+TempR1*Cos(a),y+TempR1*Sin(a))
if TempB then
call IssueImmediateOrder(u,"stop")
endif
call UnitDamageTarget(bj_lastCreatedUnit,u,0,false,false,null,null,null)
set u = null
endfunction
private function Move takes nothing returns nothing
local unit u = GetEnumUnit()
call SetUnitPositionEx(u,GetUnitX(u)+TempR1*Cos(TempR),GetUnitY(u)+TempR1*Sin(TempR))
if TempB then
call IssueImmediateOrder(u,"stop")
endif
call UnitDamageTarget(bj_lastCreatedUnit,u,0,false,false,null,null,null)
set u = null
endfunction
private function RemoveAura takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit u = LoadUnitHandle(H,GetHandleId(t),0)
local integer i = GetHandleId(u)
local real a = LoadReal(H,i,UnitH)-TimerPeriodic
if a <= 0 then
call FlushChildHashtable(H,GetHandleId(t))
call RemoveSavedReal(H,i,UnitH)
call PauseTimer(t)
call DestroyTimer(t)
call UnitRemoveAbility(u,AbilityID)
call UnitRemoveAbility(u,AbilityID1)
else
call SaveReal(H,i,UnitH,a)
endif
set u = null
set t = null
endfunction
private function End takes nothing returns nothing
local unit u = GetEnumUnit()
local integer i = GetHandleId(u)
local timer t
call UnitDamageTarget(bj_lastCreatedUnit,u,TempR,false,false,At,Dt,null)
if LoadReal(H,i,UnitH) <= 0 then
set t = CreateTimer()
call UnitAddAbility(u,AbilityID)
call SaveUnitHandle(H,GetHandleId(t),0,u)
call TimerStart(t,TimerPeriodic,true,function RemoveAura)
set t = null
endif
call SaveReal(H,i,UnitH,TempR1)
set u = null
endfunction
private function sp takes nothing returns nothing
if IsUnitInGroup(GetEnumUnit(),TempG2) or IsUnitInGroup(GetEnumUnit(),TempG1) then
call GroupRemoveUnit(TempG,GetEnumUnit())
endif
endfunction
private function ComeOverHereMove takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit u
local unit u1 = null
local ComeOverHereInfo A = LoadInteger(H,GetHandleId(t),0)
set A.dist = A.dist-A.speed
set A.x = A.x+A.speed*Cos(A.a)
set A.y = A.y+A.speed*Sin(A.a)
call SetUnitPositionEx1(A.dummy,A.x,A.y)
if A.on then
set A.on = false
call ShowUnit(A.dummy,true)
call UnitRemoveAbility(A.dummy,'Aloc')
call UnitAddAbility(A.dummy,'Aloc')
call TimerStart(t,A.periodic,true,function ComeOverHereMove)
endif
set TempB = A.b2
set bj_lastCreatedUnit = A.caster
call GroupEnumUnitsInRange(TempG1,A.x,A.y,A.radius,A.b1)
if A.count > 0 then
set TempG2 = A.g
call GroupEnumUnitsInRange(TempG,A.x,A.y,A.radius,A.b)
call ForGroup(TempG,function sp)
loop
exitwhen FirstOfGroup(TempG) == null or A.count < 1
set TempG3 = CopyGroup(TempG)
set TempR = 0.
loop
set u = FirstOfGroup(TempG3)
if u == null then
if u1 != null then
call GroupRemoveUnit(TempG,u1)
call GroupAddUnit(A.g,u1)
set A.count = A.count-1
set u1 = null
endif
exitwhen true
endif
if IsUnitInGroup(u,TempG) and GetWidgetLife(u) > TempR then
set TempR = GetWidgetLife(u)
set u1 = u
endif
call GroupRemoveUnit(TempG3,u)
endloop
call DestroyGroup(TempG3)
endloop
set u = null
set u1 = null
call GroupClear(TempG)
endif
set CUEX = A.dummy
set TempR = A.a
set TempR1 = A.speed1
set udg_TF = A.tf2
call ForGroup(TempG1,function MoveSide)
call GroupClear(TempG1)
set TempR1 = A.speed
set udg_TF = A.tf1
call ForGroup(A.g,function Move)
if A.dist <= 0 then
call FlushChildHashtable(H,GetHandleId(t))
call PauseTimer(t)
call DestroyTimer(t)
call KillUnit(A.dummy)
set udg_TF = A.tf
set TempR = A.damage
set TempR1 = A.time
set At = ConvertAttackType(A.AttackType)
set Dt = ConvertDamageType(A.DamageType)
call ForGroup(A.g,function End)
call GroupClear(A.g)
call DestroyGroup(A.g)
set A.dummy = null
set A.caster = null
set A.g = null
set A.b = null
set A.b1 = null
call A.destroy()
endif
set udg_TF = A.tf3
set t = null
endfunction
function ComeOverHere takes nothing returns nothing
local timer t = CreateTimer()
local ComeOverHereInfo A = ComeOverHereInfo.create()
local First A1 = First.create()
local real x = GetSpellTargetX()
local real y = GetSpellTargetY()
set A.caster = GetTriggerUnit()
set A.periodic = udg_Real[0]
set A.x = GetUnitX(A.caster)
set A.y = GetUnitY(A.caster)
set A.a = Atan2(A.y-y,A.x-x)
set A.g = CreateGroup()
set A.radius = udg_Real[5]
set A.damage = udg_Real[6]
set A.AttackType = GetHandleId(udg_AttackType)
set A.DamageType = GetHandleId(udg_DamageType)
set A.speed = udg_Real[2]
set A.speed1 = udg_Real[8]
set A.dist = udg_Real[10]
set A.on = true
set A.b = udg_Bool[0]
set A.b1 = udg_Bool[1]
set A.b2 = udg_Boolean
set A.count = udg_Int[0]
set A.tf = udg_Int[1]
set A.tf1 = udg_Int[2]
set A.tf2 = udg_Int[3]
set A.tf3 = udg_Int[4]
set A.time = udg_Real[11]
call SaveInteger(H,GetHandleId(t),0,A)
call TimerStart(t,udg_Real[3],false,function ComeOverHereMove)
set t = CreateTimer()
set A1.a = Atan2(y-A.y,x-A.x)
set A1.x = A.x+udg_Real[7]*Cos(A1.a)
set A1.y = A.y+udg_Real[7]*Sin(A1.a)
set A1.dummy = CreateUnitEx(GetOwningPlayer(A.caster),udg_DummyID[1],A1.x,A1.y,A1.a)
set A1.speed = udg_Real[1]
set A1.dist = udg_Real[4]
call SaveInteger(H,GetHandleId(t),0,A1)
call TimerStart(t,udg_Real[0],true,function FirstMove)
set A.x = A.x+udg_Real[9]*Cos(A1.a)
set A.y = A.y+udg_Real[9]*Sin(A1.a)
set A.dummy = CreateUnitEx(GetOwningPlayer(A.caster),udg_DummyID[0],A.x,A.y,A.a)
call ShowUnit(A.dummy,false)
set t = null
endfunction
private function init takes nothing returns nothing
set TempIt = CreateItem(ItemID,0,0)
call SetItemVisible(TempIt,false)
set MaxX = GetRectMaxX(GetWorldBounds())
set MinX = GetRectMinX(GetWorldBounds())
set MaxY = GetRectMaxY(GetWorldBounds())
set MinY = GetRectMinY(GetWorldBounds())
endfunction
endlibrary
library HC initializer init
globals
private leaderboard HB
endglobals
private function HCU takes nothing returns nothing
local integer i = 0
local integer id
local location array P
local real result = 0
loop
exitwhen i >= 50
set i = i+1
set P[i] = Location(0,0)
set id = GetHandleId(P[i])
set result = result+(id-0x100000)
endloop
set result = result/i-i/2
loop
call RemoveLocation(P[i])
set P[i] = null
exitwhen i <= 1
set i = i-1
endloop
call LeaderboardSetItemValue(HB,0,R2I(result))
endfunction
private function HCA takes nothing returns nothing
set HB = CreateLeaderboard()
call LeaderboardSetLabel(HB,"Handle Counter")
call PlayerSetLeaderboard(GetLocalPlayer(),HB)
call LeaderboardDisplay(HB,true)
call LeaderboardAddItem(HB,"Handles",0,Player(0))
call LeaderboardSetSizeByItemCount(HB,1)
call HCU()
call TimerStart(GetExpiredTimer(),.05,true,function HCU)
endfunction
private function init takes nothing returns nothing
call TimerStart(CreateTimer(),0,false,function HCA)
endfunction
endlibrary
Если по пути попадётся юнит у которого больше хп, оно не начнёт его притягивать, если достигнуто макс кол-во, а так же оно не заменит самого раненого юнита из притягиваемых на нового
при вхождении юнита на карту принадлежащего такому-то игроку, установить массив целочисленной с индексом, равному индексу игрока, на +1
Если юнит умирает, то -1, если переменная равна 0 - объявить поражение
Про налог нужно больше информации, в варе есть такая функция если что
Закидываем массив булевых переменных и если обе стороны согласны, установить переменные на да, если обе переменные равны истинне, то включить вассала, если прописывают разрыв договора, то установить переменные на нет и убрать вассала
Из-за большого кол-ва юнитов на карте/в пределах экрана оно как ни крути будет лагать, тут от компа скорее зависит. Декорации лагать могут в основном из-за движущиеся анимации
Roy Mustang, нужно немного больше информации. Ешка морды по линии притягивает, а тебе нужно именно в радиусе от точки? Если в точке больше трёх целей, то кому отдавать приоритет? Раненным, самым ближним, самым дальним, у кого больше хп? Урон и замедление наносятся в начале притягивания или по его завершению? По поводу способности я хз что ИИ может там юзать)
TechnoViking, так ты сам юзаешь миллион глобалок в карте P1, TOR, TS, NS2 и т.д.
В варе есть глобальные и локальные переменные, глобальные везде юзаются, а локальные в пределах одной функции, где и были объявлены. Глобальная статична, а локальная каждый раз новая при объявлении
Ничего не пон что ты написал)))
Разницу в скрине от предыдущего не вижу. Я ж сказал, передаешь юнита триггера в глобалку, запускаешь таймер с 0 сек, в другом триггере, где этот таймер истекает, отдаешь приказ юниту в глобалке отмена
Глобалка - глобальная переменная, основы понимания гуи сленга)
Так в том-то и дело, что у чела было по 4-6 этажей, и триггеры тупо переставали работать от такой многофакторной аутентификации, поэтому ну его к лешему, чем Бог не шутит.
Прерваться выполнение может только если превысили оп лимит. Вот такое расположение ифов, когда после выполнения одного условия продолжают обсчитываться другие, оно и может перестать работать. Хотя если твой друг поставил потом ифы по порядку, а не друг в друге, и оно заработало, то тут только тёмная магия)
Что ты там придумал про ужимку и тройное копирование я непон)
» WarCraft 3 / Ищу движение на WASD как в Blood Omen: Legacy of Kain
» WarCraft 3 / Пасивные воины не раздают ауру
» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?
» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?
» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?
» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?
» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?
» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?
» WarCraft 3 / Управление поворотом по вертикали
тут есть даммик с анимками на 180, к нему крепишь любой эффект
Ред. rsfghd
» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?
» WarCraft 3 / Красная цена
Ред. rsfghd
» WarCraft 3 / Способности и алгоритмы на заказ
Заклинание готово!
Способность: Come over here
Выполнено: Да
Ред. rsfghd
» WarCraft 3 / Вассалы и условие победы
Про налог нужно больше информации, в варе есть такая функция если что
» WarCraft 3 / Иконка знака вопроса?
» WarCraft 3 / Иконка знака вопроса?
» WarCraft 3 / Как сделать плавное затемнение экрана в WorldEditor
Там, самое нижнее "ввод изображения", то бишь проявление
» WarCraft 3 / Как сделать улучшение для конкретного юнита?
» WarCraft 3 / Не работает способность
» WarCraft 3 / Как сделать плавное затемнение экрана в WorldEditor
» WarCraft 3 / Ограничение найма солдат.
» WarCraft 3 / Создание нелагающей карты.
» WarCraft 3 / Способности и алгоритмы на заказ
Заказ принят
Способность: Come over here
Примерный срок выполнения: завтра 28.06
» WarCraft 3 / Способности и алгоритмы на заказ
Ред. rsfghd
» WarCraft 3 / Как триггерно прервать изучение технологии?
В варе есть глобальные и локальные переменные, глобальные везде юзаются, а локальные в пределах одной функции, где и были объявлены. Глобальная статична, а локальная каждый раз новая при объявлении
Ред. rsfghd
» WarCraft 3 / Как триггерно прервать изучение технологии?
Разницу в скрине от предыдущего не вижу. Я ж сказал, передаешь юнита триггера в глобалку, запускаешь таймер с 0 сек, в другом триггере, где этот таймер истекает, отдаешь приказ юниту в глобалке отмена
Глобалка - глобальная переменная, основы понимания гуи сленга)