27

» WarCraft 3 / Проверка заполненности логического массива

Alexey103, все зависит от того, что вы пытаетесь сделать. Зачем тебе
Нужно получить такую цепочку "table от 1 до Х = да" в условии
переменная (Integer A) используется для циклов, может не подойти так как используется где-нибудь в другом триггере, и значение меняется. Тебе точно не подойдет, не говорил прямо использовал именно ее (а скорее какую глобалку). Неизвестно. что вы пытаетесь сделать (что за table). Мб тебе номер игрока нужен вместо этой глобалки, скорее всего (вместо Integer A укажи номер игрока, если это то, что нужно),
27

» WarCraft 3 / Проверка заполненности логического массива

Если тебе просто индекс нужно проверить (например от 1 до 3), проверяй так
A - целочисленная переменная
как вычислить промежуток от 1 до 3
if A > 0 and A < 4  then
действие
endif
как вставить в переменную
if A > 0 and A < 4 and table[A] == true  then
действие
endif
циклом еще проще, не нужно делать, так как там сам условие (от 1 до 3) поставишь.
27

» WarCraft 3 / Где искать не защищенные карты с триггерами на GUI?

Как взломать карту много букв
  1. Ломаешь защиту карты с помощью утилиты xDeprotect
  2. Открыть стандартным редактором в большинстве случаев нельзя будет, только редактором jngp. это если имеется дело с продвинутыми картами, так как такие карты создавались в продвинутом редакторе, в ней сняты многие ограничения (лимиты) карты. Обычный редактор может не открыть
  3. Некоторые авторы карт стараются вредить архив так, что нельзя будет открыть карту редактором (специально). Можно восстановить архив через программу w3map Restorer. Смутно понимаю назначение этой проги (она то ли поврежденные из slk-таблиц в обратно в РО заделывает, или просто восстанавливает архив, чтобы открыть. Мне неизвестно. Впрочем, никогда не работало, ибо неизвестно как работает, что делает). Карты могли не открываться редактором, пробовал по нескольку ломать, если не работало, тогда через mqp-архиваторы открывал (чаще открывали после депректа, если же нет, то мне достаточно было поковыряться mpq-архиватором)
  1. Нужно нам достать какой-нибудь скилл или объект, что делать?
  • 4.1) В карте, поиграв в нее, узнаем название нужного нам скила или юнита, запоминаем или записываем где-то
  • 4.2) Открываем mpq-архиваторы (любой): мне понравились mpqmaster и Ladik's MPQ Editor, затем с их помощью открываем карту. Карта - своего рода архив, в ней хранятся кучу папок, файлов с названиями. Если она взломана депректором, то там не будет никакой белеберды. В закрытых не взломанных картах файлы невозможно понять, так как все файлы не имеют четкого названия (короче написана белеберда), короче закодированы, из-за этого не понять, еще и файлы не открыть и не извлечь.
За все файлы в архиве отвечает файл (listfile), он содержит описание всех файлов в архиве.
Поэтому нужно взломать депректором сначала. Большинство карт могут не иметь защиты, а если и есть, то она довольно простая, после депректа открывается сразу (все есть и норм). В более сложных популярных картах еще сложнее взламывать. Сложность заключается в данных, сохраненных в slk. slk - таблицы, которые можно открыть в Excel. В чем сложность то? Если открыть карту, и заглянуть в РО, то не заметите там никаких ваших юнитов, способностей и так далее, никаких изменений = словно чистый лист. Но на самом то деле, они есть, просто хранятся в архиве карты. Это надо открывать mpq и вытаскивать все таблицы с текстами, просматривать.
Да и в чем же сложность? Собственно, в том, что приходится кучу времени тратить. Если в РО было понятно все, имелись описания, и каждая строчка переведена была. То в архиве карты объекты разделены на тексты и таблицы. Описания и названия хранятся в текстах, а данные в slk таблицах. В этих таблицах вам нужно будет понять за что каждый столбик отвечает (например, за перезарядку, или за область действия способности, путь иконки и жр). Здесь можно узнать на какой основе сделана способность (обычно рядом с первым равкодом, есть второй). Это если хотите полностью скопировать.
Чтобы создать slk таблицы есть Widgetizer, который оптимизирует таблицы. А чтобы восстановить slk таблицы так, чтобы отображались в РО есть восстановитель w3map Restorer. Как писал выше, с w3map Restorer обычно никогда работало у меня.
Возвращаемся к взлому. Теперь депректором взломали карту
  • 4.3) Открыв архив, ищем папку Units. Здесь хранятся описания способностей, юнитов в текстах. Также есть отссылки к равкодам.
