Мне непонятно, зачем? Этих камхаков 100500 сортов, для того же айкапа есть, почти все мх идет с камхаком, опции чита отруби и юзай как камхак, ептить проблема то..
В jass есть gamecache (кешь) и набор функций для его работы, в нем есть функции для синхронизации сохраненных в кешь данных между игроками, синхронизация кеша производится только в потоке триггера, и синхронизация не мгновенная, может понадобится несколько секунд. Вот именно для синхронизации и нужны TriggerSleepAction и gamecache. На сайте полно примеров работы с кешем, а так же статей по сихронизации.
Ну как насчет хотябы ошибки устранять и немного подумать:
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 и там привычных вам триггеров нету, и код весьма сложен, тот же пудж варс взять. Поэтому берем и учимся, за все все ваши хотелки никто не сделает, не говоря про то что если у тебя будет уровень чуть выше среднего - тебе не усрется ни одна чужая карта, сам сел и сделал с нуля за недельку, просто посмотрев что и как в игре работает.
Потом будьте оригинальны, сделайте что то свое, подсмотреть некоторые идеи у других, не стыдно, стыдно ломать чужие карты.
» WarCraft 3 / как написать *.mix камерахак? zoom
» WarCraft 3 / Скрыть команду в чате для других игроков
» WarCraft 3 / Айсикап
» IrInA Host Bot / Вылет из игры
» WarCraft 3 / Открытая виртуальная машина
» WarCraft 3 / Исправления ВОЛНЫ АТАКИ
» WarCraft 3 / Огр в маске (Gachi)
» WarCraft 3 / как присвоить локальные значения игрока в глобальные переменные?
» WarCraft 3 / как присвоить локальные значения игрока в глобальные переменные?
Вот именно для синхронизации и нужны TriggerSleepAction и gamecache.
На сайте полно примеров работы с кешем, а так же статей по сихронизации.
» WarCraft 3 / как поставить точку в центр экрана?
» 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 / Как восстановить триггеры
Потом будьте оригинальны, сделайте что то свое, подсмотреть некоторые идеи у других, не стыдно, стыдно ломать чужие карты.