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

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

Закрытая тема
 
NIKZ
Изучаю Jass
offline
Опыт: 6,036
Активность:
Помогите с кодом
Помогите с этим кодом?
((код jass
scope Respawn initializer Init
private function Revive takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=GetDyingUnit()
local location p=GetRectCenter(GetPlayableMapRect())
call ReviveHeroLoc(u, p, false)
call RemoveLocation(p)
set p = null
set u = null
endfunction
private function Conditions takes nothing returns boolean
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true
endfunction
private function Actions takes nothing returns nothing
local timer t=CreateTimer()
call TimerStart(t, 2.0, false, function Revive)
endfunction
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( t, Condition( function Conditions ) )
call TriggerAddAction( t, function Actions )
endfunction
endscope
))
Старый 10.05.2012, 11:19
Sidhe
Unity3D engine
offline
Опыт: 7,721
Активность:
NIKZ, ты запустил функцию таймером, к которой не привязано действие, соответственно local unit u - вернет значение null, т.к. действие умершего в Action. Cоответственно нужно переносить в другую функцию юнита, привязав к переменной в Actions.

хешем, глобалкой, структурой и т.д.
Старый 10.05.2012, 11:25
NIKZ
Изучаю Jass
offline
Опыт: 6,036
Активность:
((код jass
scope Respawn initializer Init
globals
unit u
endglobals
private function Revive takes nothing returns nothing
local timer t=GetExpiredTimer()
local location p=GetRectCenter(GetPlayableMapRect())
call ReviveHeroLoc(u, p, false)
call RemoveLocation(p)
set p = null
set u = null
endfunction
private function Conditions takes nothing returns boolean
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true
endfunction
private function Actions takes nothing returns nothing
local timer t=CreateTimer()
set u=GetDyingUnit()
call TimerStart(t, 2.0, false, function Revive)
endfunction
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( t, Condition( function Conditions ) )
call TriggerAddAction( t, function Actions )
endfunction
endscope
))
воть, но проблема - воозрождается один игрок
Старый 10.05.2012, 11:31
Sidhe
Unity3D engine
offline
Опыт: 7,721
Активность:
потомучто глобалка одна, после повторного обращения к ней - она перезапишется последним заданным в нее юнитом =)))) вот это - один из примеров не МУИ скила.

вот пример с хешем:
Код:
scope Respawn initializer Init

private function Revive takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local unit u = LoadUnitHandle(HASH, GetHandleId(t), 0) // загрузим нужного юнита из хеша
    local location p=GetRectCenter(GetPlayableMapRect())
    call ReviveHeroLoc(u, p, false)
    call RemoveLocation(p)
    set p = null
    set u = null
endfunction 


private function addActions takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local timer t=CreateTimer()

if IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true then
    call SaveUnitHandle(HASH, GetHandleId(t), u, 0) // сохраняем нужного юнита
    call TimerStart(t, 2.0, false, function Revive)
endif

    set u = null
    set t = null

    return false
endfunction

private function Init takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( t, Condition( function addActions ) )
endfunction

endscope


чтобы юзать хеш, нужно создать глобалку хеша+его инициализировать при старте карты 1 раз.
Код:
globals
hashtable HASH = InitHash()
endglobals



ЗЫ возможно не прально написал в целом, потомучто "на коленке" пишу. проверишь сам в редакторе

Отредактировано Sidhe, 10.05.2012 в 13:09.
Старый 10.05.2012, 11:39
ScorpioT1000
Работаем
offline
Опыт: отключен
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true
для надёжности надо заменить на
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true and IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) != false
» ?
"== true" ВООБЩЕ не должно быть.
Старый 10.05.2012, 12:45
Sidhe
Unity3D engine
offline
Опыт: 7,721
Активность:
ScorpioT1000, походит на параною =))
Старый 10.05.2012, 13:09
DioD

offline
Опыт: 45,134
Активность:
надо проверять на героя и на иллюзию, учите матчасть.

