В своей карте я использую мультибоард, но при ливе какого-нибудь союзника, или передаче мне конроля появляется мультибоард с ресурсами союзников, как его убрать?

Принятый ответ

Переписать стандартные триггеры. Вы используете стандартные гуишные триггеры? Если да, то надо раскрыть и посмотреть. Кажется из-за них вызывает ошибку.
раскрыть
MeleeStartingVisibility - настраивает игровое время (часики)
MeleeStartingHeroLimit - устанавливает лимит на каждого героя (каждый игрок может призвать 1 тип героя) и каждый игрок может призвать максимум 3 героя
MeleeGrantHeroItems - настройки кол-ва героев. регистрирует кол-во героев при обучении или покупке в нейтральном магазине. Короче стартовое ограничение, зависит от технического прогресса базы ( на первом уровне = максимум 1 герой, на втором = максимум 2 героев, на третьем = максимум 3 героя). Тут фиксируется нанятое кол-во героев игроком (нанял или купил +1, нанял еще одного +2, нанял третьего +3, максимум можно 3).
MeleeStartingResources - стартовые ресурсы игрока
MeleeClearExcessUnits - очищает место от нейтральных крипов, чтобы на этой местности расставить рабов и ратушу. Обычно место выбирается "исходной позицией".
MeleeStartingUnits - создает ратушу и рабов
MeleeStartingAI - проверяет всех игроков (кем заняты слоты: игроком или компьютером, если комп, то включает ИИ)
MeleeInitVictoryDefeat - настройки условия поражения. Отвечает за условия изменения альянса, за выход (лив) игрока из игры, Тут намного больше кода чем в остальных частях. Именно здесь нужно искать.
непонятный близзардский говнокод функции MeleeInitVictoryDefeat
function MeleeInitVictoryDefeat takes nothing returns nothing
    local trigger    trig
    local integer    index
    local player     indexPlayer

    // Создаем в начале игры окно таймера для тайм-аута «закончить в ближайшее время», у него пока что нет таймера
    // потому что он управляется в реальном времени (вне состояния игры, чтобы избежать desyncs)
    // Это окно появляется, если у игрока разрушена база (в частности ратушена уничтожена), и появляется окно, оповещающее что если не построите здание, то вы проиграете. Так думаю я. Мб и в других ситуациях, но что-то не припомню где еще диалоговое окно с таймером появлялось
    set bj_finishSoonTimerDialog = CreateTimerDialog(null)

    // Установите триггер для запуска, когда мы получим игровое событие «закончить в ближайшее время»
   //не понятно мне что это
    set trig = CreateTrigger()
    call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_SOON)
    call TriggerAddAction(trig, function MeleeTriggerTournamentFinishSoon)

    // Установите триггер для запуска, когда мы получим игровое событие «закончить сейчас»
   //не понятно мне это тоже 
    set trig = CreateTrigger()
    call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_NOW)
    call TriggerAddAction(trig, function MeleeTriggerTournamentFinishNow)

    // Настройка поражения для каждого игрока (перебираем циклом каждого игрока)
    set index = 0
    loop
        set indexPlayer = Player(index)

        //Если этот игрок имеет статус "играет" (указан в слоте).
        if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
            set bj_meleeDefeated[index] = false
            set bj_meleeVictoried[index] = false

            //Создаем окно таймера и таймер
            set bj_playerIsCrippled[index] = false
            set bj_playerIsExposed[index] = false
            set bj_crippledTimer[index] = CreateTimer()
            set bj_crippledTimerWindows[index] = CreateTimerDialog(bj_crippledTimer[index])
            call TimerDialogSetTitle(bj_crippledTimerWindows[index], MeleeGetCrippledTimerMessage(indexPlayer))

            // Запускаем триггер, когда здание отменяется (прерывается через кнопку отмена) для этого игрока. 
            // Короче можно сделать счетчик на кол-во здании у каждого игрока. Если отменяет значит -1
            set trig = CreateTrigger()
            call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL, null)
            call TriggerAddAction(trig, function MeleeTriggerActionConstructCancel) //вот в действии много чего намусолено

            // Устанавливаем триггер для срабатывания всякий раз, когда здание умирает у этого игрока.
            // Короче можно сделать счетчик на кол-во здании у каждого игрока. Если умирает значит -1
            set trig = CreateTrigger()
            call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_DEATH, null)
            call TriggerAddAction(trig, function MeleeTriggerActionUnitDeath) //вот в действии много чего намусолено

            // Устанавливаем триггер для срабатывания всякий раз, когда устройство начинает строительство для этого игрока
            // Короче можно сделать счетчик на кол-во здании у каждого игрока. Если завершает значит +1
            set trig = CreateTrigger()
            call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
            call TriggerAddAction(trig, function MeleeTriggerActionUnitConstructionStart) //вот в действии много чего

            // Установите триггер, который будет срабатывать, когда игрок проиграет
            set trig = CreateTrigger()
            call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_DEFEAT)
            call TriggerAddAction(trig, function MeleeTriggerActionPlayerDefeated)

            // Устанавливаем триггер, когда он уходит из игры
            set trig = CreateTrigger()
            call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
            call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)

            // Установите триггер, чтобы он срабатывал всякий раз, когда этот игрок меняет свои союзы.
            set trig = CreateTrigger()
            call TriggerRegisterPlayerAllianceChange(trig, indexPlayer, ALLIANCE_PASSIVE)
            call TriggerRegisterPlayerStateEvent(trig, indexPlayer, PLAYER_STATE_ALLIED_VICTORY, EQUAL, 1)
            call TriggerAddAction(trig, function MeleeTriggerActionAllianceChange)
        else

	    //Иначе, если игрок "не играет" скорее всего наблюдатели игры

            set bj_meleeDefeated[index] = true
            set bj_meleeVictoried[index] = false

            // Обработка событий для наблюдателей
            if (IsPlayerObserver(indexPlayer)) then
                // Устанавливаем триггер, когда он уходит из игры
                set trig = CreateTrigger()
                call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
                call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)
            endif
        endif

        set index = index + 1
        exitwhen index == bj_MAX_PLAYERS
    endloop
    
    //Запускаем таймер. Через 2 секунды запускаем тестовую проверку.
    //Тест на победу/поражение при запуске, если пользователь уже выиграл / проиграл. 
    //Просто проверяем играет ли пользователь один, например, если да, то можно вручить ему победу. 
    // Разрешить короткое время, чтобы пройти первым, чтобы карта могла завершить загрузку.
    //Короче проверяем есть ли построенные здания типа ратуши.
    call TimerStart(CreateTimer(), 2.0, false, function MeleeTriggerActionAllianceChange)
