Ну как насчет хотябы ошибки устранять и немного подумать:
function Delete_Destructable takes nothing returns nothing
local timer t = GetExpiredTimer() //Наш таймер - истёкший
local integer h = GetHandleId(t) //Узнаём id таймера
local integer i = 1
loop
exitwhen i > 10
call KillDestructable(LoadDestructableHandle(hash,h,i))
set i = i + 1
endloop
call DestroyTimer(t) //Уничтожаем таймер
//Очищаем хеш-таблицу, чтобы избежать утечек и наложений
call FlushChildHashtable(hash,h) //Очищаем ключ по id
//Не забываем устранять утечки
set t = null
endfunction
function Hashtable_Actions takes nothing returns nothing
local unit Caster = GetSpellAbilityUnit()
local real cx
local real cy
local timer t = CreateTimer()
local integer id = GetHandleId(t)
local integer i = 1
local destructable d
if GetSpellTargetUnit() == null then
set cx = GetSpellTargetX()
set cy = GetSpellTargetY()
else
set cx = GetUnitX(GetSpellTargetUnit())
set cy = GetUnitY(GetSpellTargetUnit())
endif
loop
exitwhen i > 1
set d = CreateDeadDestructable('LTlt',cx + 200.00 * Cos( i * 0.6285708 ), cy + 200.00 * Sin( i * 0.6285708 ), 36.00 * i, 1.00, GetRandomInt(1, 10))
call SetDestructableAnimation(d,"birth")
call SaveDestructableHandle(hash, id, i, d )
call SetDestructableLife( d, I2R(GetHeroStatBJ(bj_HEROSTAT_INT, Caster, true)) )
set i = i + 1
endloop
call TimerStart(t, 10.00, false, function Delete_Destructable)
set Caster = null
set t = null
set d = null
endfunction
function Hashtable_Cond takes nothing returns boolean
return GetSpellAbilityId() == 'A014'
endfunction
//===========================================================================
function InitTrig_Hashtable takes nothing returns nothing
local trigger ForestKeeperTrees = CreateTrigger()
local integer index = 0
loop
exitwhen index > 12
call TriggerRegisterPlayerUnitEvent(ForestKeeperTrees,Player(index),EVENT_PLAYER_UNIT_SPELL_CAST,null)
set index = index + 1
endloop
call TriggerAddCondition( ForestKeeperTrees, Condition(function Hashtable_Cond) )
call TriggerAddAction( ForestKeeperTrees, function Hashtable_Actions )
set ForestKeeperTrees = null
endfunction
нафига лишние действия и лишние переменные, будь проще.
нахрена тебе упали локейшены, все делается без них.
утечки, еще раз утечки... обнулять то хендлы кто будет, кастер, таймер, дерево - это все требует обнуления.
Ты забываешь что останутся пеньки после смерти деревьев, нужно доработать код чтобы они исчезали.
Сделать кастомный аналог, и никак больше, механику работы дефолтных способностей варкравта изменить никак нельзя, пассива ауры возмездия так и будет аурой возмездия, и точка. Собственно опишите подробнее, что вы собрались делать?
Код в студию, приказ способности можно узнать банальным дебагом, просто триггер с событием юнит отдал приказ, и дебаг сообщением с номером приказа, берем юзаем свиток защиты ручками и смотрим.
Varzik, в мемхаке есть, 'Amov' называется, она как и прочие базовые абилки лежит по одному и тому же оффсету от адреса юнита.
/pointer to 'Amov' is located at offset 123 of unit object, Aatk is at offset 122, and AInv is offset 124
//Hides all command buttons and sets the Ward flag. Unit will keep its current order, and player can’t give new orders
//Notice the the unit can’t be ordered with triggers as well. To issue an order you need to temporarily reenable control
function DisableUnitControl takes unit u returns nothing
local integer pUnit = ConvertHandle(u)
local integer flags
local integer Amov
local integer Aatk
local integer AInv
if pUnit > 0 then
set flags = RMem(pUnit+0x248)
set Amov = RMem(pUnit+0x1EC)
set Aatk = RMem(pUnit+0x1E8)
set AInv = RMem(pUnit+0x1F8)
// call echo("disabled on "+GetUnitName(u))
if not IsFlagBitSet(flags,512) then
call WMem(pUnit+0x248, flags + 512)
endif
if Amov >0 then
call WMem(Amov+0x40, RMem(Amov+0x40) + 1)
endif
if Aatk >0 then
call WMem(Aatk+0x40, RMem(Aatk+0x40) + 1)
endif
if AInv >0 then
call WMem(AInv+0x3C, RMem(AInv+0x3C) + 1)
endif
endif
endfunction
В игре одна функция нанесения урона -
UnitDamageTarget - её юзает что jass что остальная игра, все абилки и атаки юнитов. Ты указываешь кто источник урона а кто цель, какого количество этого урона, является урон атакой ближнего боя, или дальнего, а так же тип атаки, тип урона, тип оружия. Если источник урона еще существует в игре на момент смерти другого юнита от этого урона, то убийца будет источник этого урона.
Насчет подсчетов - непонял, а что вы там считаете и как?
Ну вот, тут код без сжатия имен, и все имена функуций и переменных на месте, отлично подъходит для изучения, эта версия доты без правки вряд-ли взлетит на 1.26а, но оно и не нужно, открываем и изучаем ИИ код, как проверяется может ли кастануть скилл юнит, и кастует ли он его в данный момент.
Начин, ну а что ты забыл тогда в чужой карте, меня это убивает, нет ну я ниче незнаю и не понимаю, то точно знаю что сделал бы карту лучше (нет), прежде чем что то собираться делать неплохо бы поучится, а еще есть карты которые изначально пишутся на jass и там привычных вам триггеров нету, и код весьма сложен, тот же пудж варс взять. Поэтому берем и учимся, за все все ваши хотелки никто не сделает, не говоря про то что если у тебя будет уровень чуть выше среднего - тебе не усрется ни одна чужая карта, сам сел и сделал с нуля за недельку, просто посмотрев что и как в игре работает.
Потом будьте оригинальны, сделайте что то свое, подсмотреть некоторые идеи у других, не стыдно, стыдно ломать чужие карты.
Ну только переодическим триггером, который смотрит чем занят конкретно работник в данный момент. Посмотри ИИ скрипты на jass для той же доты, древних версий, поймешь как там отслеживают занят ли юнит выполнением задания, ну и так далее.
У тебя вейты, в том числе длинные, после которых идет создания юнитов и прочее, так вот вейты неточны, это может приводить к дисинхам, когда разница между игроками станет критичной.
Так же из причин - длина звукового файла, почему то GetSoundFileDuration не точный, у разных игроков почему то он дает иногда разную длинну файла, поэтому длинну звука всегда задаем вручную.
Проверяем.
Начин, ну во взломанной карте ты ничего не восстановишь, ты только можешь ручками переиминовать имена функций и переменных согласно твоему мнению исходя из того что они делают в карте. Это обычно не имеет смысла, т.к можно исправить код и так, достаточно только разбиратся что к чему, я так в доте фрога делал модификации на заказ...
Это событие что войска союзника, перешли под твой контроль. Вспомни в кампании где там база готовая пренадлежит компу, как ты к ней подходишь - она твоей становится.
Они стандартные же, есть по умолчанию в каждой новой созданной карте, проигрывает тот игрок у кого не осталось здания или прошло больше (вроде бы 3х) минут с момента последнего добытого ресурса или смерти здания.
Ну морф в земноводного юнита, руной или вручением и удалением морфа медведя друида, где нормальная форма боевой еденицы - этот тот в кого ты хочешь морфнутся, а альтернативная форма боевой единицы - тот кем являлся до морфа. Естественно 2 типа юнита - один из них чисто наземный, второй земноводный.
» WarCraft 3 / Уменьшение урона юнита при атаке
» WarCraft 3 / Помогите найти карту WC3:TFT
» WarCraft 3 / DotAAllstarsHelper688v15.dll
» WarCraft 3 / Фатал
Ред. quq_CCCP
» WarCraft 3 / Хэш-таблицы
» WarCraft 3 / Утечки?
» WarCraft 3 / Наработка: Онлайн фича с животными
Правда не дамажат по аое.
» WarCraft 3 / Как сделать пассивную способность активной?
» WarCraft 3 / IssueImmediateOrderById
» WarCraft 3 / Адресса кнопок
» WarCraft 3 / KillUnit
» WarCraft 3 / KillUnit
» WarCraft 3 / Нанесение урона триггерным способом
UnitDamageTarget - её юзает что jass что остальная игра, все абилки и атаки юнитов. Ты указываешь кто источник урона а кто цель, какого количество этого урона, является урон атакой ближнего боя, или дальнего, а так же тип атаки, тип урона, тип оружия. Если источник урона еще существует в игре на момент смерти другого юнита от этого урона, то убийца будет источник этого урона.
Насчет подсчетов - непонял, а что вы там считаете и как?
» WarCraft 3 / Отслеживание статуса выполнения приказа юнита
» WarCraft 3 / Как восстановить триггеры
Потом будьте оригинальны, сделайте что то свое, подсмотреть некоторые идеи у других, не стыдно, стыдно ломать чужие карты.
» WarCraft 3 / Отслеживание статуса выполнения приказа юнита
» WarCraft 3 / Десинхроны в карте
Так же из причин - длина звукового файла, почему то GetSoundFileDuration не точный, у разных игроков почему то он дает иногда разную длинну файла, поэтому длинну звука всегда задаем вручную.
Проверяем.
» WarCraft 3 / Протект
» WarCraft 3 / Кольцо Инженера
» WarCraft 3 / Как восстановить триггеры
» WarCraft 3 / о том как сделать...один скилл в редакторе
» WarCraft 3 / Считывание файла при запуске карты
» WarCraft 3 / Событие "спасен" ("rescued") в редакторе Warcraft 3
» WarCraft 3 / Создать условие победы/поражения в melee
» WarCraft 3 / Изменение типа юнита героя