Данная тема предназначена для различных функций, которые могут быть весьма полезны при программировании на Jass.
Функции
Эмуляция ошибки в Warcraft
Sim Error из Caster System, позволяет вам сэмитировать ошибку наподобие той, что выводиться движком вара. Незаменима при создании каких-либо довесков к интерфейсу пользователя.
Автор - Vexorian
Требует глобальную переменную типа звук (udg_SimError). Не создаёт утечек.
Автор - Vexorian
Требует глобальную переменную типа звук (udg_SimError). Не создаёт утечек.
function SimError takes player ForPlayer, string msg returns nothing
if udg_SimError==null then
set udg_SimError=CreateSoundFromLabel( "InterfaceError",false,false,false,10,10)
endif
if (GetLocalPlayer() == ForPlayer) then
call ClearTextMessages()
call DisplayTimedTextToPlayer( ForPlayer, 0.52, -1.00, 2.00, "|cffffcc00"+msg+"|r" )
call StartSound( udg_SimError )
endif
endfunction
Вычисление опыта за убийство юнита
Вычисляет приблизительное значение опыта за убийство указанного юнита. Применение - триггерный подсчет/добавление экспы с применением всякого рода скиллов/эффектов модификаторов.
Автор - NETRAT
Автор - NETRAT
function aow_GetApxExpBounty takes unit u returns real
return SquareRoot((GetUnitState(u, UNIT_STATE_MAX_LIFE) + GetUnitState(u, UNIT_STATE_MAX_MANA)) * GetUnitLevel(u)) * 2
endfunction
Набор функций для работы с Hex-записями
Автор: Dead_knight
Преобразует строку с Hex числом (допустимые значения "00" до "ff") в десятичное целое число:
function H2D takes string hex returns integer
local string abc = "0123456789abcdef"
local integer i = 0
local integer dec
loop
set i = i + 1
exitwhen( SubString(abc, (i-1), i)==SubString(hex, 0, 1) )
endloop
set dec = (i-1) * 16
set i = 0
loop
set i = i + 1
exitwhen( SubString(abc, (i-1), i)==SubString(hex, 1, 2) )
endloop
set dec = dec + i - 1
return dec
endfunction
Преобразует целое число (допустимые значения 0 до 255) в Hex-представление:
function D2H takes integer i returns string
local string abc = "0123456789abcdef" (можно заменить глобалкой, так даже лучше)
local string s = SubString(abc, i / 16, i / 16 + 1) + SubString(abc, ModuloInteger(i, 16), ModuloInteger(i, 16) + 1)
return s
endfunction
Покупка предмета юнита
Заставляет юнита купить предмет из указанного магазина.
В случае успеха возвращает true.
Автор - Warden
В случае успеха возвращает true.
Автор - Warden
function BuyItem takes unit FromShop,integer ItemID,unit ToUnit returns boolean
if IssueNeutralTargetOrder(GetOwningPlayer(ToUnit), FromShop, "smart", ToUnit) or IssueTargetOrder(FromShop, "smart", ToUnit) then
return IssueNeutralImmediateOrderById(GetOwningPlayer(ToUnit), FromShop, ItemID) or IssueImmediateOrderById(FromShop, ItemID)
endif
return false
endfunction
Вариант agentex
function BuyItem takes unit u, unit shop, integer id returns boolean
call IssueNeutralTargetOrder(GetOwningPlayer(u), shop, "smart", u)
return IssueNeutralImmediateOrderById(GetOwningPlayer(u), shop, id)
endfunction
Скрещивание однотипных предметов
При вызове пробует собрать из <count> предметов типа <oldItemType> новый предмет типа <newItemType>
В случае успеха возвращает true.
Автор - Shadow Daemon
В случае успеха возвращает true.
Автор - Shadow Daemon
function UnitUpgradeItem takes unit u, integer oldItemType, integer count, integer newItemType returns boolean
local integer i = 0
local integer j = 0
local integer k = 0
loop
exitwhen i > 5 or j >= count
if GetItemTypeId(UnitItemInSlot(u, i)) == oldItemType then
set j = j + 1
set k = k * 16 + i + 1
endif
set i = i + 1
endloop
if j < count then
return false
endif
loop
exitwhen k <= 0
call RemoveItem(UnitItemInSlot(u, k - (k / 16) * 16 - 1))
set k = k / 16
endloop
call UnitAddItemById(u, newItemType)
return true
endfunction
Формула параболы
Вычисляет значение, обычно применяемое для задания высоты снаряда, который летит по параболической траектории.
Автор оригинала - shadow1500
Автор ремейка - moyack
Автор оптимизированного варианта - Shadow Daemon
Автор оригинала - shadow1500
Автор ремейка - moyack
Автор оптимизированного варианта - Shadow Daemon
library ParabolicMovement
function ParabolaZ takes real h, real d, real x returns real
return (4 * h / d) * (d - x) * (x / d)
endfunction
endlibrary
- h - максимальная высота в прыжке на середине расстояния (x = d / 2),
- d - общее расстояние до цели,
- x - расстояние от исходной цели до точки, где следует взять высоту по параболе.
Формула параболы (учитывающая начальную и конечную высоту)
- h - максимальная высота в прыжке на середине расстояния (x = d / 2),
- d - общее расстояние до цели,
- x - расстояние от исходной цели до точки, где следует взять высоту по параболе.
library ParabolicMovement2
function ParabolaZ2 takes real y0, real y1, real h, real d, real x returns real
return (2*(y0 + y1 - 2*h)*(x/d - 1) + (y1 - y0))*(x/d) + y0
endfunction
endlibrary
Вариант Shadow Daemon
- h - максимальная высота в прыжке,
- d - общее расстояние до цели,
- x - расстояние от исходной цели до точки, где следует взять высоту по параболе.
library ParabolicMovement2
function ParabolaZ2 takes real y0, real y1, real h, real d, real x returns real
return ((4 * h / d) * (d - x) + y1 - y0) * (x / d) + y0
endfunction
endlibrary
Определение неуязвимости юнита
Расширенная функция определения, уязвим ли юнит или нет. Позволяет определять специфические неуязвимости (например, неуязвимость феникса при морфе и неуязвимость мастера клинка при создании иллюзий).
Автор - DioD
Автор - DioD
function IsUnitInvulnerable takes unit Unit returns boolean
local real Health_Current = GetWidgetLife(Unit)
local real Mana_Current = GetUnitState(Unit,UNIT_STATE_MANA)
local boolean Check_Health
call SetWidgetLife(Unit,Health_Current + 0.001)
if Health_Current != GetWidgetLife(Unit) then
call UnitDamageTarget(Unit,Unit,0.001,false,true,null,null,null)
set Check_Health = (GetWidgetLife(Unit) == Health_Current + 0.001)
else
call UnitDamageTarget(Unit,Unit,0.001,false,true,null,null,null)
set Check_Health = (GetWidgetLife(Unit) == Health_Current)
call SetWidgetLife(Unit,Health_Current)
endif
if Check_Health then
return not (GetUnitState(Unit,UNIT_STATE_MANA) != Mana_Current)
endif
return Check_Health
endfunction
Определение высоты рельефа
Определяет высоту рельефа в заданных координатах точки. Полезно для реализации "правильного" движения снарядов.
library TerrainHeight
globals
private location loc = Location(0, 0)
endglobals
function GetTerrainZ takes real x, real y returns real
call MoveLocation(loc, x, y)
return GetLocationZ(loc)
endfunction
endlibrary
Перпендикуляр от отрезка к точке
Находит длину перпендикуляра от отрезка, заданного Xa, Ya, Xb, Yb к точке, заданной Xc, Yc. Полезно при реализации заклинаний типа "Огненная стена", во избежание последовательных пиков юнитов по прямой.
Автор - silumin
function Perpendicular takes real Xa,real Ya,real Xb,real Yb,real Xc,real Yc returns real
return SquareRoot((Xa - Xc) * (Xa - Xc) + (Ya - Yc) * (Ya - Yc)) * Sin(Atan2(Yc-Ya,Xc-Xa) - Atan2(Yb-Ya,Xb-Xa))
endfunction
Принадлежность точки произвольному четырёхугольнику (неквадратный рект)
Функции принадлежности точки треугольнику и произвольному четырёхугольнику.
//Площадь треугольника по координатам
function TriS takes real x1, real y1, real x2, real y2, real x3, real y3 returns real
return RAbsBJ(x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2))/2
endfunction
//Принадлежность точки (x;y) треугольнику (x1;y1);(x2;y2);(x3;y3).
function IsCoordsInTriangle takes real x, real y, real x1, real y1, real x2, real y2, real x3, real y3 returns boolean
return R2I(TriS(x1, y1, x2, y2, x3, y3))==R2I(TriS(x1, y1, x2, y2, x, y)+TriS(x2, y2, x3, y3, x, y)+TriS(x1, y1, x3, y3, x, y))
endfunction
//Принадлежность точки (x;y) произвольному четырёхугольнику (x1;y1);(x2;y2);(x3;y3);(x4;y4). Облегчённая версия, см. примечание.
function IsCoordsIn4GonSimple takes real x, real y, real x1, real y1, real x2, real y2, real x3, real y3, real x4, real y4 returns boolean
return IsCoordsInTriangle(x, y, x1, y1, x2, y2, x3, y3) or IsCoordsInTriangle(x, y, x1, y1, x4, y4, x3, y3)
endfunction
//Принадлежность точки (x;y) произвольному четырёхугольнику (x1;y1);(x2;y2);(x3;y3);(x4;y4). Полная версия, см. примечание.
function IsCoordsIn4Gon takes real x, real y, real x1, real y1, real x2, real y2, real x3, real y3, real x4, real y4 returns boolean
return IsCoordsInTriangle(x, y, x1, y1, x2, y2, x3, y3) or IsCoordsInTriangle(x, y, x1, y1, x4, y4, x3, y3) or IsCoordsInTriangle(x, y, x1, y1, x2, y2, x4, y4)
endfunction
Примечание к функциям четырёхугольника
Автор: Hanabishi
Нахождение строки в строке
struct String{
private string Main
int length
int indexOf(string s, int num){
int i = 0, j = 0
int e = StringLength(this.Main)
int ls = StringLength(s)
int index[]
whilenot(i == e){
if (SubString(this.Main, i, i + ls) == s){
index[j] = i
j++
}
i++
}
if (num > j){
num = j
}
return index[num]
}
int indexOfEnd(string s, int num){
int i = 0, j = 0
int e = StringLength(this.Main)
int ls = StringLength(s)
int index[]
whilenot(i == e){
if (SubString(this.Main, i, i + ls) == s){
index[j] = i + ls
j++
}
i++
}
if (num > j){
num = j
}
return index[num]
}
}
Автор: Doc
HEX to DEC to ASCII (конвертация равкодов)
globals
integer array Pow16x
integer array Pow256x
string array CharMap16
string array CharMap256
integer array CharInx16
integer array CharInx256
endglobals
function S2Ix takes string s returns integer
//return GetHandleId(s) // changed, 20.03.2012
return StringHash(s) // changed by ScorpioT1000, 03.04.2012
//return s
//return 0
endfunction
function ASCII2DEC takes string num256 returns integer
local integer num10 = 0
local integer i = 0
local integer len = StringLength(num256)
loop
exitwhen i >= len
set num10 = num10 + CharInx256[S2Ix(SubString(num256, i, i+1))] * Pow256x[len-i-1]
set i = i + 1
endloop
return num10
endfunction
function DEC2ASCII takes integer num10 returns string
local string num256 = ""
local integer i = 3
local integer CodeCh
loop
exitwhen i < 0
set CodeCh = 0
loop
exitwhen num10 < Pow256x[i]
set CodeCh = CodeCh + 1
set num10 = num10 - Pow256x[i]
endloop
if CodeCh > 0 then
set num256 = num256 + CharMap256[CodeCh]
endif
set i = i - 1
endloop
return num256
endfunction
function HEX2DEC takes string num16 returns integer
local integer num10 = 0
local integer i = 0
local integer len = StringLength(num16)
loop
exitwhen i >= len
set num10 = num10 + CharInx16[S2Ix(SubString(num16, i, i+1))] * Pow16x[len-i-1]
set i = i + 1
endloop
return num10
endfunction
function DEC2HEX takes integer num10 returns string
local string num16 = ""
local integer i = 7
local integer CodeCh
loop
exitwhen i < 0
set CodeCh = 0
loop
exitwhen num10 < Pow16x[i]
set CodeCh = CodeCh + 1
set num10 = num10 - Pow16x[i]
endloop
if CodeCh > 0 then
set num16 = num16 + CharMap16[CodeCh]
endif
set i = i - 1
endloop
return num16
endfunction
//-
function ForLoadMap takes nothing returns nothing
set CharInx16[S2Ix("0")] = 0
set CharInx16[S2Ix("1")] = 1
set CharInx16[S2Ix("2")] = 2
set CharInx16[S2Ix("3")] = 3
set CharInx16[S2Ix("4")] = 4
set CharInx16[S2Ix("5")] = 5
set CharInx16[S2Ix("6")] = 6
set CharInx16[S2Ix("7")] = 7
set CharInx16[S2Ix("8")] = 8
set CharInx16[S2Ix("9")] = 9
set CharInx16[S2Ix("A")] = 10
set CharInx16[S2Ix("a")] = 10
set CharInx16[S2Ix("B")] = 11
set CharInx16[S2Ix("b")] = 11
set CharInx16[S2Ix("C")] = 12
set CharInx16[S2Ix("c")] = 12
set CharInx16[S2Ix("D")] = 13
set CharInx16[S2Ix("d")] = 13
set CharInx16[S2Ix("E")] = 14
set CharInx16[S2Ix("e")] = 14
set CharInx16[S2Ix("F")] = 15
set CharInx16[S2Ix("f")] = 15
set CharInx256[S2Ix("!")] = 33
set CharInx256[S2Ix(" ")] = 34
set CharInx256[S2Ix("#")] = 35
set CharInx256[S2Ix("$")] = 36
set CharInx256[S2Ix("%")] = 37
set CharInx256[S2Ix("&")] = 38
set CharInx256[S2Ix("'")] = 39
set CharInx256[S2Ix("(")] = 40
set CharInx256[S2Ix(")")] = 41
set CharInx256[S2Ix("*")] = 42
set CharInx256[S2Ix("+")] = 43
set CharInx256[S2Ix(",")] = 44
set CharInx256[S2Ix("-")] = 45
set CharInx256[S2Ix(".")] = 46
set CharInx256[S2Ix("/")] = 47
set CharInx256[S2Ix("0")] = 48
set CharInx256[S2Ix("1")] = 49
set CharInx256[S2Ix("2")] = 50
set CharInx256[S2Ix("3")] = 51
set CharInx256[S2Ix("4")] = 52
set CharInx256[S2Ix("5")] = 53
set CharInx256[S2Ix("6")] = 54
set CharInx256[S2Ix("7")] = 55
set CharInx256[S2Ix("8")] = 56
set CharInx256[S2Ix("9")] = 57
set CharInx256[S2Ix(":")] = 58
set CharInx256[S2Ix(";")] = 59
set CharInx256[S2Ix("<")] = 60
set CharInx256[S2Ix("=")] = 61
set CharInx256[S2Ix(">")] = 62
set CharInx256[S2Ix(".")] = 63
set CharInx256[S2Ix("@")] = 64
set CharInx256[S2Ix("A")] = 65
set CharInx256[S2Ix("B")] = 66
set CharInx256[S2Ix("C")] = 67
set CharInx256[S2Ix("D")] = 68
set CharInx256[S2Ix("E")] = 69
set CharInx256[S2Ix("F")] = 70
set CharInx256[S2Ix("G")] = 71
set CharInx256[S2Ix("H")] = 72
set CharInx256[S2Ix("I")] = 73
set CharInx256[S2Ix("J")] = 74
set CharInx256[S2Ix("K")] = 75
set CharInx256[S2Ix("L")] = 76
set CharInx256[S2Ix("M")] = 77
set CharInx256[S2Ix("N")] = 78
set CharInx256[S2Ix("O")] = 79
set CharInx256[S2Ix("P")] = 80
set CharInx256[S2Ix("Q")] = 81
set CharInx256[S2Ix("R")] = 82
set CharInx256[S2Ix("S")] = 83
set CharInx256[S2Ix("T")] = 84
set CharInx256[S2Ix("U")] = 85
set CharInx256[S2Ix("V")] = 86
set CharInx256[S2Ix("W")] = 87
set CharInx256[S2Ix("X")] = 88
set CharInx256[S2Ix("Y")] = 89
set CharInx256[S2Ix("Z")] = 90
set CharInx256[S2Ix("[")] = 91
set CharInx256[S2Ix("]")] = 93
set CharInx256[S2Ix("^")] = 94
set CharInx256[S2Ix("_")] = 95
set CharInx256[S2Ix("`")] = 96
set CharInx256[S2Ix("a")] = 97
set CharInx256[S2Ix("b")] = 98
set CharInx256[S2Ix("c")] = 99
set CharInx256[S2Ix("d")] = 100
set CharInx256[S2Ix("e")] = 101
set CharInx256[S2Ix("f")] = 102
set CharInx256[S2Ix("g")] = 103
set CharInx256[S2Ix("h")] = 104
set CharInx256[S2Ix("i")] = 105
set CharInx256[S2Ix("j")] = 106
set CharInx256[S2Ix("k")] = 107
set CharInx256[S2Ix("l")] = 108
set CharInx256[S2Ix("m")] = 109
set CharInx256[S2Ix("n")] = 110
set CharInx256[S2Ix("o")] = 111
set CharInx256[S2Ix("p")] = 112
set CharInx256[S2Ix("q")] = 113
set CharInx256[S2Ix("r")] = 114
set CharInx256[S2Ix("s")] = 115
set CharInx256[S2Ix("t")] = 116
set CharInx256[S2Ix("u")] = 117
set CharInx256[S2Ix("v")] = 118
set CharInx256[S2Ix("w")] = 119
set CharInx256[S2Ix("x")] = 120
set CharInx256[S2Ix("y")] = 121
set CharInx256[S2Ix("z")] = 122
set CharInx256[S2Ix("{")] = 123
set CharInx256[S2Ix("|")] = 124
set CharInx256[S2Ix("}")] = 125
set CharInx256[S2Ix("~")] = 126
endfunction
function ForInitializationMap takes nothing returns nothing
local trigger trig = CreateTrigger()
call TriggerRegisterGameEvent(trig, EVENT_GAME_LOADED)
call TriggerAddAction( trig, function ForLoadMap)
call ForLoadMap()
set Pow256x[0] = 0x00000001
set Pow256x[1] = 0x00000100
set Pow256x[2] = 0x00010000
set Pow256x[3] = 0x01000000
set Pow16x[0] = 0x00000001
set Pow16x[1] = 0x00000010
set Pow16x[2] = 0x00000100
set Pow16x[3] = 0x00001000
set Pow16x[4] = 0x00010000
set Pow16x[5] = 0x00100000
set Pow16x[6] = 0x01000000
set Pow16x[7] = 0x10000000
set CharMap16[0] = "0"
set CharMap16[1] = "1"
set CharMap16[2] = "2"
set CharMap16[3] = "3"
set CharMap16[4] = "4"
set CharMap16[5] = "5"
set CharMap16[6] = "6"
set CharMap16[7] = "7"
set CharMap16[8] = "8"
set CharMap16[9] = "9"
set CharMap16[10] = "a"
set CharMap16[11] = "b"
set CharMap16[12] = "c"
set CharMap16[13] = "d"
set CharMap16[14] = "e"
set CharMap16[15] = "f"
set CharMap256[33] = "!"
set CharMap256[34] = " "
set CharMap256[35] = "#"
set CharMap256[36] = "$"
set CharMap256[37] = "%"
set CharMap256[38] = "&"
set CharMap256[39] = "'"
set CharMap256[40] = "("
set CharMap256[41] = ")"
set CharMap256[42] = "*"
set CharMap256[43] = "+"
set CharMap256[44] = ","
set CharMap256[45] = "-"
set CharMap256[46] = "."
set CharMap256[47] = "/"
set CharMap256[48] = "0"
set CharMap256[49] = "1"
set CharMap256[50] = "2"
set CharMap256[51] = "3"
set CharMap256[52] = "4"
set CharMap256[53] = "5"
set CharMap256[54] = "6"
set CharMap256[55] = "7"
set CharMap256[56] = "8"
set CharMap256[57] = "9"
set CharMap256[58] = ":"
set CharMap256[59] = ";"
set CharMap256[60] = "<"
set CharMap256[61] = "="
set CharMap256[62] = ">"
set CharMap256[63] = "."
set CharMap256[64] = "@"
set CharMap256[65] = "A"
set CharMap256[66] = "B"
set CharMap256[67] = "C"
set CharMap256[68] = "D"
set CharMap256[69] = "E"
set CharMap256[70] = "F"
set CharMap256[71] = "G"
set CharMap256[72] = "H"
set CharMap256[73] = "I"
set CharMap256[74] = "J"
set CharMap256[75] = "K"
set CharMap256[76] = "L"
set CharMap256[77] = "M"
set CharMap256[78] = "N"
set CharMap256[79] = "O"
set CharMap256[80] = "P"
set CharMap256[81] = "Q"
set CharMap256[82] = "R"
set CharMap256[83] = "S"
set CharMap256[84] = "T"
set CharMap256[85] = "U"
set CharMap256[86] = "V"
set CharMap256[87] = "W"
set CharMap256[88] = "X"
set CharMap256[89] = "Y"
set CharMap256[90] = "Z"
set CharMap256[91] = "["
set CharMap256[93] = "]"
set CharMap256[94] = "^"
set CharMap256[95] = "_"
set CharMap256[96] = "`"
set CharMap256[97] = "a"
set CharMap256[98] = "b"
set CharMap256[99] = "c"
set CharMap256[100] = "d"
set CharMap256[101] = "e"
set CharMap256[102] = "f"
set CharMap256[103] = "g"
set CharMap256[104] = "h"
set CharMap256[105] = "i"
set CharMap256[106] = "j"
set CharMap256[107] = "k"
set CharMap256[108] = "l"
set CharMap256[109] = "m"
set CharMap256[110] = "n"
set CharMap256[111] = "o"
set CharMap256[112] = "p"
set CharMap256[113] = "q"
set CharMap256[114] = "r"
set CharMap256[115] = "s"
set CharMap256[116] = "t"
set CharMap256[117] = "u"
set CharMap256[118] = "v"
set CharMap256[119] = "w"
set CharMap256[120] = "x"
set CharMap256[121] = "y"
set CharMap256[122] = "z"
set CharMap256[123] = "{"
set CharMap256[124] = "|"
set CharMap256[125] = "}"
set CharMap256[126] = "~"
set trig = null
endfunction