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

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

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

offline
Опыт: 23,017
Активность:
Юниты не добавляються в группу (хэш)
Я сейчас наверное многих насмешу или напугаю, но вот код:
function Trig_Capture_Village_Conditions takes nothing returns boolean
return GetUnitTypeId(GetConstructedStructure()) == 'ugol'
endfunction

function Rescue_Village_Buildings takes nothing returns nothing
    local unit b = GetConstructedStructure()
    local integer h = GetHandleId(b)
    local group villagebuildings = LoadGroupHandle(udg_hash, h, StringHash("villagebuildings"))
    local unit E = GetEnumUnit()
    local integer newbarracks
    local integer newshop
//Установка id новых зданий
    call DisplayTextToForce( GetPlayersAll(), "Rescue_Village_Buildings" )
    if IsPlayerInForce(GetOwningPlayer(b), udg_Alliance) == true then
        set newbarracks = 'hbar'
        set newshop = 'hvlt'
    endif
    if IsPlayerInForce(GetOwningPlayer(b), udg_Scourge) == true then
        set newbarracks = 'usep'
        set newshop = 'utom'
    endif
//Замена и изменение владельца зданий.
    if GetUnitTypeId(E) == 'hbar' or GetUnitTypeId(E) == 'usep' then
        set E = ReplaceUnitBJ(E, newbarracks, bj_UNIT_STATE_METHOD_MAXIMUM)
        call GroupAddUnitSimple( E, villagebuildings )
        call DisplayTextToForce( GetPlayersAll(), "Бараки заменили" )
    endif
    if GetUnitTypeId(E) == 'hvlt' or GetUnitTypeId(E) == 'utom' then
        set E = ReplaceUnitBJ(E, newshop, bj_UNIT_STATE_METHOD_MAXIMUM)
        call GroupAddUnitSimple( E, villagebuildings )
        call DisplayTextToForce( GetPlayersAll(), "Шопы заменили" )
    endif
    call AddSpecialEffectTargetUnitBJ( "overhead", E, "Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" )
    call RescueUnitBJ(E, GetOwningPlayer(b), true)
    call SaveGroupHandle(udg_hash, h, StringHash("villagebuildings"), villagebuildings)
    call DisplayTextToForce(GetPlayersAll(), ( "В отряде после спасения " + I2S(CountUnitsInGroup(villagebuildings))))
    set E = null
    set b = null
    set villagebuildings = null
endfunction

function Create_Village_Hash takes nothing returns nothing
local unit b = GetConstructedStructure()
local unit E = GetEnumUnit()
local integer h = GetHandleId(b)
local group villagebuildings = CreateGroup()
//Добавление юнитов определенного типа в хеш.
if GetUnitTypeId(E) == 'ntow' or GetUnitTypeId(E) == 'hbar' or GetUnitTypeId(E) == 'hvlt' or GetUnitTypeId(E) == 'usep' or GetUnitTypeId(E) == 'utom' then
    call GroupAddUnitSimple( E, villagebuildings )
endif
call SaveGroupHandle(udg_hash, h, StringHash("villagebuildings"), villagebuildings)
call DisplayTextToForce(GetPlayersAll(), ( "В отряде при его создании " + I2S(CountUnitsInGroup(villagebuildings))))
call ForGroupBJ(villagebuildings, function Rescue_Village_Buildings )
set E = null
set b = null
set villagebuildings = null
endfunction

function Trig_Capture_Village_Actions takes nothing returns nothing
    local unit b = GetConstructedStructure()
    local unit flag
    local integer h = GetHandleId(b)
    local integer flagtype
    local integer creep
    local group villagebuildings = LoadGroupHandle(udg_hash, h, StringHash("villagebuildings"))
//Изменение тумана, создание флага и добавление особых способностей точке. Это непосредственно к
//проблеме не относится.
    if IsPlayerInForce(GetOwningPlayer(b), udg_Alliance) == true then
        set flagtype = 'alli'
        set creep = 'Abdl'
        set udg_Fog = ( udg_Fog + 500.00 )
    endif
    if IsPlayerInForce(GetOwningPlayer(b), udg_Scourge) == true then
        set flagtype = 'scou'
        set creep = 'Abgl'
        set udg_Fog = ( udg_Fog - 500.00 )
    endif
    call UnitAddAbilityBJ( creep, b )
    set flag = CreateUnit(GetOwningPlayer(b), flagtype, GetUnitX(b), GetUnitY(b), 270.0)
    call SaveUnitHandle(udg_hash, h, StringHash("flag"), flag)
    call SetTerrainFogExBJ( 0, udg_Fog, 7000.00, 50.00, 80.00, 40.00, 10.00 )
