Добавлен , не публикуется
Данная тема предназначена для различных функций, которые могут быть весьма полезны при программировании на Jass.

Функции

Эмуляция ошибки в Warcraft
Sim Error из Caster System, позволяет вам сэмитировать ошибку наподобие той, что выводиться движком вара. Незаменима при создании каких-либо довесков к интерфейсу пользователя.
Автор - 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
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
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
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
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 - расстояние от исходной цели до точки, где следует взять высоту по параболе.
Формула параболы (учитывающая начальную и конечную высоту)
Автор оригинала - moyack
Автор оптимизированного варианта - Shadow Daemon
  • 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
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
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
25
15 лет назад
0
Hellfim фэлс.
JokerStar
юзай эту функцию:

function BuyItem takes unit u, unit s, integer id returns boolean
call IssueNeutralTargetOrder(GetOwningPlayer(u), s, "smart", u)
return IssueNeutralImmediateOrderById(GetOwningPlayer(u), s, id)
endfunction
т.е. вызов должен выглядеть так: call BuyItem(<покупающий юнит>, <магаз>, <id итема>)
проверено, работает.
0
8
15 лет назад
0
function AddTimeEvents takes trigger t returns nothing
    local real r = 0
    loop
      exitwhen r == 23.59
        call TriggerRegisterGameStateEventTimeOfDay( t, EQUAL, r )
        set r = r + 0.01
    endloop
endfunction
Каждую "минуту" игрового времени вызывается триггер.
1
23
15 лет назад
1
IceInfernal
Эм... а смысл? И как бы ты учел 23.59, но почему не учел например 11.79? такое число у тебя вполне возможно.
0
27
15 лет назад
0
IceInfernal 23.59 != 23 часа 59 минут
0
1
15 лет назад
0
Не уверен, что кому-нибудь пригодится, но предложить особо нечего, ибо много уже выложено здесь.
Вообщем мини-скрипт для удобства учета игрового времени(можно использовать для мультиборда или текстовых сообщений во время игры)
Сунуть можно в Custom Script вашей карты, нужно только инициализировать таймер, обратившись к функции ts_Start. Чтобы получить строку с пройденным временем нужно лишь обратиться к функции ts_GetTime.
//***************************************************************************
//*
//*   TimeScript v1.0
//*   Автор Tosky
//*
//***************************************************************************

//===========================================================================
// Функция для удобства 
// (Возвращает одну из двух строк по условию, где первая - истинная)

function ts_iif takes boolean b, string s1, string s2 returns string
    if b then
        return s1
    else
        return s2
    endif
endfunction

//===========================================================================
// Возвращает строку вида 0:00:00

function ts_GetTime takes nothing returns string
    local integer i
    local string s
    local string m
    local string h = I2S(ts_GetHours())
    set i = bj_meleeTwinkedHeroes[1000]
    set s = ts_iif(i > 9, I2S(i), "0" + I2S(i))
    set i = bj_meleeTwinkedHeroes[1001]
    set m = ts_iif(i > 9, I2S(i), "0" + I2S(i))
    return h + ":" + m + ":" + s
endfunction

//===========================================================================
// Cоздает текстовое сообщение вида "0:00:00 - Сообщение"
// для указанного игрока по номеру(где -1 = Для всех игроков-людей)

function ts_Msg takes integer id, string msg returns nothing
    local player p = GetLocalPlayer()
    if id != -1 then
        set p = Player(id)
    endif
    call DisplayTimedTextToPlayer(p, 0, 0, 30.0, "|cffffcc00" + ts_GetTime() + "|r - " + msg)
    set p = null
endfunction

//===========================================================================
// Функция учета времени

function ts_Timer takes nothing returns nothing
    local integer s = bj_meleeTwinkedHeroes[1000]
    local integer m = bj_meleeTwinkedHeroes[1001]
    local integer h = bj_meleeTwinkedHeroes[1002]
    set s = s + 1
    if s == 60 then
        set s = 0
        set m = m + 1
    endif
    if m == 60 then
        set m = 0
        set h = h + 1
    endif
    set bj_meleeTwinkedHeroes[1000] = s
    set bj_meleeTwinkedHeroes[1001] = m
    set bj_meleeTwinkedHeroes[1002] = h
endfunction

