47-кам, Тогда шрифт мелким придется сделать, да и текста много будет, лично мое ИМХО.
РАзве нельзя написать просто "Модератор" ? Мне вот тоже конечно бесит новые иконки, где написано "Мод. форума", остаётся только догадываться, что там написано. Мод звучит как Мод. Бред конченого =/
Ползут 2 пирожка. Первый: Я тебя щас трахну. Второй: Почему? Первый: Потому что я с яйцами :D
[jass]if (условие) then //Действия после удовлетворения условия. else //Действия, которые выполняются, если условие не удовлетворено. endif[/jass] т.е. если,то,иначе^
Могу привести пример так чтобы вы уж точно поняли. Нашем условием будет например i равно 10, то увеличьте i на 3, иначе уменьшить i на 2.
[jass]if (i == 10) then set i = i + 3 else set i = i - 2 endif[/jass]
Для того, чтобы сказать условию "равно", нужно ставить двойное равно, одинарное не воспринимается так как это знак присваивания. Знаки сравнения:
== - равно != - не равно >= - больше или равно <= - меньше или равно > - больше < - меньше
Теперь оптимизируем наше условие. Допустим, что нам не нужно ничего делать, если условие не выполняется т.е. в блоке иначе можно срубить строчку. Тогда вы можете написать так:
[jass]if (i == 10) then set i = i + 3 else call DoNothing() endif[/jass]
Однако вы не оптимизировали код. С ним можно сделать 2 действия: - Убрать call DoNothing(), она ничего не делает. Ну или просто не добавлять его изначально - Убрать else, т.к. мы не хотим ничего делать, если условие не выполняется. Получим:
[jass]if (i == 10) then set i = i + 3 endif[/jass]
Отдельно расскажу об операторах and и or. and означает, что для удовлетворения условия должны выполняться все условия. Приведём такой пример: если переменная i равна пяти, а переменная b меньше двух, то прибавить к переменной i три. Код будет таким:
[jass]if(i == 5 and b < 2) then set i = i + 3 endif[/jass]
or означает, что для удовлетворения условия должно выполниться хотя бы одно из них. Приведём такой пример: если переменная i равна пяти или переменная d меньше 140, то прибавить к переменной i три. Код будет таким:
[jass]if(i == 5 or d < 140) then set i = i + 3 endif[/jass]
Если вы хотите сделать условие в действиях при неудовлетворении условия, то используйте elseif. Приведём тот же пример: если переменная i равна пяти или переменная d меньше 140, то прибавить к переменной i три, в противном случае, если i равна четырём, добавить к значению i пять. Код будет такой:
[jass]if(i == 5 or d < 140) then set i = i + 3 elseif(i == 4) then set i = i + 5 endif [/jass] Ну вот и всё. Теперь вы знаете условия в Jass
Циклы в Jass имеют следующую структуру:
[jass]loop //Действия цикла endloop[/jass]
Циклы можно регулировать целочисленной (integer), которую лучше сделать локальной переменной. Циклы бесконечны, если не написать в них следующую строку: exitwhen ваше условие для окончания цикла. Циклы выполняют действия последовательно, wait в циклах нежелателен (так как вызывает лютые баги). Поэтому подумайте, нужен ли вам цикл или вам нужен таймер. Пример цикла:
[jass]local integer i = 1 loop exitwhen i > 10 // Цикл делается 9 раз. call DisplayTextToForce(GetPlayersAll(),(( "Высвечиваюсь" + I2S(i) ) + ( "-й раз" ))) set i = i + 1 endloop[/jass]
Функции для патчей 1.24+, позволяющие работать с Trackable - объектами, которые ловят мышь.
[jass]function GetTrackableX takes trackable tc, hashtable h returns real return LoadReal(h,GetHandleId(tc),0) endfunction
function GetTrackableY takes trackable tc, hashtable h returns real return LoadReal(h,GetHandleId(tc),1) endfunction
function GetTrackableZ takes trackable tc, hashtable h returns string return LoadReal(h,GetHandleId(tc),2) endfunction
function GetTrackableFacing takes trackable tc, hashtable h returns real return LoadReal(h,GetHandleId(tc),3) endfunction
function GetTrackablePath takes trackable tc, hashtable h returns string return LoadStr(h,GetHandleId(tc),4) endfunction
function GetTrackableOwner takes trackable tc, hashtable h returns player return Player(LoadInteger(h,GetHandleId(tc),5)) endfunction
function NewTrackable takes string path, real x, real y, real z, real facing, player owner, hashtable h returns trackable local trackable tc local string invisible = "" local destructable d = CreateDestructableZ('OTip', x, y, z, 0.00, 1.00, 0 ) if GetLocalPlayer() != owner then set path = invisible endif set tc = CreateTrackable(path, x, y, facing) call RemoveDestructable(d) set d = null call SaveReal(h,GetHandleId(tc),0,x) call SaveReal(h,GetHandleId(tc),1,y) call SaveReal(h,GetHandleId(tc),2,z) call SaveReal(h,GetHandleId(tc),3,facing) call SaveStr(h,GetHandleId(tc),4,path) call SaveInteger(h,GetHandleId(tc),5,GetPlayerId(owner)) return tc endfunction[/jass]
Воскрешает героя спустя определённый промежуток времени.
[jass]function ReviveHeroTimed_Child eakes nothing returns nothing local timer t = GetExpiredTimer() local unit hero = LoadUnitHandle(udg_Hashtable,GetHandleId(t),0) local real x = LoadReal(udg_Hashtable,GetHandleId(t),1) local real y = LoadReal(udg_Hashtable,GetHandleId(t),2) local boolean show = LoadBoolean(udg_Hashtable,GetHandleId(t),3) call ReviveHero(hero,x,y,show) call FludhChildHashtable(udg_Hashtable,GetHandleId(t)) call DestroyTimer(t) set hero = null set t = null endfunction
function ReviveHeroTimed takes unit hero, real time, real x, real y, boolean doEyeCandy returns nothing local timer t = CreateTimer() call TimerStart(t,time,false,function ReviveHeroTimed_Child) call SaveUnitHandle(udg_Hashtable,GetHandleId(t),0,hero) call SaveReal(udg_Hashtable,GetHandleId(t),1,x) call SaveReal(udg_Hashtable,GetHandleId(t),2,y) call SaveBoolean(udg_Hashtable,GetHandleId(t),3,doEyeCandy) set t = null endfunction[/jass]
Система, позволяющая скрещивать предметы одной функцией. Требует Jass New Gen Pack (vJass).
method CheckItems2 takes nothing returns nothing local integer this_id local integer i = 0 loop set this_id = GetItemTypeId(UnitItemInSlot(.u, i)) if this_id == .item0_id then set .item1 = UnitItemInSlot(.u, i) elseif this_id == .item1_id then set .item2 = UnitItemInSlot(.u, i) endif set i = i + 1 exitwhen i >= bj_MAX_INVENTORY endloop if .item1 != null and .item2 != null then call RemoveItem(.item1) call RemoveItem(.item2) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIem\\AIemTarget.mdl",.u,"overhead")) call UnitAddItemById(.u, .item2_id) set .item1 = null set .item2 = null set .u = null endif endmethod
method CheckItems3 takes nothing returns nothing local integer this_id local integer i = 0 loop set this_id = GetItemTypeId(UnitItemInSlot(.u, i)) if this_id == .item0_id then set .item1 = UnitItemInSlot(.u, i) elseif this_id == .item1_id then set .item2 = UnitItemInSlot(.u, i) elseif this_id == .item2_id then set .item3 = UnitItemInSlot(.u, i) endif set i = i + 1 exitwhen i >= bj_MAX_INVENTORY endloop if .item1 != null and .item2 != null and .item3 != null then call RemoveItem(.item1) call RemoveItem(.item2) call RemoveItem(.item3) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIem\\AIemTarget.mdl",.u,"overhead")) //adds a special effect call UnitAddItemById(.u, .item3_id) set .item1 = null set .item2 = null set .item3 = null set .u = null endif endmethod
method CheckItems4 takes nothing returns nothing local integer this_id local integer i = 0 loop set this_id = GetItemTypeId(UnitItemInSlot(.u, i)) if this_id == .item0_id then set .item1 = UnitItemInSlot(.u, i) elseif this_id == .item1_id then set .item2 = UnitItemInSlot(.u, i) elseif this_id == .item2_id then set .item3 = UnitItemInSlot(.u, i) elseif this_id == .item3_id then set .item4 = UnitItemInSlot(.u, i) endif set i = i + 1 exitwhen i >= bj_MAX_INVENTORY endloop if .item1 != null and .item2 != null and .item3 != null and .item4 != null then call RemoveItem(.item1) call RemoveItem(.item2) call RemoveItem(.item3) call RemoveItem(.item4) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIem\\AIemTarget.mdl",.u,"overhead")) call UnitAddItemById(.u, .item4_id) set .item1 = null set .item2 = null set .item3 = null set .item4 = null set .u = null endif endmethod
method CheckItems5 takes nothing returns nothing local integer this_id local integer i = 0 loop set this_id = GetItemTypeId(UnitItemInSlot(.u, i)) if this_id == .item0_id then set .item1 = UnitItemInSlot(.u, i) elseif this_id == .item1_id then set .item2 = UnitItemInSlot(.u, i) elseif this_id == .item2_id then set .item3 = UnitItemInSlot(.u, i) elseif this_id == .item3_id then set .item4 = UnitItemInSlot(.u, i) elseif this_id == .item4_id then set .item5 = UnitItemInSlot(.u, i) endif set i = i + 1 exitwhen i >= bj_MAX_INVENTORY endloop if .item1 != null and .item2 != null and .item3 != null and .item4 != null and .item5 != null then call RemoveItem(.item1) call RemoveItem(.item2) call RemoveItem(.item3) call RemoveItem(.item4) call RemoveItem(.item5) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIem\\AIemTarget.mdl",.u,"overhead")) call UnitAddItemById(.u, .item5_id) set .item1 = null set .item2 = null set .item3 = null set .item4 = null set .item5 = null set .u = null endif endmethod
method CheckItems6 takes nothing returns nothing local integer this_id local integer i = 0 loop set this_id = GetItemTypeId(UnitItemInSlot(.u, i)) if this_id == .item0_id then set .item1 = UnitItemInSlot(.u, i) elseif this_id == .item1_id then set .item2 = UnitItemInSlot(.u, i) elseif this_id == .item2_id then set .item3 = UnitItemInSlot(.u, i) elseif this_id == .item3_id then set .item4 = UnitItemInSlot(.u, i) elseif this_id == .item4_id then set .item5 = UnitItemInSlot(.u, i) elseif this_id == .item5_id then set .item6 = UnitItemInSlot(.u, i) endif set i = i + 1 exitwhen i >= bj_MAX_INVENTORY endloop if .item1 != null and .item2 != null and .item3 != null and .item4 != null and .item5 != null and .item6 != null then call RemoveItem(.item1) call RemoveItem(.item2) call RemoveItem(.item3) call RemoveItem(.item4) call RemoveItem(.item5) call RemoveItem(.item6) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIem\\AIemTarget.mdl",.u,"overhead")) call UnitAddItemById(.u, .item6_id) set .item1 = null set .item2 = null set .item3 = null set .item4 = null set .item5 = null set .item6 = null set .u = null endif endmethod endstruct
function Recipe2 takes unit hero, integer i1, integer i2, integer ni returns nothing local RecipeItems IS=RecipeItems.create() set IS.item0_id = i1 set IS.item1_id = i2 set IS.item2_id = ni set IS.u = hero call IS.CheckItems2() call IS.destroy() endfunction
function Recipe3 takes unit hero, integer i1, integer i2, integer i3, integer ni returns nothing local RecipeItems IS=RecipeItems.create() set IS.item0_id = i1 set IS.item1_id = i2 set IS.item2_id = i3 set IS.item3_id = ni set IS.u = hero call IS.CheckItems3() call IS.destroy() endfunction
function Recipe4 takes unit hero, integer i1, integer i2, integer i3, integer i4, integer ni returns nothing local RecipeItems IS=RecipeItems.create() set IS.item0_id = i1 set IS.item1_id = i2 set IS.item2_id = i3 set IS.item3_id = i4 set IS.item4_id = ni set IS.u = hero call IS.CheckItems4() call IS.destroy() endfunction
function Recipe5 takes unit hero, integer i1, integer i2, integer i3, integer i4, integer i5, integer ni returns nothing local RecipeItems IS=RecipeItems.create() set IS.item0_id = i1 set IS.item1_id = i2 set IS.item2_id = i3 set IS.item3_id = i4 set IS.item4_id = i5 set IS.item5_id = ni set IS.u = hero call IS.CheckItems5() call IS.destroy() endfunction
function Recipe6 takes unit hero, integer i1, integer i2, integer i3, integer i4, integer i5, integer i6, integer ni returns nothing local RecipeItems IS=RecipeItems.create() set IS.item0_id = i1 set IS.item1_id = i2 set IS.item2_id = i3 set IS.item3_id = i4 set IS.item4_id = i5 set IS.item5_id = i6 set IS.item6_id = ni set IS.u = hero call IS.CheckItems6() call IS.destroy() endfunction
endlibrary[/jass]
Конвертирует число из шестнадцатеричной системы в десятичную.
[jass]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[/jass]
Конвертирует число из десятичной системы в шестнадцатеричную.
[jass]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[/jass]
Позволяет получить иконку, заполненную цветом определённого игрока.
[jass]function GetPlayerColoredIcon takes player p returns string local playercolor pc = GetPlayerColor(p) local integer i = GetHandleId(pc) local string s if i < 10 then set s = "0" + I2S(i) else set s = I2S(i) endif set pc = null return "ReplaceableTextures\\TeamColor\\TeamColor" + s + ".blp" endfunction[/jass]
Функция нанесения урона по линии. Полезна для спеллмейкеров.
[jass]function DamageLine takes location a, location b, real w, real dmg, boolean ranged returns nothing local integer i = 0 local real aX = GetLocationX(a) local real bX = GetLocationX(b) local real aY = GetLocationY(a) local real bY = GetLocationY(b) local real dist = SquareRoot((bX - aX) * (bX - aX) + (bY - aY) * (bY - aY)) local real angle = 57.295827908 * Atan2(bY - aY, bX - aX) local group g = CreateGroup() local group tg = CreateGroup() local unit u loop exitwhen i > 2*dist/w call GroupEnumUnitsInRange(g, aX, aY, w, null) loop set u = FirstOfGroup(g) if (IsUnitInGroup(u, tg) == false) then call UnitDamageTarget(u, u, dmg, true, ranged, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) endif call GroupAddUnit(tg, u) call GroupRemoveUnit(g, u) exitwhen u == null endloop set aX = aX + w/2 * Cos(angle * 0.01745327) set aY = aY + w/2 * Sin(angle * 0.01745327) set i = i + 1 endloop call DestroyGroup(g) call DestroyGroup(tg) set g = null set u = null endfunction[/jass]
Позволяет получить имя игрока в цвете. Поддерживает все 16 игроков.
[jass]function GetPlayerNameColored takes player p returns string local playercolor col=GetPlayerColor(p) local string r=GetPlayerName(p) if GetPlayerId(p) == 12 then set r="the |CFF333429"+r+"|r" elseif GetPlayerId(p) == 13 then set r="the |cffc1c1ff"+r+"|r" elseif GetPlayerId(p) == 14 then set r="the |CFF333429"+r+"|r" elseif GetPlayerId(p) == 15 then set r="the |CFF333429"+r+"|r" elseif col == PLAYER_COLOR_RED then set r="|CFFFF0303"+r+"|r" elseif col == PLAYER_COLOR_BLUE then set r="|CFF0042FF"+r+"|r" elseif col == PLAYER_COLOR_CYAN then set r="|CFF1CE6B9"+r+"|r" elseif col == PLAYER_COLOR_PURPLE then set r="|CFF540081"+r+"|r" elseif col == PLAYER_COLOR_YELLOW then set r="|CFFFFFC00"+r+"|r" elseif col == PLAYER_COLOR_ORANGE then set r="|CFFFE8A0E"+r+"|r" elseif col == PLAYER_COLOR_GREEN then set r="|CFF20C000"+r+"|r" elseif col == PLAYER_COLOR_PINK then set r="|cffff80c0"+r+"|r" elseif col == PLAYER_COLOR_LIGHT_GRAY then set r="|CFF959697"+r+"|r" elseif col == PLAYER_COLOR_LIGHT_BLUE then set r="|CFF7FBFF1"+r+"|r" elseif col == PLAYER_COLOR_AQUA then set r="|cFF106246"+r+"|r" elseif col == PLAYER_COLOR_BROWN then set r="|cFF4E2A04"+r+"|r" else set r="" endif set col=null return r endfunction[/jass]
Ползут 2 пирожка. Первый: Я тебя щас трахну. Второй: Почему? Первый: Потому что я с яйцами :D
Системка позволяющия прикреплять к хендлу нашие данные
[jass]integer cj_ind = 0;
define{ (Type,Name) = {
Type array Name##1 Type array Name##2 Type array Name##3 Type array Name##4 Type array Name##5 Type array Name##6 Type array Name##7 Type array Name##8}
Скорость высокая =) чтобы использовать, нужно для начало выделить какую-либо память нам нужно использовать "New Data", укажим тип и имя:
New Data(integer,test1);
И так мы проинициализировали test1, теперь можно хранить целочисловые переменые под именем test1, делается это довольно просто, предположим у нас есть юнит к которому хотим присвоить что либо:
Save(test1,u,10)
и так присвоили к юниту число 10 )
можно прикреплять структуры... допустим:
struct point{ real X; real Y; }
New Data(point, test2);
можно несколько
New Data(point, test3); New Data(point, test4);.
Для чтения используем: Load
Load (test2,u, Ipoin)
Здесь мы присвоили переменной Ipoin, сохроненное значения юнита в test2. для обнуление можно использовать:
Save(test1,u,0/null) (или null или 0, смотря что нужно)