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

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

Ответ
 
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
return SetRect(r , GetUnitX(u) - width * 0.5 , GetUnitY(u) - height * 0.5 , GetUnitX(u) + width * 0.5 , GetUnitY(u) + height * 0.5)
выдаёт ошибку
Старый 13.01.2009, 17:06
alexkill

offline
Опыт: 19,072
Активность:
Потому что SetRect не возвращает регион, как задано в функции.
Старый 13.01.2009, 17:10
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
alexkill Извини конечно... я понимаю эту попытку обьяснить мне причину ошибки.... но как это исправить тогда?:) Заменить SetRect на что-то?)
Старый 13.01.2009, 17:26
alexkill

offline
Опыт: 19,072
Активность:
Код:
globals
  integer c = 0
endglobals

function Filt takes nothing returns boolean
   return GetUnitTypeId(GetFilterUnit()) == 'u000'
endfunction

function Enum takes nothing returns nothing
   set c = c + 1
endfunction

function Trig_SpawnGhoul_Conditions takes nothing returns boolean
   return CountLivingPlayerUnitsOfTypeId('u000', Player(11)) < 100
endfunction

function Trig_SpawnGhoul_Actions takes nothing returns nothing
   local rect rct = null
   local real x 
   local real y 
   local integer i
   local integer r = 0
   local group g = CreateGroup()
     
     loop
        exitwhen r>=udg_num
           if udg_Marine[r]!=null then
             set rct = Rect(GetUnitX(udg_Marine[r])-2000,GetUnitY(udg_Marine[r])-2000,GetUnitX(udg_Marine[r])+2000,GetUnitY(udg_Marine[r])+2000)
             set x = GetRandomReal(GetRectMinX(rct),GetRectMaxX(rct))
             set y = GetRandomReal(GetRectMinY(rct),GetRectMaxY(rct))
             set i = 0
             
              loop
                set i = i + 1
                  call CreateUnit(Player(11),'u001',x,y,270.)
                exitwhen i==4
              endloop
    
           endif
        
        set r = r + 1
      endloop

   call RemoveRect(rct)
   set rct = null
   
   call GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, Filter(function Filt))
   call ForGroup(g,function Enum)
   
    if c<=12 then
      call BJDebugMsg(I2S(c))
      set x = GetRandomReal(GetRectMinX(gg_rct_ZombieSpaw3),GetRectMaxX(gg_rct_ZombieSpaw3))
      set y = GetRandomReal(GetRectMinY(gg_rct_ZombieSpaw3),GetRectMaxY(gg_rct_ZombieSpaw3))
      call CreateUnit(Player(11),'u000',x,y,270.)
    endif
    
    set c = 0 
    
    call DestroyGroup(g)
    set g = null
endfunction

//===========================================================================
function InitTrig_SpawnGhoul takes nothing returns nothing
    set gg_trg_SpawnGhoul = CreateTrigger(  )
    call DisableTrigger( GetTriggeringTrigger() )
    call TriggerRegisterTimerEvent(gg_trg_SpawnGhoul, 2.00, true)
    call TriggerAddCondition( gg_trg_SpawnGhoul, Condition( function Trig_SpawnGhoul_Conditions ) )
    call TriggerAddAction( gg_trg_SpawnGhoul, function Trig_SpawnGhoul_Actions )
endfunction

Ranger21, если будет время, подкорректирую код, избавив от утечки-группы в функции CountLivingPlayerUnitsOfTypeId. А так подкорректировал.

Отредактировано alexkill, 14.01.2009 в 15:59.
Старый 13.01.2009, 17:30
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
alexkill Аааа......извини... туплю!)))))))

Я незнаю почему там было написанно Disable Trigger.... это вообще не нужно...удалил...

Всё работает... спасибо:), пойду тестить со всеми игроками
Старый 13.01.2009, 17:41
alexkill

offline
Опыт: 19,072
Активность:
сорри, забыл спросить: u000, u001 - на основе кого делал? у меня просто проверка была на пехотинцев )
Старый 13.01.2009, 17:45
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Почему триггер работает если играет 1ый игрок ток? u001 ghoul, u000 - necromancer

Просто каким образом я проверяю - играю на месте 3-4-5-6 игрока....

Или этот триггер требует обязательного наличия 1ого игрока, но если в игре будут находиться Marine кроме первого игрока около них будут создаваться зомби?

Впринципе у меня в мапе первый игрок выбирает сложность... а без выбора сложности игра не начнётся...:), но я правильно спрашиваю?

