В первую очередь интересуют карты:
  1. Rabbits vs Sheeps(Gobolds vs Gnolls)
  2. Tom and Jerry 2
  3. Arena Allstars
Интересуюсь для обучения. Можно и с JASS`ом, на будущее

Принятый ответ

В отношении ГУИ - открывать карты близзов и изучать. Там есть много чему поучиться людям, которые мало понимают джасс.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
1
6 лет назад
0
Вроде Jass New Gen Pack какие то из них может открыть? И что там будет, мешанина из JASS скриптов?
2
12
6 лет назад
2
В отношении ГУИ - открывать карты близзов и изучать. Там есть много чему поучиться людям, которые мало понимают джасс.
Принятый ответ
0
32
6 лет назад
0
Burnout, сплошная стена текста без имен функций и переменных, никакие защищенные карты JNGP не открывает...
Разобраться в таких картах не просто, темболее vjass или cjass преобразуются так что там черт ногу сломит. Что вас конкретно интересует? Мб что то есть в статьях, открытых картах выложенных на XGM?
0
1
6 лет назад
0
Astra:
В отношении ГУИ - открывать карты близзов и изучать. Там есть много чему поучиться людям, которые мало понимают джасс.
Из папок Scenario? Как то их немного. Может близы еще что то выкладывали?
0
32
6 лет назад
0
Burnout, неа, это все.
4
27
6 лет назад
Отредактирован MpW
4
Как взломать карту много букв
  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 узнать на основе чего они сделаны, какие параметры выставлены, какие эффекты используют и прочее.
Загруженные файлы
0
12
6 лет назад
Отредактирован Astra
0
Burnout:
Из папок Scenario? Как то их немного. Может близы еще что то выкладывали?
Там основа. Тебе нужно понять, как работают основные GUI функции? Там все это есть. Поймешь их - качать чужие карты не придется.
Будут локальные вопросы - их можно задать отдельно или погуглить сей форум.
0
1
6 лет назад
0
. Что вас конкретно интересует? Мб что то есть в статьях, открытых картах выложенных на XGM?
Если честно, то просто хотел приобщиться. В свое время в 2004 не получилось, а желание осталось, периодически траю=)
Сейчас вот получилось как раз так как вы советуете. Хотел поиграть в WarChasers, но на одного она долгая, полез редактировать и удивился насколько GUI интуитивен.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.