Начинки функций. common.j и blizzard.j
Сегодня мы рассмотрим функции, а точнее их начинки и научимся определять к какому типу принадлежит функция.
Существует два вида функций, а - это native и bj.
native - не долго думая, зная английский язык слово native означает "родная" т.е. функция родная движку варкрафта, она не имеют начинки, хотя нет имеет, но не в виде жасса, а ассемблера.
Quote (Разарт)
У нативок есть код, но вы настолько тупы, что даже если я вам скажу что их можно посмотреть в game.dll, вы спросите "почему у меня блокнот кракозябры выдаёт?
Пример нативки:
bj - а именно blizzard.j функции имеющие начинку.
Пример:
Начинка - это внутренности функции, те действия которые она вызывает в последствии вызова самой функции. Так что нам будет проще избавить начинку от это функции, но не всегда это проще;)
Но не каждая функция с начинкой имеет в конце названия такое клеймо как BJ.
Начинка в каждой функции своя, будто тонна кода или вызов одной лишь функции или тонна кода которая также имеет начинку.
Как узнать начинку той или иной функции ? Жаль, но обыкновенный ВЕ нам в этом не поможет. Необходим JNGP ну или JassCraft, можно открыть в блокноте файл в папке blizzard.j.
Покажу на примере JassCraft'a:
Выберем интересующую нам функцию из Native List и снизу мы увидим её начинку, если начинка начинается со слова "native"
функция нативная и начинки мы так и не увидим, а если с "function" то имеет и собственно мы её и видим.
В JNGP можно узнать начинку, зажав ctrl и щёлкнуть по интересующей нами функции, ну или открыть лист функций и выбрать там. Ну увидели мы начинку и что дальше ? А дальше я покажу вам на примере как их разворачивать!
Для примера я разверну эту функцию:
Code
function action takes nothing returns nothing
local unit u = <ваш юнит>
local location loc = <ваша точка>
local location loc2 = <ваша точка>
call SetUnitPositionLocFacingLocBJ(u,loc,loc2)
endfunction
Для начала нам нужно узнать начинку функции SetUnitPositionLocFacingLocBJ.
А вот и она:
Code
function SetUnitPositionLocFacingLocBJ takes unit whichUnit, location loc, location lookAt returns nothing
call SetUnitPositionLoc(whichUnit, loc)
call SetUnitFacing(whichUnit, AngleBetweenPoints(loc, lookAt))
endfunction
Разберём всё подробно т.к. для вас это кажется тучей буков и не больше:
function SetUnitPositionLocFacingLocBJ takes unit whichUnit, location loc, location lookAt returns nothing
call SetUnitPositionLoc(whichUnit, loc)
call SetUnitFacing(whichUnit, AngleBetweenPoints(loc, lookAt))
endfunction
То что выделено оранжевым мы копируем и вставляем в нашу функцию
Code
function action takes nothing returns nothing
local unit u = <ваш юнит>
local location loc = <ваша точка>
local location loc2 = <ваша точка>
call SetUnitPositionLoc(whichUnit, loc)
call SetUnitFacing(whichUnit, AngleBetweenPoints(loc, lookAt))
endfunction
Ага, а дальше под ставим все значения для этого нам следует ещё раз заглянуть в начинку. function SetUnitPositionLocFacingLocBJ takes unit whichUnit, location loc, location lookAt returns nothing
обозначив все аргументы нам будет не сложно подставить их все в нашу развёртку
Code
call SetUnitPositionLoc(u, loc)
call SetUnitFacing(u, AngleBetweenPoints(loc, loc2))
Ну и в конце концов всё выглядит вот так вот:
Code
function action takes nothing returns nothing
local unit u = <ваш юнит>
local location loc = <ваша точка>
local location loc2 = <ваша точка>
call SetUnitPositionLoc(u, loc)
call SetUnitFacing(u, AngleBetweenPoints(loc, loc2))
call RemiveLocation(loc)
call RemoveLocation(loc2)
set u = null
set loc = null
set loc2 = null
endfunction
Есть одно НО, функцию AngleBetweenPoints тоже стоит развернуть, что мы сейчас и сделаем.
Её начинка:
Code
function AngleBetweenPoints takes location locA, location locB returns real
return bj_RADTODEG * Atan2(GetLocationY(locB) - GetLocationY(locA), GetLocationX(locB) - GetLocationX(locA))
endfunction
Ага! Берём это:
Code
bj_RADTODEG * Atan2(GetLocationY(locB) - GetLocationY(locA), GetLocationX(locB) - GetLocationX(locA))
И начинаем подставлять туда наши аргументы
Code
bj_RADTODEG * Atan2(GetLocationY(loc2) - GetLocationY(loc), GetLocationX(loc2) - GetLocationX(loc))
А лучше взять это в локалку:
Code
local real r = bj_RADTODEG * Atan2(GetLocationY(loc2) - GetLocationY(loc), GetLocationX(loc2) - GetLocationX(loc))
Ну и наш код приобретёт немного другой вид:
Code
function action takes nothing returns nothing
local unit u = <ваш юнит>
local location loc = <ваша точка>
local location loc2 = <ваша точка>
local real r = bj_RADTODEG * Atan2(GetLocationY(loc2) - GetLocationY(loc), GetLocationX(loc2) - GetLocationX(loc))
call SetUnitPositionLoc(u, loc)
call SetUnitFacing(u, r)
call RemiveLocation(loc)
call RemoveLocation(loc2)
set u = null
set loc = null
set loc2 = null
endfunction
Так - то!
Также список нативных функций находится в файле common.j, а список бж функций в файле blizzard.j.
Д/з: Наверняка каждый из нас знает стандартный триггер инициализации, так вот разверните его целиком и полностью :DD