Ranger21 добавил:
Тригер работает только с первым игроком... + создаётся больше 12 некромансеров... хотя на карте не должно быть больше 12 некромансеров =(.
То что он работает без висяков это хорошо... но вот это уже влияет на баланс карты

Отредактировано Ranger21, 13.01.2009 в 18:07.
Старый 13.01.2009, 18:15
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
кстати, предыдущий комментатор полностью убрал мою оптимизацию по ректам ^^

try this, son
» раскрыть
Код:
function Trig_SpawnGhoul_Conditions takes nothing returns boolean
    return CountLivingPlayerUnitsOfTypeId('u001', Player(11)) < 100
endfunction

function Trig_SpawnGhoul_Actions takes nothing returns nothing
    local rect rct = Rect(0,0,0,0)
    local real x = 0
    local real y = 0
    local integer i = 0
    local integer r = 0
    
    loop
        exitwhen r>=udg_num
        if udg_Marine[r]!=null then
            call SetRect(rct,GetUnitX(udg_Marine[r])-2000,GetUnitY(udg_Marine[r])-2000,GetUnitX(udg_Marine[r])+2000,GetUnitY(udg_Marine[r])+2000)
            set x = GetRandomReal(GetRectMinX(rct),GetRectMaxX(rct))
            set y = GetRandomReal(GetRectMinY(rct),GetRectMaxY(rct))
            
            set i = 0
            loop
                set i = i + 1
                call CreateUnit(Player(11),'u001',x,y,270.)
                exitwhen i>=4
            endloop
            
        endif

        set r = r + 1
    endloop
    

    if CountUnitsInGroup(GetUnitsOfTypeIdAll('u000')) < 12 then
        set x = GetRandomReal(GetRectMinX(gg_rct_ZombieSpaw3),GetRectMaxX(gg_rct_ZombieSpaw3))
        set y = GetRandomReal(GetRectMinY(gg_rct_ZombieSpaw3),GetRectMaxY(gg_rct_ZombieSpaw3))
        call CreateUnit(Player(11),'u000',x,y,270)
    endif
    
    call RemoveRect(rct)
endfunction

//===========================================================================
function InitTrig_SpawnGhoul takes nothing returns nothing
    set gg_trg_SpawnGhoul = CreateTrigger(  )
    call TriggerRegisterTimerEvent( gg_trg_SpawnGhoul, 2.00, true )
    call TriggerAddCondition( gg_trg_SpawnGhoul, Condition( function Trig_SpawnGhoul_Conditions ) )
    call TriggerAddAction( gg_trg_SpawnGhoul, function Trig_SpawnGhoul_Actions )
endfunction
Старый 13.01.2009, 18:30
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Может у кого-нибудь есть пример мапы, где играющие юниты-герои заносятся в переменную (их должно быть 6 или больше) и в регионе 4000 на 4000(Настраиваемо) который центрируется по этим юнитам из переменной должны респавниться зомби ( Количество желательно, чтобы тоже менялось... в самом триггере)

Причём если 1ый игрок не играет... то есть переменная с его юнитом - пустая, а играет какой-нибудь там 6 или 9ый игрок - то зомби будут создаваться вокруг него...:) так же как около игрока первого... если бы он играл.

Короче говоря.... чем больше народу - тем больше зомби должно создаваться вокруг героев которыми они играют.

Ranger21 добавил:
Van Damm
Спасибо.... наконец-то работает так как надо!)))))))))

Кстати я насчёт дисейбл триггер перемудрил.... я насток запутался в тестах мапы... что отрубал другие триггеры ... и нечайно удалил включение этого триггера в другом триггере... так что он изначально должен быть задисейблен)))... иначе зомби загрызают юнита во время заставки)...но это я уже сам добавил...

Протестил на 1ом и на 6ом игроке... у обоих зомби создаются правильно и рядом с ними в районе 4000x4000 :).

Спасибо огромное...эх ... я явно нуб в джассе...единственное умение - спрашивать =)

УРА!=)
Старый 13.01.2009, 18:44
alexkill

offline
Опыт: 19,072
Активность:
Ranger21, я только сейчас понял, что вышенаписанные коды не годятся для мультиплеера. ) чуть позже выложу рабочий код.

Отредактировано alexkill, 14.01.2009 в 14:47.
Старый 14.01.2009, 13:12
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
alexkill Извини... почему не годятся? Код Van Damm'a работает в мультиплеере...

Причём... чем больше игроков - тем больше зомби.

Что не так то?=) Или они могут вызвать десинк? Диссконект(
Старый 14.01.2009, 15:28
alexkill

offline
Опыт: 19,072
Активность:
Ты ж вроде заботился об утечках? или уже не нужно? )
Я обновил свой пост с кодом.
Старый 14.01.2009, 16:04
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
alexkill Я об утечках заботился, но мне же одновременно нужна нормальная работа триггера... чтобы он выполнял свою функцию...
Старый 14.01.2009, 16:21
alexkill

offline
Опыт: 19,072
Активность:
Ranger21. Для этого и нужно смотреть цитаты в строках. ) Теперь я тебе исправил по твоим требованиям - должно работать.
Старый 14.01.2009, 16:28
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
alexkill Так чей код лучше...?)
Старый 14.01.2009, 16:43
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Я наверно задал слишком сложный философкий вопрос=)
Старый 14.01.2009, 23:58
alexkill

offline
Опыт: 19,072
Активность:
Ranger21, на любителя. Хочешь использовать глобалки (они будут висеть всю игру, даже если их использование не потребуется) - код VD, любишь локалки - мой код. Я предпочитаю обходиится без глобальных переменных там, где это возможно.
Старый 15.01.2009, 13:56
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
alexkill в данном случае так оптимальнее. Все равно эта функция не может использоваться одновременно в двух местах, тогда глобалками удобнее
Старый 15.01.2009, 17:46
Ответ

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

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

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

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



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