XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Zahanc

offline
Опыт: 23,017
Активность:
Количество предметов в магазине равно нулю.
Постараюсь быть лаконичным. Я хочу сделать следующие: при постройке определенного здания (далее "Аптека"), в магазинах игрока-владельца все предметы типа А заменяются на предметы типа Б. Если все Аптеки игрока были уничтожены, предметы меняются обратно. Это было достигнуто следующим кодом, который в принципе рабочий.
function Trig_Init_Point_Items_Availability_Conditions takes nothing returns boolean
    if GetUnitTypeId(GetTriggerUnit()) == 'ugol' or GetUnitTypeId(GetTriggerUnit()) == 'ovln' then
        call SetPlayerTechMaxAllowed( GetOwningPlayer(GetTriggerUnit()), 'pghe',-1 )   
        call SetPlayerTechMaxAllowed( GetOwningPlayer(GetTriggerUnit()), 'pgma',-1 )
        call SetPlayerTechMaxAllowed( GetOwningPlayer(GetTriggerUnit()), 'phea',-1 )   
        call SetPlayerTechMaxAllowed( GetOwningPlayer(GetTriggerUnit()), 'pman',-1 )
        return true
    else
        return false
    endif
endfunction

function Trig_Init_Point_Items_Availability_Actions takes nothing returns nothing
    local unit a = GetTriggerUnit()
    local integer i = CountLivingPlayerUnitsOfTypeId('ovln', GetOwningPlayer(a))
    
    if i > 0 then
        call SetPlayerTechMaxAllowed( GetOwningPlayer(a), 'pghe',-1 )   
        call SetPlayerTechMaxAllowed( GetOwningPlayer(a), 'pgma',-1 )
        call SetPlayerTechMaxAllowed( GetOwningPlayer(a), 'phea', 0 )   
        call SetPlayerTechMaxAllowed( GetOwningPlayer(a), 'pman', 0 )
    else
        call SetPlayerTechMaxAllowed( GetOwningPlayer(a), 'pghe', 0 )   
        call SetPlayerTechMaxAllowed( GetOwningPlayer(a), 'pgma', 0 )
        call SetPlayerTechMaxAllowed( GetOwningPlayer(a), 'phea',-1 )   
        call SetPlayerTechMaxAllowed( GetOwningPlayer(a), 'pman',-1 )
    endif
    
    set a = null
endfunction

//===========================================================================
function InitTrig_Init_Point_Items_Availability takes nothing returns nothing
    set gg_trg_Init_Point_Items_Availability = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Init_Point_Items_Availability, EVENT_PLAYER_UNIT_DEATH )
    call TriggerRegisterEnterRectSimple( gg_trg_Init_Point_Items_Availability, GetPlayableMapRect() )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Init_Point_Items_Availability, EVENT_PLAYER_UNIT_CONSTRUCT_FINISH )
    call TriggerAddCondition( gg_trg_Init_Point_Items_Availability, Condition( function Trig_Init_Point_Items_Availability_Conditions ) )
    call TriggerAddAction( gg_trg_Init_Point_Items_Availability, function Trig_Init_Point_Items_Availability_Actions )
endfunction
Но есть одно большое НО. Если предметы не были инициализированы в магазине изначально, то при изменении доступности новые предметы появляются с количеством зарядов 0 и не перезаряжаются. Надеюсь понятно объяснил.
Вопрос - как это обойти, не меняя общую концепцию? Понятно, что это баг вара. У меня только одна идея - отказаться от динамичности и сделать через апгрейд.
Я пробовал следующие: в условии, перед тем как вернуть true, я делаю доступными все предметы, а потом, в действиях, уже устанавливаю нужную доступность. Я думал, что это позволит предметам в магазине инициализироваться, а значит решить проблему. Но нет, полностью проблему это не решило.
На всякий случай поясняю что в событиях. Триггер запускается, если магазин был уничтожен или построен, или если Аптека была уничтожена или построена.
Старый 22.06.2012, 03:17
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,595
Активность:
bladget, при отбавлении ставь кол во зарядов 3 (или сколько там надо), а потом опять 0, мб прокатит...
Старый 22.06.2012, 10:21
Zahanc

offline
Опыт: 23,017
Активность:
Какой функцией?
Старый 22.06.2012, 19:04
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,595
Активность:
bladget, call SetPlayerTechMaxAllowed( GetOwningPlayer(a), 'pman',3 ) вот так пробовал?
Старый 22.06.2012, 19:11
Zahanc

offline
Опыт: 23,017
Активность:
Тогда будет установлен лимит предмета типа 'pman' равным 3. Эта функция вообще используется для лимитирования войск, но я использую её для предметов.
Но я попробую. Чем чёрт не шутит?
Старый 22.06.2012, 19:13
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,595
Активность:
bladget, ну и потом триггерно добавляй и всё потом опять сделай -1....
Старый 22.06.2012, 19:14
Zahanc

offline
Опыт: 23,017
Активность:
Да детка! Это решается, если открыть доступ ко всем предметам ДО того как магазин начнет строится (например, отлавливая приказ о строительстве), а когда строительство начнется, возвращать зависимости как задумано!
Правда, тогда все предметы на долю секунды появятся в других магазинах, но думаю время можно сократить. Да это и не смертельно.
P.S. Господа модераторы, пожалуйста, закройте тему и удалите лишние сообщения.
Старый 26.06.2012, 07:09
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 03:33.