endfunction
Лично больше всего не понятно именно эта часть. Как связано и другое. Я бы переписал бы по-другому.
покопался в MeleeInitVictoryDefeat и не обнаружил никакого мультиборда =((
видимо встроен извнутри
знаешь мультибордов можно создать 10-20. Но отобразить игроку можешь только один. Поэтому когда появляется этот мультиборд, покажи снова свой. Единственное, что жаль нельзя удалить этот появившийся мультиборд, ссылки то на него нет. Попробуй последний созданный удалить что ль. Не знаю баг или не баг, а это связано ли с режимом сражения? попробуй отключить MeleeInitVictoryDefeat и проверить без него как работает, просто в этой функции очень много чего напихано, возможно какой-то элемент включает (переменная какая-нибудь)
Еще если союзник ливает, то делай его врагом. И его войска отдаешь себе и все.
0
27
6 лет назад
Отредактирован MpW
0
Переписать стандартные триггеры. Вы используете стандартные гуишные триггеры? Если да, то надо раскрыть и посмотреть. Кажется из-за них вызывает ошибку.
раскрыть
MeleeStartingVisibility - настраивает игровое время (часики)
MeleeStartingHeroLimit - устанавливает лимит на каждого героя (каждый игрок может призвать 1 тип героя) и каждый игрок может призвать максимум 3 героя
MeleeGrantHeroItems - настройки кол-ва героев. регистрирует кол-во героев при обучении или покупке в нейтральном магазине. Короче стартовое ограничение, зависит от технического прогресса базы ( на первом уровне = максимум 1 герой, на втором = максимум 2 героев, на третьем = максимум 3 героя). Тут фиксируется нанятое кол-во героев игроком (нанял или купил +1, нанял еще одного +2, нанял третьего +3, максимум можно 3).
MeleeStartingResources - стартовые ресурсы игрока
MeleeClearExcessUnits - очищает место от нейтральных крипов, чтобы на этой местности расставить рабов и ратушу. Обычно место выбирается "исходной позицией".
MeleeStartingUnits - создает ратушу и рабов
MeleeStartingAI - проверяет всех игроков (кем заняты слоты: игроком или компьютером, если комп, то включает ИИ)
MeleeInitVictoryDefeat - настройки условия поражения. Отвечает за условия изменения альянса, за выход (лив) игрока из игры, Тут намного больше кода чем в остальных частях. Именно здесь нужно искать.
непонятный близзардский говнокод функции MeleeInitVictoryDefeat
function MeleeInitVictoryDefeat takes nothing returns nothing
    local trigger    trig
    local integer    index
    local player     indexPlayer

    // Создаем в начале игры окно таймера для тайм-аута «закончить в ближайшее время», у него пока что нет таймера
    // потому что он управляется в реальном времени (вне состояния игры, чтобы избежать desyncs)
    // Это окно появляется, если у игрока разрушена база (в частности ратушена уничтожена), и появляется окно, оповещающее что если не построите здание, то вы проиграете. Так думаю я. Мб и в других ситуациях, но что-то не припомню где еще диалоговое окно с таймером появлялось
    set bj_finishSoonTimerDialog = CreateTimerDialog(null)

    // Установите триггер для запуска, когда мы получим игровое событие «закончить в ближайшее время»
   //не понятно мне что это
    set trig = CreateTrigger()
    call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_SOON)
    call TriggerAddAction(trig, function MeleeTriggerTournamentFinishSoon)

    // Установите триггер для запуска, когда мы получим игровое событие «закончить сейчас»
   //не понятно мне это тоже 
    set trig = CreateTrigger()
    call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_NOW)
    call TriggerAddAction(trig, function MeleeTriggerTournamentFinishNow)

    // Настройка поражения для каждого игрока (перебираем циклом каждого игрока)
    set index = 0
    loop
        set indexPlayer = Player(index)

        //Если этот игрок имеет статус "играет" (указан в слоте).
        if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
            set bj_meleeDefeated[index] = false
            set bj_meleeVictoried[index] = false

            //Создаем окно таймера и таймер
            set bj_playerIsCrippled[index] = false
            set bj_playerIsExposed[index] = false
            set bj_crippledTimer[index] = CreateTimer()
            set bj_crippledTimerWindows[index] = CreateTimerDialog(bj_crippledTimer[index])
            call TimerDialogSetTitle(bj_crippledTimerWindows[index], MeleeGetCrippledTimerMessage(indexPlayer))

            // Запускаем триггер, когда здание отменяется (прерывается через кнопку отмена) для этого игрока. 
            // Короче можно сделать счетчик на кол-во здании у каждого игрока. Если отменяет значит -1
            set trig = CreateTrigger()
            call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL, null)
            call TriggerAddAction(trig, function MeleeTriggerActionConstructCancel) //вот в действии много чего намусолено

            // Устанавливаем триггер для срабатывания всякий раз, когда здание умирает у этого игрока.
            // Короче можно сделать счетчик на кол-во здании у каждого игрока. Если умирает значит -1
            set trig = CreateTrigger()
            call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_DEATH, null)
            call TriggerAddAction(trig, function MeleeTriggerActionUnitDeath) //вот в действии много чего намусолено

            // Устанавливаем триггер для срабатывания всякий раз, когда устройство начинает строительство для этого игрока
            // Короче можно сделать счетчик на кол-во здании у каждого игрока. Если завершает значит +1
            set trig = CreateTrigger()
            call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
            call TriggerAddAction(trig, function MeleeTriggerActionUnitConstructionStart) //вот в действии много чего

            // Установите триггер, который будет срабатывать, когда игрок проиграет
            set trig = CreateTrigger()
            call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_DEFEAT)
            call TriggerAddAction(trig, function MeleeTriggerActionPlayerDefeated)

            // Устанавливаем триггер, когда он уходит из игры
            set trig = CreateTrigger()
            call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
            call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)

            // Установите триггер, чтобы он срабатывал всякий раз, когда этот игрок меняет свои союзы.
            set trig = CreateTrigger()
            call TriggerRegisterPlayerAllianceChange(trig, indexPlayer, ALLIANCE_PASSIVE)
            call TriggerRegisterPlayerStateEvent(trig, indexPlayer, PLAYER_STATE_ALLIED_VICTORY, EQUAL, 1)
            call TriggerAddAction(trig, function MeleeTriggerActionAllianceChange)
        else

	    //Иначе, если игрок "не играет" скорее всего наблюдатели игры

            set bj_meleeDefeated[index] = true
            set bj_meleeVictoried[index] = false

            // Обработка событий для наблюдателей
            if (IsPlayerObserver(indexPlayer)) then
                // Устанавливаем триггер, когда он уходит из игры
                set trig = CreateTrigger()
                call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
                call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)
            endif
        endif

        set index = index + 1
        exitwhen index == bj_MAX_PLAYERS
    endloop
    
    //Запускаем таймер. Через 2 секунды запускаем тестовую проверку.
    //Тест на победу/поражение при запуске, если пользователь уже выиграл / проиграл. 
    //Просто проверяем играет ли пользователь один, например, если да, то можно вручить ему победу. 
    // Разрешить короткое время, чтобы пройти первым, чтобы карта могла завершить загрузку.
    //Короче проверяем есть ли построенные здания типа ратуши.
    call TimerStart(CreateTimer(), 2.0, false, function MeleeTriggerActionAllianceChange)
endfunction
Лично больше всего не понятно именно эта часть. Как связано и другое. Я бы переписал бы по-другому.
покопался в MeleeInitVictoryDefeat и не обнаружил никакого мультиборда =((
видимо встроен извнутри
знаешь мультибордов можно создать 10-20. Но отобразить игроку можешь только один. Поэтому когда появляется этот мультиборд, покажи снова свой. Единственное, что жаль нельзя удалить этот появившийся мультиборд, ссылки то на него нет. Попробуй последний созданный удалить что ль. Не знаю баг или не баг, а это связано ли с режимом сражения? попробуй отключить MeleeInitVictoryDefeat и проверить без него как работает, просто в этой функции очень много чего напихано, возможно какой-то элемент включает (переменная какая-нибудь)
Еще если союзник ливает, то делай его врагом. И его войска отдаешь себе и все.
Принятый ответ
0
8
6 лет назад
0
У меня нет режима сражения, этого триггера дефолтного тоже нету, триггеры гуишные.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.