Если сразу не открыть в мпю-архиве, тогда попробуйте извлечь этот файл на рабочем столе. И там пробуйте открыть.
Например, я хочу достать скилл Wild Axes в доте.
Тогда мне придеться перерыть все текстовики с названием окончивающие на AbilityStrings (например, CampaignAbilityStrings, HumanAbilityStrings, OrcAbilityStrings и др.). Аналогично и с юнитами UnitStrings. Они все тут разделены по рассам и других категориям. Блокнотом открываете и жмете Ctrl + F, ищете.
Нашел в тексте UndeadAbilityStrings
вот оно описание скила
[A0O1]
Name=Wild Axes
Tip=|cffffcc00W|rild Axes - [|cffffcc00Уровень 1|r],|cffffcc00W|rild Axes - [|cffffcc00Уровень 2|r],|cffffcc00W|rild Axes - [|cffffcc00Уровень 3|r],|cffffcc00W|rild Axes - [|cffffcc00Уровень 4|r]
Ubertip="Швыряет обе свои секиры, которые встречаются и возвращаются к хозяину. Каждая наносит по 90 урона каждому врагу на своём пути, но не более 1 раза.|n|n|cff99ccffПерезарядка:|r 13 секунд|n|cff99ccffPaдиуc дeйcтвия:|r 100|n|cff99ccffДaльнocть пpимeнeния:|r 1300","Швыряет обе свои секиры, которые встречаются и возвращаются к хозяину. Каждая наносит по 120 урона каждому врагу на своём пути, но не более 1 раза.|n|n|cff99ccffПерезарядка:|r 13 секунд|n|cff99ccffPaдиуc дeйcтвия:|r 100|n|cff99ccffДaльнocть пpимeнeния:|r 1300","Швыряет обе свои секиры, которые встречаются и возвращаются к хозяину. Каждая наносит по 150 урона каждому врагу на своём пути, но не более 1 раза.|n|n|cff99ccffПерезарядка:|r 13 секунд|n|cff99ccffPaдиуc дeйcтвия:|r 100|n|cff99ccffДaльнocть пpимeнeния:|r 1300","Швыряет обе свои секиры, которые встречаются и возвращаются к хозяину. Каждая наносит по 180 урона каждому врагу на своём пути, но не более 1 раза.|n|n|cff99ccffПерезарядка:|r 13 секунд|n|cff99ccffPaдиуc дeйcтвия:|r 100|n|cff99ccffДaльнocть пpимeнeния:|r 1300"
Hotkey=W
Researchtip=Изучить |cffffcc00W|rild Axes - [|cffffcc00Уровень %d|r]
Researchubertip="Rexxar швыpяeт обе свои секиры, кoтopыe вcтpeчaютcя в укaзaннoм мecтe и вoзвpaщaютcя к нeму. Kaждый тoпop нaнocит уpoн кaждoму юниту нa cвoeм пути лишь oднaжды.|n|n|cffffcc00Уpoвeнь 1|r - 90 уpoнa на секиру.|n|cffffcc00Уpoвeнь 2|r - 120 уpoнa на секиру.|n|cffffcc00Уpoвeнь 3|r - 150 уpoнa на секиру.|n|cffffcc00Уpoвeнь 4|r - 180 уpoнa на секиру.|n|n|cff99ccffПepeзapядкa:|r 13 ceкунд|n|cff99ccffTpeбуeт мaны:|r 120"
Researchhotkey=W
Это все описание не важно мне, беру только равкод. Из текста беру равкод = A0O1. Может пригодиться для работ с таблицами и триггерами.
  • 4.4) Триггеры. Триггеров в карте может не быть, в большинстве случаев. Редко видел такое. Они хранятся чаще всего в архиве карты в war3map.j Мпк-архиватором вытаскиваете. Открыв этот файл, можно увидеть, полный хаос и кучу кода. Вряд ли поймете без знания jass. И вряд ли вы найдете в ней четырех-значные равкоды, скорее всего они переведены из 256-ричной системы в десятичную или какую-нибудь другую. В доте переведена в десятичную. Можно поискать на сайтах как перевести числа или найти онлайн калькуляторы