первый же код позорище и школоло, где отладочные сообщения?
Старый 10.05.2012, 15:10
Sidhe
Unity3D engine
offline
Опыт: 7,721
Активность:
DioD, помоему досточно проверить тип юнита, герой в данном случае. Иллюзия насколько я знаю, от любого юнита - считается иллюзией и не более. Могу ошибаться конечно, но такие проверки занудные не делал
Старый 10.05.2012, 15:20
DioD

offline
Опыт: 45,134
Активность:
используй калькулятор люк...

лучше бы взял и проверил, считает он.
Старый 10.05.2012, 15:21
Hanabishi
COOL STATUS
offline
Опыт: отключен
GetRectCenter(GetPlayableMapRect())
Даже если закрыть глаза на использование точек, всё равно кэп как бы намекает, что центр карты находится в координатах (0;0). Не прощё ли написать ReviveHero(u, 0, 0, false), чем делать кучу ненужных действий?
Hanabishi добавил:
Короче, вот как надо:
scope Respawn initializer Init

globals
    private hashtable hash = InitHashtable()
endglobals

private function Revive takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer h = GetHandleId(t)
    call ReviveHero(LoadUnitHandle(hash, h, 1), 0, 0, false)
    call FlushChildHashtable(hash, h)
    call DestroyTimer(t)
    set t = null
endfunction 

private function Conditions takes nothing returns boolean
    return IsUnitType(GetDyingUnit(), UNIT_TYPE_HERO)
endfunction

private function Actions takes nothing returns nothing
    local timer t = CreateTimer()
    call SaveUnitHandle(hash, GetHandleId(t), 1, GetDyingUnit())
    call TimerStart(t, 2.0, false, function Revive)
    set t = null
endfunction

private function Init takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( t, Condition( function Conditions ) )
    call TriggerAddAction( t, function Actions )
endfunction

endscope
Старый 10.05.2012, 15:48
ScorpioT1000
Работаем
offline
Опыт: отключен
всё равно кэп как бы намекает, что центр карты находится в координатах (0;0).
а хер, ты забыл, что границы карты можно сдвигать?
более того, я видел карты с коордсами, заканчивающимися (!) на -16150, т.е. 0,0 - вообще не валидные координаты и приводят к вылету с фаталом.
что бы вы без скорпи делали <3
Старый 10.05.2012, 17:10
NIKZ
Изучаю Jass
offline
Опыт: 6,036
Активность:
Hanabishi, А зачем Хеш инициализировать миллион раз при сметри героя? Можно же в другм триггере создать ее. Или я не понял?
Старый 10.05.2012, 18:36
ScorpioT1000
Работаем
offline
Опыт: отключен
Нет, это инициализация переменной.
Старый 10.05.2012, 18:45
NIKZ
Изучаю Jass
offline
Опыт: 6,036
Активность:
Вобщем я понял так. Хеши используются для того чтобы сохранить переменную как глобальную перменную?
Старый 10.05.2012, 19:02
ScorpioT1000
Работаем
offline
Опыт: отключен
Хеш-таблица используется как мини-база данных.
Старый 10.05.2012, 19:05
Hanabishi
COOL STATUS
offline
Опыт: отключен
NIKZ, лень статьи почитать чтоли? xgm.ru/p/wc3/hashtable
Старый 10.05.2012, 19:16
NIKZ
Изучаю Jass
offline
Опыт: 6,036
Активность:
Hanabishi, Не лень, они не понятливы, хоть там и раписано чуть чуть, но все равно когда читаешь нифига не понимаешь
Старый 10.05.2012, 19:21
ScorpioT1000
Работаем
offline
Опыт: отключен
Старый 10.05.2012, 21:08
NIKZ
Изучаю Jass
offline
Опыт: 6,036
Активность:
Да лан закрывайте)
Старый 10.05.2012, 21:17
Doc

offline
Опыт: 63,163
Активность:
Если непонятно - учи русский язык, в статьях все доступно.
Старый 10.05.2012, 22:36
Закрытая тема

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

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

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

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



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