Стартовать таймер, в котором периодически вызывать SaveGame. Например: после вызова SavePeriodicStart будет сохранять игру раз в 100 секунд в разные файлы.
globals
int savenumber = 1
endglobals
function Save takes nothing returns nothing
call SaveGame("mapname"+I2S(savenumber))
set savenumber = savenumber + 1
endfunction
function SavePeriodicStart takes nothing returns nothing
call TimerStart(CreateTimer(),100,false,function Save )
endfunction
Но от фаталов это вас не защитит, потому что, очень часто они происходят по вполне определенным причинам, которые воссоздадутся после сохранения
В реплее хранится очень много информации, собственно, по нему можно восстановить состояние игры в произвольный момент времени. Но с анализом есть очевидные проблемы - в реплее хранится не само состояние, а, в основном действия игроков. Поэтому, чтобы получить информацию можно записать специальным образом значения в кеш, что будет 100% видно и уникально при парсинге реплея.
Автоматически можно инфу собрать просто последовательно загружая реплеи и смотря пикнутых героев. Можно делать не вручную, а какими-то автоматическими средствами.
Текстуре нужно поставить правильный путь, чтобы варкрафт её видел. Например есть модел a.mdx, у нее есть текстура b.blp, в модели написано, что текстура должна лежать в Textures\b.blp, значит варкрафт там будет искать. Просмотрищи текстур, как правило, проверяют папку с моделью на предмет соотв. Текстуры, честные пути можно посмотреть например в ретере.
На почти любой версии варкрафта можно сохранять почти любое количество данных. Более того, эти данные можно автоматически загружать, при необходимости.
Для этого нужно поделить данные на блоки не длиннее чем 205 символов(максимальная? длина имени игрока). Далее последовавтельно сохранить в файлы по некоторому алгоритму. Сохранять через прелоад с небольшим хаком. Грузить - тоже. Операция в определенной мере тяжелая, но, тем не менее реализуемая. Вот скрипт который может продемонстрировать автоматическую загрузку и сохранение данных. Не трудно видеть, что его можно масштабировать почти неограниченно. Синхронизацию полученных данных осуществлять через например геймкеш.
--выбор имен файлов и большого куска данных можно автоматизировать.
--сохраняем старое имя игрока.
local name = GetPlayerName(Player(0))
--данные для сохранения - загрузки - проверки.
local data1 = "data1"
local data2 = "data2"
local data3 = "data3"
local data4 = "data4"
--имена файлов для сохранения.
file1 = "0.pld"
file2 = "1.pld"
file3 = "2.pld"
file4 = "3.pld"
--папка, в которую все это будет сохраняться.
folder = "Test\\Testmap\\"
--сохраняем данные. Можно вызывать неограниченно, но довольно медленно, все-таки.
function SaveData(data,filename)
assert(data:len()<205)
PreloadGenClear()
PreloadGenStart()
Preload(" \")\n\
\tcall SetPlayerName(Player(0),\""..data.."\")\
\tcall Preload(\" ")
PreloadGenEnd(folder..filename)
PreloadGenClear()
end
--позволяет неограниченно загружать данные из выбранной нами папки.
function LoadData(filename)
Preloader(folder..filename)
local data = GetPlayerName(Player(0))
assert(data:len()<205)
return data
end
--сохраняем данные.
SaveData(data1,file1)
SaveData(data2,file2)
SaveData(data3,file3)
SaveData(data4,file4)
--загружаем их в другие переменные.
tdata1 = LoadData(file1)
tdata2 = LoadData(file2)
tdata3 = LoadData(file3)
tdata4 = LoadData(file4)
--проверка.
gprint(tdata1==data1)
gprint(tdata2==data2)
gprint(tdata3==data3)
gprint(tdata4==data4)
--восстанавливаем имя игрока.
SetPlayerName(Player(0),name)
Для большей надежности можно в первый файл также сохранить общее количество файлов и некий общий хэш.
Правда, вероятно, такие системы не очень нужны, раз уж ими не слишком пользуются.
Статья про синхронизацию: xgm.guru/u/N1ghtSiren/article
В этой статье есть немного про прелоад и синк таким образом: xgm.guru/p/wc3/222365
Скрытые тексттаги тоже считаются. И при некоторой осторожномти их можно создавать локально
Ограничение на 100 тексттагов - сколько создано на локальной машине.
Насколько помню, в нем также учавствует текст с рудников, у критов и т.п.
Попробуйте при создании тексттага повыводить хэндл созданного через GetHandleId, если оно нулевое - вероятно, у вас достигнут лимит и нужно что-то делать. Можно например уменьшать время жизни тт.
И в целом, скорее всего, можно заменить установку видимости на дестрой. Не должно повлиять. Но может я и ошибаюсь.
достаточно логично ожидать, что cmemblock - блок памяти. Возможно, ошибка связана с выделением памяти или каким либо другим этапом управления ей. Мб утечки?
Отлавливать урон с мемхаком/рефоржем, увеличивать нужные виды от чего нужно. Главное классифицировать правильно, и, вероятно, не увеличивать нулевой урон.
native WaygateGetDestinationX takes unit waygate returns real
native WaygateGetDestinationY takes unit waygate returns real
native WaygateSetDestination takes unit waygate, real x, real y returns nothing
native WaygateActivate takes unit waygate, boolean activate returns nothing
native WaygateIsActive takes unit waygate returns boolean
в гуи 1.26 ограничения индекса массива от -8192 до 8192. тип туда не вставить, тк 4-значный равкод имеет большие цифры. там приходиться бд по другому строить: мы забиваем бд равкодов. потом нужно сравнить какой тип, пробегаем по бд равкодов циклом, вытаскиваем. неудобно как-то
Для этого есть хэш-таблицы. Собственно, в памяти ишры данные о юнитах хранятся в них же. Таюлицы луа, кстати, также являются, во многом, именно ими. А ограничения размера массива - логичны и понятны. Массивы нужны для другого. А чтобы сохранить с массиве значения, по индексам, соответствующим всем потенциальным равкодам понадобится около 16 гб памяти, только в виде указателей. В джасовских массивах это еще больше.
И ограничения нужны именно для того, чтобы никто не пытался таким образом индексировать большими числами и не валил игру.
Hate
Тут наверное не обязательно даже обнулять урон. Просто поставить атаку 1-1, на мизер урона внимания можно не обращать... Ну, если у вас, конечно не количества хп порядка единицы.
Возможно вам подойдет способность Очарование, в стандарте её обладает темная охотница. При правильной настройке позволяет подчинить почти любого юнита.
Правильно настроенный даммик может кинуть большинство правильно настроенных заклинаний мгновенно.
Для ченнелинг заклинаний - вероятно придется создавать нового.
Кроме того, если ты будешь кидать несколько заклинаний с одного дамми - ты не найдешь, каким убило цель например. Аналогично, если ты будешь кидать все заклинания одного игрока с одного дамми - вероятно ты и юнита-источник урона не определишь. Аналогично с игроками.
В общем, нужно определять цели, которые ты преследуешь и помнить о подобных особенностях, а так да - можно.
А что не так с реагированием на приказ? Ивент для реагирования на него кидается как минимум раньше, чем юнит заканчивает применять способность(насчет начала применения - мне не ведомо), значит, вероятно, если сделать время использования предмета чуть больше нуля, вам уж точно удастся перебить приказ на использования предмета в другую цель. Из минусов - вроде как собьются приказы по шифту.
» WarCraft 3 / Не работает нативка GetUnitGoldCost
Только те, которые не объявлены в common.j
Ред. goodlyhero
» WarCraft 3 / Как сделать автосохранение через определенный промежуток времени
» WarCraft 3 / Парсинг реплея
Автоматически можно инфу собрать просто последовательно загружая реплеи и смотря пикнутых героев. Можно делать не вручную, а какими-то автоматическими средствами.
Ред. goodlyhero
» WarCraft 3 / Помогите пожалуйста исправить мои некоторые ошибки на моей карте
Ред. goodlyhero
» WarCraft 3 / Потрачено золота на постройку здания
» WarCraft 3 / Почему не загружаются модельки с текстурами?
Ред. goodlyhero
» WarCraft 3 / Труп через разрушенную декорацию
Ред. goodlyhero
» WarCraft 3 / Лимит за смерти
Ред. goodlyhero
» WarCraft 3 / Хочу попробывать сварганить карту
Для этого нужно поделить данные на блоки не длиннее чем 205 символов(максимальная? длина имени игрока). Далее последовавтельно сохранить в файлы по некоторому алгоритму. Сохранять через прелоад с небольшим хаком. Грузить - тоже. Операция в определенной мере тяжелая, но, тем не менее реализуемая. Вот скрипт который может продемонстрировать автоматическую загрузку и сохранение данных. Не трудно видеть, что его можно масштабировать почти неограниченно. Синхронизацию полученных данных осуществлять через например геймкеш.
Правда, вероятно, такие системы не очень нужны, раз уж ими не слишком пользуются.
Статья про синхронизацию: xgm.guru/u/N1ghtSiren/article
В этой статье есть немного про прелоад и синк таким образом: xgm.guru/p/wc3/222365
Ред. goodlyhero
» WarCraft 3 / Плавающий текст периодически пропадает
Ограничение на 100 тексттагов - сколько создано на локальной машине.
Насколько помню, в нем также учавствует текст с рудников, у критов и т.п.
Попробуйте при создании тексттага повыводить хэндл созданного через GetHandleId, если оно нулевое - вероятно, у вас достигнут лимит и нужно что-то делать. Можно например уменьшать время жизни тт.
И в целом, скорее всего, можно заменить установку видимости на дестрой. Не должно повлиять.
Но может я и ошибаюсь.
» WarCraft 3 / Краш карты. с крашлогом. из-за чего именно?
Ред. goodlyhero
» WarCraft 3 / Увеличивающийся от интеллекта героя урон заклинаний
Ред. goodlyhero
» WarCraft 3 / Как триггерно настроить более сильное отдаление камеры?
Настраивается нативкой:
Ред. goodlyhero
» WarCraft 3 / Нанесение урона по определённой стороне
В конце концов взять рект с нужной стороны и надамажить в нем.
» WarCraft 3 / Tanya Degurechaff (300 Heroes)
Военная хроника маленькой девочки / Youjo Senki
» WarCraft 3 / Создание телепортов через способность.
» WarCraft 3 / Создание телепортов через способность.
Ред. goodlyhero
» WarCraft 3 / Albedo (300 Heroes)
Ред. goodlyhero
» WarCraft 3 / Вопрос по переменным
А ограничения размера массива - логичны и понятны. Массивы нужны для другого. А чтобы сохранить с массиве значения, по индексам, соответствующим всем потенциальным равкодам понадобится около 16 гб памяти, только в виде указателей. В джасовских массивах это еще больше.
И ограничения нужны именно для того, чтобы никто не пытался таким образом индексировать большими числами и не валил игру.
» WarCraft 3 / Замена атаки на способность
Тут наверное не обязательно даже обнулять урон. Просто поставить атаку 1-1, на мизер урона внимания можно не обращать... Ну, если у вас, конечно не количества хп порядка единицы.
» WarCraft 3 / Подчинение
» WarCraft 3 / Dummy unit
Для ченнелинг заклинаний - вероятно придется создавать нового.
Кроме того, если ты будешь кидать несколько заклинаний с одного дамми - ты не найдешь, каким убило цель например. Аналогично, если ты будешь кидать все заклинания одного игрока с одного дамми - вероятно ты и юнита-источник урона не определишь. Аналогично с игроками.
В общем, нужно определять цели, которые ты преследуешь и помнить о подобных особенностях, а так да - можно.
» WarCraft 3 / Заставить юнитов игрока компьютера, атаковать самих себя
Ред. goodlyhero
» WarCraft 3 / Перенаправить на другую цель способку предмета.
» WarCraft 3 / Перенаправить на другую цель способку предмета.