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

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

Ответ
 
sleepw

offline
Опыт: 8,449
Активность:
респаун - проблемма
вот скрипт:
» respawn

Код:
//---Options---

constant function CreepRespawn_Delay takes nothing returns real
    return 10.0   //The duration (in seconds) after dying creeps respawn.
endfunction

constant function CreepRespawn_VisibilityBlock takes nothing returns boolean
    return false   //If this is set to true, creep respawn will be delayed until
                  //none of the players observe the spawning point.
                  //(So none of the players can see the creeps spawning.)
endfunction

constant function CreepRespawn_NumberOfSpawns takes nothing returns integer
    return 1      //This defines the number of creeps that will spawn after one died.
endfunction

constant function CreepRespawn_SpawnRandomFromLevel takes nothing returns boolean
    return false  //If set to true, a same-level random creep will spawn.
endfunction



//---Creep Respawn System---

function CR_H2I takes handle h returns integer
    return h
    return 0
endfunction

function SetCreepRespawnPoints takes nothing returns nothing
    local group g = CreateGroup()
    local unit u = null
    local string s = ""
    call GroupEnumUnitsOfPlayer(g,Player(12),null)
    loop
        set u = FirstOfGroup(g)
        call GroupRemoveUnit(g,u)
        exitwhen u == null
        set s = I2S(CR_H2I(u))
        call StoreReal(udg_CR,s,"RespawnX",GetUnitX(u))
        call StoreReal(udg_CR,s,"RespawnY",GetUnitY(u))
        call StoreReal(udg_CR,s,"RespawnFacing",GetUnitFacing(u))
    endloop
    call DestroyGroup(g)
    set g = null
endfunction

function RespawnCreeps takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local string s = I2S(CR_H2I(u))
    local real x = GetStoredReal(udg_CR,s,"RespawnX")
    local real y = GetStoredReal(udg_CR,s,"RespawnY")
    local real f = GetStoredReal(udg_CR,s,"RespawnFacing")
    local integer a = 0
    local integer b = 0
    local integer c = 0
    call TriggerSleepAction(CreepRespawn_Delay())
    if CreepRespawn_VisibilityBlock() then
        loop
            loop
                exitwhen a > 11
                if not IsVisibleToPlayer(x,y,Player(a)) then
                    set c = c + 1
                endif
                set a = a + 1
            endloop
            exitwhen c > 11
            set a = 0
            set c = 0
            call TriggerSleepAction(10)
        endloop
        set a = 0
    endif
    set c = GetUnitLevel(u)
    set b = GetUnitTypeId(u)
    call RemoveUnit(u)
    loop
        exitwhen a >= CreepRespawn_NumberOfSpawns()
        if CreepRespawn_SpawnRandomFromLevel() then
            set u = CreateUnit(Player(12),ChooseRandomCreep(c),x,y,f)
        else
            set u = CreateUnit(Player(12),b,x,y,f)
        endif
        set s = I2S(CR_H2I(u))
        call StoreReal(udg_CR,s,"RespawnX",x)
        call StoreReal(udg_CR,s,"RespawnY",y)
        call StoreReal(udg_CR,s,"RespawnFacing",f)
        set a = a + 1
    endloop
    set u = null
endfunction

//===========================================================================
function InitTrig_CreepRespawn takes nothing returns nothing
    set udg_CR = InitGameCache("CR")
    call SetCreepRespawnPoints()
    set gg_trg_CreepRespawn = CreateTrigger()
    call TriggerRegisterPlayerUnitEvent(gg_trg_CreepRespawn, Player(12), EVENT_PLAYER_UNIT_DEATH, null)
    call TriggerAddAction(gg_trg_CreepRespawn, function RespawnCreeps)
endfunction

проблемма следующая.
поставил для теста героев (нейтрально враждебные) и крипов(нейтрално враждебные)
респаунятся только герои О_О что может быть за чудо такое?

sleepw добавил:
ps.
на чистой карте этот же скрипт работает как по маслу..

sleepw добавил:
в чём трабл понял.
в скрипте есть чтото про Player 12 у меня этот плеер занят игроком. в этом трабл может быть?

sleepw добавил:
эх.. не дело не в этом потестил.. что ещё может быть?
Старый 02.01.2008, 15:16
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Скрипт работает следующим образом:
При инициализации триггера (загрузке карты), для каждого юнита принадлежащего 13 игроку (по дефолту Neutral Hostile), сохраняются его координаты и направление, это делается в функции SetCreepRespawnPoints.
Далее создается триггер с событием срабатывания - Смерть юнита принадлежащего 13 игроку.
При срабатывании триггера запускается функция RespawnCreeps, которая извлекает сохраненые координаты умершего юнита, ждет какое то время, делает проверку на видимость точки где респавнится крип для всех игроков (хотя в данном случае проверка отключена) и потом если проверку успешна создает крипов.

Проверь принадлежат ли крипы 13 игроку. Если крипы расставляются триггерами уже после загрузки карты, то данный скрипт работать не будет.
Старый 02.01.2008, 16:22
sleepw

