Предлагаю выкладывать свои custom-функции для новичков в мире Jass'a ну и может опытные люди найдут что-нибудь полезное.
[jass]function AbUnit takes unit u,integer id ,integer did,integer lvl,real time,integer order,real x,real y returns nothing local unit d=CreateUnit(GetOwningPlayer(u),did,x,y,bj_UNIT_FACING) call UnitApplyTimedLife(d,'BTLF',time) call UnitAddAbility(d,id) call SetUnitAbilityLevel(d,id,lvl) call IssuePointOrderById(d,order,x,y) d=null endfunction[/jass]
[jass]void NTI(unit u,item i,player p,int lvl,string msg) { int id=0 if GetItemLevel(i) == lvl { whilenot id>6 { if GetItemLevel(UnitItemInSlot(u,id-1)) == lvl and UnitItemInSlot(u,id-1) != i { SetItemDropID(i, GetUnitTypeId(u)) CreateItem(GetItemTypeId(i),GetWidgetX(u),GetWidgetY(u)) DisplayTextToPl ayer (p,0 ,0,m sg) } id++ } } u=null i =null p =n ull } [/jass]
[jass]function NTI takes unit u,item i,player p,integer lvl,string msg returns nothing local integer id=0 if GetItemLevel(i) == lvl then loop exitwhen id > 6 if GetItemLevel(UnitItemInSlot(u, id - 1)) == lvl and UnitItemInSlot(u, id - 1) != i then call SetItemDropID(i, GetUnitTypeId(u)) call CreateItem(GetItemTypeId(i), GetWidgetX(u), GetWidgetY(u)) call DisplayTextToPlayer(p, 0, 0, msg) endif set id=id + 1 endloop endif set u=null set i=null set p=nul endfunction[/jass]
Сообщение отредактировал Dreii - Пт, 08.07.11, 17:25
Функции для патчей 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, смотря что нужно)
MExp (Massge Exp) то как не труд отловить полученный опыт героем. Да и создать плавающий текст рядом с самим героем видный только ему (а точнее его владельцу;)). Просто каждую секунду записываем текущий опыт героя на его хендл через хеш таблицу. При записи проверяем его прошлое значение, если есть разница то естественно вернуть её нам. А там уж мы создадим плавающий текст.
function act takes nothing returns nothing local unit u = GetEnumUnit() local integer a = 0 if IsUnitType(u, UNIT_TYPE_HERO) == true then set a = LoadInteger(Mexp_hash, GetHandleId(u),1) if a != GetHeroXP(u) then set a = GetHeroXP(u) - a // сдеся делайте что хотите, переменная "а" и есть полученный опыт. endif call SaveInteger(Mexp_hash,GetHandleId(u),1,GetHeroXP(u)) endif set u = null endfunction
function acionsMexp takes nothing returns nothing local rect r = GetPlayableMapRect() local group g = GetUnitsInRectMatching(r, null) call ForGroup(g, function act) call GroupClear(g) call DestroyGroup(g) set r = null set g = null endfunction
function InitTrig_exp takes nothing returns nothing set gg_trg_exp =CreateTrigger() call TriggerAddAction(gg_trg_exp, function acionsMexp) call TriggerRegisterTimerEventPeriodic(gg_trg_exp, 1) endfunction[/jass]
function DummyCreate takes player p returns unit return CreateUnit(p,dummy_id,0,0,0) endfunction
Ну и конечно, исправляю функцию нарка по цветам. Не требует постоянного вызова функции и её обработки. Без утечек, в отличии от функции Нарка.
Code
globals string array colormode endglobals
function InitColor takes nothing returns nothing set colormode[0]="|CFFFF0303" set colormode[1]="|CFF0042FF" set colormode[2]="|CFF1CE6B9" set colormode[3]="|CFF540081" set colormode[4]="|CFFFFFC00" set colormode[5]="|CFFFE8A0E" set colormode[6]="|CFF20C000" set colormode[7]="|cffff80c0" set colormode[8]="|CFF959697" set colormode[9]="|CFF7FBFF1" set colormode[10]="|cFF106246" set colormode[11]="|cFF4E2A04" set colormode[12]="|CFF333429" set colormode[13]="|cffc1c1ff" set colormode[14]="|CFF333429" set colormode[15]="|CFF333429" endfunction
function GetPlayerColorString takes integer p returns string return colormode[p] endfunction
Добавлено (19.03.12, 11:43) --------------------------------------------- офк коло мод можно использовать так