Alexey103, все зависит от того, что вы пытаетесь сделать. Зачем тебе
Нужно получить такую цепочку "table от 1 до Х = да" в условии
переменная (Integer A) используется для циклов, может не подойти так как используется где-нибудь в другом триггере, и значение меняется. Тебе точно не подойдет, не говорил прямо использовал именно ее (а скорее какую глобалку). Неизвестно. что вы пытаетесь сделать (что за table). Мб тебе номер игрока нужен вместо этой глобалки, скорее всего (вместо Integer A укажи номер игрока, если это то, что нужно),
Открыть стандартным редактором в большинстве случаев нельзя будет, только редактором jngp. это если имеется дело с продвинутыми картами, так как такие карты создавались в продвинутом редакторе, в ней сняты многие ограничения (лимиты) карты. Обычный редактор может не открыть
Некоторые авторы карт стараются вредить архив так, что нельзя будет открыть карту редактором (специально). Можно восстановить архив через программу w3map Restorer. Смутно понимаю назначение этой проги (она то ли поврежденные из slk-таблиц в обратно в РО заделывает, или просто восстанавливает архив, чтобы открыть. Мне неизвестно. Впрочем, никогда не работало, ибо неизвестно как работает, что делает). Карты могли не открываться редактором, пробовал по нескольку ломать, если не работало, тогда через mqp-архиваторы открывал (чаще открывали после депректа, если же нет, то мне достаточно было поковыряться mpq-архиватором)
Нужно нам достать какой-нибудь скилл или объект, что делать?
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-ричной системы в десятичную или какую-нибудь другую. В доте переведена в десятичную. Можно поискать на сайтах как перевести числа или найти онлайн калькуляторы
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 узнать на основе чего они сделаны, какие параметры выставлены, какие эффекты используют и прочее.
Есть ли нативки к морфам? Вот тема Считаю, что глупо юзать абилки, чтобы морфнуть в другого юнита, почему нельзя на напрямую. При этом эффекты, характеристики. наложенные баффы, айтемы сохраняются на новой?
триггерный ReplaceUnit - это не морф (там удаляют одного, и на месте старого создают нового). Давным-давно когда использовал эту хрень, и столкнулся с кучей проблем: не сохранить всё, точнее не переносится на новую (вот бы близзарды к морфам нативку): эффекты, характеристики, предметы, наложенные баффы. Потому что юнит новый. Лучше используй морф, не знаю, мб попробуй через руны.
совет
Есть еще морф через абилку "темный" (это постоянный морф. Использовал когда-то для курьеров, как в доты. там есть баг, когда увеличивает защиту/атаку. Бывает на единичку увеличивает/уменьшает, а бывает и норм работает, ведет себя по-разному. Не знаю, из-за чего это случается, потом протестирую. Но на курьеров не замечал, так как это не герой, защита нулевая, и тем более у них атака выключена). Поэтому советовали использовать вместо темного обычный морф, попробуй морф с руной
что-то не вижу на скрине как вы пытаетесь запихнуть в if/then/else. Почему должен угадывать
Предположение: ошибка - локальные переменные объявляются всегда первыми. Если там будет какое-то другое действие, а объявление локалок ниже, то это ошибка. Ты вперед, наверное, поставил действие "if/then/else", а потом начал объявлять что-то там,
правильно
local unit u
if (условие) then
действие
endif
не правильно
if (условие) then
local unit u
endif
Локалки вначале функции всегда объявляются. Можете в код конвентировать и посмотреть.
жалко, что нет абилки с зарядами (типа осветительного снаряда или совы, только они вот целевые, и неподходящие. сову например не уберешь и др) +триггеры регулирующие число зарядов. Такой класс был бы. А может быть просто можно было циферки влепить? вспомнил чего не хватало
+камеру прикрепить нормально за спиной как в рпг. нормальную, а не такую, что при повороте камеры в бок, возвращала обратно.
мб Shuriken(it)? в переменной it нет никакого итема, пока что.
поэтому может быть и не проходит норм условие. чтобы там ни было в Shuriken
пример смотри тут
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
или можно вообще было сразу дропнуть прямо в цикле и обойтись без счетчика, так как уже есть такой. и выйти из цикла
мб еще эта поможет это типа классификация, забиваете базу данных, проверяет есть ли такой в бд.
+ вспомнил баг, в триггерах в классификациях юнита есть "оглушение" (короче stun). И она совсем бесполезна (приходилось бафф проверять). Так понимаю, есть проверки в мем хак (думаю оттуда что-то взяли).
+ Хотелось бы еще молчанки разные (невозможность произносить заклинания, или невозможность юзать скилы и использовать итемы в инвентаре. Есть скилы, но нет таких, которые действуют на одну цель. Там помню винные пары и все. ).
+ задавать время существования баффа
Было бы классно, если в целях абилок и атак было больше всяких целей и классификации.
ScorpioT1000, порядок приказов легко запомнить, проблема в том, что нужно знать, что в данный момент зажато ли было Shift-ом. Без этого ничего нельзя получить, так как мб игрок просто кликает и водит героя, как кореец какой-нибудь. Как это вручную реализовывается?
нужно задержку делать, хотя бы ноль секунд ставил бы. Машина мгновенно код перерабатывает. Юнит не успевает выполнить приказ, даешь один приказ, даешь тут же второй приказ (перебиваешь первый), даешь третий (перебиваешь второй приказ). И в результате выполнит последний. Юниту нужно время для выполнения приказа. Бывают ситуации (не относится к нашему случаю), если приказ дальше радиуса действия абилки, то нужно ему добежать (приблизиться), то еще нужно эффекты какие-то произвести и др, и ему нужно все на это время тоже потратить. К счастью у нас дроп.
вот карта примерправда. вейт + есть утечки + не расчитана на мультиплеерность
есть система ссылка. В ней никак, помню, не мог реализовать мгновенную продажу всех предметов в инвентаре.
ссылка
В гуи есть блок, называется (в действии, в самом наверху If / Then / Else).
Если условие истинно, то выполняется действие внутри блока. Например, у меня есть патроны (патронов > 0 == истина), то стрелять. Здесь ниже пример вставлен, где логическая равна истине, может и ложью (если ложь, то мы пропустим это действие в блоке и пойдем дальше обрабатывать). специально показал пример.
If Истина then
//делать действие, стреляем
endif
в jass-е на конце всегда блок закрывают, например поставил endif. Это всегда так. Это не только с if-then-else есть еще блок функции (правда на jass видно), блок цикла, блок цикла группы. Если присмотреться, то в гуи внутри блока можно добавить какое-то действие. читай статьи
+ еще устанавливать проходимость с настройками (как получается, что у блейда стремительность через юнитов норм проходит, а через горы и деревья блок. в некоторых случаях это то, что нужно (не выбегает через горы и деревья, выглядит как бы естественно). SetUnitPathing не то, так как игнорит все преграды путей
Это перефразируй когда тебя отпустит.
ну имеется в виду, что через юнитов норм должен проходить. Пример способности стремительность. Наверное, там физ. размер стоит на ноль. А вот через деревья или ландшафт не должен. Знаешь, если SetUnitPathing отрубить, то юнит легко забирается по уклонам, например с 1 уровня ландшафта на 2.
не знаю как назвать этот уклон поточнее, поэтому скидываю скрин
GF RaiseD, кстати, кто-либо упоминал о функциях получения текущего цвета юнита? (по RGB) то же не помешало бы.
+ еще узнавать текущий размер юнита (ширина и длина)
+ еще устанавливать проходимость с настройками (как получается, что у блейда стремительность через юнитов норм проходит, а через горы и деревья блок. в некоторых случаях это то, что нужно (не выбегает через горы и деревья, выглядит как бы естественно). SetUnitPathing не то, так как игнорит все преграды путей
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-приказ у канала, тогда будет все ок (не знаю, почему дал ему вторую, мне казалось крута сравнить, щас не кажется)
Неплохо бы иметь больше настроек у кнопок-пустышек, типа канала. Или что-то похожее. Типа возможность не сбивать приказ (типа безумия), возможность запустить скилл на ходу, возможность вставлять анимацию полета снаряда (не у всех работает, у канала не робит, типа полет ядовитого дротика), не у всех работают баффы (не накидываются), нет пустышек с эффектами. Нет нужных автокастовых способностей-пустышек, работающих в разных условиях (и отслеживания). Конечно, это мечты Нет двойных способностей (типа нажал "включить щит", отобразилась обратная сторона "выключить щит" - есть конечно аналоги щит defend у пехотинца, уникальности нет никакой, можно взять defend. А если что-то придумать)
иметь две группы. Есть группа, которую нужно обработать. Создаете еще одну. По ходу цикла в одну добавляете юнита (сохраняете), а из другой удаляете (чтобы выполнился цикл).
Ред. MpW
» WarCraft 3 / Проверка заполненности логического массива
Ред. MpW
» WarCraft 3 / Проверка заполненности логического массива
A - целочисленная переменная
Ред. MpW
» WarCraft 3 / Где искать не защищенные карты с триггерами на GUI?
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
» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3
Ред. MpW
» WarCraft 3 / Как сохранить доп характиристики от книг во время морфа ?
Ред. MpW
» WarCraft 3 / если/то/иначе
Предположение: ошибка - локальные переменные объявляются всегда первыми. Если там будет какое-то другое действие, а объявление локалок ниже, то это ошибка. Ты вперед, наверное, поставил действие "if/then/else", а потом начал объявлять что-то там,
» WarCraft 3 / Ограничение предметов.
Ред. MpW
» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3
+камеру прикрепить нормально за спиной как в рпг. нормальную, а не такую, что при повороте камеры в бок, возвращала обратно.
Ред. MpW
» WarCraft 3 / Подскажите на тему расходников через руны, стаки, вся фигня
поэтому может быть и не проходит норм условие. чтобы там ни было в Shuriken
пример смотри тут
Ред. MpW
» WarCraft 3 / Ограничение предметов.
ужас столько тем было на этот вопрос, и статьей. неужели нельзя вбить в поиск
Ред. MpW
» WarCraft 3 / Ограничение кол-ва определенного предмета в инвентаре.
цикл А от 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
Ред. MpW
» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3
Ред. MpW
» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3
+ Хотелось бы еще молчанки разные (невозможность произносить заклинания, или невозможность юзать скилы и использовать итемы в инвентаре. Есть скилы, но нет таких, которые действуют на одну цель. Там помню винные пары и все. ).
+ задавать время существования баффа
Было бы классно, если в целях абилок и атак было больше всяких целей и классификации.
» WarCraft 3 / Смертельный союз + Темный ритуал
» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3
» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3
Ред. MpW
» WarCraft 3 / Способность дропающая все предметы у юнита
есть система ссылка. В ней никак, помню, не мог реализовать мгновенную продажу всех предметов в инвентаре.
Ред. MpW
» WarCraft 3 / Триггеры
В гуи есть блок, называется (в действии, в самом наверху If / Then / Else).
Если условие истинно, то выполняется действие внутри блока. Например, у меня есть патроны (патронов > 0 == истина), то стрелять. Здесь ниже пример вставлен, где логическая равна истине, может и ложью (если ложь, то мы пропустим это действие в блоке и пойдем дальше обрабатывать). специально показал пример.
Ред. MpW
» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3
вот ссылка когда пробовал затестить
» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3
не знаю как назвать этот уклон поточнее, поэтому скидываю скрин
Ред. MpW
» WarCraft 3 / С помощью триггеров раздать юнитам предметы
Ред. MpW
» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3
+ еще устанавливать проходимость с настройками (как получается, что у блейда стремительность через юнитов норм проходит, а через горы и деревья блок. в некоторых случаях это то, что нужно (не выбегает через горы и деревья, выглядит как бы естественно). SetUnitPathing не то, так как игнорит все преграды путей
Ред. MpW
» WarCraft 3 / Полет снаряда по дуге
wayMax - максимальная точка (ставите нужный размер длины дуги)
wayMin и wayMax образуют отрезок (длину дуги)
wayNow - текущее положение точки
resultMin - минимальная высота
resultMax - максимальная высота
карта
Ред. MpW
» WarCraft 3 / Blizzard готовят Producer Update для Warcraft 3
Нет двойных способностей (типа нажал "включить щит", отобразилась обратная сторона "выключить щит" - есть конечно аналоги щит defend у пехотинца, уникальности нет никакой, можно взять defend. А если что-то придумать)
» WarCraft 3 / Как совершить обход по объекту group?