A0O1 = 1093685041
  • 4.5) Мы получили равкод в деситичной системе счисления 1093685041. В файле war3map.j ищем это число. Что нужно сделать? найти все функции, в которых есть это число.
код функции (не полные конечно, очень много бессмысленницы)
function R92 takes nothing returns boolean
return GetSpellAbilityId()==1093685041
endfunction
перевести для вида можно так:
function R92 takes nothing returns boolean
	return GetSpellAbilityId()==1093685041
endfunction
ищем теперь все функции вызывают эту функцию, набираете название функции R92
function Q8I takes nothing returns boolean

	return true

endfunction......


function Q9I takes trigger t,playerunitevent QAI returns nothing

local integer L9I=0

loop

	call TriggerRegisterPlayerUnitEvent(t,Player(L9I),QAI,Condition(function Q8I))

	set L9I=L9I+1
	
exitwhen L9I==16

endloop

endfunction

function LGI takes nothing returns nothing

call DisplayTimedTextToPlayer(GetEnumPlayer(),0,U2,YJ,XJ)

endfunction


function LHI takes force LZI,real KLI,string LVI returns nothing

set XJ=LVI

set YJ=KLI

call ForForce(LZI,function LGI)

endfunction


function MDI takes nothing returns group

local integer i=IJ

loop

	exitwhen i==IJ-1

	if QY[i]==false then
		
set IJ=i+1
		
if IJ==120 then

			set IJ=0
		
endif
		
set QY[i]=true
		
return PY[i]
	
endif

	set i=i+1

	if i==120 then

		set i=0

	endif

endloop

call LHI(P2,5.00,"|c00ff0303CRITICAL ERROR: FOUND NO AVAILABLE GROUPS|r")

call LHI(P2,5.00,"|c00ff0303Send this replay to IceFrog@gmail.com|r")

return CreateGroup()

endfunction

function MCI takes group g returns nothing

local integer i=GetHandleId(g)-UY

if i<0 or i>120 then

	set OJ=true

else

	call GroupClear(g)

	set QY[i]=false

	set IJ=i

endif

endfunction


function PAI takes real x1,real y1,real x2,real y2 returns real

return SquareRoot(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)))

endfunction


function QTI takes unit N0I,integer QRI returns nothing

call UnitAddAbility(N0I,QRI)

call UnitMakeAbilityPermanent(N0I,true,QRI)

endfunction



function RGI takes real y returns real

local real RDI=GetRectMinY(bj_mapInitialPlayableArea)+50

if(y<RDI)then

return RDI

endif

set RDI=GetRectMaxY(bj_mapInitialPlayableArea)-50

if(y>RDI)then

return RDI

endif

return y

endfunction


function RCI takes real x returns real

local real RDI=GetRectMinX(bj_mapInitialPlayableArea)+50

if(x<RDI)then
return RDI
endif
set RDI=GetRectMaxX(bj_mapInitialPlayableArea)-50

if(x>RDI)then

return RDI

endif

return x

endfunction



function RA2 takes unit R7I,real x,real y,group WVO returns nothing

local group GK1=MDI()

local unit V11

call QEI(x,y,150)

call GroupEnumUnitsInRange(GK1,x,y,150,Condition(function LWI))

loop

set V11=FirstOfGroup(GK1)

exitwhen V11==null

if(IsUnitInGroup(V11,WVO)==false and IsUnitEnemy(V11,GetOwningPlayer(R7I)))then
	
if(GetUnitAbilityLevel(V11,1093678162)!=1 and GetUnitState(V11,UNIT_STATE_LIFE)>0 and IsUnitType(V11,UNIT_TYPE_STRUCTURE)==false)the
		ncall GroupAddUnit(WVO,V11)
		
call UnitDamageTarget(R7I,V11,60+GetUnitAbilityLevel(R7I,1093685041)*30,true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_METAL_HEAVY_SLICE)

call AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl",V11,"overhead")
endif
endif
call GroupRemoveUnit(GK1,V11)
endloop
call MCI(GK1)
endfunction



function RB2 takes nothing returns nothing

local integer MKI=GetHandleId(GetExpiredTimer())

local unit RC2=(LoadUnitHandle(XY,(MKI),(290)))

local unit N0I=(LoadUnitHandle(XY,(MKI),(14)))

local real Ax=(LoadReal(XY,(MKI),(284)))

local real Ay=(LoadReal(XY,(MKI),(285)))

local real Cx=(LoadReal(XY,(MKI),(286)))

local real Cy=(LoadReal(XY,(MKI),(287)))

local real Bx=(LoadReal(XY,(MKI),(288)))

local real By=(LoadReal(XY,(MKI),(289)))

local real a=(LoadReal(XY,(MKI),(137)))

local real b=1-a

local boolean RD2=(LoadBoolean(XY,(MKI),(291)))

local group WVO=(LoadGroupHandle(XY,(MKI),(133)))

local real RE2=RMaxBJ(PAI(Ax,Ay,Cx,Cy)/1300,0.4)

call SetUnitX(RC2,RCI(Ax*a*a+Bx*2*a*b+Cx*b*b))

call SetUnitY(RC2,RGI(Ay*a*a+By*2*a*b+Cy*b*b))

call RA2(N0I,GetUnitX(RC2),GetUnitY(RC2),WVO)

if(RD2)then

	call SaveReal(XY,(MKI),(137),((a-.02/RE2)*1.0))

else
	
call SaveReal(XY,(MKI),(137),((a+.02/RE2)*1.0))

	call SaveReal(XY,(MKI),(284),((GetUnitX(N0I))*1.0))

	call SaveReal(XY,(MKI),(285),((GetUnitY(N0I))*1.0))

endif

if(a<0 and RD2)then

	call SaveBoolean(XY,(MKI),(291),(false))

	call SaveReal(XY,(MKI),(288),((Ax+300*Cos(Atan2(Cy-Ay,Cx-Ax)+(LoadReal(XY,(MKI),(292)))))*1.0))

	call SaveReal(XY,(MKI),(289),((Ay+300*Sin(Atan2(Cy-Ay,Cx-Ax)+(LoadReal(XY,(MKI),(292)))))*1.0))

endif

if(a>1 and RD2==false)then

	call PauseTimer(GetExpiredTimer())
	
call MCI(WVO)

	call FlushChildHashtable(XY,(MKI))

	call RemoveUnit(RC2)

	call DestroyTimer(GetExpiredTimer())

endif

endfunction


function RF2 takes nothing returns nothing

local unit R7I=GetTriggerUnit()

local real Ax=GetUnitX(R7I)

local real Ay=GetUnitY(R7I)

local real Cx=GetLocationX(GetSpellTargetLoc())

local real Cy=GetLocationY(GetSpellTargetLoc())

local unit RG2=CreateUnit(GetOwningPlayer(R7I),1697657172,Ax,Ay,270.0)

local unit RH2=CreateUnit(GetOwningPlayer(R7I),1697657172,Ax,Ay,270.0)

local integer RZ2

local integer RV2

local timer RW2=CreateTimer()

local timer RX2=CreateTimer()

if GetSpellTargetUnit()!=null then

	set Cx=GetUnitX(GetSpellTargetUnit())
	
set Cy=GetUnitY(GetSpellTargetUnit())

endif

call QTI(RG2,1097691750)

call UnitRemoveAbility(RG2,1097691750)

call SetUnitFlyHeight(RG2,150,0)

call QTI(RH2,1097691750)

call UnitRemoveAbility(RH2,1097691750)

call SetUnitFlyHeight(RH2,150,0)

set RZ2=GetHandleId(RW2)

call SaveUnitHandle(XY,(RZ2),(14),(R7I))

call SaveUnitHandle(XY,(RZ2),(290),(RG2))




call SaveGroupHandle(XY,(RZ2),(133),(MDI()))

call SaveReal(XY,(RZ2),(284),((Ax)*1.0))

call SaveReal(XY,(RZ2),(285),((Ay)*1.0))

call SaveReal(XY,(RZ2),(286),((Cx)*1.0))

