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

1915 lines
58 KiB
Plaintext

MainViewMiniMap = class("MainViewMiniMap", SubView);
autoImport("WrapCellHelper");
autoImport("MiniMapWindow");
autoImport("NearlyCreatureCell");
autoImport("MiniMapData");
autoImport("MiniMapGuideAnim");
local MapManager = Game.MapManager;
local miniMapDataDeleteFunc = function (data)
data:Destroy();
end
function MainViewMiniMap:Init()
self:InitData();
self:InitUI();
self:MapEvent();
end
local _NSceneNpcProxy;
local _TableClearByDeleter;
local _TableClear;
local _SuperGvgProxy;
local _TeamProxy;
function MainViewMiniMap:InitData()
_NSceneNpcProxy = NSceneNpcProxy.Instance;
_TableClearByDeleter = TableUtility.TableClearByDeleter;
_TableClear = TableUtility.TableClear;
_SuperGvgProxy = SuperGvgProxy.Instance;
_TeamProxy = TeamProxy.Instance;
self.questShowDatas = {};
self.nearlyPlayers = {};
self.npcRoles = {};
self.monsterDataMap = {};
self.teamMemberMapDatas = {};
self.spotDatas = {};
self.sealDatasMap = {};
self.treeMapDatasMap = {};
self.focusMap = {};
self.playerMap = {};
self.showNpcs = {};
self.gvgDroiyanMap = {};
self.poringFightDropMap = {};
--蝴蝶翅膀和蒼蠅翅膀
self.UseButterflyButtonInfo = {};
self.UseFlyButtonInfo = {};
-- 組隊競技戰
self.teamPwsMapInfo = {};
end
local tempArgs = {};
local tempV3 = LuaVector3();
function MainViewMiniMap:InitUI()
self.mapBord = self:FindGO("MapBord");
self:InitBigMap();
self.miniMapButton = self:FindGO("MiniMapButton");
self:AddOrRemoveGuideId(self.miniMapButton, 107)
self:AddClickEvent(self.miniMapButton, function (go)
self:ActiveMapBord(not self.mapBord.activeInHierarchy);
end);
local miniMapWindowGO = self:FindGO("MiniMapWindow");
self.minimapWindow = MiniMapWindow.new(miniMapWindowGO);
self.mPanel = self:FindComponent("MiniMapScrollView", UIPanel);
self.minimapWindow:ActiveFocusArrowUpdate(true);
self.minimapWindow:SetUpdateEvent(self.CenterMiniMapWindow, self);
self.nearlyBord = self:FindGO("NearlyBord");
self.nearlyPlayerTipStick = self:FindComponent("NearlyPlayerTipStick", UIWidget);
self.gvgFinalFightTip = self:FindGO("GvgFinalFightTip");
local nearly_playerTog = self:FindGO("PlayerTog", self.nearlyBord);
self.playerTog = nearly_playerTog:GetComponent(UIToggle);
self:AddClickEvent(nearly_playerTog, function (go)
self:UpdateNearlyCreature(1, true);
end);
local nearly_npcTog = self:FindGO("NPCTog", self.nearlyBord);
self.npcTog = nearly_npcTog:GetComponent(UIToggle);
self:AddClickEvent(nearly_npcTog, function (go)
self:UpdateNearlyCreature(2, true);
end);
-- self.gvgDroiyan_stick = self:FindComponent("GvgDroiyanInfo", UIWidget);
local nearlyButton = self:FindGO("NearlyButton");
self.nearlyButton_Symbol = self:FindComponent("Arrow", UISprite);
self:AddClickEvent(nearlyButton, function (go)
if(Game.MapManager:IsPVPMode_PoringFight())then
MsgManager.ShowMsgByIDTable(3606);
return;
end
if(Game.MapManager:IsGvgMode_Droiyan())then
-- if(true)then
self:ActiveGvgFinalFightTip(not self.gvgFinalFightTip.activeSelf)
return;
end
if(not self.nearlyBord.activeSelf)then
if(self.nowNearlyTog == nil)then
self.nowNearlyTog = 1;
end
self:UpdateNearlyCreature(1, true);
self:ActiveNearlyBord(true);
else
self:ActiveNearlyBord(false);
end
end);
local nearlyGrid = self:FindGO("NearlyGrid");
local wrapConfig = {
wrapObj = nearlyGrid,
cellName = "NearlyCreatureCell",
control = NearlyCreatureCell,
dir = 1,
}
self.nearlyCreaturesCtl = WrapCellHelper.new(wrapConfig)
self.nearlyCreaturesCtl:AddEventListener(MouseEvent.MouseClick, self.ClickNearlyCell, self)
self.noPlayerTip = self:FindGO("PlayerNoneTip");
self.bubbleStick = self:FindComponent("BubbleStick", UIWidget);
local closeMapGO = self:FindGO("CloseMap");
self:AddClickEvent(closeMapGO, function ()
self:ActiveMapBord(false);
end);
end
local IsNull = Slua.IsNull;
local InverseTransformPointByTransform = LuaGameObject.InverseTransformPointByTransform;
local GetLocalPosition = LuaGameObject.GetLocalPosition;
local GetPosition = LuaGameObject.GetPosition;
local S_World = Space.World;
function MainViewMiniMap:CenterMiniMapWindow(window)
if(IsNull(window.mapTexture))then
return;
end
local mMap = window.mapTexture.transform;
tempV3[1],tempV3[2],tempV3[3] = InverseTransformPointByTransform(window.gameObject.transform, window.myTrans, S_World)
local x,y,z = GetLocalPosition(mMap)
tempV3[1],tempV3[2],tempV3[3] = x-tempV3[1],y-tempV3[2],z-tempV3[3]
mMap.transform.localPosition = tempV3;
tempV3[1],tempV3[2],tempV3[3] = GetPosition(window.s_symbolParent);
window.d_symbolParent.position = tempV3;
end
function MainViewMiniMap:ClickNearlyCell( cellCtl )
local id = cellCtl.id;
local creatureType = cellCtl.creatureType;
if(creatureType == Creature_Type.Player)then
local creature = SceneCreatureProxy.FindCreature(id);
if(creature)then
local playerData = PlayerTipData.new();
playerData:SetByCreature(creature);
if(creature ~= self.lastCreature)then
local playerTip = FunctionPlayerTip.Me():GetPlayerTip(self.nearlyPlayerTipStick, NGUIUtil.AnchorSide.Right, {-356,0});
local tipData = {
playerData = playerData,
};
tipData.funckeys = FunctionPlayerTip.Me():GetPlayerFunckey(id)
table.insert(tipData.funckeys, "Booth")
playerTip:SetData(tipData);
playerTip.closecallback = function (go)
self.lastCreature = nil;
end
playerTip:AddIgnoreBound(cellCtl.gameObject);
self.lastCreature = creature;
else
FunctionPlayerTip.Me():CloseTip();
self.lastCreature = nil;
end
end
elseif(creatureType == Creature_Type.Npc)then
local pos = cellCtl.pos;
self.minimapWindow:SetTipPos(pos);
self.bigmapWindow:SetTipPos(pos);
local npcid, uniqueid = cellCtl.npcid, cellCtl.uniqueid;
_TableClear(tempArgs);
tempArgs = {
targetMapID = MapManager:GetMapID(),
npcID = npcid,
npcUID = uniqueid,
}
local cmd = MissionCommandFactory.CreateCommand(tempArgs, MissionCommandVisitNpc)
Game.Myself:Client_SetMissionCommand( cmd );
end
end
function MainViewMiniMap:InitBigMap()
self.mapName = self:FindComponent("MapName" , UILabel, self.mapBord);
self.bigmapWindow = MiniMapWindow.new(self:FindGO("BigMapWindow"));
self.bigmapWindow:AddMapClick();
self.bigmapWindow:ActiveFocusArrowUpdate(false);
self:AddButtonEvent("ReturnHome", function (go)
MsgManager.ConfirmMsgByID(7, function ()
ServiceNUserProxy.Instance:ReturnToHomeCity()
end, nil)
end);
self.bigMapButton = self:FindGO("BigMapButton");
self.bigMapLab = self:FindComponent("Label", UILabel, self.bigMapButton);
self:AddClickEvent(self.bigMapButton, function (go)
if(self.bigmapWindow.lock)then
return;
end
local inRaid = MapManager:IsRaidMode();
if(inRaid)then
if(MapManager:IsPVPMode_TeamPws())then
MsgManager.ShowMsgByIDTable(25923);
return;
end
MsgManager.ConfirmMsgByID(7, function ()
ServiceNUserProxy.Instance:ReturnToHomeCity()
end, nil)
else
self:sendNotification(UIEvent.JumpPanel, {view = PanelConfig.WorldMapView, viewdata = {}});
end
self:ActiveMapBord(false);
end);
-- 小地圖優化邏輯
self.frontMapInfo = self:FindGO("MapFrontInfo");
self.enlargeSprite = self:FindComponent("EnLargeButton", UISprite, self.frontMapInfo);
self:AddClickEvent(self.enlargeSprite.gameObject, function (go)
self:EnLargeBigMap(not self.bigmaplarge);
end);
local activeComp = self.mapBord:GetComponent(RelateGameObjectActive);
activeComp.enable_Call = function ()
self:EnLargeBigMap(false);
end
self.moreBord = self:FindGO("MoreBord");
local moreBtn = self:FindGO("MoreButton");
local DoujinshiNode = self:FindGO("DoujinshiNode");
self:AddClickEvent(moreBtn, function ()
if(self.bigmapWindow.active)then
if(not self:ActiveMapBord(false))then
return;
end
end
self.moreBord:SetActive(not self.moreBord.activeSelf);
if self.moreBord.activeSelf then
DoujinshiNode.gameObject:SetActive(false)
end
end)
--蝴蝶翅膀
self.UseButterflyButtonInfo.itemID = 50001
self.UseButterflyButtonInfo.msgID = 25440
self.UseButterflyButtonInfo.msgDoNotHaveID = 25444
self.UseButterflyButtonInfo.base = self:FindComponent("UseButterflyWingsButton", UISprite, self.frontMapInfo);
self.UseButterflyButtonInfo.icon = self:FindComponent("Icon", UISprite, self.UseButterflyButtonInfo.base.gameObject);
IconManager:SetItemIcon("item_" .. self.UseButterflyButtonInfo.itemID, self.UseButterflyButtonInfo.icon)
self:AddClickEvent(self.UseButterflyButtonInfo.base.gameObject, function (go)
self:TryUseButterflyOrFly(self.UseButterflyButtonInfo)
end)
self.UseButterflyButtonInfo.base.gameObject:SetActive(GameConfig.MapIconShow.mapicon_butterfly_open ~= 0)
--蒼蠅翅膀
self.UseFlyButtonInfo.itemID = 5024
self.UseFlyButtonInfo.msgID = 25439
self.UseFlyButtonInfo.msgDoNotHaveID = 25444
self.UseFlyButtonInfo.base = self:FindComponent("UseFlyWingsButton", UISprite, self.frontMapInfo);
self.UseFlyButtonInfo.icon = self:FindComponent("Icon", UISprite, self.UseFlyButtonInfo.base.gameObject);
IconManager:SetItemIcon("item_" .. self.UseFlyButtonInfo.itemID, self.UseFlyButtonInfo.icon)
self:AddClickEvent(self.UseFlyButtonInfo.base.gameObject, function (go)
self:TryUseButterflyOrFly(self.UseFlyButtonInfo)
end)
self.UseFlyButtonInfo.base.gameObject:SetActive(GameConfig.MapIconShow.mapicon_fly_open ~= 0)
self:RefreshButterflyAndFlyButtons()
end
function MainViewMiniMap:ActiveMapBord(b)
if(self.bigmapWindow.lock)then
return false;
end
--self.nearlyButtonLabel.text = Game.MapManager:IsGvgMode_Droiyan() and ZhString.MiniMapGVGInfo or ZhString.MiniMapNearby
if(b)then
self.mapBord:SetActive(true);
self.bigmapWindow:Show();
self.bigmapWindow:UpdateQuestNpcSymbol(self.questShowDatas, true);
self.bigmapWindow:ResetMapPos();
self:UpdateNearlyMonsters();
if(Game.MapManager:IsGvgMode_Droiyan())then
self:ActiveGvgFinalFightTip(true)
end
self:UpdateNearlyCreature(self.nowNearlyTog or 1, true);
--蝴蝶翅膀和蒼蠅翅膀
self:RefreshButterflyAndFlyButtons();
else
self.mapBord:SetActive(false);
self.bigmapWindow:Hide();
self:ActiveNearlyBord(false);
if(Game.MapManager:IsGvgMode_Droiyan())then
self:ActiveGvgFinalFightTip(false)
end
self:ShutDownGuideAnim();
end
return true;
end
function MainViewMiniMap:EnLargeBigMap(b, notCenterMyPos)
if(self.bigmapWindow.lock)then
return;
end
if(b)then
self.bigmaplarge = true;
self.bigmapWindow:SetMapScale(2.3);
if(notCenterMyPos == nil or notCenterMyPos == false)then
self.bigmapWindow:CenterOnMyPos(true);
end
self.bigmapWindow:EnableDrag(true);
self.bigmapWindow:ShowOrHideExitInfo(true);
self.enlargeSprite.spriteName = "com_btn_narrow";
self.bigmapWindow:ActiveNearlyMonsters(false);
else
self.bigmaplarge = false;
self.bigmapWindow:SetMapScale(1);
self.bigmapWindow:ResetMapPos();
self.bigmapWindow:EnableDrag(false);
self.bigmapWindow:ShowOrHideExitInfo(false);
self.enlargeSprite.spriteName = "com_btn_enlarge";
self.bigmapWindow:ActiveNearlyMonsters(true);
end
end
function MainViewMiniMap:ActiveGvgFinalFightTip(isShow)
self.gvgFinalFightTip:SetActive(isShow)
if(isShow)then
if not self.gvgFinalFightTipCtl then
self.gvgFinalFightTipCtl = GvgFinalFightTip.new(self.gvgFinalFightTip)
end
self.gvgFinalFightTipCtl:OnShow()
else
if self.gvgFinalFightTipCtl then
self.gvgFinalFightTipCtl:OnHide()
end
end
self.nearlyButton_Symbol.flip = self.gvgFinalFightTip.activeSelf and 0 or 1;
end
function MainViewMiniMap:OnShow()
self:UpdateMyMapPos();
end
function MainViewMiniMap:OnEnter()
MainViewMiniMap.super.OnEnter(self);
self.minimapWindow:Show();
self:ActiveMapBord(false);
if (Game.MapManager:IsPVPMode_PoringFight()) then
self:ShowPoringFightMapItems();
end
self:ActiveCheckMonstersPoses(true);
end
function MainViewMiniMap:OnExit()
self.minimapWindow:Hide();
self:ActiveCheckMonstersPoses(false);
self:ClearPoringFightMapItems();
MainViewMiniMap.super.OnExit(self);
end
-- function MainViewMiniMap:EnterMap()
-- self:UpdateMapAllInfo();
-- end
-- nearly creatures begin
function MainViewMiniMap:ActiveNearlyBord(b)
self.nearlyBord:SetActive(b);
self.nearlyButton_Symbol.flip = self.nearlyBord.activeSelf and 0 or 1;
end
function MainViewMiniMap:UpdateNearlyCreature(tog, forceUpdate)
local needUpdateList = true;
if(not forceUpdate and not self.nearlyBord.activeSelf)then
needUpdateList = not self.nearlyBord.activeSelf;
end
if(not needUpdateList)then
return;
end
self.nearlyCreaturesCtl:ResetPosition();
-- 1:player 2:npc
if(tog == 1)then
self.playerTog.value = true;
self.npcTog.value = false;
_TableClearByDeleter(self.nearlyPlayers, miniMapDataDeleteFunc);
local allRole = NSceneUserProxy.Instance.userMap;
for _,role in pairs(allRole)do
local playerMapData = MiniMapData.CreateAsTable( role.data.id );
playerMapData:SetParama("creatureType", Creature_Type.Player);
playerMapData:SetParama("name", role.data.name);
local profession = role.data.userdata:Get(UDEnum.PROFESSION);
playerMapData:SetParama("Profession", profession);
local gender = role.data.userdata:Get(UDEnum.SEX);
playerMapData:SetParama("gender", gender);
local level = role.data.userdata:Get(UDEnum.ROLELEVEL);
playerMapData:SetParama("level", level);
table.insert(self.nearlyPlayers, playerMapData)
end
self.nearlyCreaturesCtl:ResetDatas(self.nearlyPlayers);
self.noPlayerTip:SetActive(#self.nearlyPlayers == 0);
elseif(tog == 2)then
self.npcTog.value = true;
self.playerTog.value = false;
_TableClearByDeleter(self.npcRoles, miniMapDataDeleteFunc);
local npcRolesMap = {};
local npcList = MapManager:GetNPCPointArray();
if(npcList)then
for i=1,#npcList do
local point = npcList[i];
local npcData = Table_Npc[ point.ID ];
if(npcData and npcData.MapIcon ~= "" and npcData.NoShowMapIcon ~= 1)then
local combineId = QuestDataStepType.QuestDataStepType_VISIT..point.ID..point.uniqueID;
local npcMapData = npcRolesMap[combineId];
if(npcMapData == nil)then
npcMapData = MiniMapData.CreateAsTable( combineId );
end
npcMapData:SetParama("creatureType", Creature_Type.Npc);
npcMapData:SetParama("npcid", npcData.id);
npcMapData:SetParama("uniqueid", point.uniqueID);
npcMapData:SetParama("name", npcData.NameZh);
npcMapData:SetParama("icon", npcData.MapIcon);
npcMapData:SetParama("PositionTip", npcData.Position);
npcMapData:SetPos(point.position[1], point.position[2], point.position[3]);
npcRolesMap[ combineId ] = npcMapData;
table.insert(self.npcRoles, npcMapData);
end
end
end
-- for combineId, miniMapData in pairs(self.questShowDatas)do
-- local npcMapData = npcRolesMap[combineId];
-- if( npcMapData )then
-- npcMapData:SetParama("Symbol", miniMapData:GetParama("SymbolType"));
-- end
-- end
table.sort(self.npcRoles, function (qa, qb)
return qa:GetParama("npcid") < qb:GetParama("npcid");
end)
self.nearlyCreaturesCtl:ResetDatas(self.npcRoles);
self.noPlayerTip:SetActive(false);
end
self.nowNearlyTog = tog;
end
function MainViewMiniMap:ActiveCheckMonstersPoses(open)
if(open)then
TimeTickManager.Me():CreateTick(0,1000,self.UpdateNearlyMonsters, self, 1)
else
TimeTickManager.Me():ClearTick(self, 1)
end
end
function MainViewMiniMap:UpdateNearlyMonsters()
if(not self.minimapWindow:IsActive())then
return;
end
local isMvpFight = MapManager:IsPVPMode_MvpFight();
local monsterIdMap = FunctionMonster.Me():FilterMonster(isMvpFight);
_TableClearByDeleter(self.monsterDataMap, miniMapDataDeleteFunc);
local rolelv = MyselfProxy.Instance:RoleLevel()
local curImageId = ServicePlayerProxy.Instance:GetCurMapImageId() or 0;
local isRaid = MapManager:IsRaidMode() or curImageId > 0;
for _,monsterId in pairs(monsterIdMap)do
local monster = _NSceneNpcProxy:Find(monsterId);
if(monster and monster.data and RoleDefines_Camp.ENEMY == monster.data:GetCamp())then
local pos = monster:GetPosition();
if(pos)then
local monsterMapData = MiniMapData.CreateAsTable(monster.id);
monsterMapData:SetPos(pos[1], pos[2], pos[3]);
local sdata = monster.data.staticData;
local symbolName, depth;
local bdata = Table_Boss[sdata.id]
if bdata and bdata.Type == 3 then
if(isMvpFight)then
monsterMapData:SetParama("monster_icon", sdata.Icon);
end
symbolName = "ui_mvp_dead11_JM";
depth = 4;
elseif(sdata.Type == "MVP")then
if(isMvpFight)then
monsterMapData:SetParama("monster_icon", sdata.Icon);
end
symbolName = "map_mvpboss";
depth = 3;
elseif(sdata.Type == "MINI")then
if(isMvpFight)then
monsterMapData:SetParama("monster_icon", sdata.Icon);
end
symbolName = "map_miniboss";
depth = 2;
else
if(isRaid)then
symbolName = "map_dot";
else
local search = monster.data.search or 0;
local searchrange = monster.data.searchrange or 0;
if(search > 0 or searchrange > 0)then
local mdata = monster.data.staticData;
if(mdata.PassiveLv and mdata.PassiveLv <= rolelv)then
symbolName = "map_dot";
else
symbolName = "map_green";
end
else
symbolName = "map_green";
end
end
depth = 1;
end
monsterMapData:SetParama("Symbol", symbolName);
monsterMapData:SetParama("depth", depth);
table.insert(self.monsterDataMap, monsterMapData);
end
end
end
if(self.minimapWindow:IsActive())then
self.minimapWindow:UpdateMonstersPoses(self.monsterDataMap, true)
end
if(self.bigmapWindow:IsActive())then
self.bigmapWindow:UpdateMonstersPoses(self.monsterDataMap, true)
end
end
-- nearly creatures end
-- quest begin
function MainViewMiniMap:GetMapNpcPointByNpcId( npcid )
local npcList = MapManager:GetNPCPointArray();
if(npcList)then
for i=1,#npcList do
local npcPoint = npcList[i];
if(npcPoint and npcPoint.ID == npcid)then
return npcPoint;
end
end
end
end
function MainViewMiniMap:UpdateQuestMapSymbol()
local nowMapId = MapManager:GetMapID();
local questlst = QuestProxy.Instance:getQuestListByMapAndSymbol(nowMapId);
_TableClearByDeleter(self.questShowDatas, miniMapDataDeleteFunc);
-- Normal Quest
for _, q in pairs(questlst) do
local params = q.staticData and q.staticData.Params;
if(params.ShowSymbol~=2 and params.ShowSymbol~=3)then
local symbolType = QuestSymbolCheck.GetQuestSymbolByQuest(q)
if( symbolType )then
local combineId;
local npcPoint;
local uniqueid, npcid = params.uniqueid, params.npc;
npcid = type(npcid) == "table" and npcid[1] or npcid;
if( uniqueid )then
npcPoint = MapManager:FindNPCPoint( uniqueid );
elseif(npcid)then
npcPoint = self:GetMapNpcPointByNpcId( npcid );
uniqueid = npcPoint and npcPoint.uniqueID or 0;
else
combineId = q.questDataStepType..q.id;
end
if(nil == combineId)then
if(npcid == nil and uniqueid == nil)then
errorLog("Not Find Npc (questId:%s)", q.id);
end
combineId = QuestDataStepType.QuestDataStepType_VISIT..tostring(npcid)..tostring(uniqueid);
end
local miniMapData = self.questShowDatas[combineId];
if(not miniMapData)then
local pos = params.pos;
if(not pos and npcPoint)then
pos = npcPoint.position;
end
if(pos)then
miniMapData = self.questShowDatas[combineId];
if(miniMapData == nil)then
miniMapData = MiniMapData.CreateAsTable(combineId);
end
miniMapData:SetPos(pos[1], pos[2], pos[3]);
miniMapData:SetParama( "questId", q.id );
miniMapData:SetParama( "npcid", npcid );
miniMapData:SetParama( "uniqueid", uniqueid );
miniMapData:SetParama( "SymbolType", symbolType );
miniMapData:SetParama( "combineId", combineId );
self.questShowDatas[combineId] = miniMapData;
end
else
local cacheSymbolType = miniMapData:GetParama( "SymbolType" );
if(symbolType < cacheSymbolType)then
miniMapData:SetParama( "SymbolType", symbolType );
end
end
end
end
end
-- Left Daily Quest
local npcList = MapManager:GetNPCPointArray();
if(npcList)then
for i=1,#npcList do
local npcPoint = npcList[i];
local npcid, uniqueid = npcPoint.ID, npcPoint.uniqueID;
local combineId = QuestDataStepType.QuestDataStepType_VISIT..npcPoint.ID..npcPoint.uniqueID;
local miniMapData = self.questShowDatas[combineId];
if(not miniMapData)then
local npcSData = Table_Npc[ npcid ];
if( QuestSymbolCheck.HasDailySymbol(npcSData) )then
miniMapData = self.questShowDatas[combineId];
if(miniMapData == nil)then
miniMapData = MiniMapData.CreateAsTable(combineId);
self.questShowDatas[combineId] = miniMapData;
end
local pos = npcPoint.position;
miniMapData:SetPos(pos[1], pos[2], pos[3]);
miniMapData:SetParama( "npcid", npcid );
miniMapData:SetParama( "uniqueid", uniqueid );
miniMapData:SetParama( "SymbolType", QuestSymbolType.Daily );
end
end
end
end
self.minimapWindow:UpdateQuestNpcSymbol(self.questShowDatas, true);
self.bigmapWindow:UpdateQuestNpcSymbol(self.questShowDatas, true);
self:UpdateNpcPointState();
end
function MainViewMiniMap:UpdateNpcPointState()
local config = GameConfig.NpcMapIconShowCondition;
if(config)then
local mylv = Game.Myself.data.userdata:Get(UDEnum.ROLELEVEL)
for npcid, config in pairs(config)do
local isNowMap = config.mapid == nil or config.mapid == MapManager:GetMapID();
local islvReach = config.level == nil or mylv >= config.level;
local isCompelete = QuestProxy.Instance:isQuestComplete(config.questId);
self.minimapWindow:UpdateNpcPointState(npcid, isNowMap and (islvReach or isCompelete));
self.bigmapWindow:UpdateNpcPointState(npcid, isNowMap and (islvReach or isCompelete));
end
end
end
-- quest end
-- memberPos begin
function MainViewMiniMap:UpdateTeamMembersPos(refreshSymbol)
local nowMapid = MapManager:GetMapID();
local restirct = Table_MapRaid[nowMapid] and Table_MapRaid[nowMapid].Restrict;
if(restirct and restirct == 1)then
self:ClearTeamMemberPos();
return;
end
if(_TeamProxy:IHaveTeam())then
local myTeam = _TeamProxy.myTeam;
local memberMap = myTeam:GetMemberMap();
for id,member in pairs(memberMap)do
self:UpdateTeamMemberPos(member.id, refreshSymbol);
end
for id,data in pairs(self.teamMemberMapDatas)do
if(not myTeam:GetMemberByGuid(id))then
self:RemoveTeamMemberPos(id);
end
end
else
self:ClearTeamMemberPos();
end
end
local BuffToBallMap;
local Init_BuffToBallMap = function ()
BuffToBallMap = {};
local npcsID = GameConfig.PvpTeamRaid and GameConfig.PvpTeamRaid.ElementNpcsID;
if(npcsID == nil)then
error("GameConfig.PvpTeamRaid Not Find..");
return;
end
for k,v in pairs(npcsID)do
BuffToBallMap[v.buffid] = v;
end
end
local Func_GetTeamPwsBallSymbol = function (creature)
if(not MapManager:IsPVPMode_TeamPws())then
return;
end
local buffs = creature.buffs;
if(buffs == nil)then
return;
end
if(BuffToBallMap == nil)then
Init_BuffToBallMap();
end
for buffid,_ in pairs(buffs)do
if(BuffToBallMap[buffid])then
return BuffToBallMap[buffid].mapicon;
end
end
end
local Player_Symbol_Name_Map =
{
[1] = "map_red",
[2] = "map_blue",
[3] = "map_yellow",
}
local GvgDroiyan_Player_Symbol_Name_Map =
{
[1] = "map_red",
[2] = "map_blue",
[3] = "map_purple",
[4] = "map_green",
}
function MainViewMiniMap:UpdateTeamMemberPos(id, refreshSymbol)
if(not id or (Game.Myself and id == Game.Myself.data.id))then
return;
end
-- remove OtherMap Member
if(_TeamProxy:IHaveTeam())then
local myTeam = _TeamProxy.myTeam;
local memData = myTeam:GetMemberByGuid(id);
local nowMapid = MapManager:GetMapID();
if(not memData or
(memData.mapid~=nowMapid and memData.raid~=nowMapid) or
memData.offline == 1)then
self:RemoveTeamMemberPos(id);
return;
end
local symbolMap = MapManager:IsGvgMode_Droiyan() and _EmptyTable or Player_Symbol_Name_Map;
local miniMapData = self.teamMemberMapDatas[id];
if(not miniMapData)then
miniMapData= MiniMapData.CreateAsTable(id);
self.teamMemberMapDatas[id] = miniMapData;
refreshSymbol = true;
end
local isTeamPws = MapManager:IsPVPMode_TeamPws();
if(isTeamPws)then
refreshSymbol = true;
end
if(refreshSymbol)then
local tag = Game.Myself.data.userdata:Get(UDEnum.PVP_COLOR);
if(tag~=nil and symbolMap[tag])then
miniMapData:SetParama("Symbol", symbolMap[tag]);
else
miniMapData:SetParama("Symbol", "map_teammate");
end
if(isTeamPws)then
local playerPwsSymbol;
local player = NSceneUserProxy.Instance:Find(id);
if(player)then
playerPwsSymbol = Func_GetTeamPwsBallSymbol(player);
if(playerPwsSymbol)then
miniMapData:SetParama("Symbol", playerPwsSymbol);
end
end
end
end
local pos = memData.pos;
miniMapData:SetPos(pos[1], pos[2], pos[3]);
local k,v = next(self.teamMemberMapDatas);
self.minimapWindow:UpdateTeamMemberSymbol(self.teamMemberMapDatas);
self.bigmapWindow:UpdateTeamMemberSymbol(self.teamMemberMapDatas);
end
end
function MainViewMiniMap:RemoveTeamMemberPos(id)
if(not id)then
return;
end
local miniMapData = self.teamMemberMapDatas[id];
if(miniMapData)then
miniMapData:Destroy();
end
self.teamMemberMapDatas[id] = nil;
self.minimapWindow:RemoveTeamMemberSymbol(id);
self.bigmapWindow:RemoveTeamMemberSymbol(id);
end
function MainViewMiniMap:ClearTeamMemberPos()
for id, teamMemberData in pairs(self.teamMemberMapDatas)do
self.minimapWindow:RemoveTeamMemberSymbol(id);
self.bigmapWindow:RemoveTeamMemberSymbol(id);
end
_TableClear(self.teamMemberMapDatas, miniMapDataDeleteFunc);
end
-- memberPos end
local lastMapId;
local cache_servershowNpcMap;
function MainViewMiniMap:UpdateMapAllInfo(map2d)
self.mapInited = true;
map2d = map2d or Game.Map2DManager:GetMap2D();
local nowMapId = MapManager:GetMapID();
local mapIdChanged = false;
if(nowMapId ~= lastMapId)then
lastMapId = nowMapId;
mapIdChanged = true;
end
self.mapdata = Table_Map[nowMapId];
self.mapName.text = self.mapdata.NameZh;
if(MapManager:IsRaidMode())then
self.bigMapLab.text = ZhString.MainViewMiniMap_ReturnHome;
else
self.bigMapLab.text = ZhString.MainViewMiniMap_WorldMap;
end
self.minimapWindow:Reset();
self.bigmapWindow:Reset();
if(map2d)then
tempV3:Set(375, 375, 0);
self.bigmapWindow:UpdateMapTexture(self.mapdata, tempV3, map2d);
if(self.mapdata.MapScale)then
local maxline = math.max(map2d.size.x, map2d.size.y);
maxline = maxline*(150/self.mapdata.MapScale);
tempV3:Set(maxline, maxline, 0);
self.minimapWindow:UpdateMapTexture(self.mapdata, tempV3, map2d);
end
self:UpdateQuestMapSymbol();
self:UpdateMapSealPoint();
self:RefreshScenicSpots();
self:UpdateTeamMembersPos(true);
self:UpdateGvgDroiyanInfos();
self:UpdateTeamPwsMapInfo();
self.bigmapWindow:UpdateQuestFocuses(self.focusMap);
self.minimapWindow:UpdateQuestFocuses(self.focusMap);
if(mapIdChanged)then
_TableClear(self.showNpcs, miniMapDataDeleteFunc);
if(cache_servershowNpcMap ~= nil)then
for k,v in pairs(cache_servershowNpcMap)do
self.showNpcs[k] = v;
cache_servershowNpcMap[k] = nil;
end
cache_servershowNpcMap = nil;
end
end
self.minimapWindow:UpdateServerNpcPointMap(self.showNpcs, true);
self.bigmapWindow:UpdateServerNpcPointMap(self.showNpcs, true);
end
self:ActiveNearlyBord(false);
end
function MainViewMiniMap:MapEvent()
self:AddListenEvt(MyselfEvent.TargetPositionChange, self.HandleUpdateDestPos);
self:AddListenEvt(MyselfEvent.PlaceTo, self.UpdateMyMapPos);
self:AddListenEvt(ServiceEvent.SceneGoToUserCmd, self.UpdateMyMapPos);
-- 小地圖任務氣泡提示
self:AddListenEvt(GuideEvent.ShowBubble, self.HandleMiniMapGuide);
self:AddListenEvt(GuideEvent.MiniMapAnim, self.HandleMiniMapGuideAnim);
-- 出口狀態更新
self:AddListenEvt(MiniMapEvent.ExitPointStateChange, self.HandleChangeExitPointState);
self:AddListenEvt(MiniMapEvent.ExitPointReInit, self.HandleExitPointReInit);
-- 隊友位置更新
self:AddListenEvt(ServiceEvent.SessionTeamMemberPosUpdate, self.HandleTeamMemberPosUpdate);
self:AddListenEvt(TeamEvent.MemberChangeMap, self.HandleTeamMemberUpdate);
self:AddListenEvt(TeamEvent.MemberOffline, self.HandleTeamMemberUpdate);
self:AddListenEvt(TeamEvent.MemberExitTeam, self.HandleTeamMemberUpdate);
-- boss位置更新
self:AddListenEvt(ServiceEvent.BossCmdBossPosUserCmd, self.HanldBossPosUpdate);
-- 景點位置更新
self:AddListenEvt(FunctionScenicSpot.Event.StateChanged, self.UpdateScenicSpotSymbol)
self:AddListenEvt(AdventureDataEvent.SceneItemsUpdate, self.HandleScenicSpotUpdate)
-- 地圖更新
self:AddListenEvt(SceneGlobalEvent.Map2DChanged, self.HandleUpdateMap2d)
-- 封印圖示更新
self:AddListenEvt(ServiceEvent.SceneSealUpdateSeal, self.UpdateMapSealPoint)
self:AddListenEvt(ServiceEvent.SceneSealQuerySeal, self.UpdateMapSealPoint)
-- 任務更新
self:AddListenEvt(ServiceEvent.QuestQuestList, self.HandleQuesUpdate);
self:AddListenEvt(ServiceEvent.QuestQuestUpdate, self.HandleQuesUpdate);
self:AddListenEvt(ServiceEvent.QuestQuestStepUpdate, self.HandleQuesUpdate);
self:AddListenEvt(SystemUnLockEvent.NUserNewMenu, self.HandleQuesUpdate);
self:AddListenEvt(ServiceEvent.NUserVarUpdate, self.HandleQuesUpdate);
self:AddListenEvt(QuestEvent.RemoveGuildQuestList, self.HandleQuesUpdate);
-- 任務Focus框
self:AddListenEvt(MainViewEvent.AddQuestFocus, self.HandleAddQuestFocus);
self:AddListenEvt(MainViewEvent.RemoveQuestFocus, self.HandleRemoveQuestFocus);
self:AddListenEvt(MiniMapEvent.ShowMiniMapDirEffect, self.HandlePlayQuestDirEffect);
-- 更新NPC位置
self:AddListenEvt(ServiceEvent.NUserNtfVisibleNpcUserCmd, self.HandleShowNpcPos);
-- 附近玩家更新
self:AddListenEvt(SceneUserEvent.SceneAddRoles, self.HandleAddRoles)
self:AddListenEvt(SceneUserEvent.SceneRemoveRoles, self.HandleRemoveRoles);
-- 北森尋寶(蘋果樹位置更新)
self:AddListenEvt(ServiceEvent.NUserTreeListUserCmd, self.HandleTreeListUpdate);
-- B格貓入侵 大貓的位置
self:AddListenEvt(ServiceEvent.NUserBCatActivityStartUserCmd, self.HandleUpdateBCatPos);
self:AddListenEvt(ServiceEvent.ActivityCmdBCatUFOPosActCmd, self.HandleUpdateBCatPos);
-- 移動景點ID begin
self:AddListenEvt(MiniMapEvent.CreatureScenicChange, self.HandleCreatureScenicChange);
self:AddListenEvt(MiniMapEvent.CreatureScenicAdd, self.HandleCreatureScenicAdd);
self:AddListenEvt(MiniMapEvent.CreatureScenicRemove, self.HandleCreatureScenicRemove);
-- 移動景點ID end
-- 小地圖引導 begin
self:AddListenEvt(GuideEvent.MapGuide_Change, self.HandleMapGuide_Change);
-- 小地圖引導 end
-- 更新地圖玩家位置
self:AddDispatcherEvt(CreatureEvent.Player_CampChange, self.HandlePlayerCampChange);
self:AddDispatcherEvt(CreatureEvent.Hiding_Change, self.HandlePlayerHidingChange);
-- 公會決戰小地圖資訊
self:AddListenEvt(ServiceEvent.FuBenCmdGvgMetalDieFubenCmd, self.UpdateGvgDroiyanInfos);
self:AddListenEvt(ServiceEvent.FuBenCmdSuperGvgSyncFubenCmd, self.UpdateGvgDroiyanInfos);
self:AddListenEvt(ServiceEvent.FuBenCmdGvgTowerUpdateFubenCmd, self.UpdateGvgDroiyanInfos);
self:AddListenEvt(GVGEvent.GVG_FinalFightLaunch, self.UpdateGvgDroiyanInfos);
self:AddListenEvt(GVGEvent.GVG_FinalFightShutDown, self.ClearGvgDroiyanInfos);
-- 波利大亂鬥顯示掉落物品
self:AddListenEvt(PVPEvent.PVP_PoringFightLaunch, self.ShowPoringFightMapItems);
self:AddListenEvt(PVPEvent.PVP_PoringFightShutdown, self.ClearPoringFightMapItems);
self:AddListenEvt(ServiceEvent.MapAddMapItem, self.HandleAddMapItem);
self:AddListenEvt(ServiceEvent.MapPickupItem, self.HandelPickupItem);
-- 蝴蝶翅膀和蒼蠅翅膀快捷按鈕
self:AddListenEvt(ItemEvent.ItemUpdate, self.RefreshButterflyAndFlyButtons);
-- 組隊競技戰小地圖
self:AddListenEvt(PVPEvent.TeamPws_Launch, self.UpdateTeamPwsMapInfo);
self:AddListenEvt(PVPEvent.TeamPws_ShutDown, self.ClearAllTeamPwsMapInfo);
self:AddListenEvt(PVPEvent.TeamPws_PlayerBuffBallChange, self.HandleTeamPwsBallChange);
self:AddListenEvt(SceneUserEvent.SceneAddNpcs, self.HandleAddNpcs)
self:AddListenEvt(SceneUserEvent.SceneRemoveNpcs, self.HandleRemoveNpcs);
end
function MainViewMiniMap:HandleUpdateMap2d(note)
self:UpdateMapAllInfo(note.body);
end
function MainViewMiniMap:HandleAddRoles(note)
if(self.nowNearlyTog == 1)then
self:UpdateNearlyCreature(1);
end
local players = note.body;
if(players)then
for _,player in pairs(players)do
self:UpdatePlayerSymbolData(player.data.id);
end
end
self:UpdatePlayerSymbolsPos();
end
function MainViewMiniMap:HandleRemoveRoles(note)
if(self.nowNearlyTog == 1)then
self:UpdateNearlyCreature(1);
end
local playerids = note.body;
if(playerids)then
for _,playerid in pairs(playerids)do
local miniMapData = self.playerMap[playerid];
if(miniMapData)then
miniMapData:Destroy();
end
self.playerMap[playerid] = nil;
end
end
self:UpdatePlayerSymbolsPos();
end
function MainViewMiniMap:HandleUpdateDestPos(note)
local destPos = note.body;
self.bigmapWindow:UpdateDestPos(destPos);
self.minimapWindow:UpdateDestPos(destPos);
end
function MainViewMiniMap:UpdateMyMapPos(note)
self.bigmapWindow:UpdateMyPos(true);
self.minimapWindow:UpdateMyPos(true);
end
-- minimap Guide begin
function MainViewMiniMap:ShutDownGuideAnim()
if(self.miniMapGuideAnim)then
self.miniMapGuideAnim:ShutDown();
self.miniMapGuideAnim = nil;
end
end
function MainViewMiniMap:HandleMiniMapGuideAnim(note)
if(note.body)then
if(not self.mapBord.activeInHierarchy)then
self:ActiveMapBord(true);
end
self:ShutDownGuideAnim();
local questData, bubbleId = note.body.questData, note.body.bubbleId;
self.miniMapGuideAnim = MiniMapGuideAnim.new(self.bigmapWindow);
self.enlargeSprite.spriteName = "com_btn_narrow";
self.miniMapGuideAnim:Launch(questData, bubbleId, self.bubbleStick);
self.miniMapGuideAnim:SetEndCall(MainViewMiniMap._MiniMapAnimEndCall, self);
self.miniMapGuideAnim:SetShutDownCall(MainViewMiniMap._MiniMapAnimShutDownCall, self);
end
end
function MainViewMiniMap:_MiniMapAnimEndCall(miniMapGuideAnim)
if(not miniMapGuideAnim)then
return;
end
local questData = QuestProxy.Instance:getQuestDataByIdAndType( miniMapGuideAnim.questId );
if(questData)then
QuestProxy.Instance:notifyQuestState(questData.id, questData.staticData.FinishJump);
end
end
function MainViewMiniMap:_MiniMapAnimShutDownCall(miniMapGuideAnim)
if(not miniMapGuideAnim)then
return;
end
self:EnLargeBigMap(true, true);
if(not miniMapGuideAnim.isEnd)then
local questData = QuestProxy.Instance:getQuestDataByIdAndType( miniMapGuideAnim.questId );
if(questData)then
QuestProxy.Instance:notifyQuestState(questData.id, questData.staticData.FailJump);
end
end
self.miniMapGuideAnim = nil;
end
function MainViewMiniMap:HandleMiniMapGuide(note)
local bubbleid = note.body;
if(not self.bubbleStick)then
end
if(bubbleid == BubbleID.MapBubbleID)then
self:ActiveMapBord(true);
tempV3:Set(-236.8, -365);
self.bubbleStick.transform.localPosition = tempV3;
TipManager.Instance:ShowBubbleTipById(bubbleid, self.bubbleStick, NGUIUtil.AnchorSide.Center, {50, 10});
elseif(bubbleid == BubbleID.MapQuestId or
bubbleid == BubbleID.MapQuestGuideId1 or
bubbleid == BubbleID.MapQuestGuideId2)then
tempV3:Set(-236.8, -365);
self.bubbleStick.transform.localPosition = tempV3;
TipManager.Instance:ShowBubbleTipById(bubbleid, self.bubbleStick, NGUIUtil.AnchorSide.Center, {50, 10});
end
end
-- minimap Guide end
function MainViewMiniMap:HandleQuesUpdate(note)
self:UpdateQuestMapSymbol();
end
function MainViewMiniMap:HandleChangeExitPointState(note)
local id = note.body.id;
local state = note.body.state;
self.minimapWindow:UpdateExitPointMapState(id, state);
self.bigmapWindow:UpdateExitPointMapState(id, state);
end
function MainViewMiniMap:HandleExitPointReInit(note)
self.minimapWindow:UpdateExitPoints();
self.bigmapWindow:UpdateExitPoints();
end
function MainViewMiniMap:HandleTeamMemberUpdate(note)
local nowMapid = MapManager:GetMapID();
local restirct = Table_MapRaid[nowMapid] and Table_MapRaid[nowMapid].Restrict;
if(restirct and restirct == 1)then
return;
end
local member = note.body;
if(member)then
self:UpdateTeamMemberPos(member.id, true);
self:HandlePlayerHidingChange(member.id);
end
end
function MainViewMiniMap:HandleTeamMemberPosUpdate(note)
local id = note.body.id;
self:UpdateTeamMemberPos(id);
end
function MainViewMiniMap:HanldBossPosUpdate(note)
local pos = note.body;
if(pos)then
local x,y,z = pos.x or 0, pos.y or 0, pos.z or 0;
pos = Vector3(x,y,z);
self.minimapWindow:UpdateBossSymbol(pos);
self.bigmapWindow:UpdateBossSymbol(pos);
end
end
function MainViewMiniMap:HandleShowNpcPos(note)
local showNpcs = note.body;
local data = note.body;
if(data)then
local cacheMap;
if(self.mapInited)then
cacheMap = self.showNpcs;
else
cache_servershowNpcMap = {};
cacheMap = cache_servershowNpcMap;
end
local showNpcs, type = data.npcs, data.type;
if(type == 1)then
local npc, scenePos;
for i=1,#showNpcs do
npc = showNpcs[i];
local npcData = Table_Npc[ npc.npcid ];
if(npcData and npcData.MapIcon)then
local createNpcID = "Server_ShowNpc_" .. npc.npcid .. "_" .. tostring(npc.uniqueid);
local miniMapData = cacheMap[ createNpcID ];
if(miniMapData == nil)then
miniMapData = MiniMapData.CreateAsTable(createNpcID);
cacheMap[ createNpcID ] = miniMapData;
scenePos = npc.pos;
miniMapData:SetPos(scenePos.x/1000, scenePos.y/1000, scenePos.z/1000);
miniMapData:SetParama("Symbol", npcData.MapIcon);
end
end
end
self.minimapWindow:UpdateServerNpcPointMap(cacheMap, false);
self.bigmapWindow:UpdateServerNpcPointMap(cacheMap, false);
elseif(type == 0)then
for i=1,#showNpcs do
local createNpcID = "Server_ShowNpc_" .. showNpcs[i].npcid .. "_" .. tostring(showNpcs[i].uniqueid);
local miniMapData = cacheMap[createNpcID];
if(miniMapData)then
miniMapData:Destroy();
cacheMap[createNpcID] = nil;
self.minimapWindow:RemoveServerNpcPointMap(createNpcID);
self.bigmapWindow:RemoveServerNpcPointMap(createNpcID);
end
end
end
end
end
function MainViewMiniMap:RefreshScenicSpots()
self:UpdateSceneSpots(FunctionScenicSpot.Me():GetAllScenicSpot());
end
function MainViewMiniMap:UpdateSceneSpots( validScenicSpots )
_TableClearByDeleter(self.spotDatas, miniMapDataDeleteFunc);
if(MapManager:IsPVPMode_TeamPws() or validScenicSpots == nil)then
self.minimapWindow:UpdateScenicSpotSymbol(self.spotDatas);
self.bigmapWindow:UpdateScenicSpotSymbol(self.spotDatas);
return;
end
for k,v in pairs(validScenicSpots) do
if(v.ID)then
self:_UpdateSceneSpot(v);
else
for i=1,#v do
if(v[i].ID)then
self:_UpdateSceneSpot(v[i]);
end
end
end
end
self.minimapWindow:UpdateScenicSpotSymbol(self.spotDatas);
self.bigmapWindow:UpdateScenicSpotSymbol(self.spotDatas);
end
function MainViewMiniMap:_UpdateSceneSpot(scenicSpot, forceUpdate)
if(MapManager:IsPVPMode_TeamPws())then
return;
end
local isDiaplay, mapStr = AdventureDataProxy.Instance:IsSceneryHasTakePic(scenicSpot.ID);
if(isDiaplay)then
mapStr = "map_Lookout";
else
mapStr = "map_Lookout_lock";
end
local spotConfig = Table_Viewspot[scenicSpot.ID];
if(spotConfig and (spotConfig.Type == 1 or spotConfig.Type == 3))then
local p = scenicSpot.position;
if(p ~= nil)then
local guid = scenicSpot.ID;
if(scenicSpot.guid)then
guid = scenicSpot.ID .. "_" .. scenicSpot.guid;
end
local spotData = self.spotDatas[guid];
if(spotData == nil)then
spotData = MiniMapData.CreateAsTable(guid);
self.spotDatas[guid] = spotData;
end
spotData:SetPos(p[1], p[2], p[3]);
spotData:SetParama("Symbol", mapStr);
end
end
if(forceUpdate)then
self.minimapWindow:UpdateScenicSpotSymbol(self.spotDatas);
self.bigmapWindow:UpdateScenicSpotSymbol(self.spotDatas);
end
end
function MainViewMiniMap:_RemoveSceneSpot(scenicSpot, forceUpdate)
local ID, guid = scenicSpot.ID, scenicSpot.guid;
if(guid)then
guid = ID .. "_" .. guid;
end
local spotData = self.spotDatas[guid];
if(spotData ~= nil)then
spotData:Destroy();
end
self.spotDatas[guid] = nil;
if(forceUpdate)then
self.minimapWindow:UpdateScenicSpotSymbol(self.spotDatas);
self.bigmapWindow:UpdateScenicSpotSymbol(self.spotDatas);
end
end
function MainViewMiniMap:HandleCreatureScenicChange(note)
local spotDatas = note.body;
if(spotDatas)then
for i=1,#spotDatas do
self:_UpdateSceneSpot(spotDatas[i]);
end
self.minimapWindow:UpdateScenicSpotSymbol(self.spotDatas);
self.bigmapWindow:UpdateScenicSpotSymbol(self.spotDatas);
end
end
function MainViewMiniMap:HandleCreatureScenicAdd(note)
local sceneSpots = note.body;
for i=1,#sceneSpots do
self:_UpdateSceneSpot(sceneSpots[i]);
end
self.minimapWindow:UpdateScenicSpotSymbol(self.spotDatas);
self.bigmapWindow:UpdateScenicSpotSymbol(self.spotDatas);
end
function MainViewMiniMap:HandleCreatureScenicRemove(note)
self:_RemoveSceneSpot(note.body, true);
end
-- 更新景點圖示
function MainViewMiniMap:UpdateScenicSpotSymbol(note)
self:UpdateSceneSpots(note.body.validScenicSpots);
end
function MainViewMiniMap:HandleScenicSpotUpdate(note)
local updateSceneIds = note.body;
for i=1,#updateSceneIds do
local id = updateSceneIds[i];
if(id and self.spotDatas[id])then
self.spotDatas[id]:SetParama("Symbol", "map_Lookout");
end
end
self.minimapWindow:UpdateScenicSpotSymbol(self.spotDatas);
self.bigmapWindow:UpdateScenicSpotSymbol(self.spotDatas);
end
-- 更新封印圖示
function MainViewMiniMap:UpdateMapSealPoint()
local nowMapId = MapManager:GetMapID();
local data = SealProxy.Instance:GetSealData(nowMapId);
if(data)then
if(not self.sealDatasMap)then
self.sealDatasMap = {};
else
_TableClearByDeleter(self.sealDatasMap, miniMapDataDeleteFunc);
end
for k,v in pairs(data.itemMap)do
local symbol = v.issealing and "map_whirlpool2" or "map_whirlpool";
local sealMapData = self.sealDatasMap[k];
if(sealMapData == nil)then
sealMapData = MiniMapData.CreateAsTable(k);
self.sealDatasMap[k] = sealMapData;
end
sealMapData:SetPos(v.pos[1], v.pos[2], v.pos[3]);
sealMapData:SetParama("Symbol", symbol);
end
self.minimapWindow:UpdateSealSymbol(self.sealDatasMap, true);
self.bigmapWindow:UpdateSealSymbol(self.sealDatasMap, true);
end
end
-- 北森尋寶
function MainViewMiniMap:HandleTreeListUpdate(note)
local treePoints = note.body.updates;
local dels = note.body.dels;
if(treePoints~=nil)then
if(not self.treeMapDatasMap)then
self.treeMapDatasMap = {};
else
_TableClearByDeleter(self.treeMapDatasMap, miniMapDataDeleteFunc);
end
for i=1,#treePoints do
local single = treePoints[i];
local treeMapData = self.treeMapDatasMap[single.id];
if(treeMapData == nil)then
treeMapData = MiniMapData.CreateAsTable(single.id);
self.treeMapDatasMap[single.id] = treeMapData;
end
treeMapData:SetPos(single.pos.x/1000, single.pos.y/1000, single.pos.z/1000);
treeMapData:SetParama("Symbol", "map_plant");
end
self.bigmapWindow:UpdateTreePoints(self.treeMapDatasMap, false);
self.minimapWindow:UpdateTreePoints(self.treeMapDatasMap, false);
end
if(dels~=nil)then
for i=1,#dels do
self.bigmapWindow:RemoveTreePoint(dels[i]);
self.minimapWindow:RemoveTreePoint(dels[i]);
end
end
end
function MainViewMiniMap:HandleUpdateBCatPos(note)
local bigCatActivityData = FunctionActivity.Me():GetActivityData( ACTIVITYTYPE.EACTIVITYTYPE_BCAT );
local mapId = bigCatActivityData and bigCatActivityData.mapid;
local serverPos = note.body.pos;
if(serverPos and MapManager:GetMapID() == mapId)then
tempV3:Set(serverPos.x/1000, serverPos.y/1000, serverPos.z/1000);
self.bigmapWindow:UpdateBigCatSymbol(tempV3);
self.minimapWindow:UpdateBigCatSymbol(tempV3);
else
self.bigmapWindow:UpdateBigCatSymbol();
self.minimapWindow:UpdateBigCatSymbol();
end
end
function MainViewMiniMap:HandleAddQuestFocus(note)
if(not self.focusMap)then
self.focusMap = {};
end
local questId, pos = note.body[1], note.body[2];
local focusData = self.focusMap[questId];
if(not focusData)then
focusData = MiniMapData.CreateAsTable(questId);
focusData:SetParama("questId", questId);
self.focusMap[questId] = focusData;
end
focusData:SetPos(pos[1], pos[2], pos[3]);
self.bigmapWindow:UpdateQuestFocuses(self.focusMap);
self.minimapWindow:UpdateQuestFocuses(self.focusMap);
end
function MainViewMiniMap:HandleRemoveQuestFocus(note)
local questId = note.body;
if(questId and self.focusMap)then
local focusData = self.focusMap[questId];
if(focusData)then
focusData:Destroy();
end
self.focusMap[questId] = nil;
self.bigmapWindow:RemoveQuestFocusByQuestId(questId);
self.minimapWindow:RemoveQuestFocusByQuestId(questId);
end
end
function MainViewMiniMap:HandlePlayQuestDirEffect(note)
local questId = note.body;
if(questId)then
self.minimapWindow:PlayFocusFrameEffect( questId );
end
end
function MainViewMiniMap:HandlePlayerCampChange(player)
if(player)then
self:_UpdatePlayerSymbolData(player);
self:UpdatePlayerSymbolsPos();
end
end
function MainViewMiniMap:HandlePlayerHidingChange(playerid)
local player = NSceneUserProxy.Instance:Find(playerid);
if(player)then
self:_UpdatePlayerSymbolData(player);
self:UpdatePlayerSymbolsPos();
end
end
function MainViewMiniMap:UpdatePlayerSymbolData(playerid)
if(playerid == Game.Myself.data.id)then
return;
end
local player = NSceneUserProxy.Instance:Find(playerid);
self:_UpdatePlayerSymbolData(player);
end
function MainViewMiniMap:_GetScenePlayerSymbolName( player )
local playerid = player.data.id;
local playerSymbolName = nil;
if(player~=Game.Myself and not _TeamProxy:IsInMyTeam(playerid))then
local tag = player.data.userdata:Get(UDEnum.PVP_COLOR);
local symbolMap = MapManager:IsGvgMode_Droiyan() and GvgDroiyan_Player_Symbol_Name_Map or Player_Symbol_Name_Map;
if (Game.MapManager:IsPVPMode_PoringFight()) then
playerSymbolName = "map_green";
elseif(tag~=nil and symbolMap[tag])then
local myTeam = _TeamProxy.myTeam;
if(myTeam == nil or myTeam:GetMemberByGuid(player.data.id) == nil)then
playerSymbolName = symbolMap[tag];
end
else
local camp = player.data:GetCamp();
if(camp == RoleDefines_Camp.ENEMY)then
playerSymbolName = "map_dot";
end
end
end
local pwsSymbol = Func_GetTeamPwsBallSymbol(player);
if(pwsSymbol)then
playerSymbolName = pwsSymbol;
end
local hideValue = player.data.props.Hiding:GetValue();
if(hideValue > 0)then
playerSymbolName = nil;
end
return playerSymbolName;
end
function MainViewMiniMap:_UpdatePlayerSymbolData(player)
if(player == nil)then
return;
end
if(_TeamProxy:IsInMyTeam(player.data.id))then
return;
end
local playerid = player.data.id;
local playerSymbolName = self:_GetScenePlayerSymbolName(player);
local miniMapData = self.playerMap[playerid];
if(playerSymbolName ~= nil)then
if(miniMapData == nil)then
miniMapData = MiniMapData.CreateAsTable(playerid);
self.playerMap[playerid] = miniMapData;
end
local pos = player:GetPosition()
if(pos)then
miniMapData:SetPos(pos[1], pos[2], pos[3]);
end
miniMapData:SetParama("Symbol", playerSymbolName);
miniMapData:SetParama("depth", 4);
else
if(miniMapData~=nil)then
miniMapData:Destroy();
self.playerMap[playerid] = nil;
end
end
end
function MainViewMiniMap:UpdatePlayerSymbolsPos()
local hasPlayer = false;
for playerid, miniMapData in pairs(self.playerMap)do
local player = NSceneUserProxy.Instance:Find(playerid);
if(player~=nil)then
local pos = player:GetPosition()
if(pos)then
miniMapData:SetPos(pos[1], pos[2], pos[3]);
end
else
local miniMapData = self.playerMap[playerid]
self.playerMap[playerid] = nil;
if(miniMapData)then
miniMapData:Destroy();
end
end
hasPlayer = true;
end
self.minimapWindow:UpdatePlayerPoses(self.playerMap, true);
self.bigmapWindow:UpdatePlayerPoses(self.playerMap, true);
if(hasPlayer == true)then
if(self.playerPosCheck == nil)then
self.playerPosCheck = TimeTickManager.Me():CreateTick(0,1000,self.UpdatePlayerSymbolsPos, self, 2)
end
else
if(self.playerPosCheck)then
TimeTickManager.Me():ClearTick(self, 2)
self.playerPosCheck = nil;
end
end
end
function MainViewMiniMap:HandleMapGuide_Change(note)
FunctionGuide.Me():AttachGuideEffect(self.bigMapButton, Guild_RemoveType.Click);
FunctionGuide.Me():AttachGuideEffect(self.miniMapButton, Guild_RemoveType.Time | Guild_RemoveType.Click);
end
-- GvgDroiyan Update
local GameConfig_GvgDroiyan = GameConfig.GvgDroiyan;
local RobPlatformId_Prefix = "RobPlatform_";
local BornGorgeousMetalId_Prefix = "BornGorgeousMetal_";
local GvgDroiyan_SymbolMap = {
[0] = "gvg_bg_gray",
[1] = "gvg_bg_red",
[2] = "gvg_bg_blue",
[3] = "gvg_bg_purple",
[4] = "gvg_bg_green",
}
function MainViewMiniMap:UpdateGvgDroiyanInfos(note)
if(not Game.MapManager:IsGvgMode_Droiyan())then
self:ClearGvgDroiyanInfos();
return;
end
_TableClearByDeleter(self.gvgDroiyanMap, miniMapDataDeleteFunc);
local robPlatform = GameConfig_GvgDroiyan and GameConfig_GvgDroiyan.RobPlatform;
for index,v in pairs(robPlatform)do
local pos = v.pos;
local map_guid = RobPlatformId_Prefix .. index;
local miniMapData = MiniMapData.CreateAsTable( map_guid );
miniMapData:SetPos(pos[1], pos[2], pos[3]);
miniMapData:SetParama("Symbol", GvgDroiyan_SymbolMap[0]);
self.gvgDroiyanMap[ map_guid ] = miniMapData;
end
local towersMap = _SuperGvgProxy:GetTowersMap() or _EmptyTable;
for k,clientGvgTowerData in pairs(towersMap)do
local index = _SuperGvgProxy:GetIndexByGuildId(clientGvgTowerData.owner_guild);
if(index and index ~= 0)then
local map_guid = RobPlatformId_Prefix .. tostring(clientGvgTowerData.etype);
local miniMapData = self.gvgDroiyanMap[map_guid];
if(miniMapData ~= nil)then
miniMapData:SetParama("Symbol", GvgDroiyan_SymbolMap[index]);
end
end
end
local bornGorgeousMetal = GameConfig_GvgDroiyan and GameConfig_GvgDroiyan.BornGorgeousMetal;
for index, v in pairs(bornGorgeousMetal)do
local pos = v.pos;
local map_guid = BornGorgeousMetalId_Prefix .. index;
local miniMapData = MiniMapData.CreateAsTable( map_guid );
miniMapData:SetPos(pos[1], pos[2], pos[3]);
miniMapData:SetParama("Symbol", GvgDroiyan_SymbolMap[index]);
self.gvgDroiyanMap[ map_guid ] = miniMapData;
end
local guildsMap = _SuperGvgProxy:GetGuildsMap();
for k,clientGvgGuildInfo in pairs(guildsMap)do
local map_guid = BornGorgeousMetalId_Prefix .. clientGvgGuildInfo.index;
local miniMapData = self.gvgDroiyanMap[map_guid];
if(miniMapData ~= nil)then
miniMapData:SetParama("metal_live", clientGvgGuildInfo.metal_live and 1 or 0);
-- if(not clientGvgGuildInfo.metal_live)then
-- miniMapData:SetParama("Symbol", GvgDroiyan_SymbolMap[0]);
-- end
end
end
self.minimapWindow:UpdateGvgDroiyanInfos(self.gvgDroiyanMap, true);
self.bigmapWindow:UpdateGvgDroiyanInfos(self.gvgDroiyanMap, true);
end
function MainViewMiniMap:ClearGvgDroiyanInfos()
_TableClearByDeleter(self.gvgDroiyanMap, miniMapDataDeleteFunc);
self.minimapWindow:UpdateGvgDroiyanInfos(self.gvgDroiyanMap, true);
self.bigmapWindow:UpdateGvgDroiyanInfos(self.gvgDroiyanMap, true);
self:ActiveGvgFinalFightTip(false);
end
--波利大亂鬥顯示掉落物品
function MainViewMiniMap:ShowPoringFightMapItems()
_TableClearByDeleter(self.poringFightDropMap, miniMapDataDeleteFunc);
if (SceneItemProxy.Instance ~= nil) then
for id,data in pairs(SceneItemProxy.Instance.userMap) do
if (data.staticData.id == 157) then
local miniMapData = MiniMapData.CreateAsTable(id);
local pos = data.pos;
miniMapData:SetPos(pos.x, pos.y, pos.z);
miniMapData:SetParama("Symbol", "map_apple");
self.poringFightDropMap[id] = miniMapData;
end
end
end
self.minimapWindow:UpdatePoringFightMapItems(self.poringFightDropMap, true);
self.bigmapWindow:UpdatePoringFightMapItems(self.poringFightDropMap, true);
end
function MainViewMiniMap:ClearPoringFightMapItems()
_TableClearByDeleter(self.poringFightDropMap, miniMapDataDeleteFunc);
self.minimapWindow:UpdatePoringFightMapItems(self.poringFightDropMap, true);
self.bigmapWindow:UpdatePoringFightMapItems(self.poringFightDropMap, true);
end
function MainViewMiniMap:HandleAddMapItem(note)
if (not Game.MapManager:IsPVPMode_PoringFight() or not SceneItemProxy.Instance) then
return
end
local items = note.body and note.body.items
if (not items) then return end
for i = 1, #items do
local item = SceneItemProxy.Instance.userMap[items[i].guid]
if (item and item.staticData.id == 157 and not self.poringFightDropMap[item.id]) then
local miniMapData = MiniMapData.CreateAsTable(item.id);
local pos = item.pos;
miniMapData:SetPos(pos.x, pos.y, pos.z);
miniMapData:SetParama("Symbol", "map_apple");
self.poringFightDropMap[item.id] = miniMapData;
end
end
self.minimapWindow:UpdatePoringFightMapItems(self.poringFightDropMap, true);
self.bigmapWindow:UpdatePoringFightMapItems(self.poringFightDropMap, true);
end
function MainViewMiniMap:HandelPickupItem(note)
if (not Game.MapManager:IsPVPMode_PoringFight() or not SceneItemProxy.Instance) then
return
end
local id = note.body and note.body.itemguid
if (self.poringFightDropMap[id]) then
self.poringFightDropMap[id]:Destroy()
self.poringFightDropMap[id] = nil
self.minimapWindow:UpdatePoringFightMapItems(self.poringFightDropMap, true);
self.bigmapWindow:UpdatePoringFightMapItems(self.poringFightDropMap, true);
end
end
--揹包物品更新時重新整理蝴蝶翅膀和蒼蠅翅膀按鈕
function MainViewMiniMap:RefreshButterflyAndFlyButtons()
self:RefreshButtonStatus(self.UseButterflyButtonInfo)
self:RefreshButtonStatus(self.UseFlyButtonInfo)
end
--重新整理蝴蝶按鈕或蒼蠅按鈕狀態
function MainViewMiniMap:RefreshButtonStatus(go)
local item = BagProxy.Instance:GetItemByStaticID(go.itemID, BagProxy.BagType.MainBag)
if (nil == item) then
item = BagProxy.Instance:GetItemByStaticID(go.itemID, BagProxy.BagType.Temp)
end
if (nil == item) then
self:SetTextureGrey(go.base)
self:SetTextureGrey(go.icon)
else
self:SetTextureWhite(go.base)
self:SetTextureWhite(go.icon)
end
end
--使用蝴蝶翅膀或蒼蠅翅膀
function MainViewMiniMap:TryUseButterflyOrFly(go)
local item = BagProxy.Instance:GetItemByStaticID(go.itemID, BagProxy.BagType.MainBag)
if (nil == item) then
item = BagProxy.Instance:GetItemByStaticID(go.itemID, BagProxy.BagType.Temp)
end
if (nil ~= item) then
local dont = LocalSaveProxy.Instance:GetDontShowAgain(go.msgID)
if (nil == dont) then
MsgManager.DontAgainConfirmMsgByID(go.msgID, function() FunctionItemFunc.TryUseItem(item) end)
else
FunctionItemFunc.TryUseItem(item)
end
else
item = Table_Item[go.itemID]
if (nil ~= item) then
MsgManager.ShowMsgByID(go.msgDoNotHaveID, item.NameZh)
else
redlog("Cannot Find Item Data: " .. go.itemID)
end
end
self:RefreshButtonStatus(go)
end
function MainViewMiniMap:HandleTeamPwsBuffBallChange(note)
for id,_ in pairs(self.playerMap)do
self:UpdatePlayerSymbolData(id);
end
end
local GetBallBornPosSID = function (id)
return "Born_" .. id;
end
local GetBallBallPosSID = function (id)
return "Ball_" .. id;
end
function MainViewMiniMap:UpdateTeamPwsMapInfo(note)
if(not MapManager:IsPVPMode_TeamPws())then
return;
end
local ballBornPos = GameConfig.PvpTeamRaid.ElementBornPosition;
local sid;
for id, pos in pairs(ballBornPos)do
sid = GetBallBornPosSID(id);
local miniMapData = self.teamPwsMapInfo[sid];
if(miniMapData == nil)then
miniMapData = MiniMapData.CreateAsTable( sid );
self.teamPwsMapInfo[sid] = miniMapData;
end
miniMapData:SetPos(pos[1], pos[2], pos[3]);
miniMapData:SetParama("Symbol", "map_tpvppt");
miniMapData:SetParama("depth", 10);
end
self.minimapWindow:UpdateTeamPwsInfo(self.teamPwsMapInfo, true);
self.bigmapWindow:UpdateTeamPwsInfo(self.teamPwsMapInfo, true);
end
function MainViewMiniMap:UpdateTeamBallInfos(updates)
if(not MapManager:IsPVPMode_TeamPws())then
return;
end
if(updates == nil or #updates == 0)then
return;
end
for i=1,#updates do
self:UpdateTeamPwsBallInfoData(updates[i]);
end
self.minimapWindow:UpdateTeamPwsInfo(self.teamPwsMapInfo, true);
self.bigmapWindow:UpdateTeamPwsInfo(self.teamPwsMapInfo, true);
end
local tempBallMap;
function MainViewMiniMap:UpdateTeamPwsBallInfoData(ballNpc)
if(not MapManager:IsPVPMode_TeamPws())then
return;
end
if(tempBallMap == nil)then
tempBallMap = {};
local ballConfig = GameConfig.PvpTeamRaid.ElementNpcsID;
for id,config in pairs(ballConfig)do
tempBallMap[config.npcid] = {id, config};
end
end
local npcid = ballNpc.data.staticData and ballNpc.data.staticData.id;
local tempConfig = npcid and tempBallMap[npcid];
if(tempConfig == nil)then
return;
end
local sid = GetBallBallPosSID(ballNpc.data.id);
local miniMapData = self.teamPwsMapInfo[sid];
if(miniMapData == nil)then
miniMapData = MiniMapData.CreateAsTable(sid);
self.teamPwsMapInfo[sid] = miniMapData;
end
miniMapData:SetParama("Symbol", tempConfig[2].mapicon);
local x, y, z = ballNpc:GetServerPos();
miniMapData:SetPos(x, y, z);
miniMapData:SetParama("depth", 11);
end
function MainViewMiniMap:RemoveTeamPwsBallInfo(dels)
if(not MapManager:IsPVPMode_TeamPws())then
return;
end
local dirty = false;
for i=1,#dels do
local ncpid = dels[i];
local sid = GetBallBallPosSID(ncpid);
local miniMapData = self.teamPwsMapInfo[sid];
if(miniMapData)then
miniMapData:Destroy();
self.teamPwsMapInfo[sid] = nil;
dirty = true;
end
end
if(dirty)then
self.minimapWindow:UpdateTeamPwsInfo(self.teamPwsMapInfo, true);
self.bigmapWindow:UpdateTeamPwsInfo(self.teamPwsMapInfo, true);
end
end
function MainViewMiniMap:ClearAllTeamPwsMapInfo()
_TableClearByDeleter(self.teamPwsMapInfo, miniMapDataDeleteFunc);
self.minimapWindow:UpdateTeamPwsInfo(self.teamPwsMapInfo, true);
self.bigmapWindow:UpdateTeamPwsInfo(self.teamPwsMapInfo, true);
self:UpdateTeamMembersPos(true);
end
function MainViewMiniMap:HandleAddNpcs(note)
self:UpdateTeamBallInfos(note.body);
end
function MainViewMiniMap:HandleRemoveNpcs(note)
self:RemoveTeamPwsBallInfo(note.body);
end
function MainViewMiniMap:HandleTeamPwsBallChange(note)
self:UpdateTeamMembersPos(true);
local _nSceneUserProxy = NSceneUserProxy.Instance;
for playerid,_ in pairs(self.playerMap)do
local player = _nSceneUserProxy:Find(playerid);
self:_UpdatePlayerSymbolData(player);
end
end