21

» WarCraft 3 / Поиск путей?

quq_CCCP, Работники идут от одного маг. круга к другому. Препятствий нету. В коде ничего нету. Всё сделано самым простым способом.
добавил скрин.
21

» WarCraft 3 / vJass

Нашёл эту статью, но там говорится, что у меня нет прав для просмотра этой страницы. Почему? xgm.guru/p/wc3/vjass-structs
21

» WarCraft 3 / Trigger action vs. Trigger condition

quq_CCCP, пользуясь случаем, хотел еще спросить.
Нет ли какой-либо разницы в добавлении в один триггер нескольких trigger condition и trigger action (кроме вышесказанного)
call TriggerAddCondition(trig1, cond1)
call TriggerAddCondition(trig1, cond2)
call TriggerAddCondition(trig1, cond3)
call TriggerAddCondition(trig1, cond4)
call TriggerAddCondition(trig1, cond5)
// и
сall TriggerAddAction(trig2, action1)
сall TriggerAddAction(trig2, action2)
сall TriggerAddAction(trig2, action3)
сall TriggerAddAction(trig2, action4)
сall TriggerAddAction(trig2, action5)
21

» WarCraft 3 / Оформление заданий от BLIZZARD

KingMaximax, я собирался это сделать, если никто тут не ответит.
Там куча карт, открывать каждую и вникать для меня сложно. К тому же там все триггеры написаны на GUI, а это очень сложно понимать, потому-что он тупо не читабелен. Миллион кликов мышью, чтобы открыть то, открыть это... Вот если бы там было написано на JASS....
21

» WarCraft 3 / Оформление заданий от BLIZZARD

Steal nerves:
У меня нет списка, так сделай свой. Не понимаю, обязательно делать как было у близзард 3? главное, чтоб красиво, быстро и удобно было, без излишевств. Если так надо перерой весь варкрафт 3, потом скинь на сайт.
Текст сообщения будет записан на след. строке, а не в один с "ОСНОВНОЕ ЗАДАНИЕ ПОЛУЧЕНО"
"|n" - перенос на другую строку. Эта фишка может не везде работать, например в описаний баффов. Но здесь пригодится, должно сработать по идее.
Если "|n" не работает, ну мало ли там, вот в описаний итемов и юнитов работает норм. так введи два сообщения последовательно: Сначало одно сообщение, потом другое. Второе на следующую строку перенесет. И будет тебе два как одно.
допустим, когда вы получаете новое задание, сообщение "ОСНОВНОЕ ЗАДАНИЕ ПОЛУЧЕНО" будет закрашено в цвет "ffcc00" и именно в такой, а не в зеленый (00ff00) например.
Ну нужно иметь набор готовых строк. Короче базу данных. При конкретных ситуациях выдавай соответствующее сообщение. Я тоже хотел бы иметь этот набор
вот где полезны штуки, так вот здесь
Вот например, для игроков эти штуки пригодятся, в мультибордах или в оповещениях при убийствах и др.
Я уже сделал функцию, но там еще много не доделано.
function QuestMessage takes player p, integer messageType, string message returns nothing
        if (messageType == bj_QUESTMESSAGE_DISCOVERED) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUEST, " ")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUEST, "|cffffcc00ОСНОВНОЕ ЗАДАНИЕ ПОЛУЧЕНО|r")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUEST, message)
            call StartSound(bj_questDiscoveredSound)
            call FlashQuestDialogButton()

        elseif (messageType == bj_QUESTMESSAGE_UPDATED) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUESTUPDATE, " ")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUESTUPDATE, "|cffffcc00ОСНОВНОЕ ЗАДАНИЕ ИЗМЕНИЛОСЬ|r")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUESTUPDATE, message)
            call StartSound(bj_questUpdatedSound)
            call FlashQuestDialogButton()

        elseif (messageType == bj_QUESTMESSAGE_COMPLETED) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUESTDONE, " ")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUESTDONE, "|cffffcc00ОСНОВНОЕ ЗАДАНИЕ ВЫПОЛНЕНО|r")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUESTDONE, message)
            call StartSound(bj_questCompletedSound)
            call FlashQuestDialogButton()

        elseif (messageType == bj_QUESTMESSAGE_FAILED) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUESTFAILED, " ")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUESTFAILED, "|cffffcc00ОСНОВНОЕ ЗАДАНИЕ ПРОВАЛЕНО|r")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUESTFAILED, message)
            call StartSound(bj_questFailedSound)
            call FlashQuestDialogButton()

        elseif (messageType == bj_QUESTMESSAGE_REQUIREMENT) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_QUESTREQUIREMENT, message)

        elseif (messageType == bj_QUESTMESSAGE_MISSIONFAILED) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_MISSIONFAILED, " ")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_MISSIONFAILED, message)
            call StartSound(bj_questFailedSound)

        elseif (messageType == bj_QUESTMESSAGE_HINT) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_HINT, " ")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_HINT, "|cff32CD32КРАТКАЯ ПОДСКАЗКА:|r" + message)
            call StartSound(bj_questHintSound)

        elseif (messageType == bj_QUESTMESSAGE_ALWAYSHINT) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_ALWAYSHINT, " ")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_ALWAYSHINT, "|cff32CD32ПОДСКАЗКА:|r" + message)
            call StartSound(bj_questHintSound)

        elseif (messageType == bj_QUESTMESSAGE_SECRET) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_SECRET, " ")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_SECRET, message)
            call StartSound(bj_questSecretSound)

        elseif (messageType == bj_QUESTMESSAGE_UNITACQUIRED) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_UNITACQUIRED, " ")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_UNITACQUIRED, message)
            call StartSound(bj_questHintSound)

        elseif (messageType == bj_QUESTMESSAGE_UNITAVAILABLE) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_UNITAVAILABLE, " ")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_UNITAVAILABLE, "|cff87CEEBНОВЫЙ ВИД ВОЙСК|r")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_UNITAVAILABLE, message)
            call StartSound(bj_questHintSound)

        elseif (messageType == bj_QUESTMESSAGE_ITEMACQUIRED) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_ITEMACQUIRED, " ")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_ITEMACQUIRED, message)
            call StartSound(bj_questItemAcquiredSound)

        elseif (messageType == bj_QUESTMESSAGE_WARNING) then
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_WARNING, " ")
            call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_WARNING, message)
            call StartSound(bj_questWarningSound)
        endif
    endfunction
