Восстановление триггеров в закрытой карте. Часть 1

Добавлен , не публикуется
Всем привет, сегодня я вас научу восстанавливать триггеры, в закрытых картах. Скажите зачем, если можно просто взять, взломать карту и оставить один триггер, который полон кучей других триггеров в текстовом виде? Если вы взламываете карту для вставки чита, то вам это не нужно... А вот если вы нашли карту, которая устарела, она прикольная, а автор карты не хочет давать исходник, или просто его давно потерял, а может просто забросил Варкрафт... Первое, что приходит в голову взломать карту. Итак вы взламываете карту, открываете триггеры и? Видите, все триггеры в виде текста! Возможно для вас это не проблема, вы просто те триггеры, оставите в покое и добавите свои, но а если надо кардинально переписать половину кода ввиду его глючености? Тогда предеться код полностью переписать... А если там полно работы? Или есть, то что вы не сможете сделать? Вы скорей всего, просто бросите карту в сторону... И продолжите работу над старым проектом или начнете новый... Так вот для тех, кто попадал в такую ситуацию или "хочет" попасть, я пишу эту статью.

И так для чего эта статья, и какое решение предлагает автор?

Скажу, что статья рассчитана на людей, знающие азы Jass!
Начнем с простого: Возьмем карту, и взломаем её, методы взлома я описывать не буду, из-за того, что статья описывает про восстановление триггеров из карты которой, была закрыта самым простым способом:- удалением файла триггеров!
Насчет того, что сейчас все не просто удаляют триггеры, но и еще протектят полностью, я расскажу в следующей статье, тут будет разбираться простой вариант, советую с него начинать, свою "карьеру" взломщика...
И для "легкого" взлома карты, то-есть восстановления триггеров, надо использовать JNGP.
Так вот, открываем триггеры, то есть "один" триггер, самый важный для нас.
Первое, что конечно надо сделать, с этой сборкой триггеров - оптимизация!
Лишь потому, что человек решивший, что удаление файла триггеров из карты, будет достаточно, чтобы карту не "скопипастили", человек явно новичок в jass, и наверняка использовал в своей карте только триггеры.

Методы оптимизации, и сокращения строк кода

Знаю, есть статьи на эту тему, но тут немного иначе происходит оптимизация...
function Trig_Game_End_Dbl_Chk_Func002002001 takes nothing returns boolean
	             return(IsUnitAliveBJ(GetEnumUnit()))
           endfunction

           function Trig_Game_End_Dbl_Chk takes nothing returns nothing
        	if(Trig_Game_End_Dbl_Chk_Func002002001())then
	        	set udg_boolean01=false
	        endif
           endfunction
Все кто пользуются триггерами, при переводе в код получают нечто похожее на это.
Первое, что надо сделать это: скопировать все то, что находится в скобках return и перенести это в скобки if.
В итоге у вас должно получиться, следующее:
           function Trig_Game_End_Dbl_Chk takes nothing returns nothing
        	if IsUnitAliveBJ(GetEnumUnit()) then
	        	set udg_boolean01=false
	        endif
           endfunction
Не забудьте, удалить первую функцию, так как она нам уже больше не нужна.
Большинство строк кода будут таковыми! Так что это первый и важный этап, иначе просто дальше будет труднее работать с кодом...
  1. Вам часто будет встречаться следующее:
            function Trig_sssss_Conditions takes nothing returns boolean
                if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) == true ) ) then
                  return false
                endif
                return true
            endfunction
С этой конструкцией надо поступать так:
            function Trig_ssss_Conditions takes nothing returns boolean
                return IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) == true
            endfunction
Также можно и еще так сократить:
            function Trig_ssss_Conditions takes nothing returns boolean
                return IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE)
            endfunction
Убрав == true, так как идет сравнение одного boolean-а с другим, что глупо...
А какже если вместо true - false ??
Вот так:
            function Trig_ssss_Conditions takes nothing returns boolean
                return not IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE)
            endfunction
