вот код проверки атаки, можно навести мышью на любого юнита, и вам покажет может ли герой атаковать. по правде говоря, можно было проверить и приказом. Но тот сбивает приказ. Работал только с полями таргета атаки, а вот доступ к таргетам абилки 'atar' недоступно, возвращает ноль.
код
есть один нюанс. обозначение цели как герой/не герой, древо/не древо, техника/не техника, самоубийцы/не самоубийцы лучше чекать классификацией. Не работает. На этом все.
do
local InitGlobalsOrigin = InitGlobals -- хукаем функцию InitGlobals
function InitGlobals()
InitGlobalsOrigin()
function IsFlagSet(flags, pos)
if pos == nil then
return false
else
return flags >> pos & 1 == 1
end
end
pos_unit = {}
pos_destructible = {}
classification = {}
string_class = {}
pos_destructible[1]=7 --tree
pos_destructible[2]=8 --wall
pos_destructible[3]=9 --debris
pos_destructible[4]=10 --decoration
pos_destructible[5]=11 --bridge
pos_unit[1]=1 --ground
pos_unit[2]=2 --air
pos_unit[3]=3 --structure
pos_unit[4]=4 --ward
pos_unit[5]=23 --non-hero
pos_unit[6]=22 --hero
pos_unit[7]=26 --Organic
pos_unit[8]=27 --Mechanical
pos_unit[9]=28 --non-suicidal
pos_unit[10]=29 --suicidal
pos_unit[11]=30 --non-ancient
pos_unit[12]=31 --ancient
pos_unit[13]=24 --alive
pos_unit[14]=25 --dead
pos_unit[15]=20 --Vulnerable
pos_unit[16]=21 --Invulnerable
pos_unit[17]=17 --not self
pos_unit[18]=12 --self
pos_unit[19]=14 --friend
pos_unit[20]=16 --enemy
pos_unit[21]=13 --Player Units
pos_unit[22]=15 --Neutral => указывают в UNIT CLASSIFICATION
classification[5] = UNIT_TYPE_HERO
classification[7] = UNIT_TYPE_MECHANICAL
classification[9] = UNIT_TYPE_SAPPER
classification[11] = UNIT_TYPE_ANCIENT
classification[13] = UNIT_TYPE_DEAD
string_class[5] = " non-hero: "
string_class[6] = " hero: "
string_class[7] = " mechanical: "
string_class[8] = " organic: "
string_class[9] = " suicidal: "
string_class[10] = " non-suicidal: "
string_class[11] = " non-ancient: "
string_class[12] = " ancient: "
string_class[13] = " alive: "
string_class[14] = " dead: "
string_class[15] = " vulnerable: "
string_class[16] = " invulnerable: "
string_class[17] = " not self: "
string_class[18] = " self: "
string_class[19] = " friend: "
string_class[20] = " non-friend: "
string_class[21] = " player unit: "
string_class[22] = " neutral: "
local string_bug = ""
function comp_flags(flags1,flags2,pos)
local p1 = IsFlagSet(flags1, pos)
local p2 = IsFlagSet(flags2, pos)
--условие истино: 2 параметра положительно, или если 2 параметра не указано
--условие ложно: если 2 параметра не соотвествуют друг другу
if p1==p2 then
--если два параметра положительны
if p1 then
string_bug = string_bug.."1"
else
string_bug = string_bug.."0"
end
return true
else
string_bug = string_bug.."0"
return false
end
end
function comp_bool(flags1,bool,pos)
local p1 = IsFlagSet(flags1, pos_unit[pos])
if p1 ~= bool and p1 then
string_bug = string_bug.."|cffff0000"..string_class[pos].."|r".."0"
return false
elseif p1 == bool and p1 then
string_bug = string_bug.."|cff00ff00"..string_class[pos].."|r".."1"
end
return true
end
function IsUnitFriend(unit,tg)
return IsUnitAlly(tg, GetOwningPlayer(unit)) and unit~=tg
end
function IsItUnitPlayer(unit,tg)
return GetOwningPlayer(unit)==GetOwningPlayer(tg) and unit~=tg
end
function IsItUnitNeutral(unit)
local flags = BlzGetUnitIntegerField(unit, UNIT_IF_UNIT_CLASSIFICATION)
return IsFlagSet(flags,8)
end
function CheckFieldAbility(unit,field,rawcode,lv)
local ability = BlzGetUnitAbility(unit, rawcode)
local param = ConvertAbilityIntegerLevelField(field)
return BlzGetAbilityIntegerLevelField(ability, param, lv)
end
function flages_target(flags1,flags2,unit,tg,IsItAttack)
local max = 22 --макс параметров типов цели
local b = true
local c = 0
if IsItAttack then
max = 12
end
--проверка по типу "или"
--если один из параметров цели (ground,air,structure,ward) соотвествует атаке.
--если юнит не может атаковать ни одной из 4 целей
string_bug = ""
for a=1,4 do
if not comp_flags(flags1,flags2,pos_unit[a]) then
c = c + 1
end
end
if c == 4 then
b = false
string_bug = "|cffff0000ground,air,structure,ward:|r "..string_bug
else
string_bug = "|cff00ff00ground,air,structure,ward:|r "..string_bug
end
--далее идет проверка по типу "и"
for i=5,max,2 do
if i < max then
if not comp_bool(flags1,IsUnitType(tg, classification[i]),i+1) then
b = false
end
if not comp_bool(flags1,not IsUnitType(tg, classification[i]),i) then
b = false
end
end
end
if IsItAttack then
if BlzIsUnitInvulnerable(tg) then
string_bug=string_bug.." |cffff0000invulnerable:|r 0"
b = false
end
else
--vulnerable/invulnerable
if not comp_bool(flags1,not BlzIsUnitInvulnerable(tg),15) then
b = false
end
if not comp_bool(flags1,BlzIsUnitInvulnerable(tg),16) then
b = false
end
--vulnerable/invulnerable
if not comp_bool(flags1,not BlzIsUnitInvulnerable(tg),15) then
b = false
end
if not comp_bool(flags1,BlzIsUnitInvulnerable(tg),16) then
b = false
end
--not self/self
if not comp_bool(flags1,unit~=tg,17) then
b = false
end
if not comp_bool(flags1,unit==tg,18) then
b = false
end
--friend/enemy
if not comp_bool(flags1,IsUnitFriend(unit,tg),19) then
b = false
end
if not comp_bool(flags1,IsUnitEnemy(tg, GetOwningPlayer(unit)),20) then
b = false
end
--player units
if not comp_bool(flags1,IsItUnitPlayer(unit,tg),21) then
b = false
end
--neutral
if not comp_bool(flags1,IsItUnitNeutral(unit),22) then
b = false
end
end
print(string_bug)
return b
end
function IsItPossibleToAttackTheTarget(unit, target)
--если может атаковать
if GetUnitAbilityLevel(unit,FourCC('Aatk'))>0 and target~=nil then
local b1 = BlzGetUnitWeaponBooleanField(unit, UNIT_WEAPON_BF_ATTACKS_ENABLED, 0)
local b2 = BlzGetUnitWeaponBooleanField(unit, UNIT_WEAPON_BF_ATTACKS_ENABLED, 1)
if b1 then
local flags_attacker_1 = BlzGetUnitWeaponIntegerField(unit, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, 0)
local flags_target = BlzGetUnitIntegerField(target, UNIT_IF_TARGETED_AS)
--local flags_spelltargetscaster = CheckFieldAbility(unit,FourCC('atar'),FourCC('AHad'),0) --поле таргета абилок не работает, вернет ноль
if not flages_target(flags_attacker_1,flags_target,unit,target,true) then
print("|cffff0000"..GetUnitName(unit).." не может атаковать цель|r")
else
print("|cff00ff00"..GetUnitName(unit).." может атаковать цель|r")
end
end
end
end
local Hpal = CreateUnit(Player(0),FourCC('Hpal'),0,0,0)
TimerStart(CreateTimer(),1.00,true,function()
IsItPossibleToAttackTheTarget(Hpal, BlzGetMouseFocusUnit())
end)
end
end
про прокрутку, если ползунком или скроллбаром - то можно. про какую еще прокрутку вы говорите? вот за счет этого ползунка вы можете двигать список. Но вам тогда нужно продумать все. Выше ссылки с примерами
на фрейм типа TEXT можно кликать, реакции события клика есть. И можно текст подсвечивать итд. да и вообще все фреймы, кроме backdrop, имеют реакции событии.
перетаскивание мыши фреймом - игра не выдает текущие координаты мыши на экране. Только с костылями отслеживается положение курсора. Поэтому это невозможна плавно осуществить. Перетаскивание можно было бы кликами перетаскивать, жаль нельзя курсор менять/прятать.
Hate, я знаю. но можно описание или предысторию писать в TextArea.
do
local InitGlobalsOrigin = InitGlobals
function InitGlobals()
InitGlobalsOrigin()
infoPanel = BlzFrameGetParent(BlzGetFrameByName("SimpleInfoPanelUnitDetail",0))
BlzFrameClearAllPoints(infoPanel)
BlzFrameSetAbsPoint(infoPanel, FRAMEPOINT_RIGHT, 0.4, 0.3)
end
end
но я не пробовал отдельные элементы двигать. там иконки, тексты и пр. они друг с другом связаны. потом все вручную каждый элемент настраивать нужно будет. можно будет попробовать двигать
infoPanel = BlzFrameGetParent(BlzGetFrameByName("SimpleInfoPanelUnitDetail",0)) <= тк у этого родителя нет имени.
отвечает за центральную панель вместе с инвентарем. инфа панели и инвентарь показывается в зависимости от того, что ты выделил. к примеру если декор выбрать, то инвентарь закрыт (просто сверху закрывает текстура инвентарь).
попробуй сдвинуть infoPanel, мб получится. если не получится, пробуй другой способ. надеюсь, знаешь как двигать? можно попробовать еще потомков этого infoPanel мучить. у него разные панели переключения
BlzGetFrameByName("SimpleInfoPanelUnitDetail",0)
отвечает за информационную панель интерфейса одного выделенного юнита (обычного юнита: атака и защита; и героя: атака, защита, характеристики гера и др)
поля utar ua1g ua2g и др. не рассматривались поля абилок, декорации. короче вы уже должны понять.
2^0 - None
2^1 - ground
2^2 - air
2^3 - Structure
2^4 - ward
2^5 - item
2^6 - tree
2^7 - wall
2^8 - debris
2^9 - decoration
2^10 - bridge
2^11 - ??
2^12 - self (распознается игрой как кастер, атакующий)
2^13 - Player Units (цели распознаются в игре)
2^14 - ??
2^14,585 - friend (цель распознается в игре враг/союзник. зависят от параметров союза игроков)
2^15 - Neutral (цель опознается в игре. наверн это у нейтральных здании указано в классификациях neutral )
2^16 - enemy (цель распознается в игре враг/союзник)
2^16,907 - not self (распознается игрой как кастер, атакующий)
2^17 - ??
2^18 - ??
2^19 - ??
2^20 - Vulnerable (может меняться параметр уязвимости абилками или кодом)
2^21 - Invulnerable (может меняться параметр уязвимости абилками или кодом)
2^22 - hero
2^23 - Non-Hero
2^24 - alive (живые. меняется в игре от состояние жив/мертв(труп) )
2^25 - dead (мертвые. это не нежить. а трупы. это для воскрешения мертвых или как пример трупы для труповозки)
2^26 - Organic (органические. не техника)
2^27 - Mechanical
2^28 - non-suicidal
2^29 - suicidal
2^30 - non-ancient
2^31 - ancient
Выводы с атакой:
ground,air,structure,ward,item,debris - основная группа цели атаки. ну если посмотреть у всех юнитов, это это основные других не видел.
ground,air,structure,ward - разделяет группу целей-юнитов по типу "или". судя по всему разделение по типу перемещения.
hero/non hero - строгая установка по типу "and". как поставил в атаке героя, то все, атакует только героя, на обычных нельзя навести.
self/not self - можно исключить. в атаке она не работает, судя по всему это только для абилок. ну и очевидно юнит сам себя атаковать не может. но пробовал параметр "self" задать грифону, и в атаке паладосу "not self", но паладину плевать на этот флаг
organic/mechanical, suicidal/ non suicidal, ancient/non ancient - ну по типу "and"
friend,enemy, units player, neutral, self/non self - в атаке эти параметры не работают. пробовал заставить атаковать только союзников, но похоже строго не получается заставить. Герой атакует даже врагов, нейтралов и пр. Эти группы работают только в абилках. можно исключить фильтром. Тем более поиском перебираем в группу, и отсеиваем.
Vulnerable/Invulnerable - эту группу по логике тоже можно исключить. какой толк атаковать неуязвимого? юнит не может. а второй параметр бесполезен. короче, это тоже для абилок.
alive/dead - это аналогично, тут труп или жив. Мертвого трупа атаковать юнит не может. Короче, для абилок.
item - понятно, предмет
debris - тут в декорации лезь не стал. тут у декора несколько типов целей (tree,wall,decoration,bridge,debris).
разделение атаки
атаку можно разделить на 10 групп, или на 8, если рассматривать только юнитов:
--or
ground
air
structure
ward
--and
hero/non hero
organic/mechanical
suicidal/ non suicidal
ancient/non ancient
--or
item
debris
способности
рассмотрим эти типы в способностях, что не работали в атаке.
--and - строгая проверка по типу and. поставил и перестала аура работать
Vulnerable/Invulnerable
alive/dead
--по факту как and. но можно и как or рассматривать.
self/not self - сам/не сам цель. можно шаманить с этим. пробовать паладосу поставить "not self", а в ауре "self". И бафф на героя не действовал
friend/enemy - союзник/враг. на примере ауры, аура может действовать только на окружающих союзников или врагов. Союзник - не только войска союзника, но и ваши войска. Однако, сам кастер не может на себя накинуть бафф, ибо по понятным причинам не входит в группу friend/enemy.
units player - это войска, принадлежащие игроку-кастеру. "Сам кастер" не входит в эту категорию.
neutral - нейтральный юнит. по факту этим обозначают нейтральные здания. не видал других
unit classification 'utyp'
0 - ничего не указано
0 - tree (неизвестный параметр)
2^0=1 - giant (неизвестный параметр)
2^1=2 - undead (нежить, для абилок. судя по всему где-то в абилках сшито)
2^2=4 - sumoned (вызванные. нигде не видел в ро у сумонов этот параметр. а значит, задается абилками призыва)
2^3=8 - mechanical (техника для ремонта указывает этот параметр. можно обозначить юнита в качестве целях "механический", но и еще в классификации указать "техника")
2^4=16 peon
2^5=32 - suicidal
2^6=64 - town hall (главные ратуши)
2^7=128 - ancient (светлячок превращается в древо, древо имеет 2-ой параметр. может ходить)
2^8=256 - neutral (для нейтральных зданий)
2^9=512 - ward (убирает панель)
2^10=1024 - walkable (через него можно ходить, короче через него можно переходить. Видели портал? Юниты в него легко заходят. Так это меняет эта классификация)
2^11=2048 - tauren (минотавры, пример воскрешение минотавров)
goodlyhero, это рвботает. нужно использовать специальные нативки с приказом ссылка
в ссылке в комменте расписал какими нативками можно юзнуть итем, или дропнуть.
есть спец нативки юза итемов
код
//юзаем предмет
native UnitUseItem takes unit whichUnit, item whichItem returns boolean
//юзаем предмет в цель (в качестве цели могут быть юнит, итем. декорация)
native UnitUseItemTarget takes unit whichUnit, item whichItem, widget target returns boolean
//юзаем предмет в точку
native UnitUseItemPoint takes unit whichUnit, item whichItem, real x, real y returns boolean
можно использовать нативки использования приказов для итемов useslot или moveslot ( goodlyhero скинул)
код
//применение на себя
native IssueImmediateOrderById takes unit whichUnit, integer order returns boolean
//применяет приказы в точку
native IssuePointOrderById takes unit whichUnit, integer order, real x, real y returns boolean
native IssuePointOrderByIdLoc takes unit whichUnit, integer order, location whichLocation returns boolean
//применяет приказы в цель (в качестве цели могут быть юниты, предметы, декорации - деревья)
native IssueTargetOrderById takes unit whichUnit, integer order, widget targetWidget returns boolean
//852002 to 852007 (moveslot): Эти приказы перемещают указанный предмет в соответствующий слот инвентаря героя, отдавшего приказ. Идентификатор 852002 переместит предмет в первый слот, идентификатор 852003 – во второй и т.д. Можно с помощью IssueInstantTargetOrderById перетащить итем самому себе.
//852008 to 852013 (useslot): Заставляют героя, отдавшего приказ, использовать предмет, находящийся в соответствующем слоте инвентаря. Идентификатор 852008 использует предмет в первом слоте, идентификатор 852009 – во втором и т.д.
//если нужно узнать какой итем лежит в слоте, и размер инвентаря
//размер инвентаря
native UnitInventorySize takes unit whichUnit returns integer
//итем в слоте
native UnitItemInSlot takes unit whichUnit, integer itemSlot returns item
также можно и передачу и дроп через спец приказы, там конкретно чет-то можно сделать с самим предметом. Но совсем не универсальны, тк приказов мало, чтобы можно что-либо делать с предметом. мб и что-то заработает с другими приказами, если попытаться. А вдруг можно. Просто кроме дропа ничего тут не робит.
код
//ИСПОЛЬЗОВАНИЕ instantTargetWidget с помощью targetWidget на цель или точку
native IssueInstantTargetOrder takes unit whichUnit, string order, widget targetWidget, widget instantTargetWidget returns boolean
native IssueInstantTargetOrderById takes unit whichUnit, integer order, widget targetWidget, widget instantTargetWidget returns boolean
//Объяснение: на примере IssueInstantTargetOrder, заставляет юнита whichUnit //использовать приказ order на targetWidget с помощью instantTargetWidget
//Пример: есть приказ на гуи "dropitem" передать targetWidget итем instantTargetWidget или использовать какое-нибудь заклинание предмета на него
order_dropitem = 852001
//С таким же успехом можно юзать итем на цель
//ИСПОЛЬЗОВАНИЕ instantTargetWidget в точку
native IssueInstantPointOrder takes unit whichUnit, string order, real x, real y, widget instantTargetWidget returns boolean
native IssueInstantPointOrderById takes unit whichUnit, integer order, real x, real y, widget instantTargetWidget returns boolean
//Объяснение: на примере IssueInstantPointOrder, заставляет юнита whichUnit использовать приказ order в точку (x,y) или что-то сделать в точке с помощью instantTargetWidget
//Пример: к примеру есть приказ на гуи "dropitem" выбросить предмет targetWidget или приказ использовать итем instantTargetWidget в точку
order_dropitem = 852001
в ро - Attack Targets Allowed ('ua1g'/'ua2g') можно указать типы целей. Но в рефордже она возвращает в виде числа. Несколько целей уже складываются, типа здание+дух = 24.
0 - ничего не указано
0 - Terrain (ландшафт) то же самое что и тыкать по земле.
1 - None (ничего)
32 - итем item
512 - декорация decoration
---------- декорации ------------
64 - дерево tree
128 - wall стена и ворота
256 - осколки, развалины, мусор, прочее debris
1024 - мост bridge
-2147483648 - древа ancient
1073741824 - не древа non-ancient
134217728 - техника Mechanical
67108864 - органические (не техника) Organic
268435456 - не убийца non-suicidal
536870912 - убийца suicidal
пример здания + духа = 24
function check(c,ch)
if(c&ch==ch) then
print("has all classifications")
return true
else
print("has not all classifications")
return false
end
return false
end
хотел чекать проверку на атаку. или можно отдать приказ, функцуия приказа возвращает bool. если он успешен, значит может. если не успешен - не может.
если нет атаки проверяем наличие способности атаки "Aatk" lv>0
или выключена ли атака
local b1 = BlzGetUnitWeaponBooleanField(unit, UNIT_WEAPON_BF_ATTACKS_ENABLED, 0)
local b2 = BlzGetUnitWeaponBooleanField(unit, UNIT_WEAPON_BF_ATTACKS_ENABLED, 1)
MadeonOK, вроде не работает через приказ. Отдача будет от имени владельца. Т.е. отдает красный игрок юниту желтого игрока, а триггер фиксирует, что отдачу получил приказ желтый. говорили что через мемхак можно
мб попробовать периодично таймером дамажить 0.00 единиц урона триггерно этой стенкой вокруг врагов. они ДОЛЖНЫ будут агриться. только учти в самой нативке урона есть флаг атаки или че-то отвечающий за агр.
берем какую нибудь красивую иконку в качестве фона, типа сферы (у вас на картинке выше сфера). Потом берете ищете красивые буковки. В фотошопе с помощью маски-слоя накладываете буковку на фон. Все, готово. Возможно еще нужно поработать с фоном.
У вас войска игрока-компьютера управляются ИИ-скриптом? в триггерах есть - раздел ИИ. короче, там короче можно включить/отключить управление скриптом над юнитом. Если ты отключаешь, то скрипт никак не может управлять юнитом, он полностью свободен, и есть возможность управлять триггерно через отдачу приказами.
можно так временно отобрать контроль над юнитом у скрипта
Мб бредово, но как вариант стоит попробовать. У юнитов можно удалить эти способности. И выдавать в нужный момент.
короче, нашел ошибку. Я не указал шаблон, не туда куда надо.
local tooltipFrameText = BlzCreateFrameByType("TEXT", "BoxedTextValue", tooltipFrameBackGround, "BoxedTextValue", 0)
x1,y1 - координаты кастера, первая точка
x2,y2 - координаты цели, вторая точка
x3,y3 - координаты снаряда (даймика). Начинаем от первой точки, и завершаем у второй.
dx = x2-x1
dy = y2-y1
a = Atan2(dy/dx) угол отрезка d - длина отрезка
x3 = x3 + d * Cos(a)
y3 = y3 + d * Sin(a)
Каждую секунду уменьшаешь длину отрезка d на s=30. Когда d < 50, значит, дошел. a - всегда будет статичным, но тут юниты двигаются, поэтому угол тоже меняется. Поэтому высчитываем таймером и угол Atan2. Вот и все.
длину определяешь по формуле
Slonick, td тоже так себе. наклепать td много ума не надо. но заинтересовать надо бы. а не чисто волны отбивать
я про старую игру "затерянный мир". чисто экономика, войнушки там минимум. много на управление и создание города, дороги, еда, деньги, рабочие, переобучение, исследование итд. разные задачи решаешь в городе.
выживалки в деревнях, можно много других пример в варкрафте карта "бродяги"
ладно поставлю лайк. заслужили. делать игру с нуля сложна.
выглядит прикольно. но слэшеров не хочется. хочется экономические какие нибудь игры на расстрой и дефенс.
берете изучаете статью. тут каждый тип ландшафта (тайл) состоит из таких вот текстур почв, камней, трав итд. короче берете заменяете в карте существующий стандартный тайл, узнаете путь и такой же текстуре прописываете. узнать путь можно в таблицах
Это время настраивается в константах: Время закат: 18.00 Время рассвет: 6.00 Время реальных секунд на игровой день: 480.00 (это сколько реальных секунд, получается реально игровой день идет 8 минут: 4 минуты ночь и 4 минуты день) Время часов в секунду: 24 (сколько часов в сутки? точно не знаю, иначе тупой перевод время часов в сек)
Время с 6.00 до 18.00 часов считается игровым днем, а время с 18.00 до 6.00 ночью. Ночью освещение становится намного темнее, чем днем.
Есть триггерные нативки:
Игра - Set the time of day to 0.00 - задает время игры.
Игра - Turn the day/night cycle (Откл/Вкл) - отключает смену дня и ночи, но так по мне часики больше не тикают, короче время запаузено. При включений время снова продолжает тикать.
Игра - Set time of day speed to 0.00% of the default speed - устанавливает скорость времени. При больших значениях время течет быстро. При низких медленно. При нуле время запаузено. просто меняет скорость смены времени. Смена дня может происходит быстро, поэтому можно замедлить время. Или наоборот. ускорить, например чтобы затестить.
» WarCraft 3 / Документация функций интерфейса - API DOC FDF
ссылка
Ред. MpW
» WarCraft 3 / Типы целей в Warcraft 3
Ред. MpW
» WarCraft 3 / Как сделать прокручиваемый список/инвентарь?
на фрейм типа TEXT можно кликать, реакции события клика есть. И можно текст подсвечивать итд. да и вообще все фреймы, кроме backdrop, имеют реакции событии.
перетаскивание мыши фреймом - игра не выдает текущие координаты мыши на экране. Только с костылями отслеживается положение курсора. Поэтому это невозможна плавно осуществить. Перетаскивание можно было бы кликами перетаскивать, жаль нельзя курсор менять/прятать.
Ред. MpW
» WarCraft 3 / Как сделать прокручиваемый список/инвентарь?
https://www.hiveworkshop.com/threads/lua-ui-framelist.319667
Ред. MpW
» WarCraft 3 / Вопрос по UI
Ред. MpW
» WarCraft 3 / Вопрос по UI
фреймы-ссылка здесь инфа какие фреймы дергать. тем более не ко всем можна обратиться.
Ред. MpW
» WarCraft 3 / Типы целей в Warcraft 3
2^0 - None
2^1 - ground
2^2 - air
2^3 - Structure
2^4 - ward
2^5 - item
2^6 - tree
2^7 - wall
2^8 - debris
2^9 - decoration
2^10 - bridge
2^11 - ??
2^12 - self (распознается игрой как кастер, атакующий)
2^13 - Player Units (цели распознаются в игре)
2^14 - ??
2^14,585 - friend (цель распознается в игре враг/союзник. зависят от параметров союза игроков)
2^15 - Neutral (цель опознается в игре. наверн это у нейтральных здании указано в классификациях neutral )
2^16 - enemy (цель распознается в игре враг/союзник)
2^16,907 - not self (распознается игрой как кастер, атакующий)
2^17 - ??
2^18 - ??
2^19 - ??
2^20 - Vulnerable (может меняться параметр уязвимости абилками или кодом)
2^21 - Invulnerable (может меняться параметр уязвимости абилками или кодом)
2^22 - hero
2^23 - Non-Hero
2^24 - alive (живые. меняется в игре от состояние жив/мертв(труп) )
2^25 - dead (мертвые. это не нежить. а трупы. это для воскрешения мертвых или как пример трупы для труповозки)
2^26 - Organic (органические. не техника)
2^27 - Mechanical
2^28 - non-suicidal
2^29 - suicidal
2^30 - non-ancient
2^31 - ancient
hero/non hero - строгая установка по типу "and". как поставил в атаке героя, то все, атакует только героя, на обычных нельзя навести.
self/not self - можно исключить. в атаке она не работает, судя по всему это только для абилок. ну и очевидно юнит сам себя атаковать не может. но пробовал параметр "self" задать грифону, и в атаке паладосу "not self", но паладину плевать на этот флаг
organic/mechanical, suicidal/ non suicidal, ancient/non ancient - ну по типу "and"
friend,enemy, units player, neutral, self/non self - в атаке эти параметры не работают. пробовал заставить атаковать только союзников, но похоже строго не получается заставить. Герой атакует даже врагов, нейтралов и пр. Эти группы работают только в абилках. можно исключить фильтром. Тем более поиском перебираем в группу, и отсеиваем.
Vulnerable/Invulnerable - эту группу по логике тоже можно исключить. какой толк атаковать неуязвимого? юнит не может. а второй параметр бесполезен. короче, это тоже для абилок.
alive/dead - это аналогично, тут труп или жив. Мертвого трупа атаковать юнит не может. Короче, для абилок.
item - понятно, предмет
debris - тут в декорации лезь не стал. тут у декора несколько типов целей (tree,wall,decoration,bridge,debris).
--or
Vulnerable/Invulnerable
alive/dead
self/not self - сам/не сам цель. можно шаманить с этим. пробовать паладосу поставить "not self", а в ауре "self". И бафф на героя не действовал
friend/enemy - союзник/враг. на примере ауры, аура может действовать только на окружающих союзников или врагов. Союзник - не только войска союзника, но и ваши войска. Однако, сам кастер не может на себя накинуть бафф, ибо по понятным причинам не входит в группу friend/enemy.
units player - это войска, принадлежащие игроку-кастеру. "Сам кастер" не входит в эту категорию.
neutral - нейтральный юнит. по факту этим обозначают нейтральные здания. не видал других
0 - tree (неизвестный параметр)
2^0=1 - giant (неизвестный параметр)
2^1=2 - undead (нежить, для абилок. судя по всему где-то в абилках сшито)
2^2=4 - sumoned (вызванные. нигде не видел в ро у сумонов этот параметр. а значит, задается абилками призыва)
2^3=8 - mechanical (техника для ремонта указывает этот параметр. можно обозначить юнита в качестве целях "механический", но и еще в классификации указать "техника")
2^4=16 peon
2^5=32 - suicidal
2^6=64 - town hall (главные ратуши)
2^7=128 - ancient (светлячок превращается в древо, древо имеет 2-ой параметр. может ходить)
2^8=256 - neutral (для нейтральных зданий)
2^9=512 - ward (убирает панель)
2^10=1024 - walkable (через него можно ходить, короче через него можно переходить. Видели портал? Юниты в него легко заходят. Так это меняет эта классификация)
2^11=2048 - tauren (минотавры, пример воскрешение минотавров)
Ред. MpW
» Модели из World Of WarCraft / Фермеры
Ред. MpW
» WarCraft 3 / Зелье вампиризма. тригерно использовать предметную абилку ID
ссылка
в ссылке в комменте расписал какими нативками можно юзнуть итем, или дропнуть.
» WarCraft 3 / Типы целей в Warcraft 3
0 - Terrain (ландшафт) то же самое что и тыкать по земле.
1 - None (ничего)
512 - декорация decoration
128 - wall стена и ворота
256 - осколки, развалины, мусор, прочее debris
1024 - мост bridge
4 - воздушный air
4096 - self сам
1048576 - уязвимый Vulnerable
8388608 - Non-Hero
24576 - друзья, союзники friend
33554432 - мертвые dead
1073741824 - не древа non-ancient
67108864 - органические (не техника) Organic
536870912 - убийца suicidal
если нет атаки проверяем наличие способности атаки "Aatk" lv>0
или выключена ли атака
local b1 = BlzGetUnitWeaponBooleanField(unit, UNIT_WEAPON_BF_ATTACKS_ENABLED, 0)
local b2 = BlzGetUnitWeaponBooleanField(unit, UNIT_WEAPON_BF_ATTACKS_ENABLED, 1)
» WarCraft 3 / eventDispatcher - Диспетчер Событий
» WarCraft 3 / eventDispatcher - Диспетчер Событий
Ред. MpW
» WarCraft 3 / Определить игрока, использующий нейтральное строение
Ред. MpW
» WarCraft 3 / Копирование юнитов во время игры
краткий_гайд_на_эту_же_тему
тот_же_гайд_только_зеркально
Ред. MpW
» WarCraft 3 / Приоритет для атаки AI
» WarCraft 3 / Иконки с буквами
Ред. MpW
» WarCraft 3 / Можно ли отключить применение способностей компьютером?
» WarCraft 3 / frame: размер шрифта
local tooltipFrameText = BlzCreateFrameByType("TEXT", "BoxedTextValue", tooltipFrameBackGround, "BoxedTextValue", 0)
Ред. MpW
» WarCraft 3 / Двигать юнита(ов) к юниту?
x2,y2 - координаты цели, вторая точка
x3,y3 - координаты снаряда (даймика). Начинаем от первой точки, и завершаем у второй.
dx = x2-x1
dy = y2-y1
a = Atan2(dy/dx) угол отрезка
d - длина отрезка
x3 = x3 + d * Cos(a)
y3 = y3 + d * Sin(a)
длину определяешь по формуле
» WarCraft 3 / Путь эффекта невидимости
» WarCraft 3 / Становление Шиноби из деревни скрытой в шахте
Ред. MpW
» Unity / Пеоны разбойники 2
я про старую игру "затерянный мир". чисто экономика, войнушки там минимум. много на управление и создание города, дороги, еда, деньги, рабочие, переобучение, исследование итд. разные задачи решаешь в городе.
выживалки в деревнях, можно много других пример в варкрафте карта "бродяги"
Ред. MpW
» Unity / Пеоны разбойники 2
выглядит прикольно. но слэшеров не хочется. хочется экономические какие нибудь игры на расстрой и дефенс.
Ред. MpW
» WarCraft 3 / Как можно заменить тайл?
Ред. MpW
» WarCraft 3 / Сколько длится день и ночь в варкрафт 3?
Время закат: 18.00
Время рассвет: 6.00
Время реальных секунд на игровой день: 480.00 (это сколько реальных секунд, получается реально игровой день идет 8 минут: 4 минуты ночь и 4 минуты день)
Время часов в секунду: 24 (сколько часов в сутки? точно не знаю, иначе тупой перевод время часов в сек)
Время с 6.00 до 18.00 часов считается игровым днем, а время с 18.00 до 6.00 ночью. Ночью освещение становится намного темнее, чем днем.
Игра - Set the time of day to 0.00 - задает время игры.
Игра - Turn the day/night cycle (Откл/Вкл) - отключает смену дня и ночи, но так по мне часики больше не тикают, короче время запаузено. При включений время снова продолжает тикать.
Игра - Set time of day speed to 0.00% of the default speed - устанавливает скорость времени. При больших значениях время течет быстро. При низких медленно. При нуле время запаузено. просто меняет скорость смены времени. Смена дня может происходит быстро, поэтому можно замедлить время. Или наоборот. ускорить, например чтобы затестить.