Попробуй отдавать "стоп" перед удалением, например,
Я так и начал делать, но сейчас это бесполезно, мне кажется, потому что сейчас рект из региона удаляется первее юнитов. PT153:
На данный момент последовательность такая: жизни становятся равным нулю; установка inGame на false; удаление области из региона, на который зарегистрирован триггер EnterFinish; всем юнитам отдаётся приказ "Стоп"; удаление миньонов.
Раз уж никто точно не знает, то хватит ли реализации из первого комментария, чтобы избежать данной ошибки? Вообще, надо систему логов сделать, вместо вывода в сообщений в игру, ибо последние отключены в ndopt версиях.
Но это не так: если несколько миньонов заходят в область почти одновременно, триггер вызывается несколько раз, потому что код не успевает удалять миньонов, которые почти одновременно входят. Потому данный код багнут.
Удаление игрока вызывается несколько раз.
19:28, жёлтый проигрывает, удаляясь 3 раза, из-за чего у зелёного становится -1 потребление пищи, а 2 игрока вылетают из пула играющих.
На данный момент я попытался исправить это так. Все функции не менялись, кроме указанных ниже:
раскрыть
function Trig_EnterFinish_Actions takes nothing returns nothing
local Minion m = GetUnitUserData(GetEnteringUnit())
local CustomPlayer p = m.foe
if p.inGame then
call p.leaked(m.data.livesconsume)
call m.gainBounty(false)
if p != m.owner and m.owner.inGame then
call m.owner.leaked(m.data.livesgain)
endif
call CreateEffectPoint(EffectLifeConsume, GetUnitX(m.minion), GetUnitY(m.minion))
if p.lives > 0 then
call m.remove()
elseif p.flush() then
call Message(MessagesDuration, "Player " + p.colored_name + " has been defeated.")
if bj_isSinglePlayer != (PlayingPlayers.top == 0) then
call FinishGame(10)
endif
endif
endif
endfunction
// p.flush()
method flush takes nothing returns boolean
if inGame then
set inGame = false
call field.flush()
call field.stopAllUnits()
call PlayingPlayers.deleteFromArray(this)
set flushing = this
call ExecuteFunc("SellAllForces")
call ExecuteFunc("RemoveAllSpawned")
call ExecuteFunc("RemoveAllMinions")
call ExecuteFunc("RemoveAllCorpses")
call ExecuteFunc("SellAllTowers") // Почти тоже самое, что и call ExecuteFunc("RemoveAllTowers").
call DeleteTimer()
if isReady then
call DestroyGrid.execute()
call ShadowMultiboard()
call RemoveUnit(builder)
set builder = null
call RemoveUnit(barracks)
set barracks = null
call RemoveUnit(altar)
set altar = null
call RemoveUnit(merccamp)
set merccamp = null
call RemoveUnit(blacksmith)
set blacksmith = null
set blacksmith_swap_faction = null
set blacksmith_mhu_level = null
set blacksmith_mhu_cost = null
endif
call DebugMsg("Player " + I2S(this) + " is flushed.")
return true
endif
return false
endmethod
// call field.flush()
method flush takes nothing returns nothing
// Regions
call RegionClearRect(SpawnRegion, spawnarea)
call RegionClearRect(LeaveRegion, leavearea)
// Destroy
call TimerStart(t, FieldDestroyDelay, false, DestroyCallback)
endmethod
// call field.stopAllUnits()
private static method StopAllUnitsFilterFunc takes nothing returns nothing
call IssueImmediateOrderById(GetFilterUnit(), Order_stop)
endmethod
private static boolexpr StopAllUnitsFilter
method stopAllUnits takes nothing returns nothing
call GroupEnumUnitsInRect(bj_lastCreatedGroup, playerfield, StopAllUnitsFilter)
endmethod
Достаточно ли этого, чтобы избежать бага, что описан в вопросе? Будет ли лучше поставить в Trig_EnterFinish_Actions вместо if p.inGame then вот это if p.lives > 0 then, или без разницы с реализацией выше? Количество жизней становится меньше 0 раньше, чем флаг inGame становится false.
На данный момент последовательность такая: жизни становятся равным нулю; установка inGame на false; удаление области из региона, на который зарегистрирован триггер EnterFinish; всем юнитам отдаётся приказ "Стоп"; удаление миньонов.
Код карты. Все триггеры на GUI конвертируются в JASS. 15к строк кода, капец, даже в моей карте 9к строк vJass.
Еще вопрос.. условно 1 триггер занимает 1 поток.. а если в один триггер добавить 3 условия.. то триггер будет занимать как один поток или как 3 ?
Не совсем так.
При срабатывании события создаётся "поток" для функции, где находятся все условия триггера. Если все условия выполнены, то создаётся "поток" для функции, где находятся все действия. Про лимит потока тебе уже сказали выше.
Ещё поток обрывается, если делаешь какую-то дичь, вроде деления на 9 или взятие значения переменной, у которой этого значения нет.
local integer i = 0
local integer ai = 0
local player p
loop
set p = Player(i)
if GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING then
if GetPlayerController(p) == MAP_CONTROL_USER then
call CustomPlayer.create.execute(p, i)
endif
elseif ai < MaxMinionPlayers then
set MinionPlayers[ai] = p
call SetPlayerColor(p, MinionColor)
call FogModifierStart(CreateFogModifierRect(p, FOG_OF_WAR_VISIBLE, bj_mapInitialPlayableArea, false, true))
set ai = ai + 1
endif
set i = i + 1
exitwhen i == bj_MAX_PLAYERS
endloop
» WarCraft 3 / wait течет или капает?
» WarCraft 3 / Сохранение приказов v2.0
Ред. PT153
» WarCraft 3 / Запретить автоатаку
» WarCraft 3 / JNGP 1.30 - есть что-нибудь такое?
» WarCraft 3 / Ошибка при выборе юнита в триггере
» WarCraft 3 / JNGP 1.30 - есть что-нибудь такое?
» WarCraft 3 / Последовательность выполнения
PT153:
Вообще, надо систему логов сделать, вместо вывода в сообщений в игру, ибо последние отключены в ndopt версиях.
Ред. PT153
» WarCraft 3 / Последовательность выполнения
Путь у карты такой: Maps\Download\WispTD v3.-1.2 ndopt.w3x
Обязательно замени _ на пробелы в названии карты.
» WarCraft 3 / Приоритет атаки ИИ
» WarCraft 3 / Приоритет атаки ИИ
Ред. PT153
» WarCraft 3 / Последовательность выполнения
» WarCraft 3 / Последовательность выполнения
Ред. PT153
» WarCraft 3 / Последовательность выполнения
» WarCraft 3 / АвтоклиКАБЕЛЬность
» WarCraft 3 / PauseUnit
Ред. PT153
» WarCraft 3 / PauseUnit
Просимулировал такую же ситуацию на чистой карте - проблемы нет.
Карту в ЛС отправлю.
» WarCraft 3 / Реплей
» WarCraft 3 / Реплей
» WarCraft 3 / jass в новой версии варкрафта
» WarCraft 3 / Как изменить цвет лечения от источника жизни?
» WarCraft 3 / jasshelper не работает
Ред. PT153
» WarCraft 3 / Проблема не знаю с чем
15к строк кода, капец, даже в моей карте 9к строк vJass.
При срабатывании события создаётся "поток" для функции, где находятся все условия триггера. Если все условия выполнены, то создаётся "поток" для функции, где находятся все действия. Про лимит потока тебе уже сказали выше.
Ещё поток обрывается, если делаешь какую-то дичь, вроде деления на 9 или взятие значения переменной, у которой этого значения нет.
» WarCraft 3 / Доспехи веры, зависящие от кол-ва юнитов вокруг ауроносца
» WarCraft 3 / Почему юниты бегут назад в область?
» WarCraft 3 / Почему юниты бегут назад в область?