добавив вначале not.
  1. Повторение конструкций:
             function Trig_Remove_A takes nothing returns boolean
	            return(GetPlayerSlotState(GetFilterPlayer())==PLAYER_SLOT_STATE_PLAYING)
             endfunction

             function Trig_Remove_Func001002 takes nothing returns nothing
	            if GetPlayerColor(GetEnumPlayer())==PLAYER_COLOR_RED then
	            	set udg_strings01[(1+GetPlayerId(GetEnumPlayer()))]="|cffff0800"
            	endif
             endfunction
		
		 ...
         call ForForce(GetPlayersMatching(Condition(function Trig_Remove_A)),function Trig_Remove_Func001002)
		 call ForForce(GetPlayersMatching(Condition(function Trig_Remove_A)),function Trig_Remove_Func002002)
		 ...
Этих проверок играет ли игрок, или таким подобным, может быть много. Тут я уже оптимизировал, в выборе группы. Эти условия могут повторяться много раз, легче просто оставить одно условие и подставить во все выборы групп это условие. Главное постарайтесь эти условия оставлять в условном месте триггера, то есть в рамках будущего триггера, чтобы легче определится, что проверяет проверка...
  1. Замена bj_forLoopAIndex, локальной переменной, это по желанию, но меня лично смущает эта глобальная переменная, и всегда заменяю ее локальной.
    call EnableTrigger( udg_trigger01 )
    call DisableTrigger( udg_trigger01 )
    call ConditionalTriggerExecute( udg_trigger01 )
    call TriggerExecute( udg_trigger01 )
    call QueuedTriggerAddBJ( udg_trigger01, true )
    call QueuedTriggerRemoveBJ( udg_trigger01 )
    call TriggerRegisterGameStateEventTimeOfDay( udg_trigger01, EQUAL, 12 )
Эти функции, могут присутствовать в коде:
Эти функции делают различные действия с триггерами, в коде они будут обозначаться в виде глобальных переменных udg_triggerXX.
Первое, что надо сделать, это найти в коде все эти вызовы функций.
Посмотреть какой там используется триггер, ну название переменной триггера. У меня это udg_trigger01
Вводим название триггера в поиск, и углубляемся в "глубь" функции Main2 (это большая функция, которая инициирует все, что есть в карте...)
	set udg_trigger01=CreateTrigger()
	call TriggerRegisterAnyUnitEventBJ(udg_trigger01,EVENT_PLAYER_UNIT_DEATH)
	call TriggerAddCondition(udg_trigger01,Condition(function Trig_Bobdies_Conditions))
	call TriggerAddAction(udg_trigger01,function Trig_Bobdies_Actions)
находим примерно такое.
Видим название функции, у меня это: Bobdies
Берем и копируем это название. Идем к вверх, к вызову этого триггера через его переменную.
Заменяем udg_trigger01 на: gg_trg_Bobdies
Это не совсем обязательно, но обязательно для тех, кто не хочет чтобы в списке глобальных переменных висели TriggerXX.

Приступаем к восстановлению

Первое, что нам надо это создать папки, создаем столько папок, сколько триггеров/20, я для себя определил эту цифру, ну чтобы в 1 папке лежало 20 триггеров. Особенно подмечу, лучше сначала оставлять все триггеры именно в том порядке, в каком они есть... До полного восстановления.
Берем, в коде ищем переменную: udg_trigger01
Натыкаемся снова вглубь функции main2
Копируем следующие строки:
	set udg_trigger01=CreateTrigger()
	call TriggerRegisterAnyUnitEventBJ(udg_trigger01,EVENT_PLAYER_UNIT_DEATH)
	call TriggerAddCondition(udg_trigger01,Condition(function Trig_Bobdies_Conditions))
	call TriggerAddAction(udg_trigger01,function Trig_Bobdies_Actions)