21

» WarCraft 3 / Оформление заданий от BLIZZARD

Steal nerves, я имел ввиду оформление.
допустим, когда вы получаете новое задание, сообщение "ОСНОВНОЕ ЗАДАНИЕ ПОЛУЧЕНО" будет закрашено в цвет "ffcc00" и именно в такой, а не в зеленый (00ff00) например.
И текст будет написан полностью большими (прописными) буквами, а не строчными, например.
Текст сообщения будет записан на след. строке, а не в один с "ОСНОВНОЕ ЗАДАНИЕ ПОЛУЧЕНО".
21

» WarCraft 3 / multiboard

Steal nerves, Я имел ввиду снова не это. В твоём случае это происходит потому-что идёт выравнивание не по центру, а по правому краю.
Есть multiboard (2 строки, 2 столбца.):
  • ширина первого столбца первой строки 5%
  • ширина второго столбца первой строки 5%
  • ширина первого столбца второй строки 25%
  • ширина второго столбца второй строки 25%
Что мы должны иметь в итоге?
  • ширина первой строки в общем - 10%
  • ширина второй строки в общем - 50%
Казалось бы, теперь ширина всего multiboard должна быть равна 50%, (т. к. это ширина самой широкой строки). Но на деле мы имеем multiboard , ширина которого равна 10%. Потому что, ширина multiboard высчитывается по ширине первой строки.
Я попытался исправить это таким образом: увеличивал количество столбцов всего multiboard. Например, если брать вышеприведённый пример, то мне нужно добавить третий столбец и установить его ширину на 40% (потому что вторая строка именно на столько больше первой).
В этом вопросе я хотел узнать, как увеличить ширину всего multiboard, не добавляя новых столбцов.
21

» WarCraft 3 / multiboard

Steal nerves, спасибо, конечно, за список функций. Но я спрашивал не это. Представь МБ, 2строки, 2 столбца.
Если задать ширину всех ячеек в строке 1 на 0.05, то если поставить ширину ячеек второй строки 0.5 и 0.2 - текст во второй строке не поместиться. МБ не увеличивается в ширине. Его ширина задаётся по перво й строке.
21

» WarCraft 3 / Функция для удаления евента триггера

quq_CCCP, можно ссылочку на этот скиллНъ??
ps нашел
ps2: зачем при спавне крипов что то им добавлять, если та библиотека делает тоже самое?
21

» WarCraft 3 / Функция для удаления евента триггера

