это скорее всего по невнимательности, это решается убиранием всех строк кода из war3map.j на которые указывают редактор, новые функции которые поддерживаются в JNJP не будут работать в обычном редакторе
либо использовать тот же редактор в котором прописаны эти функции
Идем в Редакторе Объектов -> Разрушаемые объекты или Декорации -> Ищем например Ворота (СВ- ЮЗ) или (СЗ - ЮВ) -> ищем Параметр J) Графика - Фиксированное вращение (bfxr) и указываем от 0 до 360.00 где значение указывается в градусах
Далее выбираем Файл Модель (bfil) Ворот на (З-В)
Выбираем на панель инструментов и смотрим в какую сторону Ворота смотрят
видимо он имеет в виду про команду !comp <> <> на боте
если в карте в которой играете предусмотрен механизм создания Компьютерного игрока то да можно написать эту команду
если же в условиях нету такого механизма зря вставляете в слоты игроков компьютера он не сработает а проигнорирует их
а так зависит от разработчиков проекта и самого бота. если можно ввести эту команду и в слоте игрока появится компьютер то карта запустится с компьютером.
но они не действуют, когда ввожу их в игре
это потому что в Лобби надо их вводить а не в самой игре
Centyrion, если исправно работает, то и смущаться лишний раз незачем.
ну все-же предупрежден значит вооружен.
оказывается я все это время сохранял Имя Игрока вместо идентификатора, т.е 0 1 2 3 4 в зависимости от айди игрока, так даже лучше...но не каждый зайдет в Function List и глянет что там происходит, все-же это дело оптимизации. как напишешь так и сработает.
if HaveSavedValue(15, bj_HASHTABLE_HANDLE, 1, udg_H) == true then
do action
здесь и наткнулся на HaveSavedValue
call SetUnitPositionLoc(Hero[GetPlayerId(GetOwningPlayer(GetManipulatingUnit()))],LoadLocationHandle(udg_H, 3, StringHash("GV"+I2S(GetPlayerId(GetOwningPlayer(GetManipulatingUnit()))))))
else
endif
loop
exitwhen k >= F_MaxPlayers()
if GetPlayerSlotState(Player(k)) == PLAYER_SLOT_STATE_PLAYING and GetPlayerSlotState(Player(k)) != PLAYER_SLOT_STATE_EMPTY then
call MultiboardSetRowCount(udg_MB, k + 2)
endif
set k = k + 1
endloop
что же ему не хватает
он все равно добавляет эти иконки
попробую по другому
если указать в качестве строки переменную типа массив с порядковым номером игрока и через эту нативку установить кол-во строк то оно не сработает....так как функция не умеет считать кол-во игроков
или 2 вариант...когда цикл достиг конца и условие выполнилось.. взять и добавить булевую переменную в качестве остановки цикла
простым языком цикл будет выполнятся до тех пор пока не сработает условие выхода из цикла а условие не сработает так как она добавит только лишнее
или 3 вариант в качестве выхода из цикла указать кол-во игроков и дальше ручками править
local integer l = 0
local integer i = 0
loop
exitwhen i >= 10
if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and GetPlayerSlotState(Player(i)) != PLAYER_SLOT_STATE_EMPTY then
call MultiboardSetRowCount(udg_MB, l + 2)
set l = l + 1
endif
set i = i + 1
endloop
этот вариант сработал
но
loop
exitwhen k >= F_MaxPlayers()
if GetPlayerSlotState(Player(k)) == PLAYER_SLOT_STATE_PLAYING and GetPlayerSlotState(Player(k)) != PLAYER_SLOT_STATE_EMPTY then
set r = r + 1
call MultiboardSetRowCount(udg_MB, r + 1) //не + 2 а + 1 так как цикл уже запущен
endif
set k = k + 1
endloop
но надо перестроить и другие функции.
10 строк кода вместо одной функции и 1 переменная )) оригинально ))
перестроил полностью функцию
проблема была и в этом и в другом
MultiboardSetRowCount мне оно понадобилось чтобы не указать переменную которая проверяет кол-во игроков которые играют и так далее
чтобы было все понятно
создал цикл и поставил в начале функции постоянно забываю про порядок выполнения кода
если не соблюдать порядок строк оно и не заработает
грешу на то что в цикле нельзя установить кол-во строк таблицы
только присвоить переменную которая проверит кто играет и кто нет и установить кол-во строк
Изменить состояние фиксированного слота вряд-ли возможно, главное зачем это делать, если на слоте всегда будет один и тот же ИИ? Просто при инициализации запускаешь нужный скрипт и всё
все верно, можно еще в Игровые константы изменить имя компьютерного игрока и дальше запилить свой ИИ
он имел в виду
Где-то на гитхабе видел готовый брутфорсер на java.
ну про взлом я пока не думаю )) да и врятли кто-то заморочиться внедрять читпаки и мемхаки, это больше делаю для проверки имени игрока и проверки если игрок который насолил кому-то зашел поиграть а тут бац не может играть потому что он в списке забаненых игроков.
смотри я тебе дал готовый пример как должно все работать, он будет крашится если не соблюдать правила
даю тебе карту где наглядно есть подобный механизм от него и отталкивайся
я тебе в 10 раз говорю НИКОГДА не используй вейты в Циклах
Ну не знаю, я использовал на практике специальную функцию, где есть таймер и цикл, а в цикле вейт(!) на 1 сек, цикл работает, пока не истекает таймер. Так вот, с ней никогда никаких ошибок и крашей не было, всё стабильно. Даже на паузе. Версия 1.26а
в мултиплеере она себя проявит. это только надо поиграть на 2 машинах которые не находятся в одной локалке
Остаётся узнать - ПОЧЕМУ? Почему способность сама по себе работает, а обращение к ней тригера, даже если сам тригер не активируется, ломает игру?
потому что нельзя кастовать пассивную способность.
function BackEnd takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer id=GetHandleId(t)
local unit c=LoadUnitHandle(udg_HT,id,0)
call UnitRemoveAbility(c,'A06I') // здесь убираем абилку и очищаем следы
call DestroyTimer(t)
call FlushChildHashtable(udg_HT,id)
set t=null
set c=null
endfunction
function Back takes nothing returns nothing
local unit u=GetSpellAbilityUnit()
local timer t=CreateTimer()
call SaveUnitHandle(udg_HT,GetHandleId(t),0,u)
call UnitAddAbility(u,'A06I') // это пассивная абилка
call TimerStart(t,0.5,false,function BackEnd) //запускаем таймер чтобы делать чтото
set u=null
set t=null
endfunction
ответ дал. как надо кастовать скил и как с ним работать
Я в коде полный 0. Скилл сейчас переделаю, поменяю по-разному, посмотрю.
тогда иди читай гайды как создать первоклассный скил
Centyrion, это обыкновенный хэш. Там нечему утекать и ломаться в мультиплеере. Его часто используют для именования ключей хэш-таблиц.
Да и чтоб вызвать просадки производительности, его нужно очень много раз вызвать.
Ну, мне известно что каждый объект который создается занимает в памяти определенное кол-во байтов, поэтому я постараюсь его особо не использовать,
вот пример где это используется
((цитата
создает ли эта нативка утечки или чтото такое
Нет.
и в мултиплеере как она себя поведет не вызовет десинх или все нормально будет
Не вызовет.
))
спасибо) побоялся что если при инициализации карты сохраню все имена игроков в хэш таблицу и когда попытаюсь достать эти значения по ключу игра крашнится или вылетит
Отредактирован Centyrion
» WarCraft 3 / Arthas Revenge Siege
» Блог им. ofeerist / Обзор на пиво
» Таверна "Ржавое колесо" / Жульен с грибами
Отредактирован Centyrion
» WarCraft 3 / Сломалась карта
либо использовать тот же редактор в котором прописаны эти функции
Отредактирован Centyrion
» WarCraft 3 / ворота по вертикале
Далее выбираем Файл Модель (bfil) Ворот на (З-В)
Выбираем на панель инструментов и смотрим в какую сторону Ворота смотрят
Отредактирован Centyrion
» WarCraft 3 / Как играть с другом против бота в WarCraft 3?
если в карте в которой играете предусмотрен механизм создания Компьютерного игрока то да можно написать эту команду
если же в условиях нету такого механизма зря вставляете в слоты игроков компьютера он не сработает а проигнорирует их
а так зависит от разработчиков проекта и самого бота. если можно ввести эту команду и в слоте игрока появится компьютер то карта запустится с компьютером.
» WarCraft 3 / Проверка на наличие значения (HaveSavedValue)
оказывается я все это время сохранял Имя Игрока вместо идентификатора, т.е 0 1 2 3 4 в зависимости от айди игрока, так даже лучше...но не каждый зайдет в Function List и глянет что там происходит, все-же это дело оптимизации. как напишешь так и сработает.
» WarCraft 3 / Проверка на наличие значения (HaveSavedValue)
Отредактирован Centyrion
» WarCraft 3 / Проверка на наличие значения (HaveSavedValue)
вот пример, пояснения в конце
» WarCraft 3 / Проверка на наличие значения (HaveSavedValue)
все равно игрока можно записать как Player(index)
а индекс и будет целочисленной
» WarCraft 3 / Проверка на наличие значения (HaveSavedValue)
» WarCraft 3 / 1.31.1
1.26 работал с 20 фпс
1.31.1 работает но только с 10
проблема с твоим компьютером
Отредактирован Centyrion
» WarCraft 3 / Проверка на наличие значения (HaveSavedValue)
Отредактирован Centyrion
» WarCraft 3 / Доска Статистики
попробую по другому
простым языком цикл будет выполнятся до тех пор пока не сработает условие выхода из цикла а условие не сработает так как она добавит только лишнее
» WarCraft 3 / Доска Статистики
пробовал и так, нивкакую не хочет
проблема была и в этом и в другом
чтобы было все понятно
постоянно забываю про порядок выполнения кода
если не соблюдать порядок строк оно и не заработает
Отредактирован Centyrion
» WarCraft 3 / Доска Статистики
только присвоить переменную которая проверит кто играет и кто нет и установить кол-во строк
Отредактирован Centyrion
» WarCraft 3 / Как установить сложность компьютера?
он имел в виду
» WarCraft 3 / Как установить сложность компьютера?
» WarCraft 3 / Работа с StringHash
небось скоро начну писать библиотеки» WarCraft 3 / Работа с StringHash
» WarCraft 3 / [GUI] Тригер "отказывает" в запуске карты, или крашит игру.
даю тебе карту где наглядно есть подобный механизм от него и отталкивайся
» WarCraft 3 / [GUI] Тригер "отказывает" в запуске карты, или крашит игру.
» WarCraft 3 / Работа с StringHash
» WarCraft 3 / Работа с StringHash
вот пример где это используется
» WarCraft 3 / Работа с StringHash
))