Библиотека функций

» не публикуется
Данная тема предназначена для различных функций, которые могут быть весьма полезны при программировании на 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

 

Просмотров: 69 687



Doc #701 - 8 лет назад 0
naxim, facepalm, лично у меня МОЖНО играть в сингле, но нельзя сохраняться. окей, юзай как знаешь. Я вообще юзаю ReloadGameCaches(), но это неблаготворно сказывается на реплеях.
naxim #702 - 8 лет назад 0
Doc:
naxim, facepalm, лично у меня МОЖНО играть в сингле, но нельзя сохраняться. окей, юзай как знаешь. Я вообще юзаю ReloadGameCaches(), но это неблаготворно сказывается на реплеях.
Вопрос был не о действиях после проверки, а об использовании чита.
Не успел написать в теме о перезагрузки что ты закрыл, чему был очень удивлен. Почему там не подходит
call RestartGame( false )
для перезагрузки? Или
native          ReloadGame          takes nothing returns nothing
EvolutionArena #703 - 8 лет назад 0
Лично мне идеально подошел КС все робит и без лишнего гемора)
2 комментария удалено
Elishev #706 - 8 лет назад 0
EvolutionArena:
Лично мне идеально подошел КС все робит и без лишнего гемора)
Мне тоже, а тебе? Тебе как и мне? Ясно.
Faion #707 - 8 лет назад 0
Дело было вечером, делать было нечего отдыхал от кода для проекта...
Функция для пика рандомного юнита из группы.

library GetRndUnit
{
    private unit array unit_array
    private int index = 0

    void rnd()
    {
        unit_array[index] = GetEnumUnit()
        index++
    }

    unit GetRndUnit(group g)
    {
        index = 0
        ForGroup(g, function rnd)    
        return unit_array[GetRandomInt(0,index)]
    }
}
Doc #708 - 8 лет назад 0
Faion, вот круче:
define addpool(T, M) = {
    struct T##pool{
        
        static constant int max = M
        
        int count = 0
        T blocked[thistype.max]
        
        T get(){
            T h
            do {
                h = T##.vector[GetRandomInt(0, T##.vectorCount - 1)]
            } whilenot(!this.isBlocked(h))
            this.add(h)
            return h
        }
        
        void add(T h){
            this.blocked[this.count++] = h
        }
        
        bool isBlocked(T h){
            int i = 0
            whilenot(i == this.count){
                if (h == this.blocked[i]){
                    return true
                }
                i++
            }
            return false
        }
    }
}
Группы не юзаю, например.
Faion #709 - 8 лет назад 0
[quote=Doc]Группы не юзаю, например.
Вай? Нативный массив юнитов, разве есть причины не юзать их?
Бтв, пока старики не разбежались совсем, нужно заставить их накатать статью о различных фичах которые помогают более оптимально использовать ресурсы. Начиная от банальных, типа о разнице в скорости работы координат и локаций, хт и массивов, заканчивая серьезными вещами, о которых вообще мало кто в принципе знает.
Doc #710 - 8 лет назад 0
Faion, обычные массивы много удобно.
Nerevar #711 - 8 лет назад 0
» код
library CircleMove

function CircleMoveDist takes real Radius, real Angle returns real
return Radius*Sin(1.570796327-Angle*0.017453292)
endfunction

function CircleMoveHeight takes real Radius, real Angle returns real
return Radius*(1.+Sin(Angle*0.017453292))
endfunction

function CircleMoveDistRad takes real Radius, real Angle returns real
return Radius*Sin(1.570796327-Angle)
endfunction

function CircleMoveHeightRad takes real Radius, real Angle returns real
return Radius*(1.+Sin(Angle))
endfunction

