Ну во-первых по настоящему точно(!) предсказать будущее событие, на которое игроки(или скрипт карты) способны повлиять невозможно. Особенно в контексте такого временно отрезка как минута.
Тут скорее чего ты хочешь достичь своими "предсказаниями". Eсли ты хочешь донести важную информацию о текущем игровом процессе - допустим на карте есть Башни, которые игроки должны защищать, но по невнимательности они не уследили за тем что одна башня активно осаждается, то нам не нужно "предсказывать" через какое время эта башня будет разрушена, достаточно просто сказать что она находится под атакой, или ее здоровье упало ниже какого то уровня. Или нужно донести информацию, которая повлияет на планирование: на базу Красного упадет метеорит (который мы сами и создадим), или из северных земель земель нападет армия орков, или через 2 минуты наступит ночь и пора прятаться на базе. В данном случае мы сами являемся рукой господа, которая творит будущее и просто оповещаем о неминуемом. Так же примером является стандартное уведомление варика "Золотой рудник скоро иссякнет", он не предсказывает ничего, а просто констатирует факт, что золота в руднике осталось мало.
Или как описано выше, можно реализовать систему пророчеств - а-ля случайных квестов - "Герой игрока 2 умрет в ближайшую минуту", что мотивирует остальных попробовать убить и получить награду, а игрока 2 выжить и предотвратить пророчество так же за награду.
В патче 2.0 добавили новое поле в Редакторе Объектов юнита - файл портрета ('upor'). У многих кастомных юнитов это поле автоматически приняло значение юнита на котором они были основаны. Что бы решить проблему поменяй значения этого поля у своего героя на None ( "_" ).
private function WASD_hero takes nothing returns nothing
if GetOwningPlayer(GetTriggerUnit()) == GetTriggerPlayer() and IsUnitType(udg_Tanks[1], UNIT_TYPE_HERO) == true then
set WASD_Hero[GetConvertedPlayerId(GetTriggerPlayer())] = udg_Tanks[1]
call DisplayTextToForce( GetPlayersAll(), GetUnitName(udg_Tanks[GetConvertedPlayerId(GetTriggerPlayer())]))
endif
endfunction
Когда красный игрок выберет своей танк он запишется в переменную WASD_Hero[1] , а в таймере на движение и детектах нажатий красный игрок проходит под индексом 0. .
set WASD_Hero[GetConvertedPlayerId(GetTriggerPlayer())] = udg_Tanks[1]
заменить на
set WASD_Hero[GetPlayerId(GetTriggerPlayer())] = udg_Tanks[1]
если все остальные странности кода работают верно, то должно помочь
SсRealm, я подписал , что это для актуального патча 2.0. Замени BlzGroupGetSize на старую функцию CountUnitsInGroup и по идее код будет работать на 1.26.
Базовый функционал абилки: крипы разбиваются на пары и дубасят друг друга некоторое время, потом останавливаются. Все очень примитивно. Остальной обвес добавляй сам. ("vjass", patch 2.0)
Открыть
globals
real Madness_AoE = 500.
real Madness_Duration = 5.
integer Madness_AbilityCode = 'A000'
hashtable hash // нам нужен хеш
endglobals
function Trig_Madness_Conditions takes nothing returns boolean
return GetSpellAbilityId() == Madness_AbilityCode
endfunction
function MadnessFilter takes nothing returns boolean
return ( GetOwningPlayer(GetFilterUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE) )
endfunction
function MadnessStop takes nothing returns nothing
call IssueImmediateOrder(GetEnumUnit(),"stop")
endfunction
function MadnessTimer takes nothing returns nothing
local timer tt=GetExpiredTimer()
local group gr=LoadGroupHandle(hash,GetHandleId(tt),1)
call ForGroup(gr, function MadnessStop)
call DestroyGroup(gr)
call FlushChildHashtable(hash,GetHandleId(tt))
call DestroyTimer(tt)
endfunction
function Trig_Madness_Actions takes nothing returns nothing
local real x=GetSpellTargetX()
local real y=GetSpellTargetY()
local group gr=CreateGroup()
local group gr2 = CreateGroup()
local unit t
local unit t2
local unit last=null
local timer tt
call GroupEnumUnitsInRange(gr,x,y, Madness_AoE, Filter(function MadnessFilter))
loop
set t=FirstOfGroup(gr)
exitwhen t==null
call GroupRemoveUnit(gr,t)
set t2=FirstOfGroup(gr)
if t2!=null then
call IssueTargetOrder(t,"attack",t2)
call IssueTargetOrder(t2,"attack",t)
call GroupRemoveUnit(gr,t2)
call GroupAddUnit(gr2,t)
call GroupAddUnit(gr2,t2)
elseif last!=null then
call IssueTargetOrder(t,"attack",last)
call GroupAddUnit(gr2,t)
endif
set last=t
endloop
call DestroyGroup(gr)
if BlzGroupGetSize(gr2) >0 then
set tt=CreateTimer()
call SaveGroupHandle(hash,GetHandleId(tt),1,gr2)
call TimerStart(tt,Madness_Duration,false,function MadnessTimer)
return
endif
call DestroyGroup(gr2)
endfunction
//===========================================================================
function InitTrig_Madness takes nothing returns nothing
set hash=InitHashtable() // инициализация хеша
set gg_trg_Madness = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Madness, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Madness, Condition( function Trig_Madness_Conditions ) )
call TriggerAddAction( gg_trg_Madness, function Trig_Madness_Actions )
endfunction
Делать все способности триггерными на основе канала. Редактировать поля канала (иконку, описание, дальность каста, манкост и т.д.) в процессе игры (Действие -> Ability -> Set Real/Integer Field). Тогда в карте будет только 7 абилок на всех героев.
Это отлично подходит, но оказалось близы не довезли возможность менять такие поля как Анимация ('aani'), допустимые цели('atar'). Возможно потому, что они являются массивными значениями, которые должны меняться через BlzSetAbilityStringLevelArrayField , но ни одного константного abilitystringlevelarrayfield в common.j нет в наличии.
Придется анимки триггером проигрывать, а абилки с целями продублировать.
Все обновляется и удаляется как надо. Я не писал весь код, что бы не замыливать глаза, так как в нем используется еще куча всего что может утекать, но не утекает. DracoL1ch:
что такое параллельный вызов и как связан мемхак с хендлом? оО
Параллельно, я имел ввиду МУИ использование. То есть если я использую способность Варик создаст юнита в памяти (ConvertHandle вернет адрес этого юнита в памяти) после выполнения удалив юнита, память освободится. При новом вызове варик создаст нового юнита и опять выделит под него память, а ConverHandle будет тот же самый, значит прошлый юнит удалился и освободил место для нового. Если вызвать способность дважды, создастся два юнита и получат разные места в памяти, и ConvertHandle будет различаться, что и происходит. Поправьте меня если я не прав. quq_CCCP:
Zeix, И где тут мемхак? Не вижу что то применение мемхака в данном коде, вот к примеру тут используется мемхак, а у вас нет.
Мемхак не используется в способности, чего я и не утверждал, Я использовал только ее функцию, что бы понять что происходит.
Если юнита всего два и абилка тригерная - сделать 2 разные абилки, по 1 для каждого юнита, и при использовании ее у одного вызывать холостой запуск у второго. Передавать путем запрета/разрешения. Вроде должно работать.
Зависит от СОБЫТИЯ, если это каст способности или отдача приказа при помощи мышки, то можно отловить координаты через GetSpellTargetX/Y или GetOrderPointX/Y. Если событие не связано с мышкой, то варовскими методами никак.(слишком сложно и не практично)
Выключай даммику пасинг и переноси в нужную точку.
local unit d
local real x=GetUnitX(u)
local real y=GetUnitY(u)
......
set d=CreateUnit(p,dummy,0,0,0)
call SetUnitPathing(d,false)
call SetUnitX(d,x)
call SetUnitY(d,y)
Функция AddSpecialEffectTarget нативная и только создает эффект никуда его не сохраняя. В первом случае ты создавал спец эффект но не записывал его никуда. Во втором ты создавал 2 эффекта, один из которых удалял.
AddSpecialEffectTargetUnitBJ близардовская и она записывает созданный эффект в *bj_lastCreatedEffect* который ты удалял. Делай как в во втором варианте только без первого вызова:
set se1 = AddSpecialEffectTarget( "Abilities\\Spells\\Human\\DivineShield\\DivineShieldTarget.mdl",su, "origin" )
call TriggerSleepAction(0.5)
call DestroyEffect(se1)
урон неочень, танки в аренах не нужны, т.к. у людей мозг есть, ывбирают кого бить, хил тоже недохил, а абилка типа разбег вообще какая-то..ээ...и по механике и по действенности неочень) ну и не вписывается в тематику баблодина.
Имхо, Храмовник - один из самых ярких персонажей, возможно даже слишком мощный. При игре 2 на 2 его хилки вполне хватает, хелит достаточно и мгновенно. На счет низкого урона: высокий урон только у магов, у храмовника достаточный урон, учитывая, что он не ДД клас (как писал Qd есть связка F+E+W+Q наносит солидный урон). Не веришь - приглашаю на Гарену :). Называть храмовника танком - неуместно, тк он не консервная банка, а многофункциональный класс.
Ну а вот анимация у раша и вправду не очень...
карта просто отличная, одна из лучших пвп арен. 10/10.
по поводу пироманта плюсую, сейчас самый мощный дд с 2 стунами и откидывалкой творит чудеса.
в режиме 2 на 2 играл хант+прист вс берс+друид каждый раунд махача был по 5 минут...
еще предложение, может при выходе игрока заменять его на бота, ато каждая вторая игра заканчивается раньше времени.
Ред. Zeix
» WarCraft 3 / Как узнать будущее на карте? World Editor.
Тут скорее чего ты хочешь достичь своими "предсказаниями". Eсли ты хочешь донести важную информацию о текущем игровом процессе - допустим на карте есть Башни, которые игроки должны защищать, но по невнимательности они не уследили за тем что одна башня активно осаждается, то нам не нужно "предсказывать" через какое время эта башня будет разрушена, достаточно просто сказать что она находится под атакой, или ее здоровье упало ниже какого то уровня. Или нужно донести информацию, которая повлияет на планирование: на базу Красного упадет метеорит (который мы сами и создадим), или из северных земель земель нападет армия орков, или через 2 минуты наступит ночь и пора прятаться на базе. В данном случае мы сами являемся рукой господа, которая творит будущее и просто оповещаем о неминуемом. Так же примером является стандартное уведомление варика "Золотой рудник скоро иссякнет", он не предсказывает ничего, а просто констатирует факт, что золота в руднике осталось мало.
Или как описано выше, можно реализовать систему пророчеств - а-ля случайных квестов - "Герой игрока 2 умрет в ближайшую минуту", что мотивирует остальных попробовать убить и получить награду, а игрока 2 выжить и предотвратить пророчество так же за награду.
» WarCraft 3 / Вместо портрета импортированной модели отображается модель персонажа WC3
» WarCraft 3 / Поломался код
Ред. Zeix
» WarCraft 3 / Атака и смятение вражеских юнитов
Ред. Zeix
» WarCraft 3 / Атака и смятение вражеских юнитов
» WarCraft 3 / Универсальные хоткеи для абилок.
» WarCraft 3 / Искусственный интеллект крипов
» WarCraft 3 / Искусственный интеллект крипов
» WarCraft 3 / Утечка или не утечка.
» WarCraft 3 / Утечка или не утечка.
DracoL1ch: Параллельно, я имел ввиду МУИ использование. То есть если я использую способность Варик создаст юнита в памяти (ConvertHandle вернет адрес этого юнита в памяти) после выполнения удалив юнита, память освободится. При новом вызове варик создаст нового юнита и опять выделит под него память, а ConverHandle будет тот же самый, значит прошлый юнит удалился и освободил место для нового. Если вызвать способность дважды, создастся два юнита и получат разные места в памяти, и ConvertHandle будет различаться, что и происходит. Поправьте меня если я не прав.
quq_CCCP: Мемхак не используется в способности, чего я и не утверждал, Я использовал только ее функцию, что бы понять что происходит.
» WarCraft 3 / Характеристики - Требуется древесины
Ред. Zeix
» WarCraft 3 / Утечка или не утечка.
» WarCraft 3 / Отлов урона
» WarCraft 3 / Передать перезарядку способности
» WarCraft 3 / Нужна модель? - Вам сюда!
» WarCraft 3 / как создать юнита у курсора мыши
Ред. Zeix
» WarCraft 3 / дамик
Ред. Zeix
» WarCraft 3 / Просто не могу удалить эффект с юнита(героя)
AddSpecialEffectTargetUnitBJ близардовская и она записывает созданный эффект в *bj_lastCreatedEffect* который ты удалял. Делай как в во втором варианте только без первого вызова:
set se1 = AddSpecialEffectTarget( "Abilities\\Spells\\Human\\DivineShield\\DivineShieldTarget.mdl",su, "origin" )
call TriggerSleepAction(0.5)
call DestroyEffect(se1)
» Ретро-игры / Dune II
» WarCraft 3 / JTournament 1.5e
» WarCraft 3 / JTournament 1.5e
Ну а вот анимация у раша и вправду не очень...
» WarCraft 3 / JTournament 1.5e
по поводу пироманта плюсую, сейчас самый мощный дд с 2 стунами и откидывалкой творит чудеса.
в режиме 2 на 2 играл хант+прист вс берс+друид каждый раунд махача был по 5 минут...
еще предложение, может при выходе игрока заменять его на бота, ато каждая вторая игра заканчивается раньше времени.