27

» WarCraft 3 / Типы целей в Warcraft 3

вот код проверки атаки, можно навести мышью на любого юнита, и вам покажет может ли герой атаковать. по правде говоря, можно было проверить и приказом. Но тот сбивает приказ. Работал только с полями таргета атаки, а вот доступ к таргетам абилки '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
27

» WarCraft 3 / Как сделать прокручиваемый список/инвентарь?

про прокрутку, если ползунком или скроллбаром - то можно. про какую еще прокрутку вы говорите? вот за счет этого ползунка вы можете двигать список. Но вам тогда нужно продумать все. Выше ссылки с примерами
на фрейм типа TEXT можно кликать, реакции события клика есть. И можно текст подсвечивать итд. да и вообще все фреймы, кроме backdrop, имеют реакции событии.
перетаскивание мыши фреймом - игра не выдает текущие координаты мыши на экране. Только с костылями отслеживается положение курсора. Поэтому это невозможна плавно осуществить. Перетаскивание можно было бы кликами перетаскивать, жаль нельзя курсор менять/прятать.

Hate, я знаю. но можно описание или предысторию писать в TextArea.
27

» WarCraft 3 / Как сделать прокручиваемый список/инвентарь?

тут вот прокручиваемые списки можно сделать на фреймах
фрейм с типом TextArea позволяет работать со строками текста. Прокручивать в окошке ползунком.
27

» WarCraft 3 / Вопрос по UI

код
do
    local InitGlobalsOrigin = InitGlobals

	function InitGlobals()
		InitGlobalsOrigin()
        
    infoPanel  = BlzFrameGetParent(BlzGetFrameByName("SimpleInfoPanelUnitDetail",0))

    BlzFrameClearAllPoints(infoPanel)
    BlzFrameSetAbsPoint(infoPanel, FRAMEPOINT_RIGHT, 0.4, 0.3)
    end
end

но я не пробовал отдельные элементы двигать. там иконки, тексты и пр. они друг с другом связаны. потом все вручную каждый элемент настраивать нужно будет. можно будет попробовать двигать
Загруженные файлы
27

» WarCraft 3 / Вопрос по UI

основы-ссылка
фреймы-ссылка здесь инфа какие фреймы дергать. тем более не ко всем можна обратиться.
infoPanel  = BlzFrameGetParent(BlzGetFrameByName("SimpleInfoPanelUnitDetail",0)) <= тк у этого родителя нет имени. 
отвечает за центральную панель вместе с инвентарем. инфа панели и инвентарь показывается в зависимости от того, что ты выделил. к примеру если декор выбрать, то инвентарь закрыт (просто сверху закрывает текстура инвентарь).
попробуй сдвинуть infoPanel, мб получится. если не получится, пробуй другой способ. надеюсь, знаешь как двигать? можно попробовать еще потомков этого infoPanel мучить. у него разные панели переключения
BlzGetFrameByName("SimpleInfoPanelUnitDetail",0)
отвечает за информационную панель интерфейса одного выделенного юнита (обычного юнита: атака и защита; и героя: атака, защита, характеристики гера и др)
27

» WarCraft 3 / Типы целей в Warcraft 3

типы целей.
поля 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
  1. ground
  2. air
  3. structure
  4. ward
--and
  1. hero/non hero
  2. organic/mechanical
  3. suicidal/ non suicidal
  4. ancient/non ancient
--or
  1. item
  2. 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 (минотавры, пример воскрешение минотавров)
27

» Модели из World Of WarCraft / Фермеры

вау. какие классные модели, забираю себе. Эльрата попрошу с ними поработать.
27

» WarCraft 3 / Зелье вампиризма. тригерно использовать предметную абилку ID

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
27

» WarCraft 3 / Типы целей в Warcraft 3

