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

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

Закрытая тема
 
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Проблема с системой респавна крипов
Есть одна системка респавна крипов бай paskiovich.
Я ее чуток изменил (убрал лишние функции), все вроде было норм:
В конце функции, в которой создаются крипы, добавил вызов функции записи всех крипов в кеш
Код:
call SetCreepRespawnPoints()

Вот сама функция:
» code
Код:
function SetCreepRespawnPoints takes nothing returns nothing
    local group g = CreateGroup()
    local unit u = null
    local string st = ""
    call GroupEnumUnitsOfPlayer(g,Player(12),null)
    loop
        set u = FirstOfGroup(g)
        exitwhen u == null
        set st = I2S(CR_H2I(u))
        call StoreReal(udg_CR,st,"RespawnX",GetUnitX(u))
        call StoreReal(udg_CR,st,"RespawnY",GetUnitY(u))
        call StoreReal(udg_CR,st,"RespawnFacing",GetUnitFacing(u))
        call GroupRemoveUnit(g,u)
    endloop
    call DestroyGroup(g)
    set g = null
endfunction

А вот функция респавна крипов
» code
Код:
function RespawnCreeps takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local string st = I2S(CR_H2I(u))
    local real x = GetStoredReal(udg_CR,st,"RespawnX")
    local real y = GetStoredReal(udg_CR,st,"RespawnY")
    local real f = GetStoredReal(udg_CR,st,"RespawnFacing")
    local integer b = 0
    call TriggerSleepAction(15)
    set b = GetUnitTypeId(u)
    call RemoveUnit(u)
    set u = CreateUnit(Player(12),b,x,y,f)
    set st = I2S(CR_H2I(u))
    call StoreReal(udg_CR,st,"RespawnX",x)
    call StoreReal(udg_CR,st,"RespawnY",y)
    call StoreReal(udg_CR,st,"RespawnFacing",f)
    set u = null
endfunction

Проблема состоит в следующем: в 5 из 13 спавнов крипы не появляются после первой же смерти.
Во всех этих 5 спавнах группы состоят из крипов одинакового типа. Еще в 2 спавнах, которые также состоят из крипов одинакового типа, все нормально. Остальные 6 групп состоят из крипов мешаного типа, и в них респавн происходит нормально.
Вопрос: почему так? т.е. почему в пяти областях крипы не ресаются?

Flareon добавил:
И еще - где лучше задавать вопросы данного рода: в академии или тут?

Отредактировано Flareon, 27.12.2008 в 17:51.
Старый 27.12.2008, 18:26
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Ну же, помогите, оч прошу!
Старый 27.12.2008, 22:39
Toadcop

offline
Опыт: 54,313
Активность:
хмммм.... интересно... вполне реально что у тебя идёт корупт стека хендлов что есть очень плохо...

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

если не проблема дай карту там где у тебя не работает... там уже можно будет смотреть дебагить и т.п.


а не жди =) всё проще я тепрь понял. скорей всего FirstOfGroup() некоректно работет... сейчас (провериш)

Код:
globals
    unit xxx_xgm_u=null
    string xxx_xgm_s=""
    group xxx_xgm_g=CreateGroup()
endglobals

function SetCreepRespawnPointsEnum takes nothing returns boolean
        set xxx_xgm_u=GetFilterUnit()
  if (not IsUnitState(xxx_xgm_u,UNIT_TYPE_DEAD)) then // just for fun =)
        set xxx_xgm_s = I2S(CR_H2I(xxx_xgm_u))
        call StoreReal(udg_CR,xxx_xgm_s,"RespawnX",GetUnitX(xxx_xgm_u))
        call StoreReal(udg_CR,xxx_xgm_s,"RespawnY",GetUnitY(xxx_xgm_u))
        call StoreReal(udg_CR,xxx_xgm_s,"RespawnFacing",GetUnitFacing(xxx_xgm_u))
  endif
    return false
endfunction

function SetCreepRespawnPoints takes nothing returns nothing

    call GroupEnumUnitsOfPlayer(xxx_xgm_g,Player(12),Condition(function SetCreepRespawnPointsEnum))

endfunction
Старый 28.12.2008, 01:30
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Toadcop, проверил
во-первых у меня нету jngp, чтоб я мог обьявлять глобалки де попало. ну ладно, с этим я разобрался.
а во-вторых крипы снова не респавнятся, и опять же только на пяти спавнах, остальные работают норм.

Flareon добавил:
хм... а могут ли другие триггеры влиять на это?
Старый 28.12.2008, 13:47
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
local integer b = 0
call TriggerSleepAction(15)
set b = GetUnitTypeId(u)
во первых, запоминай тип юнита не через время, а сразу, птомучто потом вероятно юнит может и самоудалится из игры...
во вторых, вроде все норм, должно работать...
в третьих, дебажи все переменые на тех юнитах что не работает и смотри что не так...
Старый 28.12.2008, 13:58
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
во-первых при перенесении set b = GetUnitTypeId(u) на одну строчку вверх все заработало!
во-втрорых Жон, ты гений! =)

я вспомнил, что у меня в карте время разложения костей - 11 секунд, т.е. получается что за 15 секунд юнит уже испарился, и респавнить уже некого, т.к. неизвестен тип умершего юнита.
а в остальных спавнах получается норм, поскольку анимация смерти проигрывается более 4 секунд, верно? ведь таймер ремува юнита запускается по окончании проигрывания анимации decay, если я не ошибаюсь.

Flareon добавил:
воспрос исчерпан (вроде как). всем спасибо за внимание! тему можно закрыть.
Старый 28.12.2008, 14:11
Закрытая тема

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

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

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

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



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