WarCraft 3: Что происходит на самом деле...

Выполнение кода и обращение к данным

Функция main

На самом деле, функцию инициализации игры InitTrig_Sphere вызывает основная функция инициализации всех триггеров, а её вызывает самая главная функция main.
Рассмотрим:
function InitTrig_Sphere takes nothing returns nothing
	set gg_trg_Sphere=CreateTrigger()
	call TriggerRegisterAnyUnitEventBJ(gg_trg_Sphere,EVENT_PLAYER_UNIT_ATTACKED)
	call TriggerAddAction(gg_trg_Sphere,function Trig_Sphere_Actions)
endfunction

function InitCustomTriggers takes nothing returns nothing
	call InitTrig_Sphere()
endfunction

// ...

function main takes nothing returns nothing
	call SetCameraBounds(-3328.0+GetCameraMargin(CAMERA_MARGIN_LEFT),-3584.0+GetCameraMargin(CAMERA_MARGIN_BO​TTOM),3328.0-GetCameraMargin(CAMERA_MARGIN_RIGHT),3072.0-GetCameraMargin(CAMERA_MARGIN_TOP),-3328.0+​GetCameraMargin(CAMERA_MARGIN_LEFT),3072.0-GetCameraMargin(CAMERA_MARGIN_TOP),3328.0-GetCameraMargin​(CAMERA_MARGIN_RIGHT),-3584.0+GetCameraMargin(CAMERA_MARGIN_BOTTOM))
	call SetDayNightModels("Environment\\DNC\\DNCLordaeron\\DNCLordaeronTerrain\\DNCLordaeronTerrain.mdl​","Environment\\DNC\\DNCLordaeron\\DNCLordaeronUnit\\DNCLordaeronUnit.mdl")
	call NewSoundEnvironment("Default")
	call SetAmbientDaySound("LordaeronSummerDay")
	call SetAmbientNightSound("LordaeronSummerNight")
	call SetMapMusic("Music",true,0)
	call CreateAllUnits()
	call InitBlizzard()
	call InitGlobals()
	call InitCustomTriggers()
endfunction
Как видно, кроме триггеров, функция задает начальное положение камеры, модели освещения, звуковое окружение, музыку, вызывает создание юнитов, инициализирует переменные blizzard.j и вызывает инициализацию глобальных переменных.
Функция main вызывается на ~95% полосы загрузки карты.
Однако, есть ещё одна функция...

Функция config

function config takes nothing returns nothing
	call SetMapName("Еще одна карта")
	call SetMapDescription("Описание отсутствует")
	call SetPlayers(1)
	call SetTeams(1)
	call SetGamePlacement(MAP_PLACEMENT_USE_MAP_SETTINGS)
	call DefineStartLocation(0,2368.0,1472.0)
	call InitCustomPlayerSlots()
	call SetPlayerSlotAvailable(Player(0),MAP_CONTROL_USER)
	call InitGenericPlayerSlots()
endfunction
Уже догадались, что она делает? А самое главное, что..
Функция config вызывается после выбора карты из списка доступных карт.
И это открывает широкие возможности! Вы можете создавать таймеры, менять позиции игроков, менять положение значков на карте и многое другое. Кстати, открыто это было еще в 2007 году.
Подробнее, что можно сделать с функцией config можно почитать в теме про config.

Как мне добавить свой код в config и main?

Знаете, что, но не знаете, как?
А решений здесь несколько.
Первое самое неудобное - просто изменить файл war3map.j и импортировать его заного. Однако после новой компиляции всё сбросится.

Решение с помощью vJass

//! inject config
	здесь ваш код для config
//! endinject

//! inject main
	здесь ваш код для main
//! endinject

Решение с помощью cJass

// Внесение в начало main:
#define <main takes nothing returns nothing> = { main takes nothing returns nothing;
	здесь ваш код для самого начала main
}

// Внесение в конец main:
#define <InitCustomTriggers()> = { InitCustomTriggers();
	здесь ваш код для конца main
}

// Внесение в начало config:
#define <config takes nothing returns nothing> = { config takes nothing returns nothing;
	здесь ваш код для самого начала config
}

// Внесение в конец config:
#define <InitGenericPlayerSlots()> = { InitGenericPlayerSlots();
	здесь ваш код для конца config
}

Кстати

  • Код инъекции желательно помещать где-то в самом верху или внизу, а не посреди ваших функций, т.к. он выполняется самый первый и не должен путаться среди "рядовых" функций.
  • Ссылка на расширенный редактор, который включает cJass и vJass: xgm.guru/p/wc3/jass_new_gen_pack-exp
  • Если появились ошибки с inject и cJass, попробуйте обрамить код следующими директивами:
//! nocjass
	ваши инъекции
//! endnocjass

Функционал Preload

Стоит упомянуть про некоторое решение, которое называется Preload Exploit - использование функции подгрузки для сохранения собственного кода в файл и выполнение его после нового запуска карты.
Это тоже дает очень широкие возможности!
Подробнее можно узнать, изучив работу Data Manager от Narayan.

Просмотров: 2 050

Diaboliko #1 - 4 года назад (отредактировано ) 0
! nocjass
ваши инъекции
! endnocjass
На примере, plz
ScorpioT1000 #2 - 4 года назад 2
//! nocjass
//! inject config
	здесь ваш код для config
//! endinject
//! endnocjass
директиву nocjass придумал адик
Master_chan #3 - 4 года назад 0
директиву nocjass придумал адик
Ее все таки придумали? Хорошие новости.
map_maiker #4 - 4 года назад 1
норм статья,config особенно аинтересовала
Стратег #5 - 4 года назад 1
меня тоже заинтересовала, но не могу пока придумать, для чего может пригодиться)
God_of_light #6 - 4 года назад 1
Стратег, у меня недавно возникла необходимость лезть в функцию конфиг. Дело в том что мне было необходимо имитировать наличие ИИ-статуса у 14 и 15 игроков (Нейтральная жетрва, Дополнительный Нейтрально-пассивный). Скорп подсказал что куда)