//Проверка количества юнитов в группе их делание в зависимости от этого действий.
    if CountUnitsInGroup(villagebuildings) == 0 then
        call ForGroupBJ( GetUnitsInRangeOfLocAll(10000.00, GetUnitLoc(b)), function Create_Village_Hash )
        call DisplayTextToForce(GetPlayersAll(), ( "В отряде при запуске (тру) " + I2S(CountUnitsInGroup(villagebuildings))))
    else
        call ForGroupBJ(villagebuildings, function Rescue_Village_Buildings )
        call DisplayTextToForce(GetPlayersAll(), ( "В отряде при запуске (фэлс) " + I2S(CountUnitsInGroup(villagebuildings))))
    endif
    set b = null
    set flag = null
    set villagebuildings = null
endfunction

//===========================================================================
function InitTrig_Capture_Village takes nothing returns nothing
    set gg_trg_Capture_Village = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Capture_Village, EVENT_PLAYER_UNIT_CONSTRUCT_FINISH )
    call TriggerAddCondition( gg_trg_Capture_Village, Condition( function Trig_Capture_Village_Conditions ) )
    call TriggerAddAction( gg_trg_Capture_Village, function Trig_Capture_Village_Actions )
endfunction
Этот код, по задумке, должен изображать универсальную системку захвата територии. Работает так: при завершении постройки определенного здания из хэша загружается отряд, в котором записаны все юниты подлежащие смене владельца и над ними проводятся нужные действия. Если юнитов в группе 0, то вызвается функция, которая в радиусе 10000 от построенного здания пикает всех юнитов, проверяет их тип, а затем добавляет нужных в группу и только потом меняет владельца (самое смешное, что юнитов в группе всегда ноль почему-то). Это кое-как работает, владелец меняется.
Если здание уничтожают, то опять-же загружается из хэша отряд и юнитам в нём меняют владельца на нейтрального пасивного (это в другом триггере, я его не выкладываю тут).
Проблема в том, что почему-то юниты то-ли не добавляються в группу, то-ли обнуляются, то-ли загружается не та группа. Хз в чем дело, но при уничтожении здания я нехитрым способом проверяю количество юнитов в группе и мне торжественно объявляют что их 0. (хотя сопутствующие действия, вроде удаления даммика, в том же триггере работают). Что мне делать?
Старый 18.03.2012, 19:30
Msey
????
offline
Опыт: 67,346
Активность:
могу только посоветовать сделать через массив, а не хеш
Старый 18.03.2012, 22:21
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Оптимизируй код и тогда проще будет
как делаются группы без BJ
((кат Конструкция
local group g = CreateGroup()
local boolexpr b = Condition(function Check)
call GroupEnumUnitInRange(g,x,y,Range,b)
call ForGroup(g,function Actions) //Или через FirstofGroup
call DestroyGroup(g)
call DestroyBoolexpr(b)
set g = null
set b = null
))
Старый 18.03.2012, 23:23
Zahanc

offline
Опыт: 23,017
Активность:
Вообще-то именно этого я делать не хотел (сначала я делал через глобалки), но если другого выбора нет...
Я попробую.
bladget добавил:
Klop:
call ForGroup(g,function Actions)
Klop:
>Или через FirstofGroup
Кстати, в чем преимущество этих вариантов друг над другом?
Старый 19.03.2012, 03:45
ScorpioT1000
Работаем
offline
Опыт: отключен
Второй быстрее и не надо передавать переменные в левые функции.
Старый 19.03.2012, 04:12
Zahanc

offline
Опыт: 23,017
Активность:
Вообщем я решил отказаться от этой задумки - слишком все это громоздко и уродливо.
Тему можна закрыть.
Старый 20.03.2012, 20:08
Закрытая тема

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

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

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

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



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