ScorpioT1000, мне таймер останавливать не надо. Он у меня каждую 0.1 секунду запускается. Если процесс не выполнен он проверит данные в хеш таблице и пойдёт дальше обрабатываться в зависимости от результатов.
Каждую 0.1 секунду проверяй стремительность на юните.)
Запусти таймер игрового времени. При уходе в стремительность засеки время. Если юнит атакован и получает дамаг я не знаю, что там по бафам. Если юнит каким то образом вышел из стремительность можно проверить по таймеру. И если время ухода в стремительность плюс время до выхода из стремительности меньше текущего времени, то кради золото.
Выбери в группу всех юнитов около точки в радиусе, пока не за компом функцию не помню. Помню что рейдж там есть. Перебери всех инитов в группе с первого по последний по своим критериям например радиус наименьший или мало хп и атакуй выбранного одного юнита через команду атака. Второй триггер напиши по смерти вражеского юнита повторить первый триггер или при определённых условиях, например, вражеский юнит входит в регион или подходит к твоему юниту в радиусе. И получится в итоге милишный бот.) Потом будешь узнавать как пройти к юниту и закричишь караул?
Моя задача. Пока выполняется триггер по времени. В нем обрабатывать другой поток для анализа проходимости юнитов. Я так понимаю потребуется хеш-таблица глобальная куда хендл от таймера помещю. Забью параметры. А в потоке возьму текущий таймер и заберу параметры.
Создаёшь глобалку SyncCache тип буфер игры.
Инициализируешь кэш
set udg_SyncCache = InitGameCacheBJ("Sync")
Пишешь первый триггер на отправку числа в кэш и синхронизацию значения в кэше. Который реагирует на событие выбор пехотинца в центре карты.
local string vKeyLocalPlayer
set vKeyLocalPlayer = I2S(GetPlayerId(GetLocalPlayer()))
call StoreInteger(udg_SyncCache ,"Select",vKeyLocalPlayer,1)
call SyncStoredInteger(udg_SyncCache ,"Select",vKeyLocalPlayer)
call DisplayTextToForce( GetPlayersAll(), vKeyLocalPlayer)
Пишешь второй триггер на перебор всех игроков в кэше и если значение получено по выводишь сообщение. Триггер реагирует на событие таймер каждую секунду.
local integer vvi = 0
local integer MAX_PLAYERS = 2
local string vKeyLocalPlayer
loop
exitwhen vvi>=MAX_PLAYERS
set vKeyLocalPlayer = I2S(vvi)
if (GetStoredInteger(udg_SyncCache,"Select",vKeyLocalPlayer ) == 1) then
call DisplayTextToForce( GetPlayersAll(), "NPlayer = " + vKeyLocalPlayer )
call StoreInteger(udg_SyncCache ,"Select",vKeyLocalPlayer,0)
endif
set vvi = vvi + 1
endloop
Первое сообщение появляется сразу по выбору пехотинца. Второе через секунду как придёт синхронизация данных в кэше.
Прикрепляю тестовую карту.
Наверное только Шелдан сможет найти ошибки по рассинхронизации в этой карте. Самый умный парень на земле, как он говорит.) Обновил ещё раз проект. Одиночка работает нормально. Исправил зависание при убийстве рабочих. Убрал спящий режим в начале игры. Начало хорошее. Но потом, где-то в коде есть нюанс, который мне мешает синхронизировать сетевую игру. Блинки исправил на таймер. Был триггер. Теперь вроде меньше рассинхронов стало. Из-за этих блинков мейн хуманов. Выкладываю новый архив с теме же программами для тестирования. Но плюс одна для сверки логов для игроков. Тестил через программу 2 окна. Добавил в папку с картой JassApi.dll файл для тестирования через два окна. Потому что не всегда подхватывает эту dll'ку другая dll'кa Vampirism_fire.dll, когда тестируешь через два окна. И приходится из корня Warcraft'a доставать эту dll.
Вот новый архив:
Модернизировал проект. Одиночка работает нормально. Прошу поискать ошибку в проекте по рассинхронизации в сетевой игре. А, то двигаться дальше пока не хочется пока не исправлю эту ошибку. Выкладываю проект для создания dll'ки Vampirism_fire.dll, программу 2 окна для Warcraft'a, что бы потестить сетевую игру, программу winmpq для внедрения dll'ки в карту, карту и dll'ки для Visual Studio 2010, которые нужно разместить в корне папки с Warcraft'ом. Версия Warcraft'a таже (1.26a).
Архив:
Не вижу развития проекта дальше, т.к. не могу воскресить слаеров. Что только не перепробовал. А функции IssueTrainOrderByIdBJ нету в нативных функциях, которые достаю с помощью JassApi.dll. Есть аналоги IssueImmediateOrderById и IssueNeutralImmediateOrderById, но в данной карте срабатывает только 2 приказа на слерку вообще, которые не воскрешают слаера это 851980, 851978 другие отсеиваю такие как: ID_ORDER_STOP, ID_ORDER_HOLDPOSITION, ID_ORDER_PATROL, ID_ORDER_ATTACK, ID_ORDER_SMART, ID_ORDER_MOVE, ID_ORDER_CANCEL, и стан 851973, которые тоже срабатывают на слерку, но от них нет ни какого толку для воскрешения слаера. По Id юнита тоже побывал воскрешать слаера, как в массиве так и без, и по TypeId. Никакого толку. Если кто разберётся, как воскрешать слаера в данной карте сообщите.
IceFog, а ты сможешь сделать перед запуском файла .json определитель ОС и разрядности архитектуры, чтобы запустить разные файлы .json. Это нужно для загрузки на машинах x86 библиотек x86 и x64 соответственно для функций <boost>.
Варкрафт 3 всегда х86 (не считая рефу), какой толк от х64, если его х86 приложения всё-равно не поймут?
IceFog, а ты сможешь сделать перед запуском файла .json определитель ОС и разрядности архитектуры, чтобы запустить разные файлы .json. Это нужно для загрузки на машинах x86 библиотек x86 и x64 соответственно для функций <boost>.
Если нативка зарегистрирована, то виртуальная машина JASS'а сможет её использовать.
Учитывая, что и обычный и ИИ скрипты исполняются ею, то почему бы и нет?
Единственная проблема — регистрация должна произойти до компиляции, а иначе компилятор откажется работать, сетуя на несуществующую нативку.
Буду благодарен за пример.
Я добавляю свою нативку в common.ai
native fBeginGameProcessAI takes nothing returns integer
Запускаю её у человека human,ai
call fBeginGameProcessAI()
Инициализирую библиотеку до:
call InitBlizzard()
call MeleeStartingAI()
И скрипт ИИ не работает.
Или её надо редеректом вызывать?
Просто на некоторых машинах у меня не получается запустить .mix файл где установлен лицензионный Windows 10. А если подгружать через карту, то работает на этой машине.
Складывается такое впечатление, будто ты не писал прежде на JASS'е, а иначе почему даже простое создание юнита вызывает у тебя проблемы?
Попробуй сначала почитать статьи и сделать простенькую карту на нём или изучить уже существующие, а уже потом на C++ перейти как окрепнешь.
Переслать команду от одного ИИ другому ИИ помоги в таких то координатах и 4 точки переслать которые прописаны в DLL. Я так думаю только с помощью сообщений можно это сделать. Мне чистый бот на JASS'e не нужен.
Ред. Vampir_kolik
» WarCraft 3 / бесконечная молния
» WarCraft 3 / ExecuteFunc и параметры
» WarCraft 3 / Как отследить удар из невидимости?
» WarCraft 3 / "Пустая" карта, созданная в редакторе
» WarCraft 3 / Название команды
» WarCraft 3 / ExecuteFunc и параметры
» WarCraft 3 / Как отследить какой игрок нажал кнопку?
Инициализируешь кэш
Прикрепляю тестовую карту.
» WarCraft 3 / ExecuteFunc и параметры
» Администрация XGM / Контекстное меню в мобилках
» Unryze Jass API / UjAPI - AngelScript
Ред. Vampir_kolik
» Unryze Jass API / UjAPI - AngelScript
» WarCraft 3 / Открытая виртуальная машина
» WarCraft 3 / Пятиминутка в вампов
Вот новый архив:
» WarCraft 3 / Пятиминутка в вампов
Архив:
» WarCraft 3 / Генератор карт VF
» WarCraft 3 / Генератор карт VF
» WarCraft 3 / Пятиминутка в вампов
» WarCraft 3 / Генератор карт VF
» WarCraft 3 / Пятиминутка в вампов
Ред. Vampir_kolik
» XGM — Премия года / Премия 2023 года
» WarCraft 3 / Сценарий на любом языке
» WarCraft 3 / Сценарий на любом языке
» WarCraft 3 / Сценарий на любом языке
Ред. Vampir_kolik
» WarCraft 3 / Работа с нативными функциями
Я добавляю свою нативку в common.ai
native fBeginGameProcessAI takes nothing returns integer
Запускаю её у человека human,ai
call fBeginGameProcessAI()
Инициализирую библиотеку до:
call InitBlizzard()
call MeleeStartingAI()
И скрипт ИИ не работает.
Или её надо редеректом вызывать?
» WarCraft 3 / Сценарий на любом языке