И опять же, не работает этот кусок только у части людей.
Тем, у кого работает, могут просто не делать определённые действия.
Необходимо скинуть триггеры, которые раскрывают предметы, и триггеры, что включают раскрывающие триггеры.
Попробуй отдавать "стоп" перед удалением, например,
Я так и начал делать, но сейчас это бесполезно, мне кажется, потому что сейчас рект из региона удаляется первее юнитов. 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; всем юнитам отдаётся приказ "Стоп"; удаление миньонов.
» WarCraft 3 / Баги со скрытыми через триггер предметами
» WarCraft 3 / wait течет или капает?
» WarCraft 3 / Баги со скрытыми через триггер предметами
Необходимо скинуть триггеры, которые раскрывают предметы, и триггеры, что включают раскрывающие триггеры.
» WarCraft 3 / Последовательность выполнения
» WarCraft 3 / wait течет или капает?
» WarCraft 3 / Баги со скрытыми через триггер предметами
Также покажи все места, где итемы раскрываются.
» 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 в новой версии варкрафта