endlibrary
4 функции для движения юнита в вертикальной плоскости.Для получения высоты полёта юнита надо использовать функцию CircleMoveHeight,чтобы получить смещение относительно центра окружности надо использовать функцию CircleMoveDist - в них обоих сначала передаётся радиус окружности,затем угол юнита относительно центра окружности.Если вы передаёте угол в радианах,используйте функции CircleMoveHeightRad\CircleMoveDistRad используйте функции
Прилагаю рисунок
Прилагаю пример(в нем бесконечное движение по кругу сделал и поллед войт используется для простоты показа)
Msey #712 - 8 лет назад 0
Функция, которая не позволяет юнитам со способностью москиты "улетать" за границы карты
Триггер их убивает быстрее, чем они убивают игру
достаточно сделать так, если у вас не навороченная система с дамми
library ABC uses ХY
...
endlibrary
Сама функция
library XY initializer init

globals
    private real minX 
    private real minY
    private real maxX 
    private real maxY 
endglobals

private function ANTIDAMMI takes nothing returns nothing
    local unit u
    if GetUnitAbilityLevel(GetTriggerUnit(), 'Aloc') > 0 then
        set u = GetTriggerUnit()
        call ShowUnit(u, false)
        call KillUnit(u)
    endif
    set u = null
endfunction

private function init takes nothing returns nothing
    local trigger t = CreateTrigger()
    local region reg = CreateRegion()
    local rect map
    set maxX = GetRectMaxX(bj_mapInitialPlayableArea) 
    set maxY = GetRectMaxY(bj_mapInitialPlayableArea) 
    set minX = GetRectMinX(bj_mapInitialPlayableArea) 
    set minY = GetRectMinY(bj_mapInitialPlayableArea) 
    set map = Rect(minX, minX, maxX, maxX)
    call RegionAddRect(reg, map)
    call TriggerRegisterLeaveRegion(t, reg, null)
    call TriggerAddAction(t, function ANTIDAMMI)
    call RemoveRect(map)
    set t = null
    set reg = null
    set map = null
   endfunction
endlibrary
16GB #713 - 8 лет назад 0
эм какой-то бред можно проще и в самом коде, и чтоб они не удалялись, а просто скользили вдоль границы
Faion #714 - 8 лет назад 0
Полнейший бред. Во первых, нафиг то что в ините. Если не используется? Во вторых функция ремува, это нечто.
Фунцкия должна быть такой, юнит может быть не только триггерным ._.

public function ANTIDAMMI takes unit u returns nothing
    if GetUnitAbilityLevel(u, 'Aloc') > 0 then
        call ShowUnit(u, false) // нафиг? сомневаюсь что это ускоряет ремув юнита.
        call KillUnit(u)
    endif
endfunction
Msey #715 - 8 лет назад 0
16GB, если юнитов 50+ и у них масштаб более 1.5 - это некрасиво
Clamp #716 - 8 лет назад 0
Msey, давно такой позорной "системы" не видел...
    private real SafeX(real R)
    {
        if(R>GetRectMaxX(bj_mapInitialPlayableArea))
        {
            return GetRectMaxX(bj_mapInitialPlayableArea)
        }
        elseif R<GetRectMinX(bj_mapInitialPlayableArea)
        {
            return GetRectMinX(bj_mapInitialPlayableArea)
        }
        return R
    }

    private real SafeY(real R)
    {
        if(R>GetRectMaxY(bj_mapInitialPlayableArea))
        {
            return GetRectMaxY(bj_mapInitialPlayableArea)
        }
        elseif R<GetRectMinY(bj_mapInitialPlayableArea)
        {
            return GetRectMinY(bj_mapInitialPlayableArea)
        }
        return R
    }
Msey #717 - 8 лет назад 0
Faion, Clamp, это функция), что вы пытаетесь добиться от "недосистемщика", который чуть ли не месяц назад клепал на гуи? :D
bee #718 - 8 лет назад 0
Msey, нужно наоборот проверять простым условием в коде.
например:
function mcc takes real x,real y returns boolean
    return(x>minX)and(y>minY)and(x<maxX)and(y<maxY)
