79 lines
4.0 KiB
Lua
79 lines
4.0 KiB
Lua
--[[----------------------------------------------------------------------------
|
|
AIO/MoonWellPlayerGuide.lua
|
|
─────────────────────────────────────────────────────────────────────────────
|
|
AIO-handler (клиентская часть) для namespace "MoonWellPlayerGuide".
|
|
Сервер отправляет SetData(payload), клиент кладёт его в C_PlayerGuide.
|
|
Клиент шлёт RequestRefresh обратно при нажатии «Обновить».
|
|
|
|
Контракт описан в player-guide-requirements.md → "AIO Contract".
|
|
------------------------------------------------------------------------------]]
|
|
|
|
local AIO = AIO or require("AIO")
|
|
if not AIO then return end -- безопасный no-op без AIO
|
|
|
|
local handlers = AIO.AddHandlers("MoonWellPlayerGuide", {})
|
|
|
|
-- ──────────────────────────────────────────────────────────────────────────
|
|
-- Server → Client
|
|
|
|
-- Полная замена payload
|
|
function handlers.SetData(player, payload)
|
|
if C_PlayerGuide and C_PlayerGuide.SetData then
|
|
local ok, err = C_PlayerGuide.SetData(payload)
|
|
if not ok and DEFAULT_CHAT_FRAME then
|
|
DEFAULT_CHAT_FRAME:AddMessage(
|
|
"|cffff8080[Путеводитель]|r Ошибка payload: "..tostring(err))
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Обновление одной цели (для частичных update'ов)
|
|
function handlers.UpdateObjective(player, objective)
|
|
if not (C_PlayerGuide and C_PlayerGuide.HasData()) then return end
|
|
-- Простая стратегия: пересобрать payload локально с заменой цели по id.
|
|
-- C_PlayerGuide хранит данные internally — даём прямой доступ через _patch:
|
|
local n = C_PlayerGuide.GetNumObjectives()
|
|
for i = 1, n do
|
|
local o = C_PlayerGuide.GetObjectiveInfo(i)
|
|
if o and o.id == objective.id then
|
|
-- Грязный, но рабочий способ для MVP — отдать обратно весь массив.
|
|
-- Для прод-уровня лучше выставить C_PlayerGuide.PatchObjective(o).
|
|
o.progress = objective.progress or o.progress
|
|
o.required = objective.required or o.required
|
|
o.completed = objective.completed
|
|
if MW_PlayerGuide and MW_PlayerGuide.Refresh then
|
|
MW_PlayerGuide.Refresh()
|
|
end
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Замена только инфы об этапе (без массива objectives)
|
|
function handlers.SetStage(player, stagePayload)
|
|
if not stagePayload then return end
|
|
-- Объединяем с текущим payload'ом
|
|
local _, name, desc, progress = C_PlayerGuide.GetStageInfo()
|
|
C_PlayerGuide.SetData({
|
|
stageID = stagePayload.stageID,
|
|
stageName = stagePayload.stageName or name,
|
|
stageDescription = stagePayload.stageDescription or desc,
|
|
progress = stagePayload.progress or progress,
|
|
stages = stagePayload.stages,
|
|
objectives = stagePayload.objectives or {},
|
|
recommendations = stagePayload.recommendations or {},
|
|
rewards = stagePayload.rewards or {},
|
|
})
|
|
end
|
|
|
|
-- Сообщения от сервера (баблы / chat-фрейм)
|
|
function handlers.Notify(player, message)
|
|
if DEFAULT_CHAT_FRAME and message then
|
|
DEFAULT_CHAT_FRAME:AddMessage("|cffffd76a[Путеводитель]|r "..tostring(message))
|
|
end
|
|
end
|
|
|
|
-- ──────────────────────────────────────────────────────────────────────────
|
|
-- Client → Server: ничего регистрировать не нужно — это просто AIO.Handle
|
|
-- внутри C_PlayerGuide.RequestRefresh / RequestTrackObjective / RequestOpenTarget.
|