call SaveReal(XY,(RZ2),(287),((Cy)*1.0))

call SaveReal(XY,(RZ2),(288),((Ax+300*Cos(Atan2(Cy-Ay,Cx-Ax)+45))*1.0))

call SaveReal(XY,(RZ2),(289),((Ay+300*Sin(Atan2(Cy-Ay,Cx-Ax)+45))*1.0))

call SaveReal(XY,(RZ2),(137),((1)*1.0))

call SaveReal(XY,(RZ2),(292),((-45)*1.0))

call SaveBoolean(XY,(RZ2),(291),(true))

set RV2=GetHandleId(RX2)

call SaveUnitHandle(XY,(RV2),(14),(R7I))

call SaveUnitHandle(XY,(RV2),(290),(RH2))

call SaveGroupHandle(XY,(RV2),(133),(MDI()))

call SaveReal(XY,(RV2),(284),((Ax)*1.0))

call SaveReal(XY,(RV2),(285),((Ay)*1.0))

call SaveReal(XY,(RV2),(286),((Cx)*1.0))

call SaveReal(XY,(RV2),(287),((Cy)*1.0))

call SaveReal(XY,(RV2),(288),((Ax+300*Cos(Atan2(Cy-Ay,Cx-Ax)-45))*1.0))

call SaveReal(XY,(RV2),(289),((Ay+300*Sin(Atan2(Cy-Ay,Cx-Ax)-45))*1.0))

call SaveReal(XY,(RV2),(137),((1)*1.0))

call SaveReal(XY,(RV2),(292),((45)*1.0))

call SaveBoolean(XY,(RV2),(291),(true))

call TimerStart(RW2,.025,true,function RB2)

call TimerStart(RX2,.025,true,function RB2)

endfunction




function V51 takes nothing returns nothing
	
local trigger t=CreateTrigger()

	call Q9I(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)

	call TriggerAddCondition(t,Condition(function R92))

	call TriggerAddAction(t,function RF2)

endfunction
получили код, посмотрели, подумали, оптимизировали, убрали лишнее. И все.
Насчет абилки, можно в электронных таблицах slk узнать на основе чего они сделаны, какие параметры выставлены, какие эффекты используют и прочее.
Загруженные файлы
27

» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3

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

» WarCraft 3 / Как сохранить доп характиристики от книг во время морфа ?

Принятый ответ
триггерный ReplaceUnit - это не морф (там удаляют одного, и на месте старого создают нового). Давным-давно когда использовал эту хрень, и столкнулся с кучей проблем: не сохранить всё, точнее не переносится на новую (вот бы близзарды к морфам нативку): эффекты, характеристики, предметы, наложенные баффы. Потому что юнит новый. Лучше используй морф, не знаю, мб попробуй через руны.
совет
Есть еще морф через абилку "темный" (это постоянный морф. Использовал когда-то для курьеров, как в доты. там есть баг, когда увеличивает защиту/атаку. Бывает на единичку увеличивает/уменьшает, а бывает и норм работает, ведет себя по-разному. Не знаю, из-за чего это случается, потом протестирую. Но на курьеров не замечал, так как это не герой, защита нулевая, и тем более у них атака выключена). Поэтому советовали использовать вместо темного обычный морф, попробуй морф с руной
27

» WarCraft 3 / если/то/иначе

Принятый ответ
что-то не вижу на скрине как вы пытаетесь запихнуть в if/then/else. Почему должен угадывать
Предположение: ошибка - локальные переменные объявляются всегда первыми. Если там будет какое-то другое действие, а объявление локалок ниже, то это ошибка. Ты вперед, наверное, поставил действие "if/then/else", а потом начал объявлять что-то там,
правильно
local unit u
if (условие) then
	действие
endif
не правильно
if (условие) then
	local unit u
endif
Локалки вначале функции всегда объявляются. Можете в код конвентировать и посмотреть.
вейты не юзайте лучше, используйте таймер. Он поток паузит, еще работает во время паузы, и не точен .
27

» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3

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

» WarCraft 3 / Подскажите на тему расходников через руны, стаки, вся фигня

Принятый ответ
мб Shuriken(it)? в переменной it нет никакого итема, пока что.
поэтому может быть и не проходит норм условие. чтобы там ни было в Shuriken
пример смотри тут
27

