SirDragdord, никак, последние патчи баганые, там много чего не работает, играть там не вочто, хотите поиграть - 1.26а к вашим услугам, старшие патчи вара только для ознакомления и обучения, пока не вышел рефордж там нечего делать.
Naadir, ну для начала немного учимся работать с jass, то как бы ты не убил карту с такой манерой написания кода...
globals
hashtable gamedata = InitHashtable( )
endglobals
function Trig_ToMelee_Conditions takes nothing returns boolean
return ( GetSpellAbilityId() == 'A048' )
endfunction
function Timer_AddSilence_Expires takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit enemy = LoadUnitHandle( gamedata, id, 0 )
local integer spellid = LoadInteger( gamedata, id, 1 )
call StartAbilityCooldown( enemy,'A049', -1 )
set spellid = GetUnitAbility(enemy,spellid) // для начала нам нужно убедится что у юнита есть такая абилка и её адресс коректный.
if spellid > 1 then //всегда проверяй корректность адрессов, мы нашли адресс способности в памяьти игры, адресс обьекта а не просто РО кода.
call AddSilenceToAbility(spellid) // функция сайленса, берет адресс способности и записывает по оффсету в структуру способности сведенья о сайленсе, подумай что будет если адресс не верен?
endif
set enemy = null
set t = null
endfunction
function Trig_ToMelee_Actions takes nothing returns nothing
local unit enemy = GetSpellAbilityUnit() // создадим переменную чтобы не мучится гуи пережитками...
local timer t = CreateTimer()
local integer id = GetHandleId(t)
call SetUnitArmor(enemy,GetUnitArmor(enemy)*2)
// 2 = ranger, 1 = instante, 0 = melee, 5 = splash, 6 = mbounce,
call SetUnitWeaponType(enemy,0)
call SetUnitAttackRange1(enemy,128)
call SaveUnitHandle( gamedata, id, 0, enemy )
call SaveInteger( gamedata, id, 1, GetSpellAbilityId())
call TimerStart( t, 0.00, false, function Timer_AddSilence_Expires)
set t = null
set enemy = null
endfunction
//===========================================================================
function InitTrig_ToMelee takes nothing returns nothing
set gg_trg_ToMelee = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_ToMelee, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_ToMelee, Condition( function Trig_ToMelee_Conditions ) )
call TriggerAddAction( gg_trg_ToMelee, function Trig_ToMelee_Actions )
endfunction
Зачем столько триггеров для такого простого спелла переключателя? Достаточно одного.
Ну вот выбор одного из двух состояний, правда хз нах так было заморачиватся, просто морфы и все.
Ну и для переключателей и механик каста лучше использовать не сайленс а мут абилок, от сайленса он отличается тем что не прирывает каста абилки но не дает применять её в ручную. Подробнее можно глянуть в моей карте.
Сравнительно просто на мемхаке, ибо можно отследить и источники регенераций и прочее, но вот сам по себе мемхак сложная наработка на jass и для новичков не подходит, иначе много мороки.
Naadir, нужен таймер на 0.00 сек, после каста абилки, чтобы корректно накладывать на неё сайленс, снимать сайленс, то же самое с кулдауном, ибо триггер срабатывает немного раньше чем ты реально применил способность, и получается что сайленс прилетел до того как ты нажал кнопку абилки.
PT153, не ваще то могут, они его исправно получают, т.е он проходит как событие EVENT_UNIT_DAMAGED но с тех пор как у юнита хп меньше 0.405 урон перестает влиять на кол-во хп юнита, а так же отсекаются все модификаторы, не вешаются баффы и так далее.
Об этом писал еще Diod на форуме, баг яйца феникса, когда из за морфа бонус хп становился отрецательным и макс хп < 0.405, что делало юнита мертвым.
ну само собой есть, во первых свободное место, во вторых все строки в варе кешируются, очень, очень, много строк переполнят память выделенную под вар, но их надо настолько много что можно об этом забыть.
Куда указанно, туда и сохраняется.
Таких чудес разумеется не происходит, все делается ручками.
И так, если у вас прелоад експлоит и кешь не заработал, то мемхак и подавно не взлетит, ибо там все куда сложнее. Потом код в студию, что делали и что не получилось.
Ах да, синхронизацию данных никто не отменял, так что кешь или длл Караулова вам понадобится, чтобы как то синхронизировать данные, хоть длл и позволяет это сделать быстро, но тут работа с длл и возможно придется нанимать автора за звонкую монетку, ценник там не 100 руб.
NazarPunk, нужно отказыватся от луа и 1.31 до рефорджа и устранения всех проблем, то завтра близзарды сделают патч на котором будет утекать все и фаталить мили карты через 15 минут игры, будем как в том анекдоте, плакать, колоться и есть кактус?
Без кода твоей карты сказать сложно, где ты сел в лужу.
Алгоритм должен быть примерно такой, в архиве карты есть pld файл в котором нет установки имени игрока, но есть вызов ExecuteFunc.
Через GetLocalPlayer вы устанавливаете путь до файла для загрузки, у 1 игрока путь до файла на его компе, у всех остальных путь до файла в архиве карты. У всех игроков происходить Preloader одновременно, иначе будет дисинх. Далее, только синхронизируем строку между игроками и проверяем её на значение.
Naadir, там все просто, Bergi_Bear, или в теме с детектом урона второй мемхак, там вылечены фаталы и прочие проблемы, о которых было известно. В теме с мемхаком задавай вопрос о том как пользоваться функциями, постараюсь помочь.
BladeInDoom, проверить весь импорт на наличе битых моделей, так же нет ли в карте создание 100500 эффектов, или когда юнитов слишком много (жар приесподней жарит сразу 50+ юнитов или что то такое)
Esea, нехрен использовать вейты в группах, они там не работают. Вовсе нельзя использовать вейты, они для этого не предназначены - не можешь без вейтов - сразу же ниче не длаешь и точка и не слушай дурачков у которых в спеллах вейты работают и все норм, ниче не норм и работать нормально никогда не будет. Либо изучаешь все как надо, либо не делаешь ничего.
Bergi_Bear, ну там много чего сбивало инвиз, а учитывая кол-во багов, этот не самый страшный. Химик во время ульта уходит в инвиз от лотара, у него кончается ульт и он выходит из инвиза, т.к морф кастуется пассивным кастом, чтобы химик мог превратится обратно. В бложике лича читаем.
Эксгумацию я проверял лично - сбивает инвиз при каждом кд. По этому спеллнигейшин не надежный и баганый вариант.
ProximityCat, насколько помню никто и не пытался особо, в основном сохраняли строки, тупо пасскоды, а из пасскодов уже извлекали данные и проверяли контрольные суммы и прочее.
ProximityCat, Синхронизация не мгновенная, еще раз. Помни про это, Потом датаменеджер не очень надежен когда нужно передавать большие обьемы данных, там как правило вейты по 1 секунде, что порой мало, синхронизация может занимать больше времени.
Попробуй с синхом простых данных, по 1 строке, к примеру пасс когда как в рпг, а не по 100500 юнитов и их параметров.
function dwFolter takes nothing returns boolean
local unit u = GetTriggerUnit()
local integer id = GetUnitUserData(u)
local boolean b = (id==2) and not( IsUnitDead(u))... ну и так далее
set u = null
return b
endfunction
Обнуляя переменные до return, базовые типы обнулять ненужно.
Только непойму почему ты не можешь юзать глобалки? В них просто заносишь нужные данные перед условием как в локалки и все, но их обнулять ненужно.
Но можно было сделать сразу проверку на типы, без IsUnitType ибо проверка на typeid быстрее и в "узких местах" лучше начинать с неё. KaneThaumaturge, Почему не выйдет? Что собрался делать напиши, какое условие?
Потом странная идиотия, создавать переменная к которой нужно обратится всего 1 раз...
function Trig_Kill_Conditions takes nothing returns boolean
local unit u = GetTriggerUnit()
local integer i = GetUnitTypeId(u)
return IsUnitType(u, UNIT_TYPE_TOWNHALL) == false or \
i != 'hfoo' or \
i != 'n006'
set u = null
endfunction
Можно было сделать так:
function Trig_Kill_Conditions takes nothing returns boolean
set bj_forLoopAIndex = GetUnitTypeId(GetTriggerUnit())
return not ( IsUnitType( GetTriggerUnit, UNIT_TYPE_TOWNHALL) or bj_forLoopAIndex == 'hfoo' or bj_forLoopAIndex == 'n006' )
endfunction
Эмм как насчет глобальных переменных, т.к в фильтрах ты не создаешь условия а только делаешь проверки, без разрыва потока вейтами, то глобалки доступное и изящное решение.
Для справки лимита в кеше нет, хоть всю память выделенную под процесс вара, пока игра не завершится с фаталом.
Вопрос в другом, как ты все это будешь синхронизировать? Для синхронизации куска ландшавта между игроками у тебя уйдет пару минут =) Все это время игроки будут вынуждены смотреть на черный экран. Для всех остальных, наш юнный мапмейкер задумал сделать карту типа рпгшки с сохранением и героея и куска ландшавта, исковерканного данным героем. Сам это он несмог написать на форуме, зато я с большим трудом выудил это из него в лс. Помогите человеку идеями =).
» WarCraft 3 / Хилку сделать предметом в инвентаре
» WarCraft 3 / Радиус обзора День/ночь
» WarCraft 3 / Карта не запускается + проблемы с редактором
» WarCraft 3 / Вопрос по триггерам.
» WarCraft 3 / Хак на память Warcraft3
Ну вот выбор одного из двух состояний, правда хз нах так было заморачиватся, просто морфы и все.
Ну и для переключателей и механик каста лучше использовать не сайленс а мут абилок, от сайленса он отличается тем что не прирывает каста абилки но не дает применять её в ручную. Подробнее можно глянуть в моей карте.
» WarCraft 3 / Вопрос по триггерам.
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Проверка кто нанёс урон
» WarCraft 3 / MemoryHack
» WarCraft 3 / Проверка кто нанёс урон
Об этом писал еще Diod на форуме, баг яйца феникса, когда из за морфа бонус хп становился отрецательным и макс хп < 0.405, что делало юнита мертвым.
» WarCraft 3 / MemoryHack
Ах да, синхронизацию данных никто не отменял, так что кешь или длл Караулова вам понадобится, чтобы как то синхронизировать данные, хоть длл и позволяет это сделать быстро, но тут работа с длл и возможно придется нанимать автора за звонкую монетку, ценник там не 100 руб.
» WarCraft 3 / wc3 1.31 и lua
» WarCraft 3 / Синхронизация строк в 1.26
Алгоритм должен быть примерно такой, в архиве карты есть pld файл в котором нет установки имени игрока, но есть вызов ExecuteFunc.
Через GetLocalPlayer вы устанавливаете путь до файла для загрузки, у 1 игрока путь до файла на его компе, у всех остальных путь до файла в архиве карты. У всех игроков происходить Preloader одновременно, иначе будет дисинх. Далее, только синхронизируем строку между игроками и проверяем её на значение.
» WarCraft 3 / StartAbilityCD(integer, real)
» WarCraft 3 / Fatal Eror
» WarCraft 3 / Действия после wait'a не работают.
» WarCraft 3 / Перезарядка пассивных предметов
Эксгумацию я проверял лично - сбивает инвиз при каждом кд. По этому спеллнигейшин не надежный и баганый вариант.
» WarCraft 3 / DataManager
» WarCraft 3 / DataManager
Попробуй с синхом простых данных, по 1 строке, к примеру пасс когда как в рпг, а не по 100500 юнитов и их параметров.
Ред. quq_CCCP
» WarCraft 3 / Обнуление переменной в фильтрах
Только непойму почему ты не можешь юзать глобалки? В них просто заносишь нужные данные перед условием как в локалки и все, но их обнулять ненужно.
» WarCraft 3 / Обнуление переменной в фильтрах
» WarCraft 3 / Обнуление переменной в фильтрах
KaneThaumaturge, Почему не выйдет? Что собрался делать напиши, какое условие?
» WarCraft 3 / Обнуление переменной в фильтрах
» WarCraft 3 / Обнуление переменной в фильтрах
» WarCraft 3 / DataManager, GameCache
Вопрос в другом, как ты все это будешь синхронизировать? Для синхронизации куска ландшавта между игроками у тебя уйдет пару минут =) Все это время игроки будут вынуждены смотреть на черный экран.
Для всех остальных, наш юнный мапмейкер задумал сделать карту типа рпгшки с сохранением и героея и куска ландшавта, исковерканного данным героем. Сам это он несмог написать на форуме, зато я с большим трудом выудил это из него в лс. Помогите человеку идеями =).