Добавлен ScorpioT1000,
опубликован
Выполнение кода и обращение к данным
Содержание:
Функция 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_BOTTOM),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 году.
И это открывает широкие возможности! Вы можете создавать таймеры, менять позиции игроков, менять положение значков на карте и многое другое. Кстати, открыто это было еще в 2007 году.
Подробнее, что можно сделать с функцией config можно почитать в теме про config.
Как мне добавить свой код в config и main?
Знаете, что, но не знаете, как?
А решений здесь несколько.
Первое самое неудобное - просто изменить файл war3map.j и импортировать его заного. Однако после новой компиляции всё сбросится.
А решений здесь несколько.
Первое самое неудобное - просто изменить файл 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.ru/p/wc3/jass_new_gen_pack-exp
- Если появились ошибки с inject и cJass, попробуйте обрамить код следующими директивами:
//! nocjass
ваши инъекции
//! endnocjass
- строки в GUI-конструкторе, а так же в редакторе объектов заносятся в специальную таблицу - war3map.wts, подробнее можно прочитать в теме Смена языка в одной и той-же карте.
Функционал Preload
Стоит упомянуть про некоторое решение, которое называется Preload Exploit - использование функции подгрузки для сохранения собственного кода в файл и выполнение его после нового запуска карты.
Это тоже дает очень широкие возможности!
Подробнее можно узнать, изучив работу Data Manager от Narayan.
Это тоже дает очень широкие возможности!
Подробнее можно узнать, изучив работу Data Manager от Narayan.
Содержание
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Diaboliko