Триггеры это глобалки, зачем их делать больше, если можно обойтись одним. Но если ты на GUI делаешь, лаги пойдут в одном триггере, когда действий слишком много станет. Можешь в таком случаи несколько триггеров сделать. И всё-таки писать лучше всё на JASS
Как сказал Hate, к переменной типа real можно присвоить расстояние между точками. Сейчас попробую сделать наработку.
Пример такой себе, на тяп ляп, и не совсем правильно, но принцип ясен, думаю. В твоём случаи, нужно придумать, как значения каждого проверить между друг другом, не должно составить труда, если каждого пронумеруешь (массив). Вычислишь расстояние каждого, и сравнишь расстояние, а потом по индексу от самого маленького расстояния убьёшь кого надо, для проверки.
Круги уже написали, напишу квадрат, если надо будет.
local unit u
local real r =100 Максимальный размер / 2
local real x = GetUnitX(u)+GetRandomReal(-1*r, r)
local real y = GetUnitY(u)+GetRandomReal(-1*r, r)
local location l = Location(x,y) Если тебе прям точку надо
WoLLFeR,
Если делаешь глобалки- делай их уж нормально в globals,а не во вкалдке Переменные.
Бр. Сорян, но это легче стереть и самому за тебя написать)
Вот воспользуйся этой статьей
Я так и делал но потом у меня были ошибки, сейчас
call SetUnitAbilityLevel(bj_lastCreatedUnit, bj_SkillTwo, Level)
Вот, это строчка не компилировалась, только, bj_SkillTwo, поменял на udg_SkillTwo, запустилась без проблем EnergyFrost:
Спасибо, я просто не совсем знаком с jass, обязательно прочту
Возможно, и не одна, я же написал, первый скилл, первый jass, я на gui всегда делал, привычка расписывать всё осталось, я скинул карту выше, можешь посмотреть
лагает не из-за этого. Лаги из-за слишком малого периода могут быть, из-за замкнутого цикла и прочих логических ошибок
Кстати, можешь не использовать call local
Если я уменьшу период, снаряды перестанут лететь с нормальной скоростью, и выглядить при увеличении скорости это будет не красиво
Так, всё, заработало, вот только использовать глобальную переменную не лучший выбор, лагает в игре сильно, хотя утечек нет, всё из-за таймера, в общем мне нужно, чтобы снаряд, который летел, всего их 9, при соприкосновении с противником умирал, и наносил урон, буду рад любым примером, если скинете, что-то типо отряд в отряде
function Trig_QStartTaimerA_Func001A takes nothing returns nothing
local unit enumunit= GetEnumUnit()
local real x = GetUnitX(enumunit)
local real y = GetUnitY(enumunit)
call MoveUnit(enumunit,GetUnitFacing(enumunit),10)
call GroupEnumUnitsInRange(udg_enemygroup,x,y, 64.00, Condition(EnemyFilter()))
call ForGroup(udg_enemygroup,function SomeFunc(enumunit))
endfunction
function SomeFunc takes unit witcunit returns nothing
local unit Thisunit = GetEnumUnit()
local real x=GetUnitX(witcunit)
local real y=GetUnitY(witcunit)
call RemoveUnit(witcunit)
call CreateUnit( GetOwningPlayer(witcunit), bj_STRELAQWeerEffect ,x,y, 0 )
call UnitApplyTimedLife(bj_lastCreatedUnit, 'BTLF', 1.00)
endfunction
function Trig_QStartTaimerA_Actions takes nothing returns nothing
call ForGroup( udg_GroupQWeer, function Trig_QStartTaimerA_Func001A)
endfunction
//===========================================================================
function InitTrig_QStartTaimerA takes nothing returns nothing
set gg_trg_QStartTaimerA = CreateTrigger( )
call TriggerRegisterTimerExpireEventBJ( gg_trg_QStartTaimerA, udg_TaimerQStart )
call TriggerAddAction( gg_trg_QStartTaimerA, function Trig_QStartTaimerA_Actions )
endfunction
quq_CCCP:
Так, значит, с начало создаю фильтр, потом другую функцию, которая будет выполнять действия над юнитами в группе, потом назначаю группу используя GroupEnumUnitsInRange, затем используя группу, выполняю над юнитами действие?
quq_CCCP:
Я пытаюсь разобраться, хорошо фильтр, я могу его сделать, как отдельную функцию, если он возвращает только bool, то как работать дальше? ну одни юниты true, другие false, это через условие проверять?
и groupEnumOwningPlayer - это вражеские Игроки, как их записать?
При использовании JNGP: Конвертируешь в код -> избавляешься от функций, подсвеченных красным, заменяя их на нативные эквиваленты -> по возможности избегаешь создания объектов вроде точек, даммиков -> чистишь локалки, которые не очищаются сами по себе
А зачем, мб альтернатива гуи? Ну она есть, jass.
Если использовать группы нормально, а не как нам предлагает гуи, не будет ни утечек, ни проблем.
Ты предлагаешь мне переписать это на jass? Я почти нечего не понимаю на jass(вру). Хорошо, как предлагает jass использовать группы? Gui использует полярные координаты, что при точках, что при диапазонах, и использует он их очень коряво! Как написать группу на jass правильно?
WoLLFeR, Поэтому я предложил создать систему мили побед\порожений (да и целиком весь сценарий вашего сражения) своими руками, для разминки могу порекомендовать карту -Монолит (от Blizzard), там реализованы нестандартные рассы, мили ии для нестандартных расс и победа\поражение.
Для изучения если вы совсем не представляете как это реализовать думаю вам подойдет.
Спасибо, что-то я совсем забыл про монолит, обязательно учту, спасибо за помощь! quq_CCCP:
Я просто превратил эту функцию в триггер с событием каждые 2 секунды, это тоже подойдёт да?
WoLLFeR, эмм зачем, чувак я описал принцип работы дефольтного мили, где ты проиграешь если у тебя не осталось юнитов. Я так понимаю у вас не мили карта и вы не в лиге будите играть в неё. Определяем победу считая здания игрока, т.к вы на гуях пишите, пример на jass я предоставил не для копипаста а чтобы вы сами осилили аналог на гуи.
В том то и дело, что melee, но при этом не стандартные расы, и с выбором союза, ну вот, когда два игрока, против одного играют, один сливается(Триггер его считает проигравшим), а двое продолжают играть, стандартным методом, Главное здание не считается главным, вот в том-то и дело.
Код я переписал, и вроде работает
function Trig_MeleeInitVictoryDefeat_Actions takes nothing returns nothing
local trigger trig
local integer index
local player indexPlayer
// Create a timer window for the "finish soon" timeout period, it has no timer
// because it is driven by real time (outside of the game state to avoid desyncs)
set bj_finishSoonTimerDialog = CreateTimerDialog(null)
// Set a trigger to fire when we receive a "finish soon" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_SOON)
call TriggerAddAction(trig, function MeleeTriggerTournamentFinishSoon)
// Set a trigger to fire when we receive a "finish now" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_NOW)
call TriggerAddAction(trig, function MeleeTriggerTournamentFinishNow)
// Set up each player's mortality code.
set index = 0
loop
set indexPlayer = Player(index)
// Make sure this player slot is playing.
if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
set bj_meleeDefeated[index] = false
set bj_meleeVictoried[index] = false
// Create a timer and timer window in case the player is crippled.
set bj_playerIsCrippled[index] = false
set bj_playerIsExposed[index] = false
set bj_crippledTimer[index] = CreateTimer()
set bj_crippledTimerWindows[index] = CreateTimerDialog(bj_crippledTimer[index])
call TimerDialogSetTitle(bj_crippledTimerWindows[index], MeleeGetCrippledTimerMessage(indexPlayer))
// Set a trigger to fire whenever a building is cancelled for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL, null)
call TriggerAddAction(trig, function MeleeTriggerActionConstructCancel)
// Set a trigger to fire whenever a unit dies for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_DEATH, null)
call TriggerAddAction(trig, function MeleeTriggerActionUnitDeath)
// Set a trigger to fire whenever a unit begins construction for this player
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
call TriggerAddAction(trig, function MeleeTriggerActionUnitConstructionStart)
// Set a trigger to fire whenever this player defeats-out
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_DEFEAT)
call TriggerAddAction(trig, function MeleeTriggerActionPlayerDefeated)
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)
// Set a trigger to fire whenever this player changes his/her alliances.
set trig = CreateTrigger()
call TriggerRegisterPlayerAllianceChange(trig, indexPlayer, ALLIANCE_PASSIVE)
call TriggerRegisterPlayerStateEvent(trig, indexPlayer, PLAYER_STATE_ALLIED_VICTORY, EQUAL, 1)
call TriggerAddAction(trig, function MeleeTriggerActionAllianceChange)
else
set bj_meleeDefeated[index] = true
set bj_meleeVictoried[index] = false
// Handle leave events for observers
if (IsPlayerObserver(indexPlayer)) then
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)
endif
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
// Test for victory / defeat at startup, in case the user has already won / lost.
// Allow for a short time to pass first, so that the map can finish loading.
call TimerStart(CreateTimer(), 2.0, false, function MeleeTriggerActionAllianceChange)
endfunction
//===========================================================================
function InitTrig_MeleeInitVictoryDefeat takes nothing returns nothing
set gg_trg_MeleeInitVictoryDefeat = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_MeleeInitVictoryDefeat, 2.00 )
call TriggerAddAction( gg_trg_MeleeInitVictoryDefeat, function Trig_MeleeInitVictoryDefeat_Actions )
endfunction
Ну разумеется, если скопировать стандартную функцию из Blizzard.j тебе редактор выдаст ошибку, что функция с таким именем уже обявлена...
Я не понимаю в чем проблема, я подробно описал что к чему.
» WarCraft 3 / Нагрузка карты
Отредактирован WoLLFeR
» WarCraft 3 / Нужна наработка
Пример такой себе, на тяп ляп, и не совсем правильно, но принцип ясен, думаю. В твоём случаи, нужно придумать, как значения каждого проверить между друг другом, не должно составить труда, если каждого пронумеруешь (массив). Вычислишь расстояние каждого, и сравнишь расстояние, а потом по индексу от самого маленького расстояния убьёшь кого надо, для проверки.
» WarCraft 3 / ТЕКСТ
Отредактирован WoLLFeR
» WarCraft 3 / local integer i = GetUnitTypeId(GetTriggerUnit()
Отредактирован WoLLFeR
» WarCraft 3 / Как создать точку в случайном месте в радиусе от юнита?
local unit u
local real r =100 Максимальный размер / 2
local real x = GetUnitX(u)+GetRandomReal(-1*r, r)
local real y = GetUnitY(u)+GetRandomReal(-1*r, r)
local location l = Location(x,y) Если тебе прям точку надо
» WarCraft 3 / Способности, требующие траты ресурсов
Желательно так. При нехватки золота, просто не даём юзать скилл.
» WarCraft 3 / Compile error.
call SetUnitAbilityLevel(bj_lastCreatedUnit, bj_SkillTwo, Level)
Вот, это строчка не компилировалась, только, bj_SkillTwo, поменял на udg_SkillTwo, запустилась без проблем
EnergyFrost:
Спасибо, я просто не совсем знаком с jass, обязательно прочту
» WarCraft 3 / Compile error.
Doc: Возможно, и не одна, я же написал, первый скилл, первый jass, я на gui всегда делал, привычка расписывать всё осталось, я скинул карту выше, можешь посмотреть
» WarCraft 3 / Compile error.
Отредактирован WoLLFeR
» WarCraft 3 / Compile error.
Отредактирован WoLLFeR
» WarCraft 3 / Compile error.
» WarCraft 3 / Compile error.
Отредактирован WoLLFeR
» WarCraft 3 / Compile error.
Ну началось, только убрал аргумент, сразу другие косяки
Doc: Хорошая идея, сейчас попробую
» WarCraft 3 / Compile error.
» WarCraft 3 / Способность с зарядами.
Отредактирован Raised
» WarCraft 3 / Compile error.
» WarCraft 3 / Утечки
Отредактирован WoLLFeR
» WarCraft 3 / Утечки
Так, значит, с начало создаю фильтр, потом другую функцию, которая будет выполнять действия над юнитами в группе, потом назначаю группу используя GroupEnumUnitsInRange, затем используя группу, выполняю над юнитами действие?
» WarCraft 3 / Утечки
Я пытаюсь разобраться, хорошо фильтр, я могу его сделать, как отдельную функцию, если он возвращает только bool, то как работать дальше? ну одни юниты true, другие false, это через условие проверять?
и groupEnumOwningPlayer - это вражеские Игроки, как их записать?
» WarCraft 3 / Утечки
Отредактирован WoLLFeR
» WarCraft 3 / Утечки
» WarCraft 3 / Как заставить редактор распознавать ратушу
quq_CCCP:
Я просто превратил эту функцию в триггер с событием каждые 2 секунды, это тоже подойдёт да?
Отредактирован Uber
» WarCraft 3 / Как заставить редактор распознавать ратушу
Код я переписал, и вроде работает
» WarCraft 3 / Как заставить редактор распознавать ратушу
Отредактирован WoLLFeR
» WarCraft 3 / Как заставить редактор распознавать ратушу