Вообщем проблема такая. Требуется джассификация гуи кода на перерождение. Он - гадина, я его переделывал раз 10, и всегда одна и та же проблема, в некоторых случаях после смерти героя герой НЕ возраждается. и таймер вместо того что бы хотя бы пропасть (строчка таймера) остается на 0, герой пропадает с панели (удаляется из игры).. собственно помогите решить вопрос. Вот исходный преобразованный в текст ГУИ код.
Code
function Trig_Reviving_Conditions takes nothing returns boolean if ( not ( IsUnitType(GetDyingUnit(), UNIT_TYPE_HERO) == true ) ) then return false endif if ( not ( GetUnitTypeId(GetDyingUnit()) != 'H00F' ) ) then return false endif if ( not ( IsPlayerInForce(GetOwningPlayer(GetDyingUnit()), GetPlayersAllies(Player(0))) == true ) ) then return false endif return true endfunction
function Trig_Reviving_Func004Func003C takes nothing returns boolean if ( ( GetUnitTypeId(GetDyingUnit()) == 'H00B' ) ) then return true endif if ( ( GetUnitTypeId(GetDyingUnit()) == 'H009' ) ) then return true endif if ( ( GetUnitTypeId(GetDyingUnit()) == 'H00C' ) ) then return true endif if ( ( GetUnitTypeId(GetDyingUnit()) == 'H00A' ) ) then return true endif if ( ( GetUnitTypeId(GetDyingUnit()) == 'H008' ) ) then return true endif return false endfunction
function Trig_Reviving_Func004C takes nothing returns boolean if ( not Trig_Reviving_Func004Func003C() ) then return false endif return true endfunction
ремув юнит у меня вообще нигде не используется.. причем такое случалось при обсолютно разных раскладах героев, тоесть это не связанно со скиллами. перекопал все триггеры ориетрированные на смерть юнитов\героев, и нигде нету строчки "ремув юнит"... вот в чем проблема.
Лол еще бы. Заноси героев в локалки. Если у тебя умрут 2 героя подряд естесственно только один воскресится.Добавлено (15-03-2010, 14:02)---------------------------------------------Вообще нужно таймером делать а не как ты.
через таймеры делал, и один из героев удаляется из игры даже в случае когда умер только один герой. с таймерами та же шняга, даже создавал окна таймеров, ну что бы наглядно и тд, так вот. по истечению таймера окно таймера НЕ удалялось и герой не возраждался, в тот момент когда остальные 2-3 мертвых героя могли спокойно перерождаться. Вообщем не держи меня за неофита и профана, договорились?
Тебе же сказали что локалки юзай так как ссылку в переменой двумя смерьями перезаписываеш. и окно таймера не удолить Оо толь скрыть.
какую ссылку в какой переменной, глупости не говори. реакция на событие - xxx unit для каждого срабатывания не переписываемые данные. Как пример: функция на перерождение деревьев выглядит так:
Code
wait xx seconds revive (dying destructible) at position of dying destructible показать birth анимацию.
И естественно свали хоть все деревья на карте одновременно - возродятся все без исключения, так что не гони пурги. И да, я вроде бы адекватно попросил джассифицировать код, а не давать мне советы типа "юзай локалку".
какую ссылку в какой переменной, глупости не говори.
Если ты не понимаешь о чём говорят, то это не значит, что глупости.
Quote (FkoFF)
И естественно свали хоть все деревья на карте одновременно - возродятся все без исключения, так что не гони пурги.
Ололо, после вейта - нет)))
Quote (FkoFF)
И да, я вроде бы адекватно попросил джассифицировать код, а не давать мне советы типа "юзай локалку".
А давай мы за тебя карту сделаем?)
Ладно, сабж: тебе дали совет, записуй героя в локалку и через неё перерождай. И убей нафиг вейты! Если не осилил зачем нужна локалка: Есть константа bj_lastDuyingUnit. При смерти юнита она перезаписывается. Потому-то твой первый гер не возродился. Потому-что после смерти другого она ПЕРЕЗАПИСАЛАСЬ. Дошло, надеюсь?
Код ужас=) Кста я не пойму почему у тебя в начале указано что триг работает только дря героя типа 'H00F' (может изза этого и не срабатывал триг, если не учитывать что он не работал ещё и потому что ужасен ),а затем проверяется для 'H00B' или 'H009' или 'H00C' или 'H00A' или 'H008'. Может ошибка, но я всё же оставил это. Лови:
Code
scope ReviveHero initializer Init private function Conditions takes nothing returns boolean return IsUnitType(GetDyingUnit(), UNIT_TYPE_HERO) == true and GetUnitTypeId(GetDyingUnit()) != 'H00F' and IsUnitAlly(GetDyingUnit(), Player(0))) == true endfunction
private function Revive takes unit H returns nothing call ReviveHero( H, GetRectCenterX(gg_rct_HeroSpawn), GetRectCenterX(gg_rct_HeroSpawn), true ) if GetUnitTypeId(H) == 'H00B' or GetUnitTypeId(H) == 'H009' or GetUnitTypeId(H) == 'H00C' or GetUnitTypeId(H) == 'H00A' or GetUnitTypeId(H) == 'H008' then call IssueImmediateOrder( H, "bearform" ) endif endfunction
private function Actions takes nothing returns nothing call TimerStart( CreateTimer(),I2R(GetHeroLevel(GetDyingUnit())) * 3.00, false, function Revive(GetDyingUnit()) endfunction
//=========================================================================== private function Init takes nothing returns nothing local trigger t = CreateTrigger() local integer V = 0 loop exitwhen V == 16 call TriggerRegisterPlayerUnitEvent( t, Player(V), EVENT_PLAYER_UNIT_DEATH, null ) set V = V + 1 endloop call TriggerAddCondition( t, Condition( function Conditions ) ) call TriggerAddAction( t, function Actions ) set t = null endfunction endscope
Я не тестил, но вроде всё так (если конечно не ошибся немного где-то при написании )
function ReviveHero_Conditions takes nothing returns boolean return IsUnitType(GetDyingUnit(), UNIT_TYPE_HERO) and GetUnitTypeId(GetDyingUnit()) != 'H00F' and IsUnitAlly(GetDyingUnit(), Player(0))) endfunction
function ReviveHero_Revive takes unit H returns nothing call ReviveHero( H, GetRectCenterX(gg_rct_HeroSpawn), GetRectCenterX(gg_rct_HeroSpawn), true ) if GetUnitTypeId(H) == 'H00B' or GetUnitTypeId(H) == 'H009' or GetUnitTypeId(H) == 'H00C' or GetUnitTypeId(H) == 'H00A' or GetUnitTypeId(H) == 'H008' then call IssueImmediateOrder( H, "bearform" ) endif endfunction
function ReviveHero_Actions takes nothing returns nothing call TimerStart( CreateTimer(),I2R(GetHeroLevel(GetDyingUnit())) * 3.00, false, function ReviveHero_Revive(GetDyingUnit()) endfunction
//=========================================================================== function InitTrigger_ReviveHero takes nothing returns nothing local trigger t = CreateTrigger() local integer V = 0 loop exitwhen V == 16 call TriggerRegisterPlayerUnitEvent( t, Player(V), EVENT_PLAYER_UNIT_DEATH, null ) set V = V + 1 endloop call TriggerAddCondition( t, Condition( function ReviveHero_Conditions ) ) call TriggerAddAction( t, function ReviveHero_Actions ) set t = null endfunction
Вроде сделал)
Сообщение отредактировал Svyaga - Понедельник, 15 Марта 2010, 20:16:20
IsUnitType Возвращает буль, так же как и IsUnitAlly, незачем делать проверку
о_О Что за бред? IsUnitType проверяет является ли героем умирающий юнит (в данном триге), IsUnitAlly проверяет является ли умирающий юнит союзником первого игрока.
EDIT Упс, неправильно прочитал (извиняюсь, только поел и хочу спать ) Забыл убрать когда редактировал гуи конверт)Исправлено
Сообщение отредактировал Svyaga - Понедельник, 15 Марта 2010, 20:16:34
Ладно, сабж: тебе дали совет, записуй героя в локалку и через неё перерождай. И убей нафиг вейты! Если не осилил зачем нужна локалка: Есть константа bj_lastDuyingUnit. При смерти юнита она перезаписывается. Потому-то твой первый гер не возродился. Потому-что после смерти другого она ПЕРЕЗАПИСАЛАСЬ. Дошло, надеюсь?
О госсподи, не строй из себя умника, договорились? Тебе просто не идет с твоим падонкавским агцентом. Функция адекватно работает, но через раз, и, блин, научись читать что тебе пишут. Бывало и 3-4 героя умирают и нормально возрождаются, а бывает и фб - и герой НЕ возраждается.
Quote (Artas_Undead)
Ну попробуй) Даже если не будет вейта и убить 2 одновременно, то только последнее возродится.
см выше
Quote (Svyaga)
Кста я не пойму почему у тебя в начале указано что триг работает только дря героя типа 'H00F' (может изза этого и не срабатывал триг, если не учитывать что он не работал ещё и потому что ужасен
if ( not ( GetUnitTypeId(GetDyingUnit()) != 'H00F' ) ) если ( отрицание (тип юнита (умирающий юнит()) не равно 'h00f') )
Ладно, сабж: тебе дали совет, записуй героя в локалку и через неё перерождай. И убей нафиг вейты! Если не осилил зачем нужна локалка: Есть константа bj_lastDuyingUnit. При смерти юнита она перезаписывается. Потому-то твой первый гер не возродился. Потому-что после смерти другого она ПЕРЕЗАПИСАЛАСЬ. Дошло, надеюсь?
Парень, я тебе могу дать ссылочку на раннюю версию разработки карты, где по команде вызывается 10-20 героев, ты их валишь, и они через вейты перерождаются ВСЕ, по очереди. Не говори глупости, юнец, очень прошу.
О госсподи, не строй из себя умника, договорились? Тебе просто не идет с твоим падонкавским агцентом. Функция адекватно работает, но через раз, и, блин, научись читать что тебе пишут. Бывало и 3-4 героя умирают и нормально возрождаются, а бывает и фб - и герой НЕ возраждается.
Ну вообще он знает жасс и вжасс, и говорит правильно (про локалки, GetDyingUnit() и подобное), да и вроде норм писал. Не его ведь проблемы что ты не понимаешь что он тебе пишет =) А система у тя и правда нерабочая изза кода, к-ый является бредом (не в обиду)
Quote (FkoFF)
if ( not ( GetUnitTypeId(GetDyingUnit()) != 'H00F' ) ) если ( отрицание (тип юнита (умирающий юнит()) не равно 'h00f') )
Лол, а так я не знал))) Кста, не понял зачем проверка эта опять же изза того что не так прочитал ( прочитал == вместо != )
Парень, я тебе могу дать ссылочку на раннюю версию разработки карты, где по команде вызывается 10-20 героев, ты их валишь, и они через вейты перерождаются ВСЕ, по очереди. Не говори глупости, юнец, очень прошу.
Это БРЕД))
Сообщение отредактировал Svyaga - Понедельник, 15 Марта 2010, 20:25:14
бред не бред, могу пруф дать, вроде как сохранился )
Добавлено (15-03-2010, 20:29) --------------------------------------------- Только давай договоримся, если работает - конкретно ты съешь свою шляпу или любой другой головной убор, и выложишь это видео тут. Согласен?
Тоже самое хочу сказать тебе) Тебе сотый раз писали, уже дали код, что тебе ёпт не нравится? Что так трудно взять и переделать не смотря на то, что твоя система "работает"?
Quote (FkoFF)
Парень, я тебе могу дать ссылочку на раннюю версию разработки карты, где по команде вызывается 10-20 героев, ты их валишь, и они через вейты перерождаются ВСЕ, по очереди. Не говори глупости, юнец, очень прошу.
*лицоладоньпыщь* Эти герои убиваются по-очереди и конфликта нету. А твои деревья все сразу и выходит ужасный конфликт изза которого возродится только 1 дерево.
бред не бред, могу пруф дать, вроде как сохранился )
Так может быть только если у тебя умирающие юниты сохранялись в переменную ( типа udg_Hero[GetPlayerId(GetOwningPlayer(GetDyingUnit()))] ), без переменной с ожиданием такого просто не может быть, ибо GetDyingUnit() переписывается с каждой смертью, даже когда триг не срабатывает (например когда умирает не герой). Если у тя работаело то значит либо у тя карта магически сделана, либо карта не варкрафта Так же случается например с GetSpellTargetUnit(), у мя способность есть, к-ая каждые 0.5 наносила урон врагу на к-ого кастанул, так пока я не сделал GetSpellTergatUnit() в локалку, она срабатывала только в первый раз. А GetDyingUnit() перестаёт работать в каком-то тригге с ожиданием тогда, когда кто-либо на карте умирает.
Quote (Artas_Undead)
сджасс какбы тоже)
Насчёт этого уж не знаю
Quote (Artas_Undead)
Тоже самое хочу сказать тебе) Тебе сотый раз писали, уже дали код, что тебе ёпт не нравится? Что так трудно взять и переделать не смотря на то, что твоя система "работает"?
Вперёд, Artas_Undead, ВПЕРЕЕЕД!!)))
Сообщение отредактировал Svyaga - Понедельник, 15 Марта 2010, 20:35:13
Эти герои убиваются по-очереди и конфликта нету. А твои деревья все сразу и выходит ужасный конфликт изза которого возродится только 1 дерево.
там вейт на 6 секунд стоял, перед респавном, валил я героев большими пачками, по 3-4 героя в секунду, и перерождались все обсолютно. Вообщем, готов кушать свою кепку за *лицоладонь*?
Добавлено (15-03-2010, 20:35) --------------------------------------------- Вообщем спасибо конечно за код, проверю сегодня-завтра.
там вейт на 6 секунд стоял, перед респавном, валил я героев большими пачками, по 3-4 героя в секунду, и перерождались все обсолютно. Вообщем, готов кушать свою кепку за *лицоладонь*?