//===========================================================================
// Функция запуска(Запустите при инициализации)

function ts_Start takes nothing returns nothing
    local timer tm = CreateTimer()
    call TimerStart(tm, 1.0, true, function ts_Timer)
    set tm = null
endfunction
0
27
15 лет назад
0
return h + ":" + m + ":" + s
set s = null
set m = null
set h = null
endfunction...
[size=1][i]J добавил:[/i][/size]
учитесь =)
globals
    timer TTimer = CreateTimer()
    string array TSTime
    integer Tsec = 0  
    integer Tmin = 0
    integer Thour = 0
endglobals 

function Time_RunTimer takes nothing returns nothing
    set Tsec = Tsec + 1
    if (Tsec > 59) then
        set Tsec = 0
        set Tmin = Tmin + 1 
        if (Tmin > 59) then
            set Tmin = 0
            set Thour = Thour + 1
        endif
    endif
endfunction

function Time_GetTime takes nothing returns string
    return TSTime[Thour] + ":" + TSTime[Tmin] + ":" + TSTime[Tsec]
endfunction

function Time_StartTimer takes nothing returns nothing 
    local integer i = 0 
    loop
        exitwhen i > 9
        set TSTime[i] = "0"+I2S(i)
        set i = i + 1
    endloop
    loop
        exitwhen i > 59
        set TSTime[i] = I2S(i)
        set i = i + 1
    endloop    
    call TimerStart(TTimer, 1.0, true, function Time_RunTimer)
endfunction
0
37
15 лет назад
0
J фтопку такое, раз делать так на неограниченное число таймеров =)
0
15
15 лет назад
0
разделение Id на разряды

function GetFirstBit takes integer id returns integer
return (id-'0000') - 256 * R2I((id-'0000')/256)
endfunction

function GetSecondBit takes integer id returns integer
return R2I((id-'0000')/256)-256*R2I((id-'0000')/65536)
endfunction

function GetThirdBit takes integer id returns integer
return R2I((id-'0000')/65536)-256*R2I((id-'0000')/16777216)
endfunction

function GetFourthBit takes integer id returns integer
return R2I((id-'0000')/16777216)
endfunction
0
21
15 лет назад
0
Было бы хорошо создать функцию, находящую Damage Per Second юнита, и следовательно, атаку и скорость атаки по отдельности.
0
27
15 лет назад
0
ELDAR тогдауж это не биты а байты
0
25
15 лет назад
0
JaBeN_Симфер отдельно от какой-либо системы аттача, в общем виде такое не напишешь
0
21
15 лет назад
0
а можно ли обратиться к ячейкам slk и написать алгоритм вычислений + учитывать магии (стандартные и сделанные на их основе), меняющие атаку и скоость атаки?
0
12
15 лет назад
0
можно до патча 1.24, но нельзя.
0
26
15 лет назад
0
изменение высоты полёта за время, функция тупая, но вдруг сэкономит кому-нибудь пару минут)
function SetUnitFlyHeightTimed takes unit u, real h, real t returns nothing
    local real c = h-GetUnitFlyHeight(u)
    local real s = c/t
    if(c<0) then
        set s = -s
    endif
    call SetUnitFlyHeight(u, h, s)
endfunction
u - нужный юнит
h - нужная высота
t - нужное время (сек.)
0
20
15 лет назад
0
Hanabishi хм... а разве со скоростью было хуже? это можно использовать в роликах
0
26
15 лет назад
0
а разве со скоростью было хуже?
ну, вдруг нужно именно за какое-то время
0
37
15 лет назад
0
было бы интересно именно вручную изменение высоты
[size=1]ScorpioT1000 добавил:[/size]
т.е. за время.. хотя, не интересно)
0
17
15 лет назад
0
Это банально реализуется стандартной функцией через простые вычисления.
0
26
15 лет назад
0
ну незнаю, тогда
function GetZAng takes location loc1, real z1, location loc2, real z2 returns real
    local real s = 0
    local real r
    local real dist = DistanceBetweenPoints(loc1, loc2)
    set r = (z2-z1)/dist
    set r = AtanBJ(r)
    return r
endfunction