» WarCraft 3 / Ограничение предметов.

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

» WarCraft 3 / Ограничение кол-ва определенного предмета в инвентаре.

ладно циклом пробегай и проверяй
код
set c = 0 счетчик, считывает кол-во итемов с похожим типом (item being manipulated в расчет не берется)
цикл А от 1 до 6
if тип итема (item being manipulated) РАВНО тип итема (item in slot А) and item being manipulated НЕ РАВНО item in slot А then проверяете
set c = c + 1
endif
конец цикла
if с > 0 then
дропать item being manipulated
endif
или можно вообще было сразу дропнуть прямо в цикле и обойтись без счетчика, так как уже есть такой. и выйти из цикла
мб еще эта поможет это типа классификация, забиваете базу данных, проверяет есть ли такой в бд.
27

» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3

+ вспомнил баг, в триггерах в классификациях юнита есть "оглушение" (короче stun). И она совсем бесполезна (приходилось бафф проверять). Так понимаю, есть проверки в мем хак (думаю оттуда что-то взяли).
+ Хотелось бы еще молчанки разные (невозможность произносить заклинания, или невозможность юзать скилы и использовать итемы в инвентаре. Есть скилы, но нет таких, которые действуют на одну цель. Там помню винные пары и все. ).
+ задавать время существования баффа
Было бы классно, если в целях абилок и атак было больше всяких целей и классификации.
27

» WarCraft 3 / Смертельный союз + Темный ритуал

вопрос только почему я ставлю галочку "оставить в живых" = урон наносишь ему и себе? в некоторых случаях убиваешь сам себя.
27

» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3

ScorpioT1000, порядок приказов легко запомнить, проблема в том, что нужно знать, что в данный момент зажато ли было Shift-ом. Без этого ничего нельзя получить, так как мб игрок просто кликает и водит героя, как кореец какой-нибудь. Как это вручную реализовывается?
27

» WarCraft 3 / Способность дропающая все предметы у юнита

нужно задержку делать, хотя бы ноль секунд ставил бы. Машина мгновенно код перерабатывает. Юнит не успевает выполнить приказ, даешь один приказ, даешь тут же второй приказ (перебиваешь первый), даешь третий (перебиваешь второй приказ). И в результате выполнит последний. Юниту нужно время для выполнения приказа. Бывают ситуации (не относится к нашему случаю), если приказ дальше радиуса действия абилки, то нужно ему добежать (приблизиться), то еще нужно эффекты какие-то произвести и др, и ему нужно все на это время тоже потратить. К счастью у нас дроп.
вот карта пример правда. вейт + есть утечки + не расчитана на мультиплеерность
есть система ссылка. В ней никак, помню, не мог реализовать мгновенную продажу всех предметов в инвентаре.
Загруженные файлы
27

» WarCraft 3 / Триггеры

ссылка
В гуи есть блок, называется (в действии, в самом наверху If / Then / Else).
Если условие истинно, то выполняется действие внутри блока. Например, у меня есть патроны (патронов > 0 == истина), то стрелять. Здесь ниже пример вставлен, где логическая равна истине, может и ложью (если ложь, то мы пропустим это действие в блоке и пойдем дальше обрабатывать). специально показал пример.
If Истина then
 //делать действие, стреляем
endif
в jass-е на конце всегда блок закрывают, например поставил endif. Это всегда так. Это не только с if-then-else есть еще блок функции (правда на jass видно), блок цикла, блок цикла группы. Если присмотреться, то в гуи внутри блока можно добавить какое-то действие. читай статьи
27

» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3

GF RaiseD, не знаю, возможно это оно. Если ты про физ. размер в РО, то что-то не похоже (ноль ставил).
вот ссылка когда пробовал затестить
27

» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3