у меня есть проверка, на наличие какой-либо абилки. спел кастует дамми юнит, товер продолжает атаковать
21

» WarCraft 3 / Функция для удаления евента триггера

quq_CCCP, потому что этот эвент срабатывает еще до того, как юнит получит урон, достаточно лишь замахнуться, чтобы запустить триггер. А в этой библиотеке, триггер запускается, когда цель получит урон.
21

» WarCraft 3 / Функция для удаления евента триггера

library TriggerRegisterAnyUnitDamagedEvent initializer Init

    globals
        public     constant    trigger    TRIGGER          =    CreateTrigger()
        private    constant    trigger    TRIGGER_ADDER    =    CreateTrigger()
    endglobals

    private function TriggerAddEvent takes nothing returns boolean
        if not HaveSavedHandle(HASHTABLE, GetHandleId(GetFilterUnit()), StringHash("bla_bla")) then
            call SaveTriggerEventHandle(HASHTABLE, GetHandleId(GetFilterUnit()), StringHash("bla_bla"), TriggerRegisterUnitEvent(TRIGGER, GetFilterUnit(), EVENT_UNIT_DAMAGED))
        endif
        return false
    endfunction

    private function Init takes nothing returns nothing
        local group    g      =    CreateGroup()
        local rect     r      =    GetWorldBounds()
        local region   reg    =    CreateRegion()
        local boolexpr filter = Condition(function TriggerAddEvent)

        call GroupEnumUnitsInRect(g, r, filter)

        call RegionAddRect(reg, r)
        call TriggerRegisterEnterRegion(TRIGGER_ADDER, reg, filter)

        call DestroyGroup(g)
        call RemoveRect(r)
        set g   = null
        set r   = null
        set reg = null
    endfunction

    function TriggerRegisterAnyUnitDamagedEvent takes code c returns nothing
        call TriggerAddCondition(TRIGGER, Condition(c))
    endfunction

endlibrary
Как видишь, на каждого нового заспавненного крипа прикрепляется евент, который остаётся после смерти крипа.
А такой триггер мне нужен, чтобы правильно работали скиллы у таверов. Например, один товер, атакуя кастует огненный столб на атакованного и т.д.
21

» WarCraft 3 / про boolexpr, filterfunc...

quq_CCCP, у меня фатала нет! все работает, словно там все верно написано.
21

» WarCraft 3 / Функция для удаления евента триггера

Uber, а что нет? ну не совсем утечки, но ненужный объект все равно же остаётся в памяти.
21

» WarCraft 3 / Функция для удаления евента триггера

quq_CCCP, ты отвечал в моём предыдущем вопросе (про библиотеку, которая добавляет событие на получение урона всем юнитам), там добавляется событие на каждого юнита на карте. Так как карта у меня жанра TD, получается, что карта будет иметь миллион утечек памяти?
21

» WarCraft 3 / Правильно ли я написал библиотеку?

quq_CCCP, переделал, посмотри, пожалуйста. А проверка на дамми и т. д. не нужна, мне кажется. То что они дамми, ведь не отменяет то, что они получили урон, а если нужно их отсеять, то можно уже сделать это в самой функции, где это нужно.
21

» WarCraft 3 / Ошибка в коде

или уберите:
local boolexpr b = Condition(function Trigger_Conditions)
call DestroyBoolExpr(b)
set b = null
Замените call TriggerAddCondition(TRIGGER, b) на call TriggerAddCondition(TRIGGER, Condition(function Trigger_Conditions))
Это помогло. Но почему так? Там же утечка создаётся.
21

» WarCraft 3 / Ошибка в коде

KingMaximax:
private function Trigger_Conditions takes nothing returns boolean
     return LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id")) != null
endfunction
Лучше так, меньше утечек
Из "private function Init takes nothing returns nothing"
 local boolexpr b = Condition(function Trigger_Conditions)
//....
call DestroyBoolExpr(b)
set b = null
Вот этот участок немного сомнительный, хотя хз мож так надо...
HASHTABLE - иницилизированна ли данная хеш таблица?
да.
21

» Блог им. nvc123 / оптимизация вызова триггерных заклинаний

Если использовать одну Хеш-таблицу на всю карту, могут ли данные в "SaveStr(hash, a, 0, b)" перезаписаться?
21

» WarCraft 3 / textag

их можно создавать в локальном коде
То есть:
if GetLocalPlayer() == Player(0) then
	set tt = CreateTextTag()
endif
не вызовет десинхронизацию?