function shell takes nothing returns nothing
    local real speed = 500 //скорость движения
    local real coef = GetZAng(loc1, z1, loc2, z2)
    local real speedXY = speed*CosBJ(coef)
    local real speedZ = speed*SinBJ(coef)
endfunction
вычисление относительной скорости при движении, т.е. с какой скоростью нужно двигаться по Z и XY относительно заданной при движении в пространстве
0
27
15 лет назад
0
Hanabishi плохо, зачем точки? зачем углы? да еще и в градусах =|, не оптимально
function Func takes real Speed, x1, real y1, real z1, real x2, real y2, real z2 returns nothing
    local real len
    set x1 = x2-x1
    set y1 = y2-y1
    set z1 = z2-z1
    set len = SquareRoot(x1*x1+y1*y1+z1*z1)/Speed;
    set x1 = x1/len;
    set y1 = y1/len;
    set z1 = z1/len;
    //
    // x1 //Скорость по оси X
    // y1 //Скорость по оси Y
    // z1 //Скорость по оси Z
    // (int)len сколько раз нужно прибавить эти скорость чтобы переместить точку 1 в точку 2
    //
endfunction
я сам часто пользуюсь этим методом, если нужно сдвинуть юнита, передаю в таймер скорости вместе со счетчиком, и декрементирую счетчик, когда он == 0 удаляю таймер
[size=1][i]J добавил:[/i][/size]
также напомню что
set r = (z2-z1)/dist
set r = AtanBJ(r)
это делает тоже самое что и это:
set r = Atan2(z2-z1, dist)
как думаешь что оптимальнее?
0
26
15 лет назад
0
J, спасибо честно говоря, слабо подозревал зачем Atan2 нужен)))
а радианами вообще никогда не пользовался...
3 комментария удалено
0
20
15 лет назад
0
Нашел интересные функции:
Создание еффекта по Z оси
function AddSpecialEffectZ takes string path, real x, real y, real z returns effect
    local destructable d = CreateDestructableZ( 'OTip', x, y, z, 0.00, 1, 0 )
    set bj_lastCreatedEffect = AddSpecialEffect( path, x, y )
    call RemoveDestructable( d )
    set d = null
    return bj_lastCreatedEffect
endfunction
GetTriggerItem
function GetTriggerItem takes nothing returns integer
if(GetSoldItem()!=null)then
return GetSoldItem()
elseif(GetManipulatedItem()!=null)then
return GetManipulatedItem()
elseif(GetOrderTargetItem()!=null)then
return GetOrderTargetItem()
else
return GetSpellTargetItem()
endif
endfunction
GetPlayerColorCode
function GetPlayerColorCode takes player whichPlayer returns string
    if ( whichPlayer == Player(0) ) then
        return "|c00FF0000"
    endif
    if ( whichPlayer == Player(1) ) then
        return "|c000000FF"
    endif
    if ( whichPlayer == Player(2) ) then
        return "|c0040E0D0"
    endif
    if ( whichPlayer == Player(3) ) then
        return "|c00A020F0"
    endif
    if ( whichPlayer == Player(4) ) then
        return "|c00FFFF00"
    endif
    if ( whichPlayer == Player(5) ) then
        return "|c00FFA500"
    endif
    if ( whichPlayer == Player(6) ) then
        return "|c0000FF00"
    endif
    if ( whichPlayer == Player(7) ) then
        return "|c00FFC0CB"
    endif
    if ( whichPlayer == Player(8) ) then
        return "|c00BEBEBE"
    endif
    if ( whichPlayer == Player(9) ) then
        return "|c00ADD8E6"
    endif
    if ( whichPlayer == Player(10) ) then
        return "|c00006400"
    endif
    if ( whichPlayer == Player(11) ) then
        return "|c00A52A2A"
    endif
    return null
endfunction
CreateError
function SimError takes player ForPlayer, string msg returns nothing
local sound error=CreateSoundFromLabel( "InterfaceError",false,false,false,10,10)
    if (GetLocalPlayer() == ForPlayer) then
        call ClearTextMessages()
        call DisplayTimedTextToPlayer( ForPlayer, 0.52, -1.00, 2.00, "|cffffcc00"+msg+"|r" )
        call StartSound( error )
    endif
    call KillSoundWhenDone(error)
set error=null
endfunction
Чтобы оставить комментарий, пожалуйста, войдите на сайт.