quq_CCCP, мемхаком никогда не пользовался, знаю только что там есть функции, которых нет в обычном джассе. В принципе, если такой функции в нет, тогда обойдусь уже хэш-таблицей и кучей-кучей условий на проверку типа юнита, спасибо)
А знаешь ли ты, как поставить голос? А как называется лицевая часть корпуса скрипки? Можешь ли ты свести вокал и музыку? Знаешь что такое рефлекс, светотень, лайн, набросок, чистка наброска, мид, сустейн, рефлексия, что такое асексуальность.
Эм, ну типо если бы мне это всё понадобилось, то я бы загуглил)
А новички даже этого не собираются делать
МрачныйВорон, хотелось бы чтобы у каждого своя овечка была. Например поставили 2 фермы, у одной убили овцу, у другой оставили, если бы счётчик был общим, то овца могла бы заспавнится не с той фермы
В принципе ладно, могу записать в целочисленную, просто хотел поработать в группой
Сделал как описали выше, до групп мне ещё далеко
код
function mycode takes nothing returns nothing
local unit u = GetEnumUnit()
local integer i = LoadInteger(H,GetHandleId(u),0)
if i < 5 then
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(u),'nshe',GetUnitX(u),GetUnitY(u),0)
call SaveUnitHandle(H,GetHandleId(bj_lastCreatedUnit),0,u)
set i = i+1
call SaveInteger(H,GetHandleId(u),0,i)
call DisplayTextToForce(GetPlayersAll(),I2S(i))
endif
set u = null
endfunction
МрачныйВорон, ну я и хотел отследить применение способности и записать инфу, но нужно же учитывать текущее хп юнита, убийство кодоя, преждевременная смерть проглоченного юнита и т.д. и т.п., а потом ещё и очищать это всё дело, неужели нельзя проще
Попробовал этот способ, но либо я криворукий, либо не работает
Что по поводу дебаффа, допустим, отследил такого юнита, а как я найду того самого кодоя, что его съел?
quq_CCCP скинул карту с нормальным кодом.
Спасибо большое)
Код:
globals
hashtable H = InitHashtable()
real x
real y
group g = CreateGroup()
real MaxX
real MinX
real MaxY
real MinY
unit bj_lastFilterUnit = null
endglobals
function GetCorX takes real x returns real
if ( x < MinX ) then
return MinX
endif
if ( x > MaxX ) then
return MaxY
endif
return x
endfunction
function GetCorY takes real y returns real
if ( y < MinY ) then
return MinY
endif
if ( y > MaxY ) then
return MaxY
endif
return y
endfunction
function Trig_Frost_Conditions takes nothing returns boolean
return ( GetSpellAbilityId() == 'A000' )
endfunction
function Enemy_Filter takes nothing returns boolean
set bj_lastFilterUnit = GetFilterUnit( )
return IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and GetWidgetLife(bj_lastFilterUnit) > 0.405 and not IsUnitType( bj_lastFilterUnit, UNIT_TYPE_STRUCTURE )
endfunction
function Group_Damage_Enemy_Enum takes nothing returns nothing
local unit enemy = GetEnumUnit()
call UnitDamageTarget( bj_lastReplacedUnit, enemy, 100.00, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_COLD, WEAPON_TYPE_WHOKNOWS )
call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Undead\\FrostArmor\\FrostArmorDamage.mdl", enemy, "chest" ) )
set enemy = null
endfunction
function Timer_Dummy_Move_Expires takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit cast = LoadUnitHandle( H, id, 0 )
local unit dummy = LoadUnitHandle( H, id, 1 )
local real facing = LoadReal( H, id, 2 )
local real dist = LoadReal( H, id, 3 ) + 32.00
set x = GetCorX( GetUnitX(dummy) + 32.00 * Cos( facing ) )
set y = GetCorY( GetUnitY(dummy) + 32.00 * Sin( facing ) )
call SetUnitX( dummy, x )
call SetUnitY( dummy, y )
call GroupClear( g )
set bj_groupEnumOwningPlayer = GetOwningPlayer( cast )
call GroupEnumUnitsInRange( g, x, y, 125.00, Condition( function Enemy_Filter ) )
if dist < 1500.00 and FirstOfGroup( g ) == null then
call SaveReal( H, id, 3, dist )
else
call GroupClear( g )
set bj_groupEnumOwningPlayer = GetOwningPlayer( cast )
call GroupEnumUnitsInRange( g, x, y, 225.00, Condition( function Enemy_Filter ) )
set bj_lastReplacedUnit = cast
call ForGroup( g, function Group_Damage_Enemy_Enum )
call FlushChildHashtable( H, id )
call PauseTimer(t)
call DestroyTimer(t)
call KillUnit(dummy)
endif
set t = null
set cast = null
set dummy = null
endfunction
function Trig_Frost_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer id = GetHandleId(t)
local unit cast = GetSpellAbilityUnit()
local real dx = GetUnitX(cast)
local real dy = GetUnitY(cast)
local real facing = Atan2(GetSpellTargetY() - dy, GetSpellTargetX() - dx)
local unit dummy = CreateUnit( GetOwningPlayer(cast), 'u000', GetCorX( dx + 64.00 * Cos(facing) ), GetCorY( dy + 64.00 * Sin(facing) ), facing * bj_DEGTORAD )
call SetUnitPathing( dummy, false )
call UnitApplyTimedLife( dummy, 'BTLF', 0.00 )
call SaveUnitHandle( H, id, 0, cast )
call SaveUnitHandle( H, id, 1, dummy )
call SaveReal( H, id, 2, facing )
call SaveReal( H, id, 3, 0.00 )
call TimerStart( t, 0.03125, true, function Timer_Dummy_Move_Expires )
set cast = null
set dummy = null
set t = null
endfunction
//===========================================================================
function InitTrig_Frost takes nothing returns nothing
set gg_trg_Frost = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Frost, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Frost, Condition( function Trig_Frost_Conditions ) )
call TriggerAddAction( gg_trg_Frost, function Trig_Frost_Actions )
endfunction
Значит всё сводится к тому, что у меня просто ужасная структуризация кода и есть некоторые недочёты? В статусе написано, что я криво структуризирую триггеры
Утечек нет или что?
Zetox, убийство юнита из-за его красивой анимации. Если ремувнуть его, то не будет взрыва и след от юнита внезапно исчезнет, это не красиво. В любом случае юнит после разложения удаляется. Да, я судил по кол-ву хэндлов. Выше кидали норм карту. Там хэндлы возвращаются на своё изначальное место, сколько бы ты не юзал эту абилку. Но там слишком много новых для меня функций принцип действия которых я не понимаю от слова совсем. Да и структура не очень комфортная для меня, это же c/vJass, что-то могу понять, но не всё
NazarPunk, я не знаю cJass и vJass, я этим даже воспользоваться не смогу
За отсутствие кода извиняюсь
Код
globals
hashtable H = InitHashtable()
real x
real y
group g = CreateGroup()
endglobals
function move takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit u = LoadUnitHandle(H,GetHandleId(t),1)
local unit u1 = null
local effect e = null
local string s = null
local real a = GetUnitFacing(u)
local real x1 = LoadReal(H,GetHandleId(t),2)
local real y1 = LoadReal(H,GetHandleId(t),3)
local real dx
local real dy
call SetUnitX(u,GetUnitX(u)+15*Cos(a*bj_DEGTORAD))
call SetUnitY(u,GetUnitY(u)+15*Sin(a*bj_DEGTORAD))
set x = GetUnitX(u)
set y = GetUnitY(u)
set dx = x1-x
set dy = y1-y
if SquareRoot(dx*dx+dy*dy) >= 900 then
call GroupEnumUnitsInRange(g,x,y,300,null)
loop
set u1 = FirstOfGroup(g)
exitwhen u1 == null
if IsUnitType(u1,UNIT_TYPE_DEAD) != true and IsUnitEnemy(u1,GetOwningPlayer(u)) == true then
call UnitDamageTarget(u,u1,10,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,null)
endif
call GroupRemoveUnit(g,u1)
set u1 = null
endloop
set s = "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl"
set e = AddSpecialEffect(s,x,y)
call DestroyEffect(e)
set e = null
set s = null
call KillUnit(u)
call PauseTimer(t)
call FlushChildHashtable(H,GetHandleId(t))
call DestroyTimer(t)
else
call GroupEnumUnitsInRange(g,x,y,100,null)
loop
set u1 = FirstOfGroup(g)
exitwhen u1 == null
if IsUnitType(u1,UNIT_TYPE_DEAD) != true and IsUnitEnemy(u1,GetOwningPlayer(u)) == true then
call GroupClear(g)
call GroupEnumUnitsInRange(g,x,y,300,null)
loop
set u1 = FirstOfGroup(g)
exitwhen u1 == null
if IsUnitType(u1,UNIT_TYPE_DEAD) != true and IsUnitEnemy(u1,GetOwningPlayer(u)) == true then
call UnitDamageTarget(u,u1,10,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,null)
endif
call GroupRemoveUnit(g,u1)
set u1 = null
endloop
set s = "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl"
set e = AddSpecialEffect(s,x,y)
call DestroyEffect(e)
set e = null
set s = null
call KillUnit(u)
call PauseTimer(t)
call FlushChildHashtable(H,GetHandleId(t))
call DestroyTimer(t)
endif
call GroupRemoveUnit(g,u1)
set u1 = null
endloop
endif
call GroupClear(g)
set t = null
set u = null
endfunction
function Frost_Actions takes nothing returns nothing
local timer t = CreateTimer()
local code c = function move
local unit u1 = GetSpellAbilityUnit()
local real x1 = GetUnitX(u1)
local real y1 = GetUnitY(u1)
local unit u = CreateUnit(GetOwningPlayer(u1),'u000',x1,y1,bj_RADTODEG*Atan2(GetSpellTargetY()-y1,GetSpellTargetX()-x1))
call SaveUnitHandle(H,GetHandleId(t),1,u)
call SaveReal(H,GetHandleId(t),2,x1)
call SaveReal(H,GetHandleId(t),3,y1)
call TimerStart(t,.03,true,c)
set c = null
set t = null
set u1 = null
set u = null
endfunction
function Frost_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A000'
endfunction
function InitTrig_Frost takes nothing returns nothing
local trigger t = CreateTrigger()
local integer index = 0
local playerunitevent e = null
local code c = function Frost_Conditions
local player p = null
local boolexpr b = null
loop
set p = Player(index)
set e = EVENT_PLAYER_UNIT_SPELL_EFFECT
call TriggerRegisterPlayerUnitEvent(t,p,e,b)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
set e = null
set p = null
endloop
set b = Condition(c)
call TriggerAddCondition(t,b)
set c = null
set c = function Frost_Actions
call TriggerAddAction(t,c)
set b = null
set c = null
set t = null
endfunction
Почему нельзя было просто сказать как сделать так, чтобы число хэндлов возвращалось на своё изначальное место? Ладно придрались к коду, что-то там плохо, что-то тут не так, но изменение этого не решает проблему
Камон, мне просто нужна помощь, пожалуйста
Та не в дальности дело, господи. Я на дальность плевать хотел, главное что при попадании все равно есть утечки (быстро кастуем спелл)
Насчёт таймера в 0.01, та бл, там изначально было 0.03, мне пофигу на таймер, если оно в любом случае криво работает
quq_CCCP, чем ужасен SetUnitPosition? Оно просто совместило в себе 2 функции SetUnitX и SetUnitY, разве нет?
они там улететь немогут, т.к SetUnitPos не выпустит.
За карту юниты спокойно улетают (ну или за пределы камеры, хз)
Вообще не понимаю почему вы придрались к отсутствию дальности, если бы мне это нужно было, я бы добавил
Было 230, стало 233
Тут спелл примитив примитивом, но сделан отвратно, зачем то SteUnitPos - вместо нормального движения по осям, как таймер бредовый 0.01, ну ладно уж 0.02, или 0.03125. Куда 0.01? Нет никакой обьективной нужды в таких таймерах, как и в прочих вещях вроде SetIUnitPosition.
Ну окей, поставил таймер 0.03 обратно, движение по осям. А толку? Всё так же, как и было до этого, вообще ничего не изменилось.
Полная ахинея, уж блин триггер бы взяли и событие UnitsInRange и вручали его всем даммиками, а триггер был бы 1, если уж дофига оптимизацию охото.
Ред. rsfghd
» WarCraft 3 / Текущий и базовый размер юнита
Ред. rsfghd
» WarCraft 3 / Нужно объяснение по джассу (обнуление группы)
» WarCraft 3 / Проглотить (devour)
» WarCraft 3 / Что не так с комьюнити?
А новички даже этого не собираются делать
- Ложкой
- А как ей пользоваться?
Ред. rsfghd
» WarCraft 3 / Нужно объяснение по джассу (обнуление группы)
Ред. rsfghd
» WarCraft 3 / Проглотить (devour)
Ред. rsfghd
» WarCraft 3 / Проглотить (devour)
Может код кривой, по которому я пытался отследить проглоченного юнита в юните? Потому что выдавало всегда 0
» WarCraft 3 / Проглотить (devour)
» WarCraft 3 / Проглотить (devour)
Попробовал этот способ, но либо я криворукий, либо не работает
Что по поводу дебаффа, допустим, отследил такого юнита, а как я найду того самого кодоя, что его съел?
Ред. rsfghd
» WarCraft 3 / Если юниты в области союзники то
Вот карта с выбором противника для кастующего юнита, советую пройтись по основам
» WarCraft 3 / Если юниты в области союзники то
Ред. rsfghd
» WarCraft 3 / Утечки
Спасибо большое)
Ред. rsfghd
» WarCraft 3 / Утечки
Утечек нет или что?
» WarCraft 3 / Утечки
Ред. rsfghd
» WarCraft 3 / Утечки
Ред. rsfghd
» WarCraft 3 / Утечки
Вот карта с вашим ограничением полёта, господи
Камон, мне просто нужна помощь, пожалуйста
Ред. rsfghd
» WarCraft 3 / Утечки
Насчёт таймера в 0.01, та бл, там изначально было 0.03, мне пофигу на таймер, если оно в любом случае криво работает
» WarCraft 3 / Дистанция получения цели
» WarCraft 3 / Дистанция получения цели
Если поставить значение 1000 в ро, а не в триггерах, то они будут друг друга лупить
» WarCraft 3 / 4 пуля это крит
» WarCraft 3 / Анимации
» WarCraft 3 / Анимации
Ред. rsfghd
» WarCraft 3 / Способность завод не работает
» WarCraft 3 / Спосоность связанная со сном