2025-06-04 05:02:57 +08:00

219 lines
5.9 KiB
Plaintext

local BaseCell = autoImport("BaseCell");
DialogCell = class("DialogCell", BaseCell);
function DialogCell:Init()
self:FindObjs();
end
function DialogCell:FindObjs()
self.namelabel = self:FindGO("NpcNameLabel"):GetComponent(UILabel);
self.contentlabel = self:FindGO("DialogContent"):GetComponent(UILabel);
self.continue = self:FindGO("continueSymbol");
self.viceContentLabel = self:FindComponent("DialogViceContent", UILabel);
local bgClick = self:FindGO("BgClick");
if(bgClick)then
local bgSprite = bgClick:GetComponent(UISprite);
bgSprite.height = GameObjectUtil.Instance:GetUIActiveHeight(bgClick);
self:SetEvent(bgClick, function (go)
self:ClickCell();
end, {hideClickSound = true});
end
end
function DialogCell:ClickCell()
if(self.leftStr == nil)then
self:PassEvent(MouseEvent.MouseClick);
return;
end
if(self.cpyData == nil)then
self.cpyData = {};
else
TableUtility.TableClear(self.cpyData)
end
-- table的value不會重新賦值 所以不用考慮引用關係
for k,v in pairs(self.data)do
self.cpyData[k] = v;
end
self.cpyData.Text = self.leftStr;
self:SetData(self.cpyData);
end
function DialogCell:SetData(dialogData, params)
self.data = dialogData;
if(dialogData)then
local speakerID = dialogData.Speaker or 0;
if(speakerID == 0)then
self.namelabel.text = Game.Myself.data.name;
speakerID = Game.Myself.data.id;
else
if(Table_Npc[dialogData.Speaker])then
self.namelabel.text = Table_Npc[dialogData.Speaker].NameZh;
speakerID = dialogData.Speaker
elseif(Table_Monster[dialogData.Speaker])then
self.namelabel.text = Table_Monster[dialogData.Speaker].NameZh;
speakerID = dialogData.Speaker
end
end
if(speakerID)then
if(dialogData.Emoji and dialogData.Emoji~=0)then
self:PlayEmoji(speakerID, dialogData.Emoji);
end
if(dialogData.Action and dialogData.Action.actionid)then
self:PlayAction(speakerID, dialogData.Action.actionid, dialogData.Action.num);
end
if(dialogData.Voice and dialogData.Voice~="")then
AudioUtil.PlayNpcVisitVocal(dialogData.Voice)
end
end
local context = self:GetDialogText(dialogData);
if(context == "")then
self:Hide(self.gameObject);
else
self:Show(self.gameObject);
if(params and #params > 0)then
context = self:_ReplaceQuestParams(context, params);
end
self:SetContext(context);
if(not dialogData.NoSpeak)then
self:PlayerSpeak(speakerID, context);
end
end
if(self.viceContentLabel)then
if(dialogData.ViceText)then
self.viceContentLabel.text = dialogData.ViceText;
self.viceContentLabel.gameObject:SetActive(true);
else
self.viceContentLabel.gameObject:SetActive(false);
end
end
end
end
local _Dialog_ReplaceParam = Dialog_ReplaceParam;
function DialogCell:GetDialogText(dialogData)
local out_text = MsgParserProxy.Instance:TryParse(dialogData.Text or "");
if(dialogData.id == nil or _Dialog_ReplaceParam == nil)then
return out_text;
end
local cfg = _Dialog_ReplaceParam[dialogData.id];
if(cfg == nil)then
return out_text;
end
local params = {};
for i=1,#cfg do
table.insert(params, self:ParseReplaceParam(cfg[i]));
end
return string.format(out_text, unpack(params));
end
local ReplaceParam_FuncMap = {};
local DialogParamType_StoragePrice = DialogParamType and DialogParamType.StoragePrice or "111";
ReplaceParam_FuncMap[ DialogParamType_StoragePrice ] = function ()
local isFree = ActivityEventProxy.Instance:IsStorageFree();
if(isFree)then
return 0;
end
local free_actid = GameConfig.System.warehouse_free_activityid;
if(free_actid)then
local running = FunctionActivity.Me():IsActivityRunning( free_actid );
if(running)then
return 0;
end
end
local rewardInfo = ActivityEventProxy.Instance:GetRewardByType(AERewardType.GuildDonate)
return GameConfig.System.warehouseZeny;
end
function DialogCell:ParseReplaceParam(param)
local func = ReplaceParam_FuncMap[param];
if(func)then
return ReplaceParam_FuncMap[param]();
end
return "";
end
local QuestParamPattern = "%[QuestParam%]";
function DialogCell:_ReplaceQuestParams(text, params)
local resultStr = string.gsub(text, QuestParamPattern,function ()
return table.remove(params, 1) or "";
end)
return resultStr
end
function DialogCell:SetContext(text)
self.contentlabel.text = text;
local bWrap, leftStr = UIUtil.GetWrapLeftString (self.contentlabel, text);
if(not bWrap)then
self.leftStr = leftStr;
else
self.leftStr = nil;
end
end
function DialogCell:GetNearNpc(id)
local myPos = Game.Myself:GetPosition();
return NSceneNpcProxy.Instance:FindNearestNpc(myPos, id);
end
function DialogCell:PlayerSpeak(id, text)
local role = self:GetNearNpc(id);
if(role)then
role:GetSceneUI().roleTopUI:Speak(text);
end
end
function DialogCell:PlayEmoji(id, emojiId)
local role = self:GetNearNpc(id);
if(role)then
role:GetSceneUI().roleTopUI:PlayEmojiById(emojiId);
end
end
function DialogCell:PlayAction(id, actionId, num)
local role = self:GetNearNpc(id);
if(role)then
num = num or 1;
local actionName = Table_ActionAnime[actionId] and Table_ActionAnime[actionId].Name;
role:Client_PlayAction(actionName, nil, false);
end
end
function DialogCell:Set_UpdateSetTextCall(updateSetTextCall, updateSetTextCallParam)
local remove, text = updateSetTextCall(updateSetTextCallParam);
self:SetContext(text);
if(not remove)then
self.updateSetTextCall = updateSetTextCall;
self.updateSetTextCallParam = updateSetTextCallParam;
self.updateSetTick = TimeTickManager.Me():CreateTick(0, 1000, self._updateSetTick,self)
end
end
function DialogCell:_updateSetTick()
if(self.updateSetTextCall)then
local remove, text = self.updateSetTextCall(self.updateSetTextCallParam);
self:SetContext(text);
if(remove)then
self:RemoveUpdateSetTick();
end
end
end
function DialogCell:RemoveUpdateSetTick()
if(self.updateSetTick)then
TimeTickManager.Me():ClearTick(self, 1);
self.updateSetTick = nil;
end
end
function DialogCell:OnExit()
self:RemoveUpdateSetTick();
end