GF RaiseD:
+ еще устанавливать проходимость с настройками (как получается, что у блейда стремительность через юнитов норм проходит, а через горы и деревья блок. в некоторых случаях это то, что нужно (не выбегает через горы и деревья, выглядит как бы естественно). SetUnitPathing не то, так как игнорит все преграды путей
Это перефразируй когда тебя отпустит.
ну имеется в виду, что через юнитов норм должен проходить. Пример способности стремительность. Наверное, там физ. размер стоит на ноль. А вот через деревья или ландшафт не должен. Знаешь, если SetUnitPathing отрубить, то юнит легко забирается по уклонам, например с 1 уровня ландшафта на 2.
не знаю как назвать этот уклон поточнее, поэтому скидываю скрин
Загруженные файлы
27

» WarCraft 3 / С помощью триггеров раздать юнитам предметы

не забудьте проверять есть ли у этих юнитов инвентарь (проверять уровень > 0 или кол-во ячеек > 0), если это надо конечно
27

» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3

GF RaiseD, кстати, кто-либо упоминал о функциях получения текущего цвета юнита? (по RGB) то же не помешало бы.
+ еще узнавать текущий размер юнита (ширина и длина)
+ еще устанавливать проходимость с настройками (как получается, что у блейда стремительность через юнитов норм проходит, а через горы и деревья блок. в некоторых случаях это то, что нужно (не выбегает через горы и деревья, выглядит как бы естественно). SetUnitPathing не то, так как игнорит все преграды путей
27

» WarCraft 3 / Полет снаряда по дуге

Принятый ответ
Кстати можно двигать так:
скрины формулы
пример с топорами
движение по эллипсу, Rx и Ry отличаются
есть еще формулы по ссылке и ссылке но здесь больше сложностей
есть форму скорпа
function geoArc takes real wayAbsolute returns real
    return sin((bj_PI / 2.0) * wayAbsolute)
endfunction

function GeoArcBetweenReal takes real wayMin, real wayMax, real wayNow returns real
    return geoArc((wayNow-wayMin) / (wayMax-wayMin))
endfunction

function GeoArcRelative takes real wayMin, real wayMax, real wayNow, real resultMin, real resultMax returns real
    return (GeoArcBetweenReal(wayMin,wayMax,wayNow) * (resultMax-resultMin)) + resultMin
endfunction
вызываешь GeoArcRelative(тут начало отсчета, тут конец отсчета, тут место где находится сейчас, тут минимальный нужный результат, тут максимальный нужный результат) возвращает значение между последними двумя относительно того, как далеко wayNow переместилась между первыми двумя
вобще это в 2D, а надо в 3D - добавь полярные координаты, или сделай отдельно для каждого измерения...
ну у тебя есть Z допустим пол это 50, потолок (самый верх параболы) - это 300
юнит идет от точки 0 до точки 1000, вот он идет, идет, где он щас находится пусть будет X
set unitZ = GeoArcRelative(0, 1000, X, 50, 300)
wayMin - минимальная расстояние (можно поставить ноль)
wayMax - максимальная точка (ставите нужный размер длины дуги)
wayMin и wayMax образуют отрезок (длину дуги)
wayNow - текущее положение точки
resultMin - минимальная высота
resultMax - максимальная высота
карта
еще есть бросок Tiny из доты и бросок из Пуджа Варс (надыбил на форуме). Код очень отличается от типичной параболы у нас на сайте в алгоритмах, там за основу счетчик берется. Мне понравился бросок из Пуджа Варс. Все эти примеры скинул в карту Только в наработке с Toss Tinny, которую скинул, есть небольшая накладка, там у него два скила (спешил и не посмотрел), и нужно поменять id-приказ у канала, тогда будет все ок (не знаю, почему дал ему вторую, мне казалось крута сравнить, щас не кажется)
27

» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3

Неплохо бы иметь больше настроек у кнопок-пустышек, типа канала. Или что-то похожее. Типа возможность не сбивать приказ (типа безумия), возможность запустить скилл на ходу, возможность вставлять анимацию полета снаряда (не у всех работает, у канала не робит, типа полет ядовитого дротика), не у всех работают баффы (не накидываются), нет пустышек с эффектами. Нет нужных автокастовых способностей-пустышек, работающих в разных условиях (и отслеживания). Конечно, это мечты
Нет двойных способностей (типа нажал "включить щит", отобразилась обратная сторона "выключить щит" - есть конечно аналоги щит defend у пехотинца, уникальности нет никакой, можно взять defend. А если что-то придумать)
27

» WarCraft 3 / Как совершить обход по объекту group?

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