Ну, или немного другие, каждый триггер имеет "свои" строки. Не у каждого триггера одинаковые события...
Создаем новый триггер. Конвертируем триггер в текст. Удаляем все, что в этом триггере.
Вставляем то, что мы скопировали.
И называем наш триггер так: как названа функция, у меня она называется - Bobdies.
Теперь возвращаемся к коду, удаляем строки, те что скопировали.
И ищем следующею функцию, у меня это - Trig_Bobdies
Ищем и копируем, все, что связанно с этой функцией!
Вставляем все это в тот триггер, что мы создали ранее. (Вставляем это выше того, что ранее скопировали.)
И удаляем, с исходного триггера, то что мы скопировали.
Вуаля, и мы вытащили первый триггер.
Следующие триггеры вытаскиваются по аналогии.
Скажу, одно, что на 75 триггеров, у меня было потрачено 2 часа.

Скопировано, а что делать дальше?

А все теперь если вы все правильно сделали, то у вас в изначальном триггере должны остаться следующие функции:
function main2
и остальные функции отвечающие за имя карты, юнитов на карте...
Их мы не трогаем, так и оставляем.
(Если у вас есть полная уверенность, что main2 ПОЛНОСТЬЮ копирует main , то смело его удаляйте) Main можно увидеть, открыв .J карты.
Ну, что, вы восстановили все триггеры, а теперь надо устранить все ошибки связанные с восстановлением!
Они есть поверьте!
Сохраните вашу карту, с включенным Jasshelper-ом.
И устраняйте появившиеся ошибки. Об их устранении я говорить не буду, из-за того, что о них и так много что написано.
Все проверили, ошибок нет! Первое, что надо сделать - это проверить, а карта запускается ли вообще? Да, бывает, что и не запускается в таком случае придется все триггеры проверить на наличия ошибки в ручную...
Но, если карта у вас запускается, и все в норме, то надо проверить, правильно ли работает карта, во многих случаях, бывает, что при оптимизации, можно нарушить пару триггеров, но это легко исправляется в виду того, что вы будите прекрасно знать какой триггер, за что отвечает и исправите.
Теперь карта работает, все как в оригинале. Осталось, лишь сделать следующее:
Расформировать все триггеры по "правильным" папочкам. Это как хотите.
И если вы хотите, дальше продолжить развитие карты, то надо еще сделать следующее:
Оптимизация BJ функций, или попусту их замена. Говорить подробно об этом я не буду, так как есть уже статья по этому поводу. Да и дело, это не совсем обязательное.
Для тех кому лень читать, и думает, что это все бред! То вот вам карта которую я взломал.
(xgm.ru/files/100/68378/Jungle_Race_1.29_Rus.w3x)
И увидите результат работы.
Спасибо, всем за внимание! Удачи во взломе и не забывайте оставить имя автора карты!
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
15
А кто сказал, что в этой статье идет речь о читерстве?
Эта статья понадобится тем кто:
  1. Потерял исходник карты и отчалился
  2. Может карту давно автор забросил! А ты благодеятель, хочешь её оживить!
  3. Может хочешь, понять как сделана карта, и берешь восстанавливаешь, и смотришь =)
  4. Да, это помогает, лучше изучить Jass!
Да и поверь, для вставки читов, мне понадобится лишь файл карты .J И все! Большего для вставки читов не надо.
29
Ручная деобфускация такого рода - полный бред.
Уж лучше написать спец. утилиту под такие задачи.
15
Все начинают с азов.
Чтобы сделать программу, нужно понять весь алгоритм!
Статья актуальна до тех пор пока, я не изучу c++, хотябы на 45% или ктонить другой...
Всеравно, сам создатель программы должен САМ прочувствовать и понять как правильно составить алгоритм восстановления триггеров.
И ведь кто-то считал, что их восстановить нельзя! =) (Программно)
3
Больше интересно что будет во второй части ))
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.