Кароче я сделал триггер где покупаеться герой в таверне и портаеться на область куда я написал и при этом высвечиватсья имя выбраноого юнита выбранным игроком.
Но не могу понять почему это происходит два раза тоесть высвечиваетсья имя выбранного юнита два раза. Вот триггер. local unit u = GetSoldUnit() local integer i = GetUnitTypeId(u) local player p = GetOwningPlayer(u) local integer l = 0 if (GetPlayerRace(p) == RACE_NIGHTELF) then call RemoveUnit(udg_remove[GetPlayerId(p) + 1]) call SetUnitPositionLoc(u, GetRectCenter(gg_rct_BaseCenterSen)) call PanCameraToTimed(GetUnitX(u), GetUnitY(u), 0) call SelectUnit(u, true) call SelectUnit(GetTriggerUnit(), false) set PlayerHero[GetPlayerId(p)] = u call DisplayTextToForce(GetPlayersAll(), "|r" + "|c00ff0303" + GetPlayerName(p) + "|r" + " has choosed " + "|r" + "|c000041ff" + GetUnitName(u) + "|r") elseif (GetPlayerRace(p) == RACE_UNDEAD) then call RemoveUnit(udg_remove[GetPlayerId(p) + 1]) call SetUnitPositionLoc(u, GetRectCenter(gg_rct_BaseCenterScor)) call PanCameraToTimed(GetUnitX(u), GetUnitY(u), 0) call SelectUnit(u, true) call SelectUnit(GetTriggerUnit(), false) set PlayerHero[GetPlayerId(p)] = u call DisplayTextToForce(GetPlayersAll(), "|r" + "|c00ff0303" + GetPlayerName(p) + "|r" + " has choosed " + "|r" + "|c000041ff" + GetUnitName(u) + "|r") endif call RemoveUnitFromAllStock(i) set u = null set p = null
Добавлено (24-02-2011, 15:15) --------------------------------------------- lawson, ааа... я понял. честно, не знаю. Может elseif криво работает ? сделай тогда через if
Я покупаю героя там идет проверка если раса игрока который купил героя ночные эльфы то вывести его имя. Если раса не ночные эльфы вывести его имя. Но у меня раса ночные эльфы тоесть выполняеться одно условие и значит должно выводить один раз имя.
Без разницы все равно выводит всегда два раза не понимаю в чем дело.
Добавлено (24-02-2011, 15:18) --------------------------------------------- Кажеться как будто этот триггер запускаетсья два раза когда я покупаю одного героя.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Четверг, 24 Февраля 2011, 15:16:07
Я покупаю героя там идет проверка если раса игрока который купил героя ночные эльфы то вывести его имя. Если раса не ночные эльфы вывести его имя. Но у меня раса ночные эльфы тоесть выполняеться одно условие и значит должно выводить один раз имя.
lawson, хм... а если проверить юнита на расу. P.S. А если у игрока Любая раса? P.S.S. Ты когда-нибудь пользовался этим действием ? Вдруг, не работает..
Если бы было так то переменная PlayerHero записывалась бы два раза а так она записываеться один раз.Все корчое в этом триггере все правильно работает но выводиться имя юнита два раза.
lawson, ну для начала, твой код можно сократить в два раза:
Code
local integer i = GetUnitTypeId(u) local player p = GetOwningPlayer(u) local integer l = 0 local location loc if (GetPlayerRace(p) == RACE_NIGHTELF) then set loc = GetRectCenter(gg_rct_BaseCenterSen)) else set loc = GetRectCenter(gg_rct_BaseCenterScor) endif call RemoveUnit(udg_remove[GetPlayerId(p) + 1]) call SetUnitPositionLoc(u, loc) call PanCameraToTimed(GetUnitX(u), GetUnitY(u), 0) call SelectUnit(u, true) call SelectUnit(GetTriggerUnit(), false) set PlayerHero[GetPlayerId(p)] = u call DisplayTextToForce(GetPlayersAll(), "|r" + "|c00ff0303" + GetPlayerName(p) + "|r" + " has choosed " + "|r" + "|c000041ff" + GetUnitName(u) + "|r")
call RemoveUnitFromAllStock(i) set u = null set p = null call RemoveLocation (loc) set loc = null
Попробуй так, а потом напиши та же проблема или нет.
По началу так и было я выводил имя в коде один раз в самом конце триггера.
local unit u = GetSoldUnit() local integer i = GetUnitTypeId(u) local player p = GetOwningPlayer(u) local integer l = 0 if (GetPlayerRace(p) == RACE_NIGHTELF) then call RemoveUnit(udg_remove[GetPlayerId(p) + 1]) call SetUnitPositionLoc(u, GetRectCenter(gg_rct_BaseCenterSen)) call PanCameraToTimed(GetUnitX(u), GetUnitY(u), 0) call SelectUnit(u, true) call SelectUnit(GetTriggerUnit(), false) set PlayerHero[GetPlayerId(p)] = u elseif (GetPlayerRace(p) == RACE_UNDEAD) then call RemoveUnit(udg_remove[GetPlayerId(p) + 1]) call SetUnitPositionLoc(u, GetRectCenter(gg_rct_BaseCenterScor)) call PanCameraToTimed(GetUnitX(u), GetUnitY(u), 0) call SelectUnit(u, true) call SelectUnit(GetTriggerUnit(), false) set PlayerHero[GetPlayerId(p)] = u endif call DisplayTextToForce(GetPlayersAll(), "|r" + "|c00ff0303" + GetPlayerName(p) + "|r" + " has choosed " + "|r" + "|c000041ff" + GetUnitName(u) + "|r") call RemoveUnitFromAllStock(i) set u = null set p = null
Включай логику, всего две расы. если не одна, то другая. lawson, ты меня не понял, у тебя одни и те же действия повторяются по два раза, тебе if/then/else зачем нужен? Только чтобы установить регион, в который перемещается герой, а ты зачем то все остальные действия туда поместил, упрости код для начала, что бы с ним работать и найти ошибку было легче.
Все корчое в этом триггере все правильно работает но выводиться имя юнита два раза.
Если в игре работает что-то не так, значит в коде что-то не так. В игре выполняется только то, что ты запрограммировал, хотя сначала и может казаться что ты все сделал правильно.
Вот его укаратил все равно показывает два раза. Могу скрин скинуть.
local unit u = GetSoldUnit() local integer i = GetUnitTypeId(u) local player p = GetOwningPlayer(u) local integer l = 0 if (GetPlayerRace(p) == RACE_NIGHTELF) then call SetUnitPositionLoc(u, GetRectCenter(gg_rct_BaseCenterSen)) else call SetUnitPositionLoc(u, GetRectCenter(gg_rct_BaseCenterScor)) endif call RemoveUnit(udg_remove[GetPlayerId(p) + 1]) call PanCameraToTimed(GetUnitX(u), GetUnitY(u), 0) call SelectUnit(u, true) call SelectUnit(GetTriggerUnit(), false) set PlayerHero[GetPlayerId(p)] = u call DisplayTextToForce(GetPlayersAll(), "|r" + "|c00ff0303" + GetPlayerName(p) + "|r" + " has choosed " + "|r" + "|c000041ff" + GetUnitName(u) + "|r") call RemoveUnitFromAllStock(i) set u = null set p = null
function Trig_HeroUserBuy_Actions takes nothing returns nothing local unit u = GetSoldUnit() local integer i = GetUnitTypeId(u) local player p = GetOwningPlayer(u) local integer l = 0 if (GetPlayerRace(p) == RACE_NIGHTELF) then call SetUnitPositionLoc(u, GetRectCenter(gg_rct_BaseCenterSen)) else call SetUnitPositionLoc(u, GetRectCenter(gg_rct_BaseCenterScor)) endif call RemoveUnit(udg_remove[GetPlayerId(p) + 1]) call PanCameraToTimed(GetUnitX(u), GetUnitY(u), 0) call SelectUnit(u, true) call SelectUnit(GetTriggerUnit(), false) set PlayerHero[GetPlayerId(p)] = u call DisplayTextToForce(GetPlayersAll(), "|r" + "|c00ff0303" + GetPlayerName(p) + "|r" + " has choosed " + "|r" + "|c000041ff" + GetUnitName(u) + "|r") call RemoveUnitFromAllStock(i) set u = null set p = null endfunction
//=========================================================================== function InitTrig_HeroUserBuy takes nothing returns nothing local trigger tt = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(tt, EVENT_PLAYER_UNIT_SELL) call TriggerAddCondition(tt, Condition( function Trig_HeroUserBuy_Conditions ) ) call TriggerAddAction(tt, function Trig_HeroUserBuy_Actions ) endfunction
lawson, надо выяснить, проблема в самом триггере или конкретно в этом действии. Добавь обычное действие создания юнита, например работника. Если создастся не один работник, а два - значит проблема в самом триггере, это он выполняется дважды. Жду результата.
Я проверял переменную PlayerHero которая в этом триггере должна заполняться в массив одного юнита для одного игрока так и есть все правильно работает заполняеться одни раз а вот имя высвечиваеться два раза.