endfunction
16GB #719 - 8 лет назад 0
Clamp:
private real SafeX(real R)
{
if(R>GetRectMaxX(bj_mapInitialPlayableArea))
{
return GetRectMaxX(bj_mapInitialPlayableArea)
}
elseif R<GetRectMinX(bj_mapInitialPlayableArea)
{
return GetRectMinX(bj_mapInitialPlayableArea)
}
return R
}
private real SafeY(real R)
{
if(R>GetRectMaxY(bj_mapInitialPlayableArea))
{
return GetRectMaxY(bj_mapInitialPlayableArea)
}
elseif R<GetRectMinY(bj_mapInitialPlayableArea)
{
return GetRectMinY(bj_mapInitialPlayableArea)
}
return R
}
то чем пользуюсь я
Faion #720 - 8 лет назад 0
Фигней вы пользуетесь.

library SafeMoving
{

    private float MinX=-28400.0
    private float MaxX=31300.0
    private float MinY=-31700.0
    private float MaxY=28300.0

    #define
    {
        SetUnitX=SetUnitXEx
        SetUnitY=SetUnitYEx
        SetUnitPosition=SetUnitPositionEx
    }

    private float CheckX(float x)
    {
        if x>MaxX
        {
            return MaxX
        }
        elseif x<MinX
        {
            return MinX
        }
        return x
    }

    private float CheckY(float y)
    {
        if y>MaxY
        {
            return MaxY
        }
        elseif y<MinY
        {
            return MinY
        }
        return y
    }

    void SetUnitXEx(unit u, float x)
    {
        SetUnit##X(u,CheckX(x))
    }

    void SetUnitYEx(unit u, float y)
    {
        SetUnit##Y(u,CheckY(y))
    }

    void SetUnitPositionEx(unit u, float x, float y)
    {
        SetUnit##Position(u,CheckX(x),CheckY(y))
    }

    void SetUnitXY(unit u, float x, float y)
    {
        SetUnitX(u,x)
        SetUnitY(u,y)
    }
}
Elf_Stratigo #721 - 8 лет назад 0
а чем плох один триггер, который киляет юнита, который покинул игровую область?
я конечно не про систему Msey, а в общем
8 комментариев удалено
Msey #730 - 8 лет назад 0
системка не моя

// Damage Enemies System
function FilterIsEnemy takes nothing returns boolean
    return IsUnitEnemy(GetFilterUnit(), bj_groupEnumOwningPlayer)
endfunction

function DamageEnemiesArea takes unit whichUnit, real radius, real x, real y, real amount, boolean attack, boolean ranged, attacktype attackType, damagetype damageType, weapontype weaponType returns nothing
    local group g = CreateGroup()
    local boolexpr b = Condition(function FilterIsEnemy)
    local unit t
    set bj_groupEnumOwningPlayer = GetOwningPlayer(whichUnit)
    call GroupEnumUnitsInRange(g, x, y, radius, b)
    call DestroyBoolExpr(b)    
    loop
        set t = FirstOfGroup(g)
        exitwhen t == null
        call GroupRemoveUnit(g,t)
        call UnitDamageTarget(whichUnit,t,amount,attack, ranged,attackType,damageType,weaponType)
    endloop    
    call DestroyGroup(g)
    set g = null
    set b = null
endfunction
Doc #731 - 8 лет назад 0
Msey, выглядит как говно)
Elf_Stratigo #732 - 8 лет назад 0
зачем мёртвых бить?
с циклом смысл фильтра теряется
кстати да, там фильтр должен быть а не кондишн
Nerevar #733 - 8 лет назад 0
Такой банальный дамаг по области применяется редко - ведь в большинстве случаев этих всех юнитов надо засалить\застанить\замедлить\начать двигать\да что угодно,поэтому данная функция не найдет широкого применения.
Ах да ещё условие корявое - будет бить и здания и всё что попадётся под руку,будет враждебным.
Msey #734 - 8 лет назад 0
[quote=Nerevar]не найдет широкого применения
ну тк этой хрени не нашлось применения в моей карте.. вот я и запилил ее сюды
Это сообщение удалено
Doc #736 - 8 лет назад 0
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]
        }
}
14 комментариев удалено