кину куда-нибудь мб потом пригодиться.
одиночные цели
в ро - Attack Targets Allowed ('ua1g'/'ua2g') можно указать типы целей. Но в рефордже она возвращает в виде числа. Несколько целей уже складываются, типа здание+дух = 24.
0 - ничего не указано
0 - Terrain (ландшафт) то же самое что и тыкать по земле.
1 - None (ничего)
32 - итем item
512 - декорация decoration
---------- декорации ------------
64 - дерево tree
128 - wall стена и ворота
256 - осколки, развалины, мусор, прочее debris
1024 - мост bridge
---------- Юниты -----------
32768 - юнит нейтрального игрока Neutral
8192 - юниты игрока Player Units
2 - наземный ground
4 - воздушный air
8 - Structure
16 - дух ward
122880 - not self не сам
4096 - self сам
2097152 - неуязвимый Invulnerable
1048576 - уязвимый Vulnerable
4194304 - hero
8388608 - Non-Hero
65536 - враги enemy
24576 - друзья, союзники friend
16777216 - живые alive
33554432 - мертвые dead
-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)
27

» WarCraft 3 / eventDispatcher - Диспетчер Событий

ScorpioT1000, уже видел в вашей демо наработке на движение с векторами. но ничего не понял. похоже на дебаг
27

» WarCraft 3 / Определить игрока, использующий нейтральное строение

MadeonOK, вроде не работает через приказ. Отдача будет от имени владельца. Т.е. отдает красный игрок юниту желтого игрока, а триггер фиксирует, что отдачу получил приказ желтый. говорили что через мемхак можно
27

» WarCraft 3 / Приоритет для атаки AI

мб попробовать периодично таймером дамажить 0.00 единиц урона триггерно этой стенкой вокруг врагов. они ДОЛЖНЫ будут агриться. только учти в самой нативке урона есть флаг атаки или че-то отвечающий за агр.
27

» WarCraft 3 / Иконки с буквами

берем какую нибудь красивую иконку в качестве фона, типа сферы (у вас на картинке выше сфера). Потом берете ищете красивые буковки. В фотошопе с помощью маски-слоя накладываете буковку на фон. Все, готово. Возможно еще нужно поработать с фоном.
27

» WarCraft 3 / Можно ли отключить применение способностей компьютером?

У вас войска игрока-компьютера управляются ИИ-скриптом? в триггерах есть - раздел ИИ. короче, там короче можно включить/отключить управление скриптом над юнитом. Если ты отключаешь, то скрипт никак не может управлять юнитом, он полностью свободен, и есть возможность управлять триггерно через отдачу приказами.
можно так временно отобрать контроль над юнитом у скрипта

Мб бредово, но как вариант стоит попробовать. У юнитов можно удалить эти способности. И выдавать в нужный момент.
27

» WarCraft 3 / frame: размер шрифта

короче, нашел ошибку. Я не указал шаблон, не туда куда надо.
local tooltipFrameText = BlzCreateFrameByType("TEXT", "BoxedTextValue", tooltipFrameBackGround, "BoxedTextValue", 0)
27

» WarCraft 3 / Двигать юнита(ов) к юниту?

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. Вот и все.
длину определяешь по формуле
Есть функция разные. Смотри в базе. У юнитов SetUnitX\Y, можно вместо юнитов, эффекты двигать.
27

» Unity / Пеоны разбойники 2

Slonick, td тоже так себе. наклепать td много ума не надо. но заинтересовать надо бы. а не чисто волны отбивать
я про старую игру "затерянный мир". чисто экономика, войнушки там минимум. много на управление и создание города, дороги, еда, деньги, рабочие, переобучение, исследование итд. разные задачи решаешь в городе.
выживалки в деревнях, можно много других пример в варкрафте карта "бродяги"
27

» Unity / Пеоны разбойники 2

ладно поставлю лайк. заслужили. делать игру с нуля сложна.
выглядит прикольно. но слэшеров не хочется. хочется экономические какие нибудь игры на расстрой и дефенс.
27

» WarCraft 3 / Как можно заменить тайл?

есть на сайте статья об этом


берете изучаете статью. тут каждый тип ландшафта (тайл) состоит из таких вот текстур почв, камней, трав итд. короче берете заменяете в карте существующий стандартный тайл, узнаете путь и такой же текстуре прописываете. узнать путь можно в таблицах
27

» 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 - устанавливает скорость времени. При больших значениях время течет быстро. При низких медленно. При нуле время запаузено. просто меняет скорость смены времени. Смена дня может происходит быстро, поэтому можно замедлить время. Или наоборот. ускорить, например чтобы затестить.