offline
Опыт: 8,449
Активность:
нет крипы стоят изначально..
а как проверить?:(

sleepw добавил:
зы. и что я мог такого сделать на карте чтобы скрипту чтото мешало?.. если на чистой карте всё пашет.. хотя потом начал крутить эту самую "чистую карту" и после того как я сделал кланы и фиксирование игроков скрипт перестал работать...

как же быть ?(

sleepw добавил:
Всё я точно понял проблемму!

когда ставится
Сценарий - Свойства игрока - Кланы """Фикс. параметры игрока""",перестаёт работать скрипт!.
Как поступить в даной ситуации?... фиксирование мне чрезвычайно необходимо!

sleepw добавил:
exploder
Зы. и зачем вообще проверять?.. герои вить спаунятся,а они тоже были нейтрально-враждебными..

sleepw добавил:
тут трабл дето в другом..

sleepw добавил:
работает всё.. непойму что я сделал:)

хотелось бы узнать О_О
Старый 02.01.2008, 19:11
Harakternyk

offline
Опыт: 2,703
Активность:
exploder, этот script будет работать и тогда, кода creep-ы будут создаваться после иннициации карты, однако, местом их последующего respawn-а будет точка гибели последнего creep-а.

Чтобы всё работало корректно нужно задёствовать функцию SetCreepRespawnPoints с момента первичного создания creep-ов (т.е. триггер, их создающий, должен вызывать эту функцию после создания оных, однако, чтобы не нарушить место respawn-а ранее созданных другими триггерами creep-ов, нужно будет адаптировать эту функцию под юнитов, создаваемых конкретным триггером ).

sleepw, проблема решалась довольно просто: для корректной работы системы нужно перенести задержку respawn-a в место после определения значений локальных переменных "c" и"b". Это связано с тем, что функция задержки ( TriggerSleepAction( r ), равно как и PolledWait( r ) ) прерывает дальнейшие присвоения значений тем локальным переменным, которые устанвливались до её задействования (см. вложение к этому посту).

Замечание (!): Однако, эта проблема не имеет место, если creep-ом является герой. Пока не знаю почему так, но может разберусь позже.

Просьба (!): Если кто-нибудь знает, по какой причинe эта ошибка не действует на героев, то напишите об этом в этой теме, пожалуйста (думаю, что ответ на этот вопрос будет интересен не только мне и автору данной темы, но и другим картостроителям). Заранее спасибо!
Прикрепленные файлы
Тип файла: w3x Respawn fixing.w3x (15.8 Кбайт, 18 просмотров )

Отредактировано Harakternyk, 03.01.2008 в 15:45.
Старый 03.01.2008, 15:07
sleepw

offline
Опыт: 8,449
Активность:
зы и просто интересно ещё.. зачем ставить там вот наприер a=1 и в какихто функциях значения player 12+a
не легче было там просто написать плеер 13?:)
Старый 03.01.2008, 15:27
Harakternyk

offline
Опыт: 2,703
Активность:
sleepw, читай код внимательней!

Переменная а создаётся только в основной функции действия триггера по respawn-у и задействуется для проверки того, находится ли точка respawn-а в поле зрения какого-либо игрока, чтобы "воскрешать" creep-ов только тогда, когда точка их "возрождения" будет в поле зрения соответствующего игрока. Обрати внимание, что проверка заканчивается тогда, когда а становится больше, либо равно 11,т.е. 12-му игроку (да, да, не удивляйся, объясню далее ), т.к. в jass-е индексирование игроков начинается не с "1", а с "0", поэтому 12-й игрок в редакторе триггеров, это 11 в jass-script-е. Соответственно 12 в этом script-е будет 13-м в упомянутом редакторе, т.е. "нетрально-враждебным". Надеюсь, что ты всё понял. Успехов тебе в картостроительстве!
Старый 03.01.2008, 15:39
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Цитата:
exploder, этот script будет работать и тогда, кода creep-ы будут создаваться после иннициации карты, однако, местом их последующего respawn-а будет точка гибели последнего creep-а.

Этой точкой будет т.(0, 0), хотя не суть... под "работой" я иммел ввиду корректную работу триггера.
---
По-моему скрипт легче переписать с нуля... Вместо убогой TriggerSleepAction() лучше воспользоватся таймером...
Старый 03.01.2008, 18:43
sleepw

offline
Опыт: 8,449
Активность:
Цитата:
Сообщение от Harakternyk
sleepw, читай код внимательней!

Переменная а создаётся только в основной функции действия триггера по respawn-у и задействуется для проверки того, находится ли точка respawn-а в поле зрения какого-либо игрока, чтобы "воскрешать" creep-ов только тогда, когда точка их "возрождения" будет в поле зрения соответствующего игрока. Обрати внимание, что проверка заканчивается тогда, когда а становится больше, либо равно 11,т.е. 12-му игроку (да, да, не удивляйся, объясню далее ), т.к. в jass-е индексирование игроков начинается не с "1", а с "0", поэтому 12-й игрок в редакторе триггеров, это 11 в jass-script-е. Соответственно 12 в этом script-е будет 13-м в упомянутом редакторе, т.е. "нетрально-враждебным". Надеюсь, что ты всё понял. Успехов тебе в картостроительстве!

спс... :)
Старый 03.01.2008, 20:13